Was bedeutet der Fehler? Ich vermute, das hat was mit Interruptvektoren
zu tun.
Hier das Programm:
.include "m8def.inc"
.def tmp1 = R16
ldi tmp1,HIGH(RAMEND)
out SPH,tmp1
ldi tmp1,LOW(RAMEND)
out SPL,tmp1
.equ MPORT = PORTC
.equ IN1 = PC0
.equ IN2 = PC1
.equ IN3 = PC2
.equ IN4 = PC3
.equ ENA = PC4
.equ ENB = PC5
reset:
ldi tmp1, 0xFF
out DDRC, tmp1
cbi DDRD, PD2 //Taster1, ENon
cbi DDRD, PD3 //Taster2, ENoff
sbi DDRD, PD5 //Led1
sbi DDRD, PD6 //Led2, EN Status
sbi PORTD, PD6
cbi MPORT, ENA
cbi MPORT, ENB
ldi tmp1, (1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20) //CTC Modus
out TCCR2, tmp1
ldi tmp1, (1<<OCIE2) //CTC Interrupt enable
out TIMSK, tmp1
ldi tmp1, 0xF0
out OCR2, tmp1
rjmp main
.org OC2addr //Compare Match Interrupt
rjmp match
main:
sbic PIND, PD2 //Taster abfrage
rcall ENon
sbic PIND, PD3
rcall ENoff
rjmp main
match:
sbis PIND, PD5
rjmp LED1on
sbic PIND, PD5
rjmp LED1off
LED1on:
sbi PORTD, PD5
reti
LED1off
cbi PORTD, PD5
reti
ENon:
sbi PORTD, PD6
sbi MPORT, ENA
sbi MPORT, ENB
ret
ENoff:
cbi PORTD, PD6
cbi MPORT, ENA
cbi MPORT, ENB
ret
Die Interuptvektoren muessen vor das eigetliche Hauptprogramm. Dann gibts auch keine Probleme :) also .org 0x00 rjmp reset .org OC2addr //Compare Match Interrupt rjmp match reset: # der rest deines Programms#
Hallo, zum Verständnis etwas länger: der Assembler macht genau, was Du ihm sagst. reset: ldi tmp1, 0xFF out DDRC, tmp1 usw. rjmp main Da Du ihm nicht sagst, wo er den Kram hinschreiben soll (.org) beginnt er bei Adresse 0x0000 und schreibt Deine befehle der Reihe nach rein. rjmp main landet also irgendwo bei 0x0016 (jetzt nicht genau nachgerechnet...), der Zähler zeigt also auf 0x0017 Jetzt kommt Dein .org OC2addr //Compare Match Interrupt rjmp match Der Assembler holt sich also den Wert für =C2addr aus m8def.inc und will seinen Zähler auf Adresse 0x0003 setzen und... wundert sich sehr, weil da schon cbi DDRD, PD2 steht und teilt Dir genau dieses mit. Theoretisch kann man die Vektorliste auch ans Programm-Ende schreiben mit .org INT_VECTORS_SIZE reset: ldi tmp1, 0xFF out DDRC, tmp1 usw. rjmp main .org 0x0000 rjmp reset .org OC2addr //Compare Match Interrupt rjmp match macht die Sache nur nicht unbedingt übersichtlicher... Gruß aus Berlin Michael
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.