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