> Detta är vad jag har uppfattat det som...
Kod: Markera allt
LOOP:
sbi PortB, 3 : skickar ett värde till PortB pin 3
cbi PortB, 3 : rensar värdert på PortB pin 3
sbis PinB, 5 : läser av Port B, 5
rjmp LOOP
> men undertiden nu så ser jag ju att så som jag trodde att det va verkar
> ju iunte rätt, eftersom PortB, 3 måste ju vara att den sätter 3 bit på PortB ...
Ah, du har inte läst på tillräckligt. Kolla i manualen för AVR-instruktioner:
http://www.atmel.com/dyn/resources/prod ... oc0856.pdf
Sida 117
Kommandot
sbi PortB,3 Sätter bit nummer 3 och
enbart bit nummer 3 till "1" på PortB. Den sätter
inte 3 bitar på PortB. Inga andra bitar på PortB berörs.
För att göra det ännu tydligare:
Kod: Markera allt
PortB bitar och värde:
Bit nummer 7 6 5 4 3 2 1 0
Värde 0 0 0 0 1 0 0 0
Se? Bit nummer 3 är "1"
När du sätter bit nummer 3 på PortB, lägger processorn ut +5V på den pinne som motsvarar bit 3 på PortB, i fallet ATiny26 är det ben 4.
Har du dioden kopplad där lyser den, eftersom den får +5V spänning.
Sedan (enligt ditt program) sätter du bit nummer 3 på PortB till noll med kommandot
cbi PortB,3. Detta gör att processorn tar bort spänningen på den pinne som motsvarar bit nummer 3 på PortB (fortfarande ben 4). Det betyder att dioden inte får spänning/ström och följaktligen inte lyser.
Efter det du tänt och släckt dioden i din kod med ovanstående kommandon (sbi, cbi) så kollar du vad du har på ingången PinB bit nummer 5. Om man så tittar i databladet, ser man att PinB bit 5 motsvarar ATiny26 ben 8.
Om du har en spänning (+5V) på ben 8 kommer bit 5 på PinB vara "1", om du inte har någon spänning på ben 8 (0V) kommer bit 5 på PinB att vara "0".
Om du nu har brytaren kopplad till ben 8 på ATiny26 och sluter den, kommer det att ligga en spänning på +5V på det benet. När du då läser av med
sbis PinB,5 kommer den att känna av en "1" på PinB bit 5 och följaktligen skippa nästa kommando (i ditt fall rjmp LOOP). Detta vet du antagligen redan eftersom du läst hur sbis kommandot funkar på sidan 119 i ovan nämnda datablad.
Det enda din knapptryckning gör är att hoppa över rjmp-kommandot ifall du sluter brytaren. Ifall du inte sluter den så läser den
rjmp LOOP och hoppar till labeln LOOP och fortsätter därifrån.
För att summera:
Det du gör i ditt program (stegen nummrerade):
1. Sätter bit 3 PortB (tänder dioden)
2. Nollar bit 3 PortB (släcker dioden)
3. Kollar om brytaren är nedtryckt (bit 5 PinB), hoppar isåfall över nästa kommando (steg 4).
4. Hoppar tillbaka till steg 1
Som du ser har vi inget steg 5. Det har du inte heller i ditt program, så när brytaren är "till" hoppar processorn ur ditt program och exekverar vad som nu kan tänkas ligga efter steg 4. Antagligen resettar den sig eller lyckas så småningom hoppa till startvektorn och börjar om ditt program igen efter några mikrosekunder, men det är likväl fel.
Det du vill göra (stegen nummrerade):
1. Kolla om brytaren är nedtryckt (bit 5 PinB), hoppa isåfall över nästa steg (steg 2)
2. Nolla bit 3 PortB (släck dioden)
3. Kolla om brytaren
inte är nedtryckt (bit 5 PinB), hoppa isåfall över nästa steg (steg 4)
4. Sätt bit 3 PortB (tänd dioden)
5. Hoppa tillbaka till steg 1
Nu kommer det mest spännande. Kan du göra om "Det du vill göra" i vacker AVR-kod? Sätt de små grå i gungning.
EDIT: Tips! Du behöver ett till kommando förutom de du redan använt:
sbic. Nu så, jag har redan sagt mer än nog.
Mats