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