Forum: Mikrocontroller und Digitale Elektronik Collision detection mit UART-Hardware


von Björn C. (bjoernc) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo, ich habe da ein kleines Problem mit der UART bzw. mit den 
Interrupts des AVRs. Aber erstmal zu meiner Anwendung: Ich möchte einen 
kleines RS485 Protokoll schreiben, wobei eine Kollisionsdetektierung 
ähnlich wie bei Ethernet implementiert werden soll. Der RS485 treiber 
selbst macht da keine größeren Probleme, da ich während des Sendens 
mitlesen kann. Für die ersten Tests habe ich begonnen, RX und TX des 
ATMega mit einander zu verbinden. Dabei wird das Senden und Empfangen 
über Interrupts getriggert (UDRE-ISR und RXC-ISR).

Das große Problem ist aber, dass der uC quasi abstürzt, was sich durch 
ein reset äußert. Dabei habe ich bisher schon ausschließen können, dass 
ein falscher Interrupt aktiv wird. Ausserdem konnte ich mittlerweile die 
Anzahl der Pakete ermitteln, bis wann der uC noch funktioniert ohne das 
dieser abstürzt (6*8 Bit-Pakete). Bei 5 Paketen läuft der uC scheinbar 
ohne Probleme (habe dieses nun über einen Zeitraum von 40 Minuten 
getestet - aber ein langsames überlaufen des Stacks oä. kann ich dennoch 
nicht ausschließen).

Meine Vermutung ist, dass der Stack überläuft - wobei ich mir nicht 
erklären kann, warum dies so ist. Bisher war meine Meinung, dass der AVR 
keine Interrupts unterbricht, solange man in einer ISR ein sei(); 
einfügt und das, dass Interruptflag erst nachdem verlassen der ISR 
(inkl. der pop-Befehle) zurückgesetzt wird. Aber damit der Stack 
überläuft muss die ISR selbst unterbrochen werden - was natürlich auch 
plausibel wäre, da die beiden ISRs zeitlich sehr nahe beieinander 
liegen. Aber das steht wiederum im Konflikt mit den vorherigen 
Eigenschaften, wie der AVR die Interrupts verarbeitet, daher steh ich 
derzeit echt ein wenig auf dem Schlauch, was den Fehler nun genau 
verursacht.

Meine Frage wäre daher, hat jemand evtl. eine Vermutung oä. woran dies 
nun liegen kann? Oder ob es "nur" ein Konfigurationsfehler ist ( Code 
habe ich diesem Beitrag beigelegt)?

von Björn C. (bjoernc) Benutzerseite


Lesenswert?

So ich mal wieder, das Problem hat sich mittlerweile erledigt. Der 
Fehler saß wie so oft 50 cm vor dem Bildschirm. Ich habe nochmals die 
äußere Beschaltung überprüft. Dabei fiel mir auf, dass an einer der LEDs 
der-Vorwiderstände falsch war. Statt 1,2kOhm war dort nur ein 120 Ohm 
Widerstand verlötet. Nachdem ich das korrigiert hatte, läuft nun alles 
wie am schnürchen. Ich schätze mal, dass durch die zu hohe Belastung an 
dem jeweiligen Port es zu internen Spannungseinbrüchen kam, der ein 
Reset ausgelöst hat. Damit wäre zumindest aus meiner Sicht der Fehler 
plausibel.

Also dann noch einen schönen Nachmittag.

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.