Collision detection mit UART-Hardware

OP Persönliche Seite #2376763
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)?
Angehängte Dateien:
OP Persönliche Seite #2377703
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.