ein Kurzer blick ins Datenblatt liefert:
[asm]
Address LabelsCodeComments
.org 0x001
0x001 rjmp EXT_INT0 ; IRQ0 Handler
0x002 rjmp EXT_INT1 ; IRQ1 Handler
[/asm]
dort steht also bei org die 0x01.
Für den ATMega328P die Adresse für den INT0 ist 0x0002:
1 0x0000 RESET External Pin, Power-on Reset, ...
2 0x0002 INT0 External Interrupt Request 0
3 0x0004 INT1 External Interrupt Request 1
...
Ich habe auch INT0addr staat 0x0002 benutzt und es hat auch nicht
funktioniert.
Wenn Ich out für EICRA benutze bekomme Ich "Operand 1 out of range:
0x69".
Ich habe "out" statt "sts" für EIMSK, MCUCR und EIFR benutzt aber es
funktioniert auch nicht.
> ldi temp, (1 << IVSEL)> sts MCUCR, temp
Der tiefere Sinn hierfür?
Aus dem Datenblatt:
"When the IVSEL bit is cleared (zero), the Interrupt Vectors are placed
at the start of the Flash memory. When this bit is set (one), the
Interrupt Vectors are moved to the beginning of the Boot Loader section
of the Flash."
Auf welche Weise stellst Du denn fest, das es nicht funktioniert?
Du könntest zuerst einmal im Simulator schauen, ob die Bits der
Steuerregister wie gewollt gesetzt werden.
Zuletzt kann man dort auch sehen, ob die ISR angesprungen wird.
Ich habe mir den Code nicht im Detail angeschaut, aber das
"ausprobieren" von STS anstelle OUT könnte bedeuten, dass evtl. nicht
bekannt ist, dass etwa EIMSK unter zwei Adressen erreichbar ist, die
sich aber darin unterscheiden ob sie mit OUT oder STS benutzt werden.
Die Definition von EIMSK in den include-Files (das ich übrigens in
Deinem Quellcode nicht sehe), ist nur für einen der beiden Fälle
ausgelegt. D.h.: Man kann OUT EIMSK, ... nicht einfach durch STS EIMSK,
... ersetzen.
Bei den hohen Adressen über 0x5F wirst Du gewarnt, wenn Du OUT verwenden
willst, aber umgekehrt, bei den niedrigen Adressen gibt es keine
Warnung, denn damit sind sowohl OUT als auch STS anwendbar. Nur sind das
physisch zwei verschiedene Register.
@Theor:
Für EIMSK kann ich auch OUT oder STS benutzen und bekomme weder eine
Warnung noch einen Error.
Wie soll ich sonst auf das Register EICRA zugreifen?
@Landholt: INT0 hat einen 47Ohm Pull-Down Widerstand. Für EICRA benutze
beide ISC01 und ISC00 1, das bedeutet dass, Eine steigende Flanke den
Interrupt auslöst.
Um die Sache abzukürzen: an PB1 LED+R, an INT0 ein externer Pullup und
Taster gegen GND, dann läuft, d.h. die LED wird per Tastendruck
umgeschaltet (mit Prellen), folgendes Programm bei mir:
Antonis schrieb:> INT0 hat einen 47Ohm Pull-Down Widerstand. Für EICRA benutze> beide ISC01 und ISC00 1, das bedeutet dass, Eine steigende Flanke den> Interrupt auslöst.
Gegen eine 47Ω-Widerstand? Der Eingang reagiert auf Spannung, nicht auf
Wärme.
Antonis schrieb:> ldi temp, (1 <<IVSEL )> out MCUCR, temp>> kommentiert und nochmal versucht. Funktioniert auch nicht.
Natürlich nicht. Was soll das überhaupt?
Antonis schrieb:> Ich sollte OUT für EIMSK benutzen.
Das hat dir doch der Landolt schon gesagt.
S. Landolt schrieb:> EIMSK, MCUCR und EIFR werden per out angesprochen, siehe im> Datenblatt> 'Register Summary'.