PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit RS232 und dem Empfang



BlaueLed
13.01.2010, 21: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

PicNick
14.01.2010, 06:57
So wirklich springt mich nix an, ausser, dass du die Array-Werte schon wegschreibst, wenn sie noch garnicht da sind (weil "arridx" fängt ja bei 1 an und muss z.b. "5" überhaupt erstmal erreichen)

würde ich mal folgendes probieren (tricky):


Dim Inputstring As Byte
'-------------------------------------------
Dim x_BE As Byte 'byte 1
Dim x_01 As Byte 'byte 2
Dim x_03 As Byte 'byte 3
Dim cntr As Byte 'byte 4
Dim Rot_top As Byte 'byte 5
Dim Gruen_top As Byte 'byte 6
Dim Blau_top As Byte 'byte 7
Dim Rot_right As Byte 'byte 8
Dim Gruen_right As Byte 'byte 9
Dim Blau_right As Byte 'byte 10
Dim Rot_left As Byte 'byte 11
Dim Gruen_left As Byte 'byte 12
Dim Blau_left As Byte 'byte 13
Dim Myarr(13) As Byte at x_BE OVERLAY
Dim Arridx As Byte
Dim I As Byte


der Interrupt wär dann nurmehr wie folgt


Onrxd:

Inputbin Inputstring 'Hex einlesen
If Inputstring = &HBE Then 'Wenn Sync erkannt, dann starten
Timercount = 0
Arridx = 0
End If
if Arridx < 13 then Incr Arridx ' sicherheitshalber der Teufel und Murphy schlafen nicht
Myarr(arridx) = Inputstring

' --------------(das genügt)----------------
Return


die werte sind dann automatisch im richtigen Feld, aber nur, wenn sie auch kommen

BlaueLed
14.01.2010, 10:11
Hallo PicNick,

vielen dank für die Antwort. Habe Deinen Code probiert, aber leider mit dem gleichen Ergebnis. Die Farben zucken genauso.

Gruß BlaueLed

PicNick
14.01.2010, 11:55
Wie genau hast du den Input in allen Varianten analysiert ? (da war doch schon mal ein Thread)
Weil das Programm oben ist eigentlich schon koscher, aber ohne irgendwelche Checks, ob alles so ist, wie erwartet.
--> Gibt's Doku von der Software, was die so genau liefert ?

BlaueLed
14.01.2010, 12:13
Hi,

auf dem angehängten Bild sind die Daten zu erkennen, die mir boblight über die serielle Schnittstelle liefert. BE ist die Synchronisation. Erst ab byte 5 fangen die RGB Werte an.

Es gibt eigentlich keine richtige Doku. Nur eine Homepage.

http://blogger.xs4all.nl/loosen/articles/420470.aspx

Gruß BlaueLED

Vitis
14.01.2010, 13:08
ui ui ui ...

probiers mal so:



Onrxd:
Incr Arridx
Myarr(arridx) = UDR
If Myarr(arridx) = &HBE Then 'Wenn Sync erkannt, dann starten
Timercount = 0
Arridx = 0
End If
' --------------(das genügt)----------------
Return

PicNick
14.01.2010, 13:53
mmmmmh.
Moment, das Zeichen &HBE kann doch jederzeit auch in den RGB-Daten vorkommen ? Das würde das Programm doch ins schleudern bringen.


Ich versuch mich mal schlau zu machen

BlaueLed
14.01.2010, 13:59
Hallo PicNick,

das kann natürlich sein.

gruß BlaueLed

PicNick
14.01.2010, 14:07
Tscha, ich würde folgendes versuchen, um die Sache einzukreisen


Onrxd:
Inputbin Inputstring
if Arridx = 0 then
If Inputstring = &HBE Then
Timercount = 0
Arridx = 1
End If
else
Myarr(arridx) = Inputstring
Incr Arridx
if Arridx > 13 then
Arridx = 0
End If
End If
Return


geht darum, erst auf &HBE zu warten, dann aber auf jeden fall immer 12 bytes zu lesen (je nach mode) und erst dann wieder auf das Sync zu warten

Eleganterweise sollte man die Leseanzahl aus der Message selbst rausfischen ( 3, 6 od. 9) aber für einen ersten Versuch reciht das oben vielleicht schon

BlaueLed
14.01.2010, 14:38
hi,

es hat funktioniert. Es zuckt nicht mehr. PicNick Du hattest recht. Das zucken kam bestimmt vom BE während der Übertragung. Jetzt kann ich mein Ambilight genießen.

Vielen Dank

Gruß BlaueLed

TomEdl
14.01.2010, 16:01
Hallo!

Gibts davon vielleicht ein Video? :)

Grüße
Thomas

BlaueLed
14.01.2010, 17:43
hi,

ich werde heute abend noch ein video machen und hochladen.

Gruß BlaueLed

BlaueLed
14.01.2010, 19:00
Hi,

ich habe das Video ( sorry für die schlechte qualität ) bei youtube hochgeladen. Man kann es nicht besonders gut erkennen. In Wirklichkeit sieht das besonders gut aus.

Gruß BlaueLed

http://www.youtube.com/watch?v=MvdwSSvdrhg

TomEdl
14.01.2010, 19:07
Hallo!

Danke für die Mühe! Sieht verdammt gut aus!
Gibt es so ein Programm eigentlich auch für den PC-Bildschirm?

Grüße
Thomas

BlaueLed
14.01.2010, 19:33
Hallo Thomas,

das Programm ist eigentlich nur für den PC-Bildschirm gedacht. Ich habe an meinem FlatTV ein HTPC hängen. Auf dem läuft Windows und darauf das Programm Boblight, welches mir die Daten über die serielle Schnittstelle sendet.

Gruß BlaueLed

TomEdl
14.01.2010, 19:35
Hallo!

Achso, okay, Danke. Vielleicht bau ich mir ja so ein Ambilight für meinen PC-Monitor. Bei einem PC-Game muss das ja cool rüberkommen, denk ich mir...

;-)

Grüße
Thomas