Hey, die Befehle gefallen mir![]()
Hab das nun auch gleich umgesetzt:
Funktioniert alles wunderbar. Mit diesem Code hab ich auch nicht mehr das Problem, dass ab und zu das Lauflicht nicht mehr geht. Ich kann das Netzteil an und ausschalten wie ich will, das Lauflicht geht immer.Code:;Dieses Programm produziert ein Lauflicht. Jede halbe Sekunde geht die ;nächste LED an. ;Das Programm läuft in einer Endlosschleife durch. .include "m8def.inc" .equ time1 = 65536-1800 ;Damit wird der Timer1 vorgeladen, für die halbe Sekunde .def tmp = r16 ;Mein Universallregister .def statusLED = r17 ;In diesem Register wird gespeichert, welche LED gerade leuchtet .org 0x000 rjmp reset ;Interruptvektor "reset:" .org OVF0addr rjmp hSekEnde ;Interruptvektor für Timer0 Überlauf, hier springt ;das Programm hin, wenn der Timer überläuft reset: ;Stack einrichten ldi tmp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse out SPH, tmp ldi tmp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse out SPL, tmp ldi tmp, 0b11111111 out DDRB, tmp ;PortB als Ausgang ldi statusLED, 0b00000010 out PORTB, statusLED ;Am Anfang soll LED1 leuchten ;Timer Register für halbe Sekunde werden belegt, hier Timer1 ldi tmp, (1<<CS12) | (1<<CS10) ;Prescaler ist 1024 out TCCR1B, tmp ldi tmp, HIGH(time1) ;Für den Timer1 (16Bit) benötigen out TCNT1H, tmp ;wir 2 Register, in denen wir den Wert ldi tmp, LOW(time1) ;für die 1/2 speichern -> out TCNT1L, tmp ;"TCNT1H" und TCNT2L" ldi tmp, (1<<TOIE1) ;Hier werden Interrupts nach Timer1 Überlauf eingeschaltet out TIMSK, tmp ;Register TIMSK ist dafür zuständig sei ;Interrupts zulassen main: rjmp main ;Immer wieder die main durchlaufen ;Jede halbe Sekunde wird geprüft, welche LED an ist und dementsprechen die ;nächste LED angemacht. Die aktuelle wird dabei natürlich ausgeschaltet hSekEnde: push tmp ;tmp-Register auf Stack sichern in tmp, SREG push tmp ;SREG auf Stack sichern ;TIMER1 wird neu geladen ldi tmp, HIGH(time1) ;Für den Timer1 (16Bit) benötigen out TCNT1H, tmp ;wir 2 Register, in denen wir den Wert ldi tmp, LOW(time1) ;für die 1 Sekunde speichern -> out TCNT1L, tmp ;"TCNT1H" und TCNT2L" cpi statusLED, 0b00001000 ;Leuchtet die 3. LED? breq wiederholen ;Wenn JA... lsl statusLED ;Wenn NEIN, Register "statusLED" mit 2 multiplizieren ;dadurch verschieben sich alle Bits um 1 nach link -> ;nächste LED blinkt rjmp ende wiederholen: ldi statusLED, 0b00000010 ;Wieder erste LED leuchten lassen ende: out PORTB, statusLED ;nächste LED leuchtet pop tmp out SREG, tmp ;SREG wiederherstellen pop tmp ;tmp wiederherstellen reti ;springe wieder dahin, wo du hergekommen bist
Komisch naja...ich hab dem Support ja meinen Code mitgeschickt, vlt. ist ja daran doch was nicht in Ordnung.![]()
PS: Hab durch die neuen Befehle 8 Zeilen gespartHört sich wenig an, aber bei Assembler muss man ja "sparsam" sein
![]()







Zitieren

Lesezeichen