Forum: Compiler & IDEs Interrupt bei steigender und fallender Flanke möglich?


von Werner A. (homebrew)


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

von Werner A. (homebrew)


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
}

von Werner A. (homebrew)


Lesenswert?

nochwas vergessen...
Prozessor ist ein AT90S2313

von Roland Schmidt (Gast)


Lesenswert?

Lies dir den Absatz über das Setzen und Löschen von Bits aus dem
AVR-GCC-Tutorial noch einmal durch.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Schreiben_von_Bits

von Werner A. (homebrew)


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

von Reiner (Gast)


Lesenswert?

Hallo Roland,

Wie wäre es denn mit
MCUCR ^= (1<<ISC00);

Reiner

von johnny.m (Gast)


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.

von Werner A. (Gast)


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

von Karl heinz B. (kbucheg)


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.

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.