Forum: Mikrocontroller und Digitale Elektronik AtTiny24A externer Interrupt


von newie (Gast)


Lesenswert?

Hallo zusammen,

versuche grad meinen ersten Interrupt zu generieren und komme grad nicht 
weiter....
Ich versuche eine steigende Flanke am PB2 zu detektieren.
Hierfür möchte ich den INT0 verwenden, jedoch ohne Erfolg.

Mein Ansatz:

ISR(INT0_vect)
{
 // Mach was....
}

int main(void)
{

   DDRB = 1 << PB2;
   PORTB = 1 << PB2;

   GIFR &= 1<<INTF0;
   MCUCR &= (1<<ISC01 | 1<<ISC00);
   sei();

    while(1)
    {
    // Mach was....
    }
}


So, was mache ich falsch oder was fehlt hier noch?
Vorab besten Dank!

von erster (Gast)


Lesenswert?

newie schrieb:
>    GIFR &= 1<<INTF0;

Das ist überaus falsch.

von Yann L. (ylere)


Lesenswert?

1
MCUCR |= (1 << ISC00) | (1 << ISC01); //configure INT0: rising edge
2
GIMSK |= (1 << INT0); //enable INT0
3
sei();
4
5
ISR(EXT_INT0_vect) {
6
  /*tu etwas*/
7
}

Bitte bedenke aber, das INT0 im sleep mode nur "low level" erkennt (also 
keine egde detection) und daher in diesem Falle der pin change interrupt 
das Mittel der Wahl ist:
1
//configure pinchange interrupt on PB2/INT0/PCINT10
2
PCMSK1 |= (1 << PCINT10); //configure interrupts for the PCINT1[8:11] to PB2
3
GIMSK |= (1 << PCIE1); //enable PCINT10
4
sei();
5
/*ggf. hier sleep mode aktivieren*/
6
ISR(PCINT1_vect) {
7
  /*hier müsstest du jetzt noch feststellen, um welche flanke es sich handelt/ob PB2 high oder low ist*/
8
  /*tu etwas*/
9
}

von newie (Gast)


Lesenswert?

Vielen Dank Yann L.,

jetzt funktioniert es mit dem Interrupt :)

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.