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?
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...
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.