Forum: Mikrocontroller und Digitale Elektronik Uhr und Dimmen mit Timer 1 Atmega8 gleichzeitig


von Bernd S. (bernd66)


Angehängte Dateien:

Lesenswert?

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

von Bernd S. (bernd66)


Lesenswert?

Sorry der Fehler mit dem 2x aktivierten PORTC ist mir bekannt, sollte 
ganz oben eigentlich deaktiviert sein.

von Wolfgang (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Bernd S. (bernd66)


Lesenswert?

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

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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