www.mikrocontroller.net

Forum: Compiler & IDEs Soft-PWM hängt sich auf


Autor: Richard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich hänge im Anhang mal meinen Code (komplett) an. In den Zeilen 264 und 
317 habe ich 2 Prüfungen eingefügt, deren Ergebnis mir zu denken 
geben... siehe Kommentar.

Hardware: STK500 und Tiny2313 @ 8MHz
Zum Code selbst:
Es sollen mal ein paar Lagerfeuer und Kerzen simmuliert werden, für ein 
großes Krippenspiel (wir haben doch Weihnachen...)

Mein Konzept:
Timer/Counter 1 dient als 10ms Timer in dessen Takt die PWM aktualisiert 
wird.

Timer/Counter0 (8-bit) läuft mit clk/256 im CTC-Modus und zählt bis 254. 
Der "Comparematch 0B" wird für Interrupts genutzt in denen vorberechnete 
Werte in OCR0B und in/an den PWM-PORT geschrieben werden.
Die Werte werden zwischengepuffert, in insgesammt 4 Arrays:
pwm_mask(_buf)[] und pwm_next(_buf)[]
in pwm_next[] steht jeweils wann der nächste Interrupt passieren muss, 
in pwm_mask[] was augegeben werden muss.

Fürs vorberechnen der Werte ist die Funktion _calc_pwm()_ zuständig. Sie 
liest pwm_set[] und schriebt in pwm_****_buf[]. Ausserdem scheibt sie in 
pwm_i_max_buf wieviele gültige Einträge in den beiden Arrays sind (in 
pwm_next_buf natürlich einer weniger, da ich mir die "0" gespart habe). 
wenn sie fertig ist setzt sie valid_buf und erlaubt damit der ISR sich 
die Daten zu "laden".

Aalle anderen Funktionan sind prinzipiell unwichtig. gen_pwm_set() 
generiert neue "zufallswerte" nach vorschrift einiger flexibler und in 
modi gefasster regeln. read_key() ist deaktiviert (return 0). 
boot-lamps() ist ne spielerei die Anfangs alle Lampen nacheinander 
langsam angehen lässt, sinnfrei aber ich find toll. Und die Init() ist 
auch klar.

wichig zu wissen ist, dass NUR calc_pwm() in die globalen Arrays 
(eigentlich Pointer) pwm_mask_buf[] und pwm_next_buf[] schreibt.

Interessant ist weiters die Variable pwm_en_mask. Jedes bit in ihr steht 
für einen PWM-Kanal wobei eine 0 daktiviert bedeutet. Die Funktion 
gen_pwm_set() nimmt dann das deaktivieren vor indem sie die PWM-Werte in 
pwm_set[] der entspechenden Kanäle auf 0 setzt.
pwm_en_mask wird aus dem eeprom geladen ( Varibale ee_channel_mask )

So, aber jetzt: Sind weniger als 5 Kanäle aktiviert, hängt sich die PWM 
nie aufgehängt. Aktiviere ich allerdings 5 oder mehr Kanäle (egal 
welche) wird irgendwann OCR0B mit 0xFF beschrieben und es passiert kein 
Interrupt mehr!
=> PWM hängt...

Ich find den Fehler nicht!


Vielleicht hat jemand die Zeit und Muße und hilft mir. Ich such den 
ganzen Tag schon... bin auch schon bissl gaga glaub ich.

Vielan Dank
lg Richard

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stelle gerade Fest, dass in der Codeansicht keine Zeilennummern 
angezeigt werden. Die Markaten Prüfstellen, welche mir zu denken geben 
befinden sich ziemlich gegen Ende der funktion calc_pwm() sowie am Ende 
der als PWM_ISR betitelten Interruproutine.

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetz werds Nacht.
Um Hardware-Fehler ausschließen zu können hab ich nun den Code auf einem 
2. Tiny2313 ausprobiert, ohne Erfolg.
Dann hab ich ihn auf einen MEGA8515 gebrannt, müssen ja nur ein Paar 
register bei der Initialisierung anders benannt werden und der Erfolg 
war da.

Ich plan also gar nix mehr. Die Tiny2313 kacken ab (sorry für die 
Wortwahl) währen der Mega8515 damit läuft. Kann mir sowas jemand 
erklären?!
Wie geht das denn?

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler vermutlich gefunden: höchstwahrscheinlich läuft der Stack bis in 
meine Variablen/Arrays und überschriebt sie

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.