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)?