Forum: Mikrocontroller und Digitale Elektronik Atmega 644 Phase Corrected PWM / PCM Problem - Spurious Resets


von Michael W. (Gast)


Lesenswert?

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.

von Hinn Weiss (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von Hinn Weiss (Gast)


Lesenswert?

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.

von Michael W. (Gast)


Lesenswert?

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...

von Hinn Weiss (Gast)


Lesenswert?

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.

von Christian S. (roehrenvorheizer)


Lesenswert?

"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

von Michael W. (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Michael W. (Gast)


Lesenswert?

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

von Michael W. (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von stefanus (Gast)


Lesenswert?

> 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.

von Michael W. (Gast)


Lesenswert?

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?

von Hinn Weiss (Gast)


Lesenswert?

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.

von Michael W. (Gast)


Lesenswert?

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.

von A-Freak (Gast)


Lesenswert?

Sind Abblockkondensatoren an der Spanungsversorgung?

von Michael W. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.