Naja, ich hab mal kurz in das Datenblatt deines Controllers geschaut und
gesehen, daß der mit meinem Programm nicht laufen wird, da der
Watchdog-Timer keinen eigenen Interrupt hat. Meins ist halt für einen
ATtiny13 gedacht. Ich hab's trotzdem mal angehängt. Man könnte es ja
so modifizieren, daß es einen normalen Timer verwendet.
Schauen wir uns mal dein Programm an.
> .include "4433def.inc"
>
> ldi r16, 50
> ldi r17, 0xFF
Einfacher:
ser r17
> out DDRB, r17
> loop1:
>
> if1:
> cpi r16, 100
> brne else1
> ldi r17, 0b00000001
ldi r17, (1 << PORTB0)
> out PORTB, r17
> ldi r16, 50
> rjmp endif1
> else1:
> ldi r17, 0b00000010
ldi r17, (1 << PORTB1)
> out PORTB, r17
> ldi r16, 100
> endif1:
>
Generell dürfte dein Programm vermutlich einfach viel zu schnell
ablaufen. Schauen wir uns mal die Dauer der Warteschleife an:
> ldi r17, 255
> while1:
> subi r17, 1
1 Taktzyklus
> breq endwhile1
1 Taktzyklus, wenn false, sonst 2
> nop
1 Taktzyklus
> rjmp while1
2 Taktzyklen
Macht also 5 Taktzyklen pro Schleifendurchlauf. Die für das ldi und der
zusätzliche für den breq am Ende vernachlässigen wir mal.
Bei 255 Schleifendurchläufen macht das 1275 Taktzyklen. Ich weiß
nicht, bei welchem Takt du den Controller betreibst, aber bei 1MHz wäre
deine Warteschleife in gut 1,2 Millisekunden fertig. Deine LEDs würden
also mit einer Frequenz von über 400 Hz wechselblinken. Falls dein Takt
höher ist, natürlich entsprechend schneller.
Entweder mußt du auf Timer ausweichen, oder du mußt deine Warteschleife
auf einen 16bittigen Schleifenzähler erweitern, um genug Zeit
kaputtzumachen, damit die Blinkgeschwindigkeit für Menschen wahrnehmbar
wird.
> endwhile1:
> rjmp loop1