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
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