Forum: Compiler & IDEs Doppelter Funktionsaufruf beim AT90CAN128


von Walter W. (wummpe)


Angehängte Dateien:

Lesenswert?

Moin

ich benutze 2 AT90CAN128 und möchte mehrere Bytes über den CAN-Bus
verschicken. Dazu versende ich immer 3 Datenbytes mit einigen
Zusatzinformationen (Byte Nummer) zum 2. AT90CAN128. Dieser bestätigt
dem Empfang und es werden die nächsten verschickt.

Das Problem ist, dass die Funktion (void konf_datei_senden(void)) ab
und zu doppelt ausgeführt wird, allerdings nicht doppelt aufgerufen
wird. So kommt es dazu, dass 2 oder 3 Bytes verloren gehen.

Hier mal ein kleines Beispiel, der Code ist im Anhang.

. => µC empfängt die Empfangsbestatigung und ruft die Funktion
konf_datei_senden() auf.

-{Zahl} => Positionsnummer der verschickten Dateien

.-3.-6.-9.-12.-15.-18.-21.-24.-27.-30.-33.-36-38.-41.

Wie man sieht wird beim 36 Byte die Funktion nachmal ausgeführt ohne
das eine Empfangsbestätigung vorhanden ist.
Hatte jemand schonmal so ein ähnliches Problem?

Gruß
Wummpe

von peter dannegger (Gast)


Lesenswert?

Schmeiß mal schnell cli/sei aus den Interrupts raus, das ist Mumpitz.
Sollte eigentlich jeder wissen, der mal ein AVR-Datenblatt in der Hand
gehalten hat.


Daß Bytes verloren gehen, ist vollkommen normal, wenn Du so einen
riesen Zeitvernichter wie printf im Interrupt ausführst.

Solche Programme funktionieren nie !

Wenn Du Glück hast, benötigt printf den UART-Interrupt und Du hast nen
prima Deadlock.


Peter

von johnny.m (Gast)


Lesenswert?

Damit jetzt nicht nochmal alles durchgekaut werden muss, lies mal z.B.
http://www.mikrocontroller.net/forum/read-2-351284.html

von Walter W. (wummpe)


Lesenswert?

@peter dannegger:
cli() und sei() habe ich erst reingepackt als es Probleme gab, genauso
wie die printf Anweisung. Diese habe ich nur zum Auffinden des Fehlers
reingepackt. Aber auch ohne diese Sachen kommen die Daten nicht richtig
an.

@johnny.m:
Ich weiss nicht wie mir der Beitrag helfen soll. Die ISR vom CAN wird
nicht zweimal aufgerufen, nur die Funktion die die Daten versendet wird
2x ausgeführt.

wummpe

von peter dannegger (Gast)


Lesenswert?

@Wumpe

"Aber auch ohne diese Sachen kommen die Daten nicht richtig an."


Und warum führst Du uns dann erst auf die falsche Fährte und schickst
nen aufgeblähten Code ?

Denkst Du, sowas macht Spaß ?


Außerdem schicken Leute in der Regel immer genau das Codefragment an
dem es garantiert nicht liegt.

Und dann natürlich eins, das nicht mal compilierbar ist.

Sehr gerne wird auch was geschickt, was nicht mit dem getesten Code
übereinstimmt.

Selbst wenn man nur einen Kommentar rausnimmt, muß man es nochmal
testen, ob der Fehler immer noch da ist.

Und wenn 2 MCs beteiligt sind, muß man natürlich auch beide Programme
schicken.


Also mir ist die Lust vergangen.


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