-
        

Ergebnis 1 bis 2 von 2

Thema: Bug in der UART bei Mega644 und Mega644P?

  1. #1

    Bug in der UART bei Mega644 und Mega644P?

    Anzeige

    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:

    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
    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.

  2. #2
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •