Forum: Mikrocontroller und Digitale Elektronik BASCOM PWM mit Timer1a und 1b


von Tom (Gast)


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

von Bernadette (Gast)


Lesenswert?

timerwert 1b so lange auf 0 lassen.

B.

von Tom (Gast)


Lesenswert?

Das ist ja das Problem. Er ist auf 0 und fängt durch die Schleife erst 
dann an, die LED zu dimmen, wenn Timer 1a mit seiner Schleife durch ist.

von Route_66 (Gast)


Lesenswert?

Hallo!
Der Fehler steckt in Zeile 42!

von Tom (Gast)


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

von Route_66 (Gast)


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 ?

von Tom (Gast)


Lesenswert?

Herzlichen Dank,

WEIL es so anscheinend nicht funktioniert, stelle ich ja auch hier meine 
Frage. Wie muss ich die Sache denn angehen ?

von Bernadette (Gast)


Lesenswert?

Da muss ich wirklich sagen, erst einmal das Beispiel aus der 
BASCOM-Hilfe ausprobieren und dann den ganzen Code hier posten.

B.

von Bernadette (Gast)


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.

von Karl H. (kbuchegg)


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.

von Tom (Gast)


Lesenswert?

JAAA :-)

Das ist eine Antwort. Vielen Dank dafür. Habe mir schon fast gedacht, 
dass ich da nicht um einen weitern Timer herum komme. Werde das mal 
versuchen.

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.