Ich besitze seit 2 Tagen einen Atmega16 und spiele gerade ein bisschen damit rum. Mein LCD kann ich schon ansteuern und jetzt will ich noch das er auf Tastendrücke reagiert(per Interrupt). Ich habe je einen Taster an INT0 und INT1 mit Pull up-widerständen angeschlossen und dazu folgendes Programm geschrieben: .ORG $0000 rjmp main ; Reset-vector rjmp taste0 ; External Interrupt Request 0 rjmp taste1 ; External Interrupt Request 1 ........ LDI mp,LOW(RAMEND) ;Initiate Stackpointer OUT SPL,mp ; wegen verwendeten Unterprogrammen LDI mp,HIGH(RAMEND) OUT SPH,mp ldi r16,0b11000000 ;int1 und int 0 anschalten out GICR,R16 ldi r16,0b00001010 ;int1 und int00 auf fallende Flanke out mcucr,r16 sei .... taste0: push r16 in r16,sreg push r16 .... pop r16 out sreg,r16 pop r16 reti taste1: push r16 in r16,sreg push r16 ..... pop r16 out sreg,r16 pop r16 reti Mein Problem: Es wird nur ein Interrupt ausgelöst wenn ich auf Taste 1 Drücke. Bei Taste 0 passiert nichts. Ich hänge jetzt schon seit Stunden daran und mir sind die Ideen ausgegangen. Habe ich was an den Interruptregistern falsch eingestellt?
.ORG $0000 rjmp main ; Reset-vector rjmp taste0 ; External Interrupt Request 0 rjmp taste1 ; External Interrupt Request 1 statt rjmp jmp verwenden, fertig.
Danke hat geklappt. Aber warum geht Rjmp nicht. Mein Programm besteht aus 298 bytes und ich dachte rjmp geht bis + - 2*1024 bytes?
> Aber warum geht Rjmp nicht. Weil bei AVRs mit mehr als 8 KB Flash für jeden Interruptvektor zwei Adressen reserviert sind, damit der 32-Bit-Befehl JMP hineinpasst und damit der gesamte Adressraum erreicht werden kann. RJMP würde gehen, wenn Du dahinter einen Dummy-Befehl setzt, der die Lücken in der Vektortabelle füllt. ...
oder mit .org jeden Vektor die physikalische Adresse direkt zuweist. Nutzt aber nichts, mehr Schreiberei für nichts. Ansonsten: es ist i.a. besser, für Taster gar keine Interrupts zu verwenden, sondern in einem Timerinterrupt zu pollen.
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.