Gast
#4362604
Hallo zusammen, ich bin neu im Bereich der Mikrocontrollerprogrammierung und fange gerade mit der Assemblerprogrammierung an. Ich habe ein Programm geschrieben, bei dem ein Port ganz simple hochzählen soll. Dies ergibt dann einen Dualzähler bzw. Frequenzteiler. Nur zählt der Controller leider nicht korrekt (Atmega8), wie im Video zu sehen ist. Nach einem Reset zählt er nur bis 32 und fängt dann wieder bei 0 an und danach zählt er dann weiter als 32. Woran kann das liegen? Hier das Programm: /* * Frequenzteiler/Dualzähler 1Hz * Ausgang: PORTB * Created: 19.11.2015 10:40:30 * Author: Lubic, Napierski, Wittenberg */ ;---Assemblerdirektiv(en)--- .INCLUDE "m8def.inc" ;---Initialisierung--- ldi r16, low(RAMEND) ;Stack-Initialisierung out SPL, r16 ldi r16, high(RAMEND) out SPH, r16 .DEF output=R25 .DEF Wait1=R20 .DEF Wait2=R21 ldi r17,0xff ;Lade Konstante ffh in r17 out DDRB,r17 ;PORT B ist Ausgang ldi output,0x00 ;Arbeitsregister output Anfangsbedinung 0 ;---Hauptprogramm--- loop: ;Beginn der Endlosschleife out PORTB,output ;PORTB auf Null setzen RCALL Unterprogramm INC output ;Arbeitsregister r16 inkrementieren rjmp loop ;Springe zur Marke loop ;-------Unterprogramm Wartschleife--------- Unterprogramm: ldi wait1,0xFF ;lade 255 in Register "Wait1" Warten: ldi wait2,0xFF ;lade 255 in Register "Wait2" Warten1: nop nop nop dec wait2 ;Dekrementiere Register "wait2" um 1 brne Warten1 ;Vergleiche "wait2" mit 0. Wenn ungleich 0 springe zu Warten1 dec wait1 ;Dekrementiere Register "wait1" um 1 brne Warten ;Vergleiche "wait1" mit 0. Wenn ungleich 0 springe zu Warten1 ret ;Rücksprung zum Hauptprogramm