Vielleicht funktioniert das:

Code:
' PULS WEITEN MODULATION (PWM)
' Sprache: Bascom AVR-Basic (Demoversion 1.11.6.2)
' Getestet mit 8 MHz auf 90S2333.Ausgabewert wird dann ca. 121 mal pro Sekunde
' erneuert.
' 3 Kanäle an Port B0, B1, B2
' Bewust einfaches Programm zur Erklärung wie eine Software PWM funktionieren kann.
' Timerinterupt, der in gleichmäßigen Abständen
' das Hauptprogramm unterbricht und ein Unterprogramm (Interupthandler) aufruft
' das die Ausgänge ein oder ausschaltet. Im Mittel ergibt sich dann der gewünschte
' Ausgabewert (Normale Multimeter sind langsam genug d.h. der Ausgabewert kann
' für Testzwecke direkt am Pin gemessen werden)
' Sept. 2002 Bernhard T.



'Timer konfigurieren, Vorteiler auf 1 ist gut fürs Simulieren (evtl. anpassen, dann aber ausgang mit R-C Tiefpass)
Config Timer0 = Timer , Prescale = 1

'Definiere den Interrupthandler
On Ovf0 Tim0_isr

'Wichtig:
Config Pinb.0 = Output        'Port B = Ausgang
Config Pinb.1 = Output
Config Pinb.2 = Output

Enable Timer0                 'timer einschalten
Enable Interrupts             'interrupts  einschalten

Dim R As Byte                 ' In diese Variablen muss man
Dim G As Byte                 ' im Hauptprogram die gewünschten
Dim B As Byte                 ' Ausgabewerte laden

Dim Z As Word                 'Byte                 ' Zähler

Dim Ri As Byte                ' Hilfsregister
Dim Gi As Byte
Dim Bi As Byte




Z = 0

Do
   'your program goes here
'Bsp.:

 'R = 51                       ' bei Ub= 5V ca. 1Volt
 'G = 102                      ' ca. 2V
 'B = 1                        ' 5V/256 = 0.01953125 V Soll

 R = 255
 G = 255
 B = 255

Schleife:
Goto Schleife


Loop

'Interupthandler, wird bei jedem Timerüberlauf(bei 8 MHz und Vorteiler=1 alle 32 µSec.)
'aufgerufen:
Tim0_isr:

    If Z = 0 Then             'Gewünschte Ausgabewerte an
    Ri = R                    'Hilfsregister übergeben
    Gi = G
    Bi = B
    Z = 255
    End If

    Z = Z - 1

    If Ri > 0 Then            'R > Port B.0
    Portb.0 = 1               'bei R = 51 wird hier
    Else                      'Port B.0 51 mal auf 1
    Portb.0 = 0               'und 205 mal auf 0 geschaltet
    End If                    'das ergibt bei 5V Ub im Mittel
    Ri = Ri - 1               ' ca. 1 V
    If Ri = 255 Then Ri = 0

    If Gi > 0 Then            'G > Port B.1
    Portb.1 = 1
    Else
    Portb.1 = 0
    End If
    Gi = Gi - 1
    If Gi = 255 Then Gi = 0

    If Bi > 0 Then
    Portb.2 = 1               'B > Port B.2
    Else
    Portb.2 = 0
    End If
    Bi = Bi - 1
    If Bi = 255 Then Bi = 0

    ' Hier könnten eigentlich noch weitere Kanäle eingefügt werden

    Return