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
Lesezeichen