BASCOM PWM mit Timer1a und 1b

Gast #1607923
Lesenswert?

Hallo,

ich steuere über die beiden PWM Kanäle 1a und 1b eines MEGA32 jeweils 
eine LED Kette mit 9 LED an. Das mach ich mit jeweils einer For - next 
Schleife.

Wie kann ich es anstellen, dass Timer1a eingeschaltet wird und seine For 
next Schleife durchläuft und der Timer1b nach X Sekunden ebenfalls 
startet ?

Habe da wohl gerade eine gedankliche Blockade .
Danke
Gast #1607977
Lesenswert?

Ich habe das Listing gerade nícht hier.  Aber der Aufbau ist etwa so

enable timer1a (alias Led1)
enable timer1b (alias Led2)

for i = 0 to 254
Led1 = i
waitms 10
next

for i = 0 to 254
Led2 = i
waitms10
next

Wobei die beiden Schleifen als Sub-Routine definiert sind und im main 
loop nacheinander mit call aufgerufen werden
Gast #1607994
Lesenswert?

Du solltest über Deinen Programmierstil nachdenken:

> nacheinander mit call aufgerufen

Sowas verträgt sich nicht mit:

> Wie kann ich es anstellen, dass Timer1a eingeschaltet wird und seine For
> next Schleife durchläuft und der Timer1b nach X Sekunden EBENFALLS
> startet ?
Gast #1608043
Lesenswert?

Probiere:
'And the TIMER can be used in PWM mode
'You have the choice between 8,9 or 10 bit PWM mode
'Also you can specify if the counter must count UP or down after a match
'to the compare registers
'Note that there are two compare registers A and B

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm 
= Clear Down , Prescale = 1

'to set the PWM registers, just assign a value to the compare A and B 
registers

Compare1a = 100
Compare1b = 200

'Or for better reading :
Pwm1a = 100
Pwm1b = 200

Wenn Pwm1a oder 1b verändert werden, dann ändert sich auch die 
Helligleit der LED's an den entsprechenden Ausgängen des Mega32.

Waitms o.ä ist verboten weil absolut überflüssig.

B.
#1608053
Lesenswert?

Tom schrieb:
> Ich habe das Listing gerade nícht hier.  Aber der Aufbau ist etwa so
>
> enable timer1a (alias Led1)
> enable timer1b (alias Led2)
>
> for i = 0 to 254
> Led1 = i
> waitms 10
> next
>
> for i = 0 to 254
> Led2 = i
> waitms10
> next


In dem Moment, in dem du Warteschleifen mit waitms realisierst, wirst du 
immer wieder genau in dieses Problem reinlaufen. Daher ist das 
offensichtlich der falsche Ansatz.

Der richtige Ansatz führt über einen weiteren Timer, der dir alle 10ms 
(zb. kann auch ein anderer Zahlenwert sein) eine ISR aufruft. Die ist 
deine Zeitbasis, dort schaltest du Led1 weiter. Und wenn du dann nach 
dem 100 Aufruf der ISR anfängst, Led2 ebenfalls zu bedienen, dann fängt 
Led2 zu dimmen an, während Led1 noch immer weiter dimmt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren