Hjälp en nybörjare!

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Greve Hamilton
EF Sponsor
Inlägg: 544
Blev medlem: 4 september 2004, 15:03:35
Ort: GBG

Hjälp en nybörjare!

Inlägg av Greve Hamilton »

Tjenare!

Köpte just en Velleman K8048 PIC-programmerare och experimentkort på Kjell för att försöka lära mig lite om PIC.
Eftersom jag är helt och hållet ny på programmering av alla de slag blir det lite utav en utmaning.

Men iaf, efter att ha plockat ihop kortet börjar fundera lite på vilket språk som kan tänkas vara lämpligast mig just mig. Tittade runt lite på Internet och bestämde mig för att mikroBasic verkade "lagom" för mina behov.
Som program för att bränna ned koden med valde jag det medföljande till programmeraren. ProgPIC2 heter det tydligen.

Ungefär här jag är nu. Problemet just nu är att lära sig alla grunder i språket. Har läst igenom manualen till mikroBasic men blir inte så mycket klokare. Det verkar ju som om det krävs lite förkunskaper innan man läser den.


Här kommer ett frågetecken som antagligen måste rätas ut:

Skriver man t ex. "TRISB = 0" så väljer man ju att PORTB ska bli utgång. Skriver man sedan "PORTB = $FF" så blir ju ALLA ben som hör till PORTB logisk etta. Men hur ska man skriva om man vill att ett speciellt ben på på PORTB ska bli etta?

Kommer antagligen mer frågor och följdfrågor snart. :wink:


/Tack på förhand!
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

det finns antagligen ett kommando typ "PINB" eller så som gör det du vill, men eftersom jag inte vet hur (eller om) det funkar så kan jag ge dig ett lite omständgare sätt att göra det.

När du skriver PORTB = $FF så sätter du bitmönstret 11111111 på porten
(binärt 1111 är samma som F hexadecimalt)
Så, för att sätta t.ex. bit nummer 2 (bit 0 är längst till höger) så räknar vi ut att 0100 binärt är lika med 4 decimalt och hexadecimalt) så
PORTB = $04 sätter bit 2 på porten
PORTB = $01 sätter bit 0 osv....
PORTB = $80 sätter högsta biten....

Hoppas att det funkar nu :)
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Annars går det bra att ange det rent binärt. Vill du exempelvis sätta pin 0 och pin 5 hög (resten låga) på portb så blir det:
PortB = %00100001
Procenttecknet berättar för kompilatorn att det du anger efter detta tecken är binärt tal. Bit 0 är längst till höger och motsvarar även pin 0.


Om du bara vill ändra vissa pinnar kan du använda dig av logiska kommando (OR, AND, XOR).

Exempel 1: Pin 2 hög på portb utan att påverka någon annan pinne:
PORTB = PORTB OR %00000100

Exempel 2: Pin 0 låg, alla andra oförändrade:
PORTB = PORTB AND %11111110

Exempel 3: Byt läge på pin 6, alla andra oförändrade:
PORTB = PORTB XOR %01000000
Användarvisningsbild
Greve Hamilton
EF Sponsor
Inlägg: 544
Blev medlem: 4 september 2004, 15:03:35
Ort: GBG

Inlägg av Greve Hamilton »

Tack för hjälpen grabbar!

Testade lite av det ni beskrev och lyckades göra ett "rinnande ljus"! Kanske inte var den mest ultimata koden... men det fungerade iaf!

Har bara ett litet, vad jag tror, problem bara.

När jag kör denna kod så blinkar den till lite snabbare än vanligt mellan 4:e och 5:e blinket (och mellan 8:e och 9:e osv.). Ska det vara så? Antagligen inte va?

Postar koden, även om den är väldigt simpel. :D

Kod: Markera allt

main:
    TRISA = 1
    TRISB = 0
    PORTB = $00
    Delay_ms(250)
    PORTB = $01
    Delay_ms(250)
  Goto main
end.
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

är det där verkligen ett rinnande ljus?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Ja, det liknar mer en blinkande LED eller sånt.

Sen gör du en initialisering av porten varje gång, ganska onödigt.
main:
TRISA = 1
TRISB = 0
PORTB = $00
Delay_ms(250)
PORTB = $01
Delay_ms(250)
Goto main
end.
bör vara:

main:
TRISA = 1
TRISB = 0
Loop:
PORTB = $00
Delay_ms(250)
PORTB = $01
Delay_ms(250)
Goto Loop
end.

Ett löp-ljus som är oerhört primitivt:
main:
TRISA = $FF
TRISB = $00
Loop:
PORTB = $01
Delay_ms(250)
PORTB = $02
Delay_ms(250)
PORTB = $04
Delay_ms(250)
PORTB = $08
Delay_ms(250)
PORTB = $10
Delay_ms(250)
PORTB = $20
Delay_ms(250)
PORTB = $40
Delay_ms(250)
PORTB = $80
Delay_ms(250)
goto Loop

Det kan utföras mycket snyggare men jag vet inte vilket språk du använder. Det ruller en bit från PORTB.0 till PORTB.7 och upprepar
Användarvisningsbild
Greve Hamilton
EF Sponsor
Inlägg: 544
Blev medlem: 4 september 2004, 15:03:35
Ort: GBG

Inlägg av Greve Hamilton »

Nej nej, det var absolut inte det rinnande ljuset jag postade. Var nog för otydlig.
Jag testade även att stoppa in en loop, men det blir ändå lika skumt.
Kan jag ha missat någon inställning?
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

En sak som skulle kunna göra att ditt program nollställs ibland (och därmed ger konstiga blinkningar) är om du har watchdog-timern på. Har ingen aning om hur man ställer in det i mikrobasic, och det vore faktiskt lite konstigt om den var på som standard.
Användarvisningsbild
Greve Hamilton
EF Sponsor
Inlägg: 544
Blev medlem: 4 september 2004, 15:03:35
Ort: GBG

Inlägg av Greve Hamilton »

Asch, där hade vi det! Watchdog-timern var inte ikryssad att den skulle vara av. Men den var inte ikryssad så den var påslagen heller. Så jag fick välja att den skulle vara avstängd. :oops:
Jaja, tack cyr!

Nu kommer ett nytt problem! Försöker få så att jag kan styra något med ingångarna.

Har testat lite med denna kodbit, men det fungerar inte alls. Eller krävs det något mer i koden? Kanske till och med är fel sätt att använde "IF-joxet"?

Kod: Markera allt

main:
TRISA = 1
TRISB = 0
loop:
If PORTA = $02 Then 
PORTB = $02
Else
PORTB = $00
End if
Goto loop
End
Användarvisningsbild
Xyzzy
Inlägg: 1260
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

Du sätter bara den lägsta biten på portA till ingång, de andra är fortfarande utgångar (värde: noll)
byt rad
TRISA = 1
till
TRISA = 255
Sen vet jag inte om du verkligen kan LÄSA portens värde med "PORTx"... kolla i manualen.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Sen så måste det du läser verkligen vara exakt $02 för att det ska funka, så di måste vara säker på att alla övriga ingångar är 0.

Bättre att bara titta på en bit, misstänker att det finns något speciell funktion för det i språket...

Annars går det att göra genom att maska bort de övriga bitarna

typ

If PORTA AND $02 = $02 Then

Fast jag vet inte ens om det är korrekt syntax...
Skriv svar