Hallo, bin kurz vorm Verzweifeln. Ich habe eine Schaltuhr in Assembler mit einem atmega 8 ind Timer 1 geschrieben, die auch funktioniert. Jetzt versuche ich mit dem Timer 1 gleichzeitig LED-s zu dimmen. Es funktioniert entweder das eine oder das andere, nie beides gleichzeitig. Beim Schalten eines Relais gibt es nur jeweils einen Schaltvorgang. Kein Problem. Bei der PWM muß ständig geschaltet werden und das Programm bleibt in der Endlosschleife hängen damit die PWM funktioniert. Dann funktioniert die Schaltuhr nicht mehr. Wie komme ich da raus bzw. weiter? Kurze Erklärung, die Schaltuhr startet mit einer Netzschaltuhr und ist für 20 Stunden programmierbar im 5 Minuten Takt (Aquarium). Bei dem angehängten Code verlangsamt sich die Zeit stark (Schaltzeiten), aber PWM funktioniert nicht. Code müsste aus der ISR raus. Brauche ich zwingend 2 Timer? Schon getestet, aber das Problem mit der Endlosschleife bleibt... Es wäre nett wenn sich das jemend anschauen könnte. Danke Bernd
Sorry der Fehler mit dem 2x aktivierten PORTC ist mir bekannt, sollte ganz oben eigentlich deaktiviert sein.
Bernd S. schrieb: > Bei der PWM muß ständig geschaltet werden und das Programm > bleibt in der Endlosschleife hängen damit die PWM funktioniert. Dann > funktioniert die Schaltuhr nicht mehr. > Wie komme ich da raus bzw. weiter? Mit der PWM würde ich den Prozessor gar nicht belasten. Das würde ich an einen Timer deligieren, der einmal initialisiert, das PWM-Signal selbständig generiert.
Wolfgang schrieb: > Mit der PWM würde ich den Prozessor gar nicht belasten. Das würde ich an > einen Timer deligieren, der einmal initialisiert, das PWM-Signal > selbständig generiert. Und dabei die PWM-Frequenz so festlegen, daß man die OVF-Interrupts als Uhrentakt gebrauchen kann.
Wolfgang schrieb: > Mit der PWM würde ich den Prozessor gar nicht belasten. Das würde ich an > einen Timer deligieren, der einmal initialisiert, das PWM-Signal > selbständig generiert. Klingt logisch, aber ich dachte das hätte ich getan. Habs noch nicht ganz kapiert. Der Timer macht dann bei Überlauf wohl alles (PWM) selbst. Thomas E. schrieb: > Und dabei die PWM-Frequenz so festlegen, daß man die OVF-Interrupts als > Uhrentakt gebrauchen kann. Muß mich noch mal genauer einlesen. Im Moment macht der Timer die Uhr, und PWM bringt das Ganze durcheinander. Danke für Eure Antworten! Gruß Bernd
Hi Was soll dieses Konstrukt bewirken:
1 | dimm1: cpi subcount,10 |
2 | breq ein1 |
3 | ein1: cbi portc,1 |
Wenn subcount 10 ist, wird nacj 'ein1' gesprungen - soweit klar. Wenn subcount ungleich 10 ist, wird der nächste Befehl ausgeführt - Der steht beim Label 'ein1' - somit ist die Prüfung und der bedingte Sprung hier eher fragwürdig. Gleiches direkt darunter für 'aus1'. Ändert aber Nichts an Deinem Problem. Hinter aus1 springst Du nach 'weiter3'. Dort, je nach Sekundenwert, (hier 5), wieder nach dimm1 (mit den oben bereits genannten unnötigen Vergleichen) und dem Sprung nach 'weiter3', wo Du nach 'rjmp end_isr' die ISR verlässt. Du müsstest also die ISR, wie ich Das bis jetzt sehe, auf jeden Fall verlassen (da subcount geleert wird und dadurch beim 2.ten Durchlauf zum Ende gesprungen wird). Hast Du noch andere Interrupts laufen? Also noch etwas mehr Code, als hier steht? Dann könnte ich mir vorstellen, daß der µC beim ausgelösten Interrupt in die Vector-Tabelle springt und dort Programmcode statt dem ISR-Vector (rjmp) findet und ausführt. Auch das Rumgespringe in der ISR ist gewühnungsbedürftig - um es mal nett auszudrücken ;) Da Du in der Main eh Nichts machst, warum in der ISR nicht nur Flags setzen und in der Main darauf reagieren? Mit den ganzen Jumps wird die Laufzeit der PWM wohl eh nicht 'taktsymetrisch' ausfallen. Warum rechnest Du in 2er Sekunden und 5er Minuten-Packen? ----------------------------------- Ob Dir der interne PWM hilft? Der wäre zumindest EIN Kanal, in Deinem Code schaltest Du aber 3 Kanäle. Auch musst Du in dieser ISR den Compare-Wert laufend anpassen, wenn Du den Überlauf für den Timer benutzen möchtest - Alles kein Hexenwerk, will aber bedacht sein. ... hatte gerade ein Telefonat, Faden verloren, muß hier so erst Mal reichen :/ (Multi-Tasking in meinem Alter ... ne gg) MfG
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.