PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Software PWM



hardstyleroxx
30.11.2005, 21:13
Ich habe nun fast jeden Beitrag gelesen den die Suche gefunden hat, blos gings da immer um Hardware PWM.
Ich suche einen einfachen Code für Software PWM. Sagen wir einfach mal 2 oder 3 Leds die nacheinander an- und ausgehen.


Danke schonmal ;)

bertl100
01.12.2005, 21:01
Um Led´s nacheinander ein und auszuschalten brauchst du keine PWM!
Mit PWM kannst dimmen. Zum ein und ausschalten reicht eine schleife in der die Pins entsprechend aus und eingeschalten werden.

MFG

Vader

hardstyleroxx
02.12.2005, 14:03
Das ist mir auch klar... Ich will das sie nacheinander Ein-und Ausfaden! Habe mich vielleicht etwas dumm ausgedrückt.

hardstyleroxx
03.12.2005, 13:04
Keiner so nett mir das mal zu erklären? Ich habe zwar das AVR Buch von Roland Walter aber da wird nicht so genau auf mein Anliegen eingegangen..

xanadu
03.12.2005, 19:44
Die Vorgehensweise ist ganz simpel, du musst ja für diesen Fall nicht auf eine genaue Einhaltung einer Zykluszeit achten.

Der Algorithmus sieht so aus:

Schritt 1: Schalte LED ein
Schritt 2: Warte Zeit X
Schritt 3: Schalte LED aus
Schritt 4: Warte Zeit Y

Wenn Du X immer kleiner und Y immer größer werden lässt, wird die LED dunkler.

Rage_Empire
03.12.2005, 19:54
Guck mal im Downloadverzeichnis, dort habe ich einen Source für Bascom geschrieben, welcher für so etwas modifiziert werden kann.

hardstyleroxx
03.12.2005, 21:35
Ich habs nun schon selber hinbekommen, dass 3 LEDs aufeinmal an- und ausfaden. Nun würde ich die aber gene nach belieben einzeln ansteuern. Also z.B wenn led 1 aus
led2 an oder wenn led2 halb aus dann led3 an.



'#################################
'# Software Pulsweitenmodulation #
'#################################


$regfile = "M8def.dat"
$crystal = 3686400

Ddrd = &B11100000 'PD7, PD6,
PD5 als Ausgänge festlegen, rest Eingang
Portd = &B00001100 'PullUps
von PD2, PD3 Aktivieren



Enable Interrupts
'Interrupts Global einschalten

Enable Timer0
Config Timer0 = Timer , Prescale = 256
On Timer0 Ontimer0

Enable Timer1
Config Timer1 = Timer , Prescale = 8
On Timer1 Ontimer1

Dim Reverse As Bit
Dim Helligkeit As Byte

Helligkeit = 255





'###Deklarationen###

Led_gr Alias Portd.7 'LED Grün
Led_ge Alias Portd.6 'LED Gelb
Led_ro Alias Portd.5 'LED Rot
Prwata Alias Pind.3
'Programmwahltaster
Speed Alias Pind.2


Do

Loop

Ontimer0:

Toggle Led_ro
Toggle Led_gr
Toggle Led_ge

If Led_ro = 1 Then
Timer0 = 256 - Helligkeit
Else
Timer0 = Helligkeit
End If

Return



Ontimer1:

If Helligkeit = 255 Then
Set Reverse
End If

If Helligkeit = 1 Then
Reset Reverse
End If

If Reverse = 0 Then
Incr Helligkeit
End If

If Reverse = 1 Then
Helligkeit = Helligkeit - 1
End If

Return

Rage_Empire
04.12.2005, 11:54
Also dafür gibts 2 Möglichkeiten:

1. Du verwendest die Timer0 und Timer1, wovon Timer1 zwei PWM-Ausgänge hat, welche durch compare1a und compare1b gesteuert werden kann. Mit dem Timer0 wären dies dann 3 PWM-Signale.

2. Du lässt einen Timer Zählen. Die LEDs ordnest du dann Werten zu, ab welche diese leuchten sollen. Beispiel:

If timer1 >100 then led1=1 else led1=0
if timer1 >150 then led2=1 else led2=0
if timer1 >200 then led3=1 else led3=0


So könnte man es ungefär machen. Mit der 2. Variante Kannst du noch mehr LEDs steuern.