mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ISR funktioniert nicht


Autor: Stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (FIFOP_SET && !FIFOP_SET)
    ^^^^^^^^^^^^^^^^^^^^^^^ ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.