-
        

Ergebnis 1 bis 8 von 8

Thema: Uart zwischen zwei Megas klemmt - - wieder einmal

  1. #1
    Murus
    Gast

    Uart zwischen zwei Megas klemmt - - wieder einmal

    Anzeige

    Hallihallo

    Ich möchte 42 Bytes von einem Mega32 zu einem Mega8 schicken.
    Hier die Daten:
    Mega32: 16MHz Quarz
    Mega8: 8MHz interner Oszillator
    Baudrate: 9600

    TxD vom einen ist an RxD vom Anderen angeschlossen und umgekehrt, physikalischer Kontakt ist gewährleistet.

    Der Mega32 sendet die Daten (Print-Befehl in Bascom), auf der Leitung tut sich was. (Oszi)
    So sieht die Senderoutine aus:

    For i=1 to 42
    Print Led(i)
    Next

    Led ist ein Array, alle Stellen sind beschrieben.
    auch wenn ich nach dem Printbefehl etwas warte (10ms) klappts nicht.

    Im Empfänger nutze ich den UART-Empfangsinterrupt.
    In der Interruptroutine vom Empfang wird das UDR-Byte zu einem vorhanden String hinzuaddiert.
    Leider scheint nicht einmal diese Interruptroutine erreicht zu werden, sprich, der Mega8 (Empfänger) tut so, als ob nichts ankäme, werde das morgen nochmals untersuchen.

    Frage: stimmt die Hardware (basierend auf obigen Daten)? (besonders Taktraten/Baudraten, passt des?)

    Herzlichen Gruss und vielen Dank

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    was mir als erstes dazu einfällt,
    sind alle Gnd Anschlüsse beider AVRs miteinander verbunden ?

    Zeig evtl. auch den EmpfängerCode, dann lässt sichs leichter drüber nachdenken.

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Print Led(i)
    da mußt du auf jeden fall ein semikolon anhängen, sonst wird <CR><LF> angehängt (Zeilenvorschub), und da kömmt der Empfänger ins Schleudern
    also

    Print Led(i) ;
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Murus
    Gast
    Hmhm, geht noch nicht.
    GND verbunden.

    Hier die Codes: (nur Wesentliches)

    Sender:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 4800
    
    Ddra.7 = 0
    Porta.7 = 1
    Ddra.6 = 0
    Porta.6 = 1
    Ddra.5 = 0
    Porta.5 = 1
    Ddra.4 = 0
    Porta.4 = 1
    
    Dim Led(42) As Byte                                         ' Array für Matrixled: 0= Aus, 1= Grün, 2= Rot, 3=orange
    Dim I As Byte
    ' Zuerst alle aus
    For I = 1 To 42
    Led(i) = 0
    Next
    
    
    Dim A As Byte
    A = 1
    Dim B As Byte
    B = 1
    
    Do
    ' Eine Matrix-Led mehr aufleuchten lassen:
    If Pina.4 = 0 Then
    Waitms 300
    Toggle Porta.0
    Gosub Matrixchange
    End If
    Loop
    
    Matrixchange:
    ' nächste LED
    Led(b) = A
    Incr B
    
    'Falls alle leuchten:
    If B = 43 Then
    B = 1
    For I = 1 To 42
    Led(i) = 0
    Next
    
    Incr A
    
    If A = 4 Then
    A = 1
    End If
    
    End If
    
    ' nun noch per UART schicken:
    For I = 1 To 42
    Print Led(i);
    Waitms 2
    Next
    
    Return
    Und der Empfänger:

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 4800
    
    On Urxc Serielleroutine
    Enable Urxc
    Enable Interrupts
    
    Dim Empfang As String * 50
    Empfang = ""
    
    Do
    
    If Len(empfang) =42 Then
                                      
    For I = 1 To 42
    Blablabla (unwichtig)
    Next
    
    Empfang = ""
    End If
    Loop
    
    
    Serielleroutine:
    Empfang = Empfang + Chr(udr)
    Return
    Diese If-Abfrage in der Do-loop-Schleife wird nicht erreicht, "Emfpang" wird also nicht 42lang, falls sich überhaupt was tut.
    Nun schau ich noch, ob der Serielle Interrupt überhaupt erreicht wird.

    Im Empfänger läuft aber noch der Timer0-interrupt, der mit 36kHz einen Interrupt auslöst... Könnte das ein Grund für Störungen sein?

    Aaaah, ich habs! Es war tatsächlich der Timer! Hab seinen Prescale mal auf 1024 gestellt, jetzt wird alles sauber und korrekt empfangen...

    Jetzt mach ichs einfach so, dass der Mega32 zuerst etwas kurzes schickt, damit der Timer im Mega8 abgestellt werden kann. Dann blinkt halt die Matrix kurz aber was solls.



    Herzlichen Gruss und Danke
    Mario

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2006
    Ort
    Biberach
    Alter
    27
    Beiträge
    485
    Hi,
    was mir auffällt:
    Bei deinen For-Schleifen schreibst du immer "For x=0 to 100 ... Next"
    Das muss dann aber "Next x" heißen. Also bei deinem Sender zum Beispiel:
    For I = 1 To 42
    Led(i) = 0
    Next I

    Keine Ahnung obs daran liegt.

    MfG

  6. #6
    Murus
    Gast
    Ne, es geht auch ohne Next I.
    Nur wenn ich verschachtelte For-Schleifen habe nehme ich das Next I, wäre aber auch da unnötig.
    Der Compiler nimmt dann einfach das Next, das zuerst kommt.

    Aber jetzt gehts ja, hab die Baudrate auf 19200 hochgedreht und den Prescaler auf 8. Tipptopp, vielen Dank!

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.01.2007
    Ort
    Deutschland [Bayern]
    Alter
    35
    Beiträge
    125
    Was mir dazu nur einfällt ist dein Quarz! ... Der ist nicht wirklich Optimal dimensioniert für eine Stabile übertragung. Die internen 8MHz is eigentlich schon nicht kompatibel zu einem PC (da du aber zwischen 2 selbige 8MHz takt-Controler überträgst, kann man das vernachlässigen) das du allerdings den Internen Quarz nimmst, find ich nicht besonders toll, da dieser doch SEHR ungenau ist, im vergleich zu eienm externen Quarz.

    Ich empfehle dir einen Externen Quarz mit >genau< 11059,200 KHz (also .. 11,0592 MHz) ... dieser ist rechnerisch der ideale Takt für die Kommunikation im Baud-Raster mit dem UART.


    JimJim
    XUN

  8. #8
    Murus
    Gast
    Hmm.. geht net...
    Alle Pins des Mega8 sind besetzt

    Ist übrigens kein interner Quarz, sondern ein RC-Oszillator (drum ja etwas ungenau)

    Ausserdem funktionierts ja... also was solls

Berechtigungen

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