Interrupt bei steigender und fallender Flanke möglich?

OP #366765
Lesenswert?

Hi Leute,
ich habe folgende Interrupt routine
1
ISR(INT0_vect)  //Signal on ext. Interrupt
2
{
3
   Tog_Bit(CH2OUT);    
4
   if (!(MCUCR & (1<<ISC00)))    // if rising edge enabled
5
  MCUCR |= (1<<ISC00);    // then delete rising edge bit
6
   else
7
  MCUCR &= (1<<ISC00);    // else set rising edge bit
8
}

Ich möchte, das der Ausgang sowohl bei steigender als auch bei
fallender Flanke wechselt. Leider wechselt der nur einmal nach dem
Starten und danach passiert nichts mehr.
Darf ich das MCUCR Register innerhalb eines Interrupt nicht wechslen,
oder hab ich da nen Denkfehler?

mfg
  Werner
OP #366766
Lesenswert?

hier nochmal der Code richtig formatiert ;-)
1
ISR(INT0_vect)  //Signal on ext. Interrupt
2
{
3
   Tog_Bit(CH2OUT);
4
   if (!(MCUCR & (1<<ISC00)))           // if rising edge enabled
5
      MCUCR |= (1<<ISC00);              // then delete rising edge bit
6
   else
7
      MCUCR &= (1<<ISC00);              // else set rising edge bit
8
}
OP #366769
Lesenswert?

War wohl ein wenig spät für mich...
  ich werde beim löschen immer &= ~(1<<bit) schreiben
  ich werde beim löschen immer &= ~(1<<bit) schreiben
  ich werde beim löschen immer &= ~(1<<bit) schreiben
  ich werde beim löschen immer &= ~(1<<bit) schreiben
  ich werde beim löschen immer &= ~(1<<bit) schreiben
  ich werde beim löschen immer &= ~(1<<bit) schreiben

Danke Roland
Gast #366771
Lesenswert?

Genau. Und zusätzlich (vorausgesetzt die Möglichkeit besteht): Wenn Du
anstelle des 90S2313 nen Tiny2313 nimmst (pinkompatibel), brauchst Du
die Umschalterei evtl. gar nicht zu machen, weil die externen
Interrupts da auch auf Reaktion auf 'any logical change'
programmierbar sind (also die Konfiguration der ISC0x-Bits, wo beim
90S2313 'reserved' im Datenblatt steht). Dann reagieren sie auf jede
Flanke.
Gast #366772
Lesenswert?

@Reiner
das mit dem ^= kannte ich noch nicht. Ist aber (hoffentlich) besser zu
merken als das andere...
@johnny.m
is für privat und von den 90S2313 hab ich noch nen paar zuhause.
Ansonsten ist das mit dem Tiny bestimmt eleganter.

Besten Dank für die Unterstützung

Werner
#366773
Lesenswert?

> das mit dem ^= kannte ich noch nicht.

Das macht aber genau genommen, ganz was anderes.
Das toggelt den einen Pin:
War er vorher auf 1, dann wird er auf 0 gesetzt
War er vorher auf 0, dann wird er auf 1 gesetzt

Da du toggeln möchtest, ist das das Werkzeug deiner
Wahl. Das befreit dich aber nicht davon, dir zu merken,
wie man ein Bit (egal ob am Port oder in einer Variablen)
gezielt auf 1 bzw. auf 0 setzt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren