benkly
26.04.2009, 15:14
Hallo,
ich progge mir gerade einen RGB Controller mit einem Mega644P. Das ganze an sich lief bisher sehr gut und es waren am Ende keine Fehler mehr drinne.
So lange bis ich versucht habe dem Controller auch noch eine DMX-Empfängerfunktion beizubringen.
Ab dann war es vorbei bzw. die DMX-Empfänger Funktion funktioniert nicht. Ich habe nun einiges versucht aber es weder mit dem Mega644 noch mit dem Mega644p hinbekommen. Beide zeigen die gleichen Symptome, die LEDs flackern nur noch und auch auf dem LCD Display werden nur noch wirre Zeichen ausgespuckt bis sich der Controller paar Sekunden später total aufhängt.
Da ich einen Programmierfehler ausschliessen wollte habe ich den von Günter verwendeten Code mal auf einem Mega8 getestet um zu schauen ob das überhaupt funktioniert. Und siehe da es ging. Hier der Code der funktioniert hat:
'--------------------------------------------------------------
' DMX-Empfang.bas
' Grundgerüst für den Empfang des DMX-512 Signals
' (c) 2008, Günter Gerold
' Fileversion 1.0
'--------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 16000000 'selbst mit 8MHz kommt der Code noch locker mit
$baud = 250000
'USART auf DMX512 einstellen
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 , Clockpol = 1
Config Timer1 = Pwm , Pwm = 8 , Prescale = 256 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 'PWMs einstellen
Led2 Alias Pwm1a 'PWM Kanal einer LED zuweisen
Led1 Alias Pwm1b 'PWM Kanal einer LED zuweisen
On Urxc Empfang
Enable Urxc
Enable Interrupts
'Puffer für das angekommene Byte aus dem DMX-Signal
Dim X As Byte
'Alle 512 Kanäle werden in diesem Array gehalten
Dim Buffer(512) As Byte
'Der aktuelle Kanal in der Schleife
Dim Kanal As Word
Do
Led1 = Buffer(1)
Led1 = Buffer(2)
Loop
'--------------------------------------------------------------
'
'Empfang:
'
'steht in der USART ein Byte an, wird ein Interrupt
'ausgelöst und folgender Code abgearbeitet:
'--------------------------------------------------------------
Empfang:
X = Udr
If Ucsra.fe = 1 Then
Kanal = 0
Else
Incr Kanal
If Kanal < 513 And Kanal > 0 Then Buffer(kanal) = X
End If
Return
Den Code habe ich für den Mega644 und Mega644p angepasst und sieht nun so aus:
$regfile = "m644def.dat"
$crystal = 16000000 'selbst mit 8MHz kommt der Code noch locker mit
$baud = 250000
'USART auf DMX512 einstellen
Ddra = &B00000000
Ddrb = &B00000000 'IO Pins von PortB einstellen
Ddrc = &B00000000 'IO Pins von PortC einstellen
Ddrd = &B11110000
Porta = &B11111111 'IO Pins von PortD einstellen
Portb = &B11111111 'Pullup Widerstände der Pins von PortA einstellen
Portc = &B11111111 'Pullup Widerstände der Pins von PortA einstellen
Portd = &B00001111
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 , Clockpol = 1
Config Timer2 = Pwm , Pwm = On , Prescale = 256 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 'PWMs einstellen
Config Timer1 = Pwm , Pwm = 8 , Prescale = 256 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 'PWMs einstellen
Led3 Alias Pwm2a 'PWM Kanal einer LED zuweisen
Led2 Alias Pwm1a 'PWM Kanal einer LED zuweisen
Led1 Alias Pwm1b 'PWM Kanal einer LED zuweisen
Led4 Alias Pwm2b 'PWM Kanal einer LED zuweisen
On Urxc Empfang
Enable Urxc
Enable Interrupts
'Puffer für das angekommene Byte aus dem DMX-Signal
Dim X As Byte
'Alle 512 Kanäle werden in diesem Array gehalten
Dim Buffer(512) As Byte
'Der aktuelle Kanal in der Schleife
Dim Kanal As Word
Do
Led1 = Buffer(1)
Led2 = Buffer(2)
Led2 = Buffer(3)
Led2 = Buffer(4)
Loop
'--------------------------------------------------------------
'
'Empfang:
'
'steht in der USART ein Byte an, wird ein Interrupt
'ausgelöst und folgender Code abgearbeitet:
'--------------------------------------------------------------
Empfang:
X = Udr
If Ucsr0a.fe0 = 1 Then
Kanal = 0
Else
Incr Kanal
If Kanal < 513 And Kanal > 0 Then Buffer(kanal) = X
End If
Return
Und der Code funktioniert halt leider nicht, ich verstehe nur nicht warum. Ich werde nun noch mal schauen was ich noch so für µC zum gegentesten da habe.
Wäre klasse wenn sich das mal jemand anschauen könnte, ich dreh noch durch. Bisher hat mit dem RGB Controller alles geklappt, nur die DMX Geschichte will nicht, das wäre sehr schade!
Gruß, Benny.
ich progge mir gerade einen RGB Controller mit einem Mega644P. Das ganze an sich lief bisher sehr gut und es waren am Ende keine Fehler mehr drinne.
So lange bis ich versucht habe dem Controller auch noch eine DMX-Empfängerfunktion beizubringen.
Ab dann war es vorbei bzw. die DMX-Empfänger Funktion funktioniert nicht. Ich habe nun einiges versucht aber es weder mit dem Mega644 noch mit dem Mega644p hinbekommen. Beide zeigen die gleichen Symptome, die LEDs flackern nur noch und auch auf dem LCD Display werden nur noch wirre Zeichen ausgespuckt bis sich der Controller paar Sekunden später total aufhängt.
Da ich einen Programmierfehler ausschliessen wollte habe ich den von Günter verwendeten Code mal auf einem Mega8 getestet um zu schauen ob das überhaupt funktioniert. Und siehe da es ging. Hier der Code der funktioniert hat:
'--------------------------------------------------------------
' DMX-Empfang.bas
' Grundgerüst für den Empfang des DMX-512 Signals
' (c) 2008, Günter Gerold
' Fileversion 1.0
'--------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 16000000 'selbst mit 8MHz kommt der Code noch locker mit
$baud = 250000
'USART auf DMX512 einstellen
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 , Clockpol = 1
Config Timer1 = Pwm , Pwm = 8 , Prescale = 256 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 'PWMs einstellen
Led2 Alias Pwm1a 'PWM Kanal einer LED zuweisen
Led1 Alias Pwm1b 'PWM Kanal einer LED zuweisen
On Urxc Empfang
Enable Urxc
Enable Interrupts
'Puffer für das angekommene Byte aus dem DMX-Signal
Dim X As Byte
'Alle 512 Kanäle werden in diesem Array gehalten
Dim Buffer(512) As Byte
'Der aktuelle Kanal in der Schleife
Dim Kanal As Word
Do
Led1 = Buffer(1)
Led1 = Buffer(2)
Loop
'--------------------------------------------------------------
'
'Empfang:
'
'steht in der USART ein Byte an, wird ein Interrupt
'ausgelöst und folgender Code abgearbeitet:
'--------------------------------------------------------------
Empfang:
X = Udr
If Ucsra.fe = 1 Then
Kanal = 0
Else
Incr Kanal
If Kanal < 513 And Kanal > 0 Then Buffer(kanal) = X
End If
Return
Den Code habe ich für den Mega644 und Mega644p angepasst und sieht nun so aus:
$regfile = "m644def.dat"
$crystal = 16000000 'selbst mit 8MHz kommt der Code noch locker mit
$baud = 250000
'USART auf DMX512 einstellen
Ddra = &B00000000
Ddrb = &B00000000 'IO Pins von PortB einstellen
Ddrc = &B00000000 'IO Pins von PortC einstellen
Ddrd = &B11110000
Porta = &B11111111 'IO Pins von PortD einstellen
Portb = &B11111111 'Pullup Widerstände der Pins von PortA einstellen
Portc = &B11111111 'Pullup Widerstände der Pins von PortA einstellen
Portd = &B00001111
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 , Clockpol = 1
Config Timer2 = Pwm , Pwm = On , Prescale = 256 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 'PWMs einstellen
Config Timer1 = Pwm , Pwm = 8 , Prescale = 256 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 'PWMs einstellen
Led3 Alias Pwm2a 'PWM Kanal einer LED zuweisen
Led2 Alias Pwm1a 'PWM Kanal einer LED zuweisen
Led1 Alias Pwm1b 'PWM Kanal einer LED zuweisen
Led4 Alias Pwm2b 'PWM Kanal einer LED zuweisen
On Urxc Empfang
Enable Urxc
Enable Interrupts
'Puffer für das angekommene Byte aus dem DMX-Signal
Dim X As Byte
'Alle 512 Kanäle werden in diesem Array gehalten
Dim Buffer(512) As Byte
'Der aktuelle Kanal in der Schleife
Dim Kanal As Word
Do
Led1 = Buffer(1)
Led2 = Buffer(2)
Led2 = Buffer(3)
Led2 = Buffer(4)
Loop
'--------------------------------------------------------------
'
'Empfang:
'
'steht in der USART ein Byte an, wird ein Interrupt
'ausgelöst und folgender Code abgearbeitet:
'--------------------------------------------------------------
Empfang:
X = Udr
If Ucsr0a.fe0 = 1 Then
Kanal = 0
Else
Incr Kanal
If Kanal < 513 And Kanal > 0 Then Buffer(kanal) = X
End If
Return
Und der Code funktioniert halt leider nicht, ich verstehe nur nicht warum. Ich werde nun noch mal schauen was ich noch so für µC zum gegentesten da habe.
Wäre klasse wenn sich das mal jemand anschauen könnte, ich dreh noch durch. Bisher hat mit dem RGB Controller alles geklappt, nur die DMX Geschichte will nicht, das wäre sehr schade!
Gruß, Benny.