PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerproblem mit PWM



Octi
05.12.2004, 12:30
Hallo

Bin Anfänger in der ganzen Sache und möchte nun folgendes machen.
Eine Dimmerschaltung, die wenn zb. Pin PD7 nach Masse gezogen wird
der Mega8 selbständig die PWM von 0 nach Max innerhalb von 3 sec durchfährt.
und wenn PD6 nach Masse gezogen wird das ganze natürlich umgekehrt!
(also von max auf 0 runter) und das wiedrum innerhalb 3 sec.

Nun habe ich folgendes Listing gefunden in der die PWM mit Hilfe der UART eingestellt wird (0-255), das möchte ich aber nicht, den das soll ja ohne PC laufen.
'0607.BAS: LED-Helligkeit mit phasenkorrektem Timer1-PWM
'Hardware: Pin PB1/OC1A zur LED, Nullmodemkabel zum PC
'----------------------------------------------------------
$Regfile="m8def.dat" 'ATmega8-Deklarationen
$Crystal=3686400 'Verwendeter Quarz: 3,6864 MHz
$Baud =9600 '9600 Baud
'
DDRB.1=1 'Pin PB1/OC1A ist Ausgang
'
TCCR1A=&B10000001 'Pin OC1A nicht invertiert, 8-Bit-
TCCR1B=&B00000010 '...PWM phasenkorrekt, Timer1 1/8
'----------------------------------------------------------
Do 'Hauptschleife
If UCSRA.RXC=1 Then 'Falls ein Byte im UART-Puffer...
OCR1AL=UDR 'Neuen Helligkeitswert setzen
End If
Loop

wer kann mir helfen, und das Listing so verändern, damit ich was anfangen kann??
Danke

albundy
05.12.2004, 14:14
Dim Dimmen as Byte
$crystal = 8000000

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 64 ----> entspricht etwa 245 Hz
Pwm1a = 0
Enable Timer1
Enable Interrupts

If Pind.7 = 0 Then
For Dimmen = 0 to 255 ----------> von dunkel nach hell
Pwm1a = Pwm1a+1
waitms 10
next ---------->dauert 255 * 10 ms = 2,55 sek
end if
If Pind.6 = 0 Then
For Dimmen = 255 to 0 ----------> von hell nach dunkel
Pwm1a = Pwm1a-1
waitms 10
next
end if

Das gilt für 8MHz Quarz. Bei anderem Quarz, Timer1 ändern, damit etwa 245Hz rauskommen

Octi
05.12.2004, 15:10
Hallo

danke erstmal, werde das ganze mal testen.
unterscheidet sich aber gewaltig von meinem listing
aber meins ist ja auch nur aus einem buch abgeschrieben
danke nochmals

albundy
05.12.2004, 16:09
Es sind 2 verschiedene Verfahren. In deinem Beispiel wird der Timer über OCR1AL voreingestellt, sodass sich die Frequenz ändert.
Ich nehme eine feste Frequenz und verändere das Verhältnis zwischen Low und High.

Kannst ja auch dein Beispiel nehmen und dann,

If Pind.7 = 0 Then
For Dimmen = 0 to 255 ----------> von dunkel nach hell
OCR1AL=Dimmen
waitms 10
next ---------->dauert 255 * 10 ms = 2,55 sek
End If

If Pind.6 = 0 Then
For Dimmen = 255 to 0 ----------> von hell nach dunkel
OCR1AL=Dimmen
waitms 10
next
end if

Octi
11.12.2004, 16:03
Hallo

Hmmm
Habe das Heute mal getestet.
$regfile = "m8def.dat" 'ATmega8-Deklarationen
$crystal = 3686400 'Verwendeter Quarz: 3,6864 MHz
Dim Dimmen As Byte
Config Pind.3 = Input
Config Pind.4 = Input

Portd.3 = 1
Portd.4 = 1
Ddrb.1 = 1 'Pin PB1/OC1A ist Ausgang

Tccr1a = &B10000001 'Pin OC1A nicht invertiert, 8-Bit-
Tccr1b = &B00000010 '...PWM phasenkorrekt,Timer1 1/8
'----------------------------------------------------------

Do

If Pind.3 = 0 Then
For Dimmen = 0 To 255 ' ----------> von dunkel nach hell
Ocr1al = Dimmen
Waitms 15
Next Dimmen ' ---------->dauert 255 * 10 ms = 2,55 sek
End If
If Pind.4 = 0 Then
For Dimmen = 255 To 0 ' ----------> von hell nach dunkel
Ocr1al = Dimmen
Waitms 15
Next Dimmen
End If

Loop

Ergebniss:
Bei Pind2 gegen masse passiert garnix.
bei Pind3 gegen Masse geht die leuchte langsam an bis zur vollen Helligkeit, ist aber der Pin noch gegen Masse, so wird die Lampe schlagartig dunkel und langsam wieder hell.
Wird Pind3 aber von Masse getrennt so leuchtet die lampe mit voller Helligkeit (das sollte sie auch machen so aber trotz das Pind3 noch gegen Masse ist sollte die Lampe voll weiterleuchten)

Ein Dimmen von Hell nach Dunkel ist nicht möglich.
Hmmm schade aber irgendwas passt da noch nicht
reini

albundy
11.12.2004, 16:33
>Bei Pind2 gegen masse passiert garnix.

Klar, Pind.2 müßte dafür Eingang sein.

>Config Pind.3 = Input
>Config Pind.4 = Input
>Portd.3 = 1
>Portd.2 = 1


>bei Pind3 gegen Masse geht die leuchte langsam an bis zur vollen >Helligkeit, ist aber der Pin noch gegen Masse, so wird die Lampe >schlagartig dunkel und langsam wieder hell.

Das Beispiel war für einen kurzen Impuls an Pind.2 oder 3.
Versuch das mal.

If Pind.3 = 0 And Dimmen < 255 Then
For Dimmen = 0 To 255 ' ----------> von dunkel nach hell
Ocr1al = Dimmen
Waitms 15
Next Dimmen ' ---------->dauert 255 * 10 ms = 2,55 sek
End If
If Pind.2 = 0 And Dimmen > 0 Then
For Dimmen = 255 To 0 ' ----------> von hell nach dunkel
Ocr1al = Dimmen
Waitms 15
Next Dimmen
End If

Octi
11.12.2004, 16:47
Hallo

ja schon klar, hab den Fehler mit den Pins auch bemerkt, aber selbst nach den berichtigen war nix mit dem Dimmen nach dunkel!
der Pin für dunkel ist ohne ledliche Funktion

werde jetzt mal das Listing ändern.

Habe es nun geändert, aber alles beim alten!!
keinerlei Änderung zum ersten Listing

reini

albundy
12.12.2004, 11:23
Ich weis jetzt nicht, welchen pin du wirklich benutzt ?
Habe es mit pind.3 und 4 probiert und funktioniert jetzt.

If Pind.3 = 0 And Ocr1al < 255 Then
For Dimmen = 0 To 255
Ocr1al = Dimmen
Waitms 15
Next Dimmen
End If
If Pind.4 = 0 And Ocr1al > 0 Then
For Dimmen = 255 To 0 Step -1
Ocr1al = Dimmen
Waitms 15
Next Dimmen
End If

Ich hatte in der unteren schleife "Step -1" vergessen, deshalb wurde nicht runtergezählt.
Außerdem muß bei If ...... Ocr1l und nicht Dimmen rein.

Octi
12.12.2004, 12:14
Hallo

Besten Dank albundy
werde natürlich auch noch Deine Lösung testen,
aber ich habe es nun auch geschaft mit dieser Lösung:
Do
If Pind.3 = 0 And Pwm1a = 0 Then
Do
Pwm1a = Pwm1a + 1
Waitms 20
Loop Until Pwm1a = 255
End If
If Pind.4 = 0 And Pwm1a = 255 Then
Do
Pwm1a = Pwm1a - 1
Waitms 20
Loop Until Pwm1a = 0
End If
Loop

funst jedenfals bestens
Aber nochmals meinen Dank an albundy ohne seine Vorschläge wäre ich nicht auf diese Lösung gekommen
reini