Code:
' Demo einer 3 Kanal Hardware PWM ( 1 x Rot, 1 x Gruen , 1 x Blaue LED ) und Steuerung durch eine RC5 Kompatibele Infrarot Fernbedienung
' Das ganze ist mit einem Pollin Board " Atmel Evaluations-Board Version 2.0" und einem ATMega32 Prozessor realisiert.
' Als RGB LED wurde eine [5mm, 6 Pin, Fullcolor LED verwandt mit 2 x Blaue + 1 x Rot + 1 Gruene LED bei 2 x Gem. Kathode] von
' Kingbright Part No. LF5WAEMBGMBC (Klar Version) oder Part No. LF5WAEMBGMBW (Diffuse Version) genommen.
' Umrechnungsgrundlage von HSV zu RGB ist in Wikipedia zu finden Link: http://de.wikipedia.org/wiki/HSV-Farbraum
' und wurde in den Wertebereichen 360° = 255 Dezimal und 100% = 255 Dezimal angepasst, um mit Byte Variablen arbeiten zu können.
' geschrieben am 30.12.2007 durch Martin Derks.
'---------------------------------------------------------------------------------------------------------------------------------------------
$regfile = "m32def.dat"
$crystal = 8000000
$baud = 9600
$framesize = 512 ' Reichlich hoch gesetzt um Reserven zu haben
$swstack = 512 ' Reichlich hoch gesetzt um Reserven zu haben
$hwstack = 512 ' Reichlich hoch gesetzt um Reserven zu haben
$lib "mcsbyte.lbx" 'mcsbyte library um etwas kuerzeren Code zu generieren
Config Rc5 = Pinc.6 ' Eingangs Pin für Infrarotempfaenger Baustein [(AtMega32 IC Pin 28) und (Pollin Board J4 Stecker Pin 24)] '
Config Portd = &B10110000 ' Port Bits d 4,5,7 auf High setzen
' Timer0 nicht setzen und nutzen da Bascom diesen intern für den Befehl GetRC5 nutzt
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
' 8 Bit PWM Ausgang
' Portd.4 = Rote LED [(AtMega32 IC Pin 18) und (Pollin Board J4 Stecker Pin 30)] und
' Portd.5 = Gruene LED [(AtMega32 IC Pin 19) und (Pollin Board J4 Stecker Pin 31)]
Config Timer2 = Pwm , Pwm = On , Compare = Clear , Prescale = 1
' 8 Bit PWM Ausgang
' Portd.7 = Blaue LED [(AtMega32 IC Pin 21) und (Pollin Board J4 Stecker Pin 33)]
Enable Timer1
Enable Timer2
Enable Interrupts
Dim R As Byte , G As Byte , B As Byte , I As Byte , F As Byte , Rot As Byte , Gruen As Byte , Blau As Byte , Z As Byte
Dim H As Byte , S As Byte , V As Byte
' H = Hue = Farbwert ; V = Value = Helligkeitsbeiwert ; S = Saturation = Sättigung
Dim P As Integer , Q As Integer , T As Integer , P1 As Integer , Q1 As Integer , T1 As Integer
Dim Address As Byte , Command As Byte
Declare Sub Hsv_to_rgb(byval H As Byte , Byval S As Byte , Byval V As Byte)
H = 0
S = 255
V = 255
Call Hsv_to_rgb(h , S , V ) ' Erster Subrutinen Aufruf, um einen eindeutigen Farbzustand einzustellen
Do
Getrc5(address , Command)
If Address = 0 Then
Command = Command And &B01111111
Print "Adr.: " ; Address ; " Cmd: " ; Command ' Wer mag kann den Wert von "Adress" & "Command" via RS232 ausgeben
End If
Select Case Command
Case 32 : ' erhöhe Hue ; entspricht der Taste [CH+] der IR FB
H = H + 1
Case 33 : ' verringere Hue ; entspricht der Taste [CH-] der IR FB
H = H - 1
Case 16 : ' erhöhe Value ; entspricht der Taste [VOL+] der IR FB
V = V + 1
Case 17 : ' verringere Value ; entspricht der taste [VOL-] der IR FB
V = V - 1
Case 13 : ' erhöhe Saturation ; entspricht der Taste [Symbol Lautsprecher aus / Mute] der IR FB
S = S + 1
Case 60 : ' verringere Saturation ; entspricht der Taste [Symbol 3 Striche im Bildschirm = TEXT] der IR FB
S = S - 1
Case 63 : ' setze H,S,V auf 0 entspricht der Tast [Symbol leerer Bildschirm] der IR FB
H = 1
S = 1
V = 1
Case 46 : ' setze H,S,V auf 255 entspricht der Taste [Symbol 3 unterschiedlich lange Striche im Bildschirm = Sskundäres Menue] der IR FB
H = 255
S = 255
V = 255
Case 41 : ' setze H,S,V auf 128 entspricht der Taste [ Symbol Pfeil oben und unten mit 2 Strichen im Bildschirm = Speichern/Ausführen/Bestätigen] der IR FB
H = 128
S = 128
V = 128
End Select
Call Hsv_to_rgb(h , S , V )
Print " Rot=" ; Rot ; " " ; " Gruen =" ; Gruen ; " " ; " Blau=" ; Blau ; " " ; " H= " ; H ; " S=" ; S ; " V=" ; V ' Wer mag kann sich die Daten via RS232 ausgeben
Compare1a = Rot
Compare1b = Gruen
Ocr2 = Blau
Loop
End ' Ende des Hauptprogrammes
Sub Hsv_to_rgb(byval H As Byte , Byval S As Byte , Byval V As Byte)
If S = 0 Then
R = V
G = V
B = V
Else
I = H / 43
F = H Mod 43
P = 255 - S : P1 = P * V : P = P1 / 256
Q = S * F : Q1 = 10710 - Q : Q = Q1 / 42 : Q1 = Q * V : Q = Q1 / 256
T1 = 42 - F : T = T1 * S : T1 = 10710 - T : T = T1 / 42 : T1 = T * V : T = T1 / 256
End If
Select Case I
Case 0 :
R = V
G = T
B = P
Case 1 :
R = Q
G = V
B = P
Case 2 :
R = P
G = V
B = T
Case 3 :
R = P
G = Q
B = V
Case 4 :
R = T
G = P
B = V
Case 5 :
R = V
G = P
B = Q
End Select
Rot = R
Gruen = G
Blau = B
End Sub
Ich hoffe für euch und für mich, dass das kommende Jahr sich nicht wie 6 Monate anfühlt.
Lesezeichen