Forum: Mikrocontroller und Digitale Elektronik Interrupt im Interrupt konfigurieren :-)


von Jens Lampe (Gast)


Lesenswert?

Hallo zusammen, brauche mal kurz eine schnelle Hilfe.

Ich möchte eine Flankenerkennung mit einem ext. Interrupt realisieren.

Bei der Poitiven flanke soll er das erste mal auslösen und dann im 
interrupt auf eine negative erkennung umstellen.

Klappt noch nicht!!!!!

Hat jemand ne idee?


..hier mal angedeutet was ich will

SIGNAL (SIG_INTERRUPT3)
{
if(dummy==0)
{   uart_puts("positive Flanke");
    EICRA|= (1<<ISC31)|(0<<ISC30);//config für fallende flanke
    dummy=1;
}
else
{    uart_puts("negative Flanke");
     EICRA|= (1<<ISC31)|(1<<ISC30);//config für steigende flanke
     dummy=1;


}

Hauptprogramm:
...INIT...

sei();
EIMSK|=(1<<INT3);
EICRA|= (1<<ISC31)|(1<<ISC30);//für positive Flanken

EIFR=0xFF;

for(;;);

von Peter II (Gast)


Lesenswert?

EICRA|= (1<<ISC31)|(0<<ISC30);//config für fallende flanke

das ist falsch, man kann so kein bit löschen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter II schrieb:
> das ist falsch, man kann so kein bit löschen.

Am besten ist es, das ganze EICRA-Register neu zu beschreiben,
statt so eines umständlichen read-modify-write.

von Falk B. (falk)


Lesenswert?

@  Jens Lampe (Gast)

>Klappt noch nicht!!!!!

>Hat jemand ne idee?

Dazu muss man die entsprechenden Bits KOMPLETT überschreiben, nicht nur 
neu setzen. Ausserdem sollte man sich über Bitmanipulation 
informieren und feststellen, dass man sinnvoll keine Null schieben kann.

>if(dummy==0)
>{   uart_puts("positive Flanke");
>    EICRA|= (1<<ISC31)|(0<<ISC30);//config für fallende flanke

Eher so

     EICRA &= ~((1<<ISC31)|(0<<ISC30));
     EICRA |= (1<<ISC31);

>     EICRA|= (1<<ISC31)|(1<<ISC30);//config für steigende flanke

Dito.

     EICRA &= ~((1<<ISC31)|(0<<ISC30));
     EICRA |= (1<<ISC31)|(1<<ISC30);

Ausserdem kann es nötig sein, direkt nach der Flankenumstellung einen 
parasitär erzeugten Interrupt zu löschen, der eben durch die Umstellung 
generiert wurde. Durch Schreiben einer 1 auf das passende Flag.

MfG
Falk

von Rangi J. (rangi)


Lesenswert?

und dummy bitte auf 0 im elsezweig

von Rangi J. (rangi)


Lesenswert?

alternativ auch als einzeiler ohne dummy und if else:
1
EICRA ^= (1<<ISC30);

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.