hi,
ich hab hier nen ganz kuriosen fehler.
die beiden zähler laufen bis 4, beim nächsten interrupt sind sie wieder
auf 0.
dann laufen sie immer bis 2 bevor sie wieder auf 0 gesetzt werden.
irgendwas in meinem programm schreibt auf ihre speicheradressen, aber
was - und warum?
wie kann ich das rausfinden wer da aus der reihe tanzt?
ich kann den AVR-debugger ja nicht anhalten wenn eine variable geändert
wird, oder?
übrigens: wenn ich die zeile
1
UDR0=0x00;
auskommentiere passiert das nicht. dann laufen die ganz normal hoch.
also das ist mir zu hoch :)
bin für jeden hinweis dankbar!
Aus dem Codefragment kann man leider nichts entnehmen, dort liegt der
Fehler nicht, denn sonst hättest du den schon gefunden :-/
> wie kann ich das rausfinden wer da aus der reihe tanzt?
Indem du anschaust, was z.B. vor der Variable v_test deklariert
wird. Ist da ein char-Array? Läuft der Index über das Arayende hinaus?
ich kann nicht den kompletten code posten, viel zu viel.
ich habe jetzt mal eine variable "vorher" vor v_test gesetzt.
im .map file liegt die aber ganz woanders als v_test ...
aber ich glaube eh nicht das da was aus den grenzen läuft.
es scheint eher so zu sein, dass alle variablen in diesem file neu
initialisiert werden.
(vorher1 wird wieder 255 gesetzt, v_test, s_test auf 0)
was könnte der grund dafür sein?
Bill wrote:
> aber ich glaube eh nicht das da was aus den grenzen läuft.> es scheint eher so zu sein, dass alle variablen in diesem file neu> initialisiert werden.
Das klingt nach Neustart oder Sprung nach 0.
Bill wrote:
> TIMSK0 = (1 << OCIE0A);
Wo ist der Interrupt Handler dazu?
Und noch was: Du gibst den RXC-Interrupt frei, der Handler oben ist aber
für den UDRE-Interrupt, der (zumindest im geposteten Code) nicht
freigegeben ist. Da passt wohl einiges nicht...
Bill wrote:
> insbesondere ist ja auch seltsam, dass das nicht passiert wenn ich die> zeile UDR0=... auskommentiere...
Und das wiederum deutet drauf hin, dass nur mit dieser Zeile ein
Interrupt ausgelöst wird, ohne nicht. Und ein fehlender oder falsch
implementierter Handler zum Neustart führt.
danke sehr! :)
es war die fehlende ISR für timer2.
wusste nicht, das sich das derart rächt. was passiert da wenn der INT
ausgelöst wird und nicht gehandled wird. scheint ja nicht so gesund zu
sein.
danke euch!
ich werde jetzt wohl mal ein bisschen was lesen zu interrupt handling
und so.
empfehlungen?
>> insbesondere ist ja auch seltsam, dass das nicht passiert wenn ich die>> zeile UDR0=... auskommentiere...>Und das wiederum deutet drauf hin, dass nur mit dieser Zeile ein>Interrupt ausgelöst wird, ohne nicht. Und ein fehlender oder falsch>implementierter Handler zum Neustart führt.
ja, das sollte man doch vermuten.
aber es hat auch irgendwas mit dem timer2 zu tun...
myteriös (jedenfalls für einen newbe wie mich)
...aber spassig.
>>ich werde jetzt wohl mal ein bisschen was lesen zu interrupt handling>>und so.>>empfehlungen?>Das Datenbl
booo wirklich :( gääähn
ich muss aber zu meiner verteidigung sagen, dass ich da schon einiges
gelesen hab. eigentlich ganz gut, aber nicht sonderlich fesselnd... aber
du hast wohl recht.
Bill wrote:
> danke sehr! :)>> es war die fehlende ISR für timer2.
Und was ist mit dem UDRE-Interrupt?
> wusste nicht, das sich das derart rächt. was passiert da wenn der INT> ausgelöst wird und nicht gehandled wird.
Wenn das ne Frage sein soll: Dann gibt's einen "Warmstart", sofern
nichts anderes eingestellt ist.
> ich werde jetzt wohl mal ein bisschen was lesen zu interrupt handling> und so.> empfehlungen?
Datenblätter, AVR-GCC-Tutorial...
>> wusste nicht, das sich das derart rächt. was passiert da wenn der INT>> ausgelöst wird und nicht gehandled wird.>Wenn das ne Frage sein soll: Dann gibt's einen "Warmstart", sofern>nichts anderes eingestellt ist.
ja, aber warum gibts den warmstart nur, wenn ich in dem UDR-handler
UDR-setze? der warmstart kommt doch von dem nicht gehandleden
timer2-overflow...!
>ja, aber warum gibts den warmstart nur, wenn ich in dem UDR-handler>UDR-setze? der warmstart kommt doch von dem nicht gehandleden>timer2-overflow...!
Die Timer2-Interrupt-Einsprungadresse liegt vor der des UDRE-Interrupts
in der Vektor-Tabelle. Vermutlich springt der Prozessor dorthin, findet
aber keine Adresse und geht dann den Adressraum weiter hoch, bis er zum
ersten sinnvollen Programmpunkt kommt, der dann die UDRE-ISR-Adresse
ist.
Lernender wrote:
> Läßt sich der Compiler oder besser Linker dazu bewegen, an die> Einsprungadressen ohne ISR ein RETI zu setzen?
Definiere einfach einen leeren BADISR-Interrupt, das hat den gleichen
Effekt.
1
ISR(BADISR_vect){}
Nur so nebenbei:
Was STK500-Besitzer da geschrieben hat, ist Quatsch. Die AVR-Libc belegt
jeden Interruptvektor mit einem Sprung. Die unbenutzten gehen halt zum
BADISR-Interrupt, und die Default-Implementierung der AVR-Libc dieses
Interrupts enthält dann den Sprung an die Adresse 0.
Lernender wrote:
> aus Interesse habe ich mal eine Frage:> Läßt sich der Compiler oder besser Linker dazu bewegen, an die> Einsprungadressen ohne ISR ein RETI zu setzen?
Beim GCC indirekt ja, indem man einen Handler mit
Stefan Ernst wrote:
> Nur so nebenbei:> Was STK500-Besitzer da geschrieben hat, ist Quatsch. Die AVR-Libc belegt> jeden Interruptvektor mit einem Sprung. Die unbenutzten gehen halt zum> BADISR-Interrupt, und die Default-Implementierung der AVR-Libc dieses> Interrupts enthält dann den Sprung an die Adresse 0.
Richtig. Ich vermute mal, dass in dem nicht gezeigten Teil des Programms
noch eine Reihe weiterer Klöpse stecken, von denen mindestens einer zu
dem beschriebenen Effekt führt.
Danke für die Antworten.
Dann gehört die BADISR eigentlich in jedes Projekt und sollte eine
definierte Fehlerausgabe erzeugen. Während der Entwicklung kann man dort
auch einen Breakpoint setzen, der ja nicht erreicht werden sollte.
Lernender wrote:
> Danke für die Antworten.> Dann gehört die BADISR eigentlich in jedes Projekt und sollte eine> definierte Fehlerausgabe erzeugen. Während der Entwicklung kann man dort> auch einen Breakpoint setzen, der ja nicht erreicht werden sollte.
Ist auf jeden Fall klug.
>Richtig. Ich vermute mal, dass in dem nicht gezeigten Teil des Programms>noch eine Reihe weiterer Klöpse stecken, von denen mindestens einer zu>dem beschriebenen Effekt führt.
hehe... immer drauf auf die kleinen newbes.
eigentlich läuft jetzt aber alles ganz super, nachdem ich den timer2
rausgenommen habe.
(das hatte ich halt versehentlich mit reinkopiert aus einem anderen
projekt)
ich kann den code aber gerne der wissenschaft zur verfügung stellen,
würde mich ja auch mal interessieren was da genau passiert.
also wenn ihr wollt, schrumpfe ich den code soweit zusammen, dass er
lesbar wird und den beschriebenen effekt zeigt.