Ich probier jetzt schon seit mehreren Stunden, den externen Interrupt an
meinem AtMega 48 zum Laufen zu bekommen. Ich möchte, dass er bei
steigender Flanke ausgelöst wird. Doch anscheinend wird der INT1 immer
aufgerufen, wenn der PORT, an den er angeschlossen ist, 0 ist. Mein Code
sieht folgendermaßen aus:
1
ldi temp1, (1<<ISC11) ; INT1 auf steigende Flanke konfigurieren
2
sts EICRA, temp1
3
ldi temp1, (1<<INT1) ; INT1 aktivieren
4
out EIMSK, temp1
Hoffentlich kann mir irgendwer helfen, wie ich das richtig machen muss.
Danke!
mfg
Simon
Bist du dir mit
> ldi temp1, (1<<ISC11) ; INT1 auf steigende Flanke konfigurieren
sicher?
Laut Datenblatt bekommst du mit ISC11 den Interrupt auf fallende Flanke.
> Bist du dir mit>> ldi temp1, (1<<ISC11) ; INT1 auf steigende Flanke konfigurieren> sicher?> Laut Datenblatt bekommst du mit ISC11 den Interrupt auf fallende Flanke.
Stimmt, ich muss ja auch noch ISC10 auf 1 setzen, damit er bei
steigender Flanke reagiert. Aber ich habe das so auch schon probiert:
1
ldi temp1, (1<<ISC11)|(1<<ISC10) ; INT1 auf steigende Flanke konfigurieren
2
sts EICRA, temp1
3
ldi temp1, (1<<INT1) ; INT1 aktivieren
4
out EIMSK, temp1
und wieder wird der Interrupt ständig ausgelöst, wenn der PIN auf 0 ist.
Ich glaube inzwischen, dass der obige Code gar nichts in den
entscheidenden Registern verändert, weil egal was ich da reinschreibe,
das Problem bleibt bestehen. Trotzdem danke für deinen Tip!
Simon schrieb:> Ich glaube inzwischen, dass der obige Code gar nichts in den> entscheidenden Registern verändert, weil egal was ich da reinschreibe,> das Problem bleibt bestehen. Trotzdem danke für deinen Tip!
Lad den Code in den Simulator vom AVR-Studio, geh ihn in Einzelschritten
durch und sieh dir jeweils an, ob die richtigen Bits in den richtigen
Registern gesetzt sind.
12. External Interrupts
...
Observe that, if enabled, the interrupts will trigger even if the INT0
and INT1 or PCINT23..0 pins are configured as outputs.
...
mfg.
> Was hast du wie an INT1 angeschlossen? Eventuell notwendigen> Pullup-Widerstand beachtet?
Ich habe einfach einen Taster, der, wenn er gedrückt wird, 5 V "ausgibt"
an INT1 angeschlossen. Wenn der Taster geöffnet ist, liegt am Pin weder
GND noch 5V an. Ich dachte, ich könne auf einen Pullup-Widerstand
verzichten, bei solch einer simplen Anordnung. Aber wenn ich den Taster
drücke, wird die endlose Abfolge von Interrupts unterbrochen solange ich
ihn gedrückt halte. Könnte dann ein fehlender Pullup-Widerstand das
Problem sein?
Simon schrieb:> Könnte dann ein fehlender Pullup-Widerstand das Problem sein?
Ja in deinem Fall allerdings Pulldown.
Schliess' den Taster so an, wie man das schon immer gemacht hat:
Pin auf Ausgang, Pullup high, Taster auf GND, Interrupt auf fallende
Flanke. Kein externer Widerstand.
mfg.
Simon schrieb:>> Was hast du wie an INT1 angeschlossen? Eventuell notwendigen>> Pullup-Widerstand beachtet?>> Ich habe einfach einen Taster, der, wenn er gedrückt wird, 5 V "ausgibt"> an INT1 angeschlossen. Wenn der Taster geöffnet ist, liegt am Pin weder> GND noch 5V an.
Also hängt der Pin in der Luft und hat keinen definierten Pegel.
In diesem Zustand fängt der sich jedes ordinäre elektromagnetische Feld
aus der Umgebung ein, weil er wie eine Antenne wirkt. Und in deiner
Umgebung gibt es davon jede Menge.
Taster werden angeschlossen, indem man sie gegen GND schalten lässt und
im µC den Pullup-Widerstand aktiviert.
AVR-Tutorial 2. Kapitel: I/O Grundlagen