Forum: Mikrocontroller und Digitale Elektronik Externer Interrupt steigende Flanke


von Simon (Gast)


Lesenswert?

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

von hdd (Gast)


Lesenswert?

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.

von Helfer (Gast)


Lesenswert?

1
; 
2
; Nach http://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts
3
; 
4
.include "m48def.inc"
5
 
6
.def temp = r16
7
 
8
.org 0x0000
9
         rjmp main            ; Reset Handler
10
.org INT1addr
11
         rjmp int1_handler    ; IRQ1 Handler
12
13
main:                         ; hier beginnt das Hauptprogramm
14
 
15
         ldi temp, LOW(RAMEND)
16
         out SPL, temp
17
         ldi temp, HIGH(RAMEND)
18
         out SPH, temp
19
 
20
         ldi temp, (1<<ISC11)  ; INT1 auf fallende Flanke konfigurieren
21
         sts EICRA, temp
22
23
         ldi temp, (1<<INT1)   ; INT1 aktivieren
24
         out EIMSK, temp
25
 
26
         sei                   ; Interrupts allgemein aktivieren
27
 
28
loop:    rjmp loop             ; eine leere Endlosschleife
29
 
30
int1_handler:
31
         reti

von Simon (Gast)


Lesenswert?

> 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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Helfer (Gast)


Lesenswert?

Was hast du wie an INT1 angeschlossen? Eventuell notwendigen 
Pullup-Widerstand beachtet?

von Thomas E. (thomase)


Lesenswert?

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.

von Simon (Gast)


Lesenswert?

> 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?

von Thomas E. (thomase)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Simon (Gast)


Lesenswert?

OK, danke an alle für die Hilfe. Dann werde ich mich wohl noch etwas 
fortbilden. Danke nochmal!

von Selt Same Voegel (Gast)


Lesenswert?

Hh: Hardware hilft !
Schalte einen Inverter vor den INT_Eingang !
Deine steigende Flanke wird zur Fallenden .

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
Noch kein Account? Hier anmelden.