PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bug in der UART bei Mega644 und Mega644P?



benkly
26.04.2009, 14: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.

benkly
26.04.2009, 15:08
Hallo,

neue Erkenntnis: mit der 2. UART des Mega644P funktioniert es. Also denke ich mal das es an der .Dat-Datei des Mega644P liegen muss und dieser Fehler sogar in der .Dat-Datei des Mega644 auch vorhanden sein muss da es mit diesem ja auch nicht geht aber nur der aber gar keine 2. UART zum testen hat.

Gruß, Benny.