Gast
#1982645
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