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.
Frag doch mal beim Reset die Quelle ab, indem du als erstes MCUSR liest. Wenn da keine Resetquelle drin steht, ists dein Code.
:
Bearbeitet durch User
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.
Sind Abblockkondensatoren an der Spanungsversorgung?
A-Freak schrieb: > Sind Abblockkondensatoren an der Spanungsversorgung? Ja, habe ich. Danke für Idee!
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.