Hallo,
vielleicht hilft es dir, wenn ich hier mal ein paar allgemeine Tips zur Programmierung von Mikrocontrollern in Assembler gebe.
Ich nutze dazu einmal deinen Code, um zu zeigen wie es besser geht.
1. geize nicht mit Kommentaren aber vermeide "sinnfreie" oder selbsterklärende Komentare.
Beispiel:
dein Code:
besser:
Code:
mov temp2,R0 ; um dieses oder jenes zu erreichen
wesentlich schlechter:
Code:
mov temp2,R0 ; Inhalt von R0 -> temp2
2. vermeide wann immer es geht die binäre Schreibweise, da diese meistens ziemlich nichtssagend ist.
dein Code:
Code:
ldi temp,0b00000101
out TCCR1B,temp
besser:
Code:
ldi temp, (1<<CS12) | (1<<CS10)
out TCCR1B,temp
der Vorteil:
wenn man in einigen Wochen doch noch einmal in den Code schaut, wird es fast auf einen Blick klar, was dort nun in das entsprechende Register wandert (in dem Fall die Prescaler Einstellungen für den Timer Takt).
3. Sichere wann immer es geht das Statusregister, auch wenn du es im Moment nicht benötigst.
Der Vorteil: du vergisst es nicht, wenn du doch einmal dein Programm erweiterst und du es dann doch mal brauchst.
Beispiel:
Code:
: ------- irgendwo am Anfang:
.def sregsave = r3
; in der ISR
ISR:
in sregsave, SREG ; Statusregister sichern
out SREG, sregsave
reti
4. egal was du machst, vermeide lange ISR's (Interupt Service Routinen)
defakto ist es wesentlich besser und eleganter sich ein eigenes Statusregister zu definieren und anschließend dort ein Bit zu setzen als durch lange ISR's den controller zu blockieren.
Beispiel:
Code:
: ------- irgendwo am Anfang:
.def status = r17 ; statusregister
; 7 =
; 6 =
; 5 =
; 4 =
; 3 =
; 2 =
; 1 =
; 0 = Ampel aktuallisieren
; im Code
sbrc status, 0 ; ampel aktuallisieren ?
rcall ampel_update ; -> Ja
; restlicher Code
ampel_update:
andi status, 0b11111110 ; Ampel aktuallisieren Flag löschen
; Code
ret
; in der ISR
ISR:
in sregsave, SREG ; Statusregister sichern
ori status, 0b00000001 ; Ampel aktuallisieren Flag setzen
out SREG, sregsave
reti
So, ich hoffe dir damit ein klein wenig geholfen zu haben.
BTW: Der Wurm bei dir liegt nicht an der fehlenden Sicherung des Statusregisters, sondern an der etwas deplazierten Wertetabelle.
Hier noch einmal ein grober Strukturansatz:
1. nötiges Include File laden
2. Aliase für Register definieren
3. Aliase für speicheradressen definieren
4. Konstanten definieren
(danach nen .cseg & .org 0x00)
5. Interupt Vektoren
6. Reset Rioutine mit:
- Stack initialisieren
- Speicher leeren
- Peripherie initialisieren (Timer, Ports etc)
7. Main Loop
8. Sub Routinen
9. ISR Routinen
10. Diverse Datentabellen.
Grüße,
da Hanni.
Lesezeichen