Hallo,
was aehnliches habe ich gerade mit einem ATmega8 zu Testzwecken zusammengebrutzelt:
http://www.elektronik-web.de/pwm_test.jpg
Allerdings habe ich hier noch einen Infrarotempfaenger (TSOP1136) mit aufs Board gebastelt (Stichwort RC5). Mit ner Standart TV-Fernbedienung schalte ich eine Gluehlampe mit der "1" ein und mit der "2" wieder aus. Mit der "4" wird heller gedimmt und mit der "5" dunkler.
Auf PortB.0 wird hier das PWM-Signal erzeugt.
Ich benutze da ein simples PWM-Beispiel mit einem 8Bit Timer aus dem Claus Kuehnel Buch von Seite 159.
Da der Timer0 schon von der Infrarotgeschichte benutzt wird, habe ich hier den Timer 2 verwendet.
Die kleine Gluehlampe (12V) wird ueber einen BD243 geschaltet, der ueber nen 1K direkt an PortB.0 haengt.
Aus dem folgenden Code (ist sicherlich nicht optimal), musste Dir das wichtigste rausfischen.
Code:
$regfile = "m8def.dat"
$crystal = 12000000
Const True = 1
Const False = 0
Config Pinb.0 = Output
Config Rc5 = Pinb.1
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.0 , Rs = Portd.1
Config Lcd = 16 * 4
Config Timer2 = Timer , Prescale = 64
Ausgang Alias Portb.0
On Timer2 Timer2_isr
Dim Hi As Byte
Dim Lo As Byte
Dim Phase As Bit
Dim Address As Byte , Command As Byte
Dim A As Integer
Lo = 1
Phase = True
Enable Timer2
Enable Interrupts
Initlcd
Cursor Off
Cls
Locate 1 , 1
Lcd "PWM-Test"
Lo = 0
Hi = 0
A = 0
Do
Getrc5(address , Command)
If Address <> 255 Then
Command = Command And &B01111111
Select Case Command
Case 1 : A = 0
Case 2 : A = 255
Case 4 :
A = A - 5
If A <= 0 Then A = 0
Case 5 :
A = A + 5
If A >= 255 Then A = 255
End Select
Lo = A
Hi = 255 - Lo
Locate 3 , 1
Lcd A ; " "
End If
Loop
End
Timer2_isr:
If Phase = True Then
Ausgang = 1
Timer2 = Lo
Phase = False
Else
Ausgang = 0
Timer2 = Hi
Phase = True
End If
Return
Mit freundlichen Gruessen
Digitali
Lesezeichen