PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RGB Led PWM Benutzerfreundlich Ansteuern



Lenox
18.02.2007, 22:39
Abend,
da ich zurzeit mit meiner Fernsteuerung nicht weiterkomme, erstmal das wichtigere.
Es soll eine RGB Led verschiedene Farben "durchfadern".
Ich habe mir dazu
http://www.smartprogramming.de/index.php?siteid=10
angeguckt, und den Code auf eine RGB hin gestutzt.

Leider leuchen aber nur Rot & Grün. Und das auch nur sehr langsam.
Problem ist wahrscheinlich das ich einen ATMeaga 16 mit 16Mhz anstadt einen Mega8 mit 8 Mhz benutze.

Leider komme ich nicht wirklich weiter.
Mein Gedankengang ist das vielleicht der letzte Teil der Soubroutine "verschluckt" wird.
Zudem wundern mich die ganzen Waitms im Code

Wäre nett wenn ihr mal drübergucken könntet, dürfte nur eine kleinigkeit sein, aber leider hab ich wohl noch verständlichkeits Probleme mit den Timern..



$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Waitms 50 'Einschwingzeit

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output

'Timer konfigurieren, Vorteiler auf 1
Config Timer0 = Timer , Prescale = 1

'Definiere den Interrupthandler
On Ovf0 Tim0_isr

Enable Timer0 'timer einschalten
Enable Interrupts 'interrupts einschalten

Dim R1 As Byte ' In diese Variablen muss man
Dim G1 As Byte ' im Hauptprogram die gewünschten
Dim B1 As Byte ' Ausgabewerte laden

Dim Z As Word 'Byte 'Zähler

Dim Ri1 As Byte ' Hilfsregister
Dim Gi1 As Byte
Dim Bi1 As Byte

'Variablen für Hauptprogramm
Dim A As Byte 'Eine Schleifenvariable

Z = 0

G1 = 0
R1 = 0
B1 = 0

'Hauptschleife==================================== ==============================
Do

'Rot
For A = 0 To 254
R1 = R1 + 1
'Waitms 0,1
Next
Waitms 10
For A = 0 To 254
R1 = R1 - 1
'Waitms 1
Next

'Grün
For A = 0 To 254
G1 = G1 + 1
'Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
'Waitms 1
Next

'Blau
For A = 0 To 254
B1 = B1 + 1
'Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
'Waitms 1
Next

'Blau/Grün
For A = 0 To 254
B1 = B1 + 1
G1 = G1 + 1
'Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
G1 = G1 - 1
'Waitms 1
Next

'Blau/Rot
For A = 0 To 254
B1 = B1 + 1
R1 = R1 + 1
'Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
R1 = R1 - 1
'Waitms 1
Next

'Grün/Rot
For A = 0 To 254
G1 = G1 + 1
R1 = R1 + 1
'Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
R1 = R1 - 1
'Waitms 1
Next

'Grün/Rot/Blau
For A = 0 To 254
G1 = G1 + 1
R1 = R1 + 1
B1 = B1 + 1
'Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
R1 = R1 - 1
B1 = B1 - 1
'Waitms 1
Next

Loop
'Hauptschleife ende============================================== ===============

'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
Ri1 = R1 'Hilfsregister übergeben
Gi1 = G1
Bi1 = B1
Z = 255
End If

Z = Z - 1

'PWM Kanäle

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

If Gi1 > 0 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
Gi1 = Gi1 - 1
If Gi1 = 255 Then Gi1 = 0

If Bi1 > 0 Then
Portb.2 = 1
Else
Portb.2 = 0
End If
Bi1 = Bi1 - 1
If Bi1 = 255 Then Bi1 = 0

Return
'Interupthandler ende


Mfg
Stefan