Forum: Mikrocontroller und Digitale Elektronik ISR funktioniert nicht


von Stefanie (Gast)


Lesenswert?

Hallo, ich habe einen ATmega128 und einen CC2420 und möchte die Signale
von einem anderen CC2420 empfangen.
Die ISR soll von einem steigenden Pegel an PE4 (int4) ausgelöst werden.

Hier die wichtigsten Codeausschnitte:

volatile uint8_t packet_pending = 0;

int init(void)
{ ...
   EIMSK = (1<<INT4);
   EICRB |= (1<<ISC41) | (1<<ISC40);
...
}


ISR(INT4_vect) {
DISABLE_FIFOP_INT;
if(FIFOP_SET && !FIFOP_SET) {
      cc_strobe(CC2420_SFLUSHRX);
      cc_strobe(CC2420_SFLUSHRX);
      goto out;
   }
   cc_strobe(CC2420_SACK);

   packet_pending++;
out:
   ENABLE_FIFOP_INT;
}

int main(void)
{...
   init();
   cc_strobe(CC2420_SRXON);
   for(;;) {
     wdt_reset();
     if(packet_pending > 0) {
     if((buffer = (struct com_buf *)malloc(sizeof(struct com_buf))) ==
NULL) {
        fputs("No memory\r\n", uart);
        break;
       }
    if(read_rx_fifo(buffer)) {
    ...

doch leider führt mein Programm nur manchmal die ISR und dann auch nur
einmal aus.
Mit dem Oszi sehe ich aber ständig steigende Flanken, was mach ich nur
falsch?

von johnny.m (Gast)


Lesenswert?

Ich weiß nicht, was die Funktionen in der ISR machen, aber wenn die eine
gewisse Größe haben (bzw. Laufzeit), dann wundert es wenig, dass was
verloren geht. Außerdem sehe ich ein goto in der ISR. Wenn Du ein
funktionierendes Programm haben willst, dann verzichte völlig auf goto.
goto hebelt den größten Vorteil der Programmiersprache C aus, nämlich
den der strukturierten Programmierung. Es gibt nur ganz wenige wirklich
sinnvolle Anwendungen für goto, und die Anweisung lässt sich (manchmal
mit ein wenig Trickserei) eigentlich immer vermeiden. Vielleicht ist
das bei Dir ne Fehlerquelle. Sollte mich jedenfalls nicht wundern...

von johnny.m (Gast)


Lesenswert?

Hier mal ein Zitat aus 'The C Programming Language' von Kernighan /
Ritchie (das sind die wo C erfunden haben):
"C provides the infinitely-abusable goto statement, and labels to
branch to. Formally the goto is never necessary, and in practice it
is almost always easy to write code without it."

goto macht wirklich nur dann u.U. Sinn, wenn man irgendwelche tief
verschachtelten Strukturen hat und mehrere Schleifen auf einmal
abbrechen will. Da das bei Dir nicht der Fall ist, sei Dir dringend
geraten, auf goto zu verzichten.

Es gibt hier im Forum auch ein paar Threads zum Thema goto (v.a. im
GCC-Forum). Einfach mal suchen.

von Peter D. (peda)


Lesenswert?

Das if..goto hier kann man durch das if..else ersetzen, sollte aber
primär mit dem Problem nichts zu tun haben.

if..else ist halt gebräuchlicher.


Solange man keinen compilierbaren Code hat, kann man zum Fehler
überhaupt nichts sagen. Da sind einfach viel zu viele Unbekannte drin.

In C kann schon ein fehlendes ; die merkwürdigsten Effekte haben.


Bei ISRs sollten man immer den Vektornamen angeben, statt eine feste
Nummer. Die verschiedenen AVRs haben leider auch die Vektoren an
verschiedenen Stellen.


Peter

von arc (Gast)


Lesenswert?

if (FIFOP_SET && !FIFOP_SET)
    ^^^^^^^^^^^^^^^^^^^^^^^ ?

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.