Forum: Mikrocontroller und Digitale Elektronik Arduino Mega1280 - externer Interrupt


von Tobias S. (ucfreak)


Lesenswert?

Ich möchte mit nem Arduino Mega (ATMega1280) einen Impuls erfassen. Dazu 
nutze ich nen Optokoppler um den Impuls auf einen Portpinzu "leiten".

Im Normalzustand ist der Portpin High (Pull-Up) und wenn der Impuls 
kommt, wird er auf Low gezogen (Optokopler).
Per Polling kann ich den Impuls (im Moment noch simuliert durch ein 
Netzteil, welches die Spannung erzeugt) auch erfassen, nur per Interrupt 
(was das eigentliche Ziel ist) klappt es so gar nicht.

Ich habe den Impuls an PORTE4 und PORTB7. An PORTE4 wollte ich mir die 
Falling Edge erfassen lassen und initialisere alles so:
1
// PORT E - 4 -> impulse input
2
DDRE = 0x00;
3
// set INT4 to falling edge
4
EICRB = (1 << ISC41) | (0 << ISC40);
5
// clear pending interrupts
6
EIFR = (1 << INTF4);
7
// enable INT4
8
EIMSK = (1 << INT4);
Wenn ich jetzt noch die globalen Interrupts per sei() anmache, sollte ja 
eigentlich ein Interrupt (INT4_vect) geworfen werden. Passiert aber 
nicht.

Ist mein Initialiserungscode falsch oder habt ihr noch Ideen was ich 
falsch gemacht haben könnte. Mich wundert es einfach, dass ich den 
Impuls per Polling erfassen kann, aber keinen Interrupt bekomme.

von Achim M. (minifloat)


Lesenswert?

Tobias Schlegl schrieb:
> (Pull-Up)
Und wo schaltest du den ein?
mfg mf

von Thomas E. (thomase)


Lesenswert?

Tobias Schlegl schrieb:
> oder habt ihr noch Ideen was ich falsch gemacht haben könnte.
Gesamter Code als Anhang. 0 Errors, 0 Warnings.
Sonst kann man nur raten.

mfg.

von Tobias S. (ucfreak)


Angehängte Dateien:

Lesenswert?

Mini Float schrieb:
> Tobias Schlegl schrieb:
>> (Pull-Up)
> Und wo schaltest du den ein?
Ne, ich habe nicht den internen Pull-Up genutzt sondern habe extern 
einen angelötet (10kOhm gegen 5V).

Thomas Eckmann schrieb:
> Gesamter Code als Anhang. 0 Errors, 0 Warnings.
> Sonst kann man nur raten.
Nicht wundern, im Code benutze ich auch Port B.7 Impuls (Port Change 
Interrupt), aber auch das hat nicht funktioniert.

Meine main() sieht ungefähr so aus:
1
impulseCounterInit();
2
sei();
3
4
while(true) {
5
    if(g_ImpulseReceived > 0) {
6
        impulseCounterDistanceRealFire();
7
        g_ImpulseReceived--;
8
    }
9
}

von Peter D. (peda)


Lesenswert?

volatile


Peter

von Tobias S. (ucfreak)


Lesenswert?

So ein einfaches Wort ;)

Mir ist absolut unklar wie ich das vergessen konnte. Ich werde das 
nachher gleich mal ausprobieren und hoffen das es dann funktioniert.

Thx!

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.