BlaueLed
13.01.2010, 22:59
Hallo,
ich versuche mir gerade ein "Ambilight" zu bauen. Dafür gibt es eine Software, die den Bildschirminhalt ausliest und die Werte ( Hex ) an die serielle Schnittstelle sendet. Ein String davon sieht so aus:
BE 00 00 03 FF FF FF
Wobei nur die letzen 3 Hex Werte ( R G B ) interessant sind. Dies ist ein Beispiel für einen Kanal. Für 2 Kanäle sieht der String so aus:
BE 00 00 06 FF FF FF FF FF FF
Auch hier sind wieder nur die letzten 6 Werte ( RGB RGB ) interessant. Zum einlesen benutze ich folgenden Code:
'--- Regfile ---
$regfile = "m88def.dat"
$crystal = 18432000
$baud = 38400
'--- interrupt ---
On Urxc Onrxd
Enable Urxc
Enable Interrupts
'--- Dim ---
Dim Inputstring As Byte
Dim Myarr(13) As Byte
Dim Arridx As Byte
Dim I As Byte
Dim Rot_top As Byte
Dim Gruen_top As Byte
Dim Blau_top As Byte
Dim Rot_right As Byte
Dim Gruen_right As Byte
Dim Blau_right As Byte
Dim Rot_left As Byte
Dim Gruen_left As Byte
Dim Blau_left As Byte
Dim Timercount As Word
'--- Config ---
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portc.5 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Config Timer2 = Pwm , Pwm = On , Compare A Pwm = Clear Down , Prescale = 1
Tccr2a = &B10000001
'--- Enable ---
Enable Timer0
Enable Timer1
Enable Timer2
'--- Start / boot ---
Compare1b = 0
Compare1a = 0
Ocr2a = 0
Timercount = 0
'--- Main ---
Main:
Compare1b = Gruen_top 'Grün ansteuern
Compare1a = Blau_top 'Blau ansteuern
Ocr2a = Rot_top 'Rot ansteuern
Goto Main
'--- Interrupt Onrxd ---
Onrxd:
Inputbin Inputstring 'Hex einlesen
If Inputstring = &HBE Then 'Wenn Sync erkannt, dann starten
Timercount = 0
Arridx = 0
End If
Incr Arridx
Myarr(arridx) = Inputstring
Rot_top = Myarr(5) 'Werte in Array packen
Gruen_top = Myarr(6)
Blau_top = Myarr(7)
Rot_left = Myarr(8)
Gruen_left = Myarr(9)
Blau_left = Myarr(10)
Rot_right = Myarr(11)
Gruen_right = Myarr(12)
Blau_right = Myarr(13)
Return
Wenn ich die Software auf nur einen Kanal stelle, dann habe ich schöne Übergänge zwischen den einzelnen Farben. Sobald ich aber die Software auf 2 Kanäle umstelle ( Top und Left ), dann zucken die Farben der LED Leiste ab und zu. ( Das Programm im Atmel ist immer das selbe. Nur die Daten, welche über die serielle kommen sind anders ). Beim hoch- oder runterdimmen einer Farbe geht diese dann z.B. dauerhaft an und sofort wieder aus. Es ist nicht reproduzierbar. Ich schließe einen Hardwarefehler momentan mal aus, da mit nur einem Kanal ( Top ) alles funktioniert. Ich sitz hier nun seit 6 Stunden und finde den Fehler einfach nicht. Es wäre nett, wenn Ihr mal drüber schauen könntet. Wo könnte der Fehler sein ?
Danke im Voraus
Gruß BlaueLED
ich versuche mir gerade ein "Ambilight" zu bauen. Dafür gibt es eine Software, die den Bildschirminhalt ausliest und die Werte ( Hex ) an die serielle Schnittstelle sendet. Ein String davon sieht so aus:
BE 00 00 03 FF FF FF
Wobei nur die letzen 3 Hex Werte ( R G B ) interessant sind. Dies ist ein Beispiel für einen Kanal. Für 2 Kanäle sieht der String so aus:
BE 00 00 06 FF FF FF FF FF FF
Auch hier sind wieder nur die letzten 6 Werte ( RGB RGB ) interessant. Zum einlesen benutze ich folgenden Code:
'--- Regfile ---
$regfile = "m88def.dat"
$crystal = 18432000
$baud = 38400
'--- interrupt ---
On Urxc Onrxd
Enable Urxc
Enable Interrupts
'--- Dim ---
Dim Inputstring As Byte
Dim Myarr(13) As Byte
Dim Arridx As Byte
Dim I As Byte
Dim Rot_top As Byte
Dim Gruen_top As Byte
Dim Blau_top As Byte
Dim Rot_right As Byte
Dim Gruen_right As Byte
Dim Blau_right As Byte
Dim Rot_left As Byte
Dim Gruen_left As Byte
Dim Blau_left As Byte
Dim Timercount As Word
'--- Config ---
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portc.5 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Config Timer2 = Pwm , Pwm = On , Compare A Pwm = Clear Down , Prescale = 1
Tccr2a = &B10000001
'--- Enable ---
Enable Timer0
Enable Timer1
Enable Timer2
'--- Start / boot ---
Compare1b = 0
Compare1a = 0
Ocr2a = 0
Timercount = 0
'--- Main ---
Main:
Compare1b = Gruen_top 'Grün ansteuern
Compare1a = Blau_top 'Blau ansteuern
Ocr2a = Rot_top 'Rot ansteuern
Goto Main
'--- Interrupt Onrxd ---
Onrxd:
Inputbin Inputstring 'Hex einlesen
If Inputstring = &HBE Then 'Wenn Sync erkannt, dann starten
Timercount = 0
Arridx = 0
End If
Incr Arridx
Myarr(arridx) = Inputstring
Rot_top = Myarr(5) 'Werte in Array packen
Gruen_top = Myarr(6)
Blau_top = Myarr(7)
Rot_left = Myarr(8)
Gruen_left = Myarr(9)
Blau_left = Myarr(10)
Rot_right = Myarr(11)
Gruen_right = Myarr(12)
Blau_right = Myarr(13)
Return
Wenn ich die Software auf nur einen Kanal stelle, dann habe ich schöne Übergänge zwischen den einzelnen Farben. Sobald ich aber die Software auf 2 Kanäle umstelle ( Top und Left ), dann zucken die Farben der LED Leiste ab und zu. ( Das Programm im Atmel ist immer das selbe. Nur die Daten, welche über die serielle kommen sind anders ). Beim hoch- oder runterdimmen einer Farbe geht diese dann z.B. dauerhaft an und sofort wieder aus. Es ist nicht reproduzierbar. Ich schließe einen Hardwarefehler momentan mal aus, da mit nur einem Kanal ( Top ) alles funktioniert. Ich sitz hier nun seit 6 Stunden und finde den Fehler einfach nicht. Es wäre nett, wenn Ihr mal drüber schauen könntet. Wo könnte der Fehler sein ?
Danke im Voraus
Gruß BlaueLED