Hallo,
mein Programm hängt sich bei einem interrupt auf und resettet.
ich habe keinen watchdog an.
Ich enable globale interrupts und behandle nur den rxien also beim
empfang von daten über den UART. mein Code sieht wiefolgt aus:
1
...
2
// Global interrupt enable
3
sei();
4
sendStringRS232("Global Interrupt enabled\r\n");
5
...
6
7
...
8
9
/**
10
* Interrupt handling for the RS232 interface
11
*/
12
ISR(USART_RXC_vect){
13
//sendStringRS232("Interrupt");
14
//sendStringRS232((char)askCRS232());
15
PORTC=0xff;
16
}
17
...
18
/**
19
* This function initializes the uart with the setten baudrate i the header file
in der mainloop lasse ich leds im sekundentakt blinken, die im interrupt
alle eingeschaltet werden. Sende ich über das terminal ein Zeichen
resettet sich der atmega andauernd. Drücke ich dann für eine Weile
reset, fängt wer sich wieder und blinkt.
> Sende ich über das terminal ein Zeichen>resettet sich der atmega andauernd.
Das glaub ich jetzt weniger. Wenn du UDR im Int. nicht
liest, dann feuert der RXC Int. weiter bis du schwarz wirst.
holger schrieb:
>> Sende ich über das terminal ein Zeichen>>resettet sich der atmega andauernd.>> Das glaub ich jetzt weniger. Wenn du UDR im Int. nicht> liest, dann feuert der RXC Int. weiter bis du schwarz wirst.
das kann ja sein aber warum dann der Reset?
>> Das glaub ich jetzt weniger. Wenn du UDR im Int. nicht>> liest, dann feuert der RXC Int. weiter bis du schwarz wirst.>das kann ja sein aber warum dann der Reset?
Woher soll ich wissen was du in deinem Programm
noch so für Unsinn machst? M103C Fuse abgeschaltet?
>> das kann ja sein aber warum dann der Reset?
Da Du den µC nicht verraten hast, also mal in den includes gesucht.
Die USART_RXC_vect gibt's für den M8, M16, M32 & M323.
Keine dieser includes kennt das UCSR1B Register, also muss es wohl ein
anderer µC sein. Da der dann wieder Deine USART_RXC_vect ISR nicht
kennt, ist die eigentliche RX ISR für den nicht vorhanden und damit
geht's ab in's Nirvana.
Keine Warnung vom Compiler bekommen ?
Sönke Paschko schrieb:
> altlasten> das mit dem funktionsaufruf kommt noch weg, war ja nur erstmal nen debug> test
Ist aber trotzdem Quatsch.
UDR1 ist bestenfalls vom Datentyp char. sendStringRS232 will aber einen
String. Ooops.
Gabs da keine Warnung vom Compiler? Irgendwas, dass die Datentypen nicht
passen? Immerhin versuchst du einer Funktion, die einen Pointer haben
will einen einzelnen char unterzujubeln.
Mir scheint, du misst den Warnungen deines Compilers keine rechte
Bedeutung bei. Lass dir gesagt sein, dass in vielen Firmen die Maxime
gilt: Code muss in einem der höheren Waninglevels (falls es so etwas
gibt) absolut ohne jeglichen Kommentar des Compilers compilieren. Keine
Warnungen erlaubt!
Und diese Firmen haben guten Grund für diese Direktive!
wie gesagt, das stimmt am ende müssen tool wie lint keine fehler melden
aber mal ebend um einen anderen fehler auszuschließen ist mir das egal.
ich verstehe auch nicht den entwickler, der nur mal ebend zur
debugzwecken ein programm schreibt, welches ohne jegliches mucken eines
speziellen diagnosetools arbeitet nur um schnell mal was zu testen, was
keinerlei relevanz für das spätere programm hat.
Sönke Paschko schrieb:
> debugzwecken ein programm schreibt, welches ohne jegliches mucken eines> speziellen diagnosetools arbeitet nur um schnell mal was zu testen, was> keinerlei relevanz für das spätere programm hat.
Woher weißt du, ob die Warnung relevant ist oder nicht? Du hättest dir,
ja nachdem was die Funktion macht, ja auch den Stack komplett
zerschiessen können, was dann unter Umständen auch zu einem Neustart des
Programms führen könnte.
Nur so als Nachdenkhilfe: Was du da gemacht hast, würde auf einem PC
ziemlich sicher zum sofortigen Crash des Programms führen. Du hättest
eine 'access violation'. Lediglich die Tatsache, dass auf einem AVR kein
Betriebssystem läuft und die Hardware keine Möglichkeit hat, deine
Speicherzugriffe zu überwachen, hat dich vor diesem Schicksal bewahrt.
Ganz abgesehen davon, wenn jemand versucht einen char in eine Funktion
reinzustopfen, die einen Pointer haben will UND die Warnung des
Compilers auch noch ignoriert, denke ich mir meinen Teil über seine
Programmierfähigkeiten. Sowas passiert schon mal beim schnellen tippen
aber spätestens nach dem ersten Compilerlauf ist der Code geändert.
(Und wenn ich ein Testprogramm sehe, bei dem anscheinend das Wichtigste
der Programmheader und die Begrüßungsmaske ist, denke ich mir auch
meinen Teil)