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:
Code:'-------------------------------------------------------------- ' 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:
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.Code:$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
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.







Zitieren

Lesezeichen