Liebes Board,
Ich erstelle gerade einen polyphonen 8Bit PCM Sample Player, und habe
das Problem dass ab und zu ein Reset ausgeloest wird, aus unerfindlichen
Gruenden:
- Die Atmega 644 20PU wird mit 20 MHz getaktet.
- Register B in Timer 0 (PB4 Ausgang = OCR0B) wird in Modus 5 (Phase
Corrected PWM) ohne Prescaler betrieben.
- Das Hauptprogramm laedt das abzuspielende PCM-Sample in eine globale
(volatile) Variable "pcm_byte", die dann von einer Overflow ISR fuer
Timer2 periodisch in OCR0B geladen wird.
- Timer2 wird ebenfalls ohne Prescaler betrieben. Die ISR hat einen
Zaehler, so dass nur alle "n" ISR-Overflow-Aufrufe das "pcm_bye" in
OBR0B geladen wird: OBROB = pcm_byte. So kann ich die "Abspiel-Rate"
kontrollieren.
- PB4 ist mittels RC am Verstaerker.
Ich kann mittels Tastendruck einen 8Bit 8kHz PCM Sample abspielen (ca. 6
Sekunden lang). Das PCM kommt aus dem Speicher (PROGMEM). Wenn die Taste
gedrueckt wird, waehrend das PCM noch spielt, beginnt es von vorne. Das
funktioniert auch ganz gut, wenn ich die Taste nur alle 1 oder 2
Sekunden betaetige.
Triggere ich das Abspielen mittels der Taste allerdings in schneller
Folge (insbesondere, wenn das PCM noch nicht zu Ende gespielt hat!),
haengt sich der Atmega 644 zuverlaessig nach ein paar Tastendruecken
weg, und es gibt ein Reset... und das ist das Problem.
Die Stromversorgung ist stabil. Ich habe keine Brownout-Fuse aktiviert.
Der Reset-Pin ist sauber auf 5V mittels 10k gelegt.
Ich habe den Watchdog Timer fuer meinen "Reset Knopf" ebenfalls
deaktiviert (MCUSR).
Ich bin eingermassen ratlos inzwischen... ist es moeglich, dass
bestimmte
PWM-Verlaeufe an "pcm_byte" zu zu hohen Frequenzspitzen im Signal o.ae.
fuehren, die dann das Reset ausloesen?
Ich habe auch schon Fast PWM und andere Prescaler verwendet... das
Problem tritt dann dennoch auf.
Auch bin ich mir ziemlich sicher, dass die Einstellungen fuer Timer0 PWM
und Timer2 etc. stimmen. Ich habe den Code gerade nicht hier, kann ich
aber spaeter posten.
Viele Dank fuer jeden Hinweis / jede Idee.
Michael W. schrieb:> Viele Dank fuer jeden Hinweis
Hinweis: solange du uns nicht das Gegeteil durch Herzeigen
deines Codes beweist liegt/sitzt die Ursache des Fehlers vor
der Tastatur.
Hinn Weiss schrieb:> Hinweis: solange du uns nicht das Gegeteil durch Herzeigen> deines Codes beweist liegt/sitzt die Ursache des Fehlers vor> der Tastatur.
Im konkreten Fall braucht man wohl nicht mal wirklich den Code sehen, um
mit an Sicherheit grenzender Wahrscheinlichkeit einen Bug darin als
Ursache des beobachteten Verhaltens annehmen zu können.
Bei den AtMegas gibt es gar keine Möglichkeit, per Software einen echten
Reset auszulösen. Weder beabsichtigt noch unbeabsichtigt.
Etwas Code wäre daher hilfreich.
Oliver
Michael W. schrieb:> - PB4 ist mittels RC am Verstaerker.
Dieser Schaltplan ist so eindeutig dass du mit Sicherheit
keinen vollständigen Schaltplan zeigen brauchst. Denn die
Vollkommenheit des Bedieners vor der Tastatur schliesst
Fehler in der Schaltung auf jeden Fall aus.
Hinn Weiss schrieb:> Dieser Schaltplan ist so eindeutig dass du mit Sicherheit> keinen vollständigen Schaltplan zeigen brauchst. Denn die> Vollkommenheit des Bedieners vor der Tastatur schliesst> Fehler in der Schaltung auf jeden Fall aus.
R = 47 kOhm, C = 220 uF oder so.
PB4 -> R -> C -> Audio Jack Pin 1, Audio Jack Pin 2 -> GND.
Wenn es keine Moeglichkeit gibt, dieses Verhalten durch Software
hervorzubringen, muss es ja ein Hardware-Problem sein?
Sonst muss ich mal den Oskar bemuehen am Wochenende...
Michael W. schrieb:> R = 47 kOhm, C = 220 uF oder so.
Du hast es nicht verstanden.
Wir zweifeln nicht nur an deinen Software-Fähigkeiten.
Wenn man oft so manchen Schaltplan und/oder Aufbau sieht
braucht man über Software-Fehler gar nicht mehr nachdenken.
"Triggere ich das Abspielen mittels der Taste allerdings in schneller
Folge (insbesondere, wenn das PCM noch nicht zu Ende gespielt hat!),
haengt sich der Atmega 644 zuverlaessig nach ein paar Tastendruecken
weg, und es gibt ein Reset... und das ist das Problem."
Hallo,
vielleicht hast Du einen netten Stacküberlauf produziert?
MfG
Christian S. schrieb:> "Triggere ich das Abspielen mittels der Taste allerdings in> schneller> Folge (insbesondere, wenn das PCM noch nicht zu Ende gespielt hat!),> haengt sich der Atmega 644 zuverlaessig nach ein paar Tastendruecken> weg, und es gibt ein Reset... und das ist das Problem.">> Hallo,>> vielleicht hast Du einen netten Stacküberlauf produziert?>> MfG
Danke fuer den konstruktiven Hinweis!
Nun, die ISR fuer Timer2 kann das m.E. nicht verursachen, da die ISR
selbst ja nicht unterbrechbar ist.
Und der Taster selbst wird mittels polling in der Endlos-Hauptschleife
abgefragt. Die selbe Schleife ist auch dafuer zustaendig, dass pcm_byte
sucksessive aus dem PROGMEM geladen wird.
Matthias S. schrieb:> Frag doch mal beim Reset die Quelle ab, indem du als erstes MCUSR liest.> Wenn da keine Resetquelle drin steht, ists dein Code.
Gute Idee... danke fuer den Hinweis.
Wie kann ich denn MCUSR am Besten auslesen beim Reset? "Ueberlebt" das
Register einen Reset, sodass man beim "Reset-bedingtem Neustart" von
main() einfach MCUSR auslesen kann (und z.B. mit Leuchtdioden anzeigen
o.ae.)
Ich hatte natuerlich auch Race Conditions in Verdacht. Allerdings ist
das Lesen und Schreiben von pcm_byte ja atomar, sodass hier eigentlich
kein Problem auftreten kann. pcm_byte wird in der Timer2 ISR gelesen,
und in der Hauptschleife geschrieben.
Um Race Conditions bzgl. der geteilten globalen Variable in jedem Fall
auszuschliessen, habe ich zudem auch noch Timer2 jedesmal vor Aenderung
von pcm_byte angehalten (und nach Schreiben wieder fortgefuehrt). Das
behebt das Problem ebenfalls nicht.
Nun, ich werde einmal die MCUSR Flags anschauen, wie vorgeschlagen und
melde mich dann wieder.
Michael W. schrieb:> Wie kann ich denn MCUSR am Besten auslesen beim Reset?
Am besten so früh wie möglich - dazu steht m.W. auch was im DB. Ich bin
im Moment nicht sicher, ob der C-Startup Code (falls du C benutzt) da
dran rumfummelt, aber dazu kann sicher jemand was sagen. In Assembler
ists easy.
> Wie kann ich denn MCUSR am Besten auslesen beim Reset?> "Ueberlebt" das Register einen Reset
Die Logik gebietet, dass das Register sinnlos wäre, wenn es durch den
Reset gelöscht/initialisiert würde.
Falls du noch ernst genommen werden willst, solltest du schleunigst
einen Schaltplan zeichnen, ein Foto vom Aufbau zeigen, und den Quelltext
zeigen. Wir interessieren und auch für die Eigenschaften der
Stromversorgung.
Wenn man keine Ahnung hat, wo man suchen soll, reduziert man das
Programm schrittweise, bis der Fehler verwindet.
stefanus schrieb:> Wenn man keine Ahnung hat, wo man suchen soll, reduziert man das> Programm schrittweise, bis der Fehler verwindet.
Windet er sich denn rechts- oder linksrum der Code?
stefanus schrieb:> Wir interessieren und auch für die Eigenschaften der> Stromversorgung.
Sehr richtig! Hatte ich vergessen zu erwähnen.
Derweil spekulieren die Software-Gurus um den vorhandenen
Programmcode der durch reichhaltige Prosa übermittelt wurde.
Ich bedanke mich schon einmal fuer die vielen Hinweise und das
Engagement!
Ich werde die "eingeforderten Details" nachreichen, nachdem ich etwas
Zeit hatte, das Programm und auch die Schaltung in eine Minimal-Form zu
bringen, die den Effekt zeigt, und die man dann besser diskutieren kann.
Allerdings muss es ja auch moeglich sein, einmal eine Diskussion /
Brainstorming ueber ein Problem anzustossen in der Hoffnung dass einer
sagt "Hey, dass kommt mir bekannt vor! Bei mir was es das und das". Das
ist alles was ich zu diesem Zeitpunkt wollte.