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
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
Damit jetzt nicht nochmal alles durchgekaut werden muss, lies mal z.B. http://www.mikrocontroller.net/forum/read-2-351284.html
@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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.