- 3D-Druck Einstieg und Tipps         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Mehrere Atmegas Koppeln- UART

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    13.06.2008
    Ort
    Nürnberg
    Alter
    30
    Beiträge
    94

    Mehrere Atmegas Koppeln- UART

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi Leuts,

    ich hock grad vor einem, wahrscheinlich simplen Problem:
    Ich versuch gerade mehrere Atmega8 zu verbinden, und zwar via UART.
    Erstmal will ich es mit 2 Schaffen, danach mit mehreren. Ich verbinde also RxD un TxD jeweils gekreuzt. Eine Nachricht, der der Master sendet, heißt z.B. "A ON": Das heißt das er Slave A meint und die Nachricht "ON" schickt, was einfach eine LED anschalten soll.
    Hier mein Code:
    Master:
    Code:
    'Master
    $regfile = "M8def.dat"
    $crystal = 8000000
    
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    
    'Uart
    $baud = 9600
    Config Serialin = Buffered , Size = 15 , Bytematch = 13
    Enable Interrupts
    'Main:
    Do
    'senden
    Print "A"
    Wait 2
    Print "B ON"
    Wait 2
    Print "A OFF"
    Wait 2
    Print "B OFF"
    Wait 2
    
    
    Loop
    Und Slave:
    Code:
    'Slave 1
    $regfile = "M8def.dat"
    $crystal = 8000000
    
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    
    $baud = 9600
    
    
    
    
    
    'Globale Variablen
    Dim Tmp As Byte
    Dim New_command As String * 15
    Dim Command_array(3) As String * 5
    Dim New_status As Bit
    
    
    'Prozeduren
    Declare Sub Serial0charmatch()
    Declare Sub Do_set_command(cmd_output As String)
    
    'Configs
    Config Portc.5 = Output
    Portc.5 = 1
    Config Serialin = Buffered , Size = 15 , Bytematch = 13
    Enable Interrupts
    
    'Main:
    Do
    If New_command <> "" Then
          'Alles in Großbuchstaben umwandeln
          New_command = Ucase(new_command)
    
          'Anweisung aufteilen
          Tmp = Split(new_command , Command_array(1) , " ")
    
          Select Case Command_array(1)
          Case "A"
             'Status des Ausganges/der Ausgänge zurück geben
             Call Do_set_command(command_array(2))
              Toggle Portc.5
          End Select
    
          New_command = ""
       End If
    
    
    Loop
    
    
    'Subs
    
    Sub Serial0charmatch()
     Input New_command Noecho
    End Sub
    
    Sub Do_set_command(cmd_output As String * 5)
    Select Case Cmd_output
    Case "ON"
    Portc.5 = 1
    Case "OFF"
    Portc.5 = 0
    End Select
    
    End Sub
    Wenn ich jedoch starte, dann passiert beim Slave nix. Der Master sendet fließig(sieht man am Hyperterminal) doch der Slave verarbeitet das Signal nicht. Ankommen tuts (Serial0charmatch wird aufgerufen), aber er erkennt "A" nicht. Wenn ich per Hyperterminal "A ON" sende, dann funzts...

    Ich bin nicht so der Bascom-Kreck, vielleicht hab ich mich mit irgendwelchen Variablen vertaen...

    Vielleicht kann ja irgendjemand helfen,

    Grüße,

    Tom

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    52
    Beiträge
    765
    Im Master fehlt hinter A das on.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    13.06.2008
    Ort
    Nürnberg
    Alter
    30
    Beiträge
    94
    Hi,

    danke für deine Antwort, aber das "A" hatte ich nur mal zu Testzwecken genommen, um zu prüfen, ob es an dem "on" liegt.

    Gruß,

    Tom

    EDIT:
    Ich hab jetzt nochmal nachgeprüft, und den Slave mal das ausgeben lassen, was er bekommt. Er bekommt ganz normal "A OFF" und dann halt CR.

    Ich verstehe nicht warum das nicht funktioniert, ich hab auch schon versucht CHR(64) zu senden. A kommt an aber es tut sich nix...

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.05.2006
    Beiträge
    260
    Hi,

    Semikolon (carriage return) hinter den Text setzen.
    Print "A on";
    sollte funktionieren


    Gruß

    Christian

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    13.06.2008
    Ort
    Nürnberg
    Alter
    30
    Beiträge
    94
    Hi,

    danke für die Antwort aber soweit ich weiß verhindert das Semikolon Carrige Return. Ohne sollte CR und LineFeed(oder so) automatisch gesendet werden.

    Gruß,

    Tom

    PS: Habs auch ausprobiert

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2004
    Beiträge
    451
    hi,

    ich hab den quelltext nur mal überflogen, kann es evtl. daran liegen, dass du bei deiner slave zwar ein "A[leer]ON" erhälst, aber in deiner auswertung auf das Signal "AON" wartest, also dieses Leerzeichen nicht bei der auswertung mit einbeziehst?

    Wie gesagt, ich hab den code nur überflogen und in Bascom hab ich auch lang nicht mehr programmiert.

    mfg robin

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    13.06.2008
    Ort
    Nürnberg
    Alter
    30
    Beiträge
    94
    Hallo,

    guter Ansatz, aber
    Code:
    Tmp = Split(new_command , Command_array(1) , " ")
    splittet das eingangssignal nach einer Leerzeile in ein Array.
    Und wie gesagt, wenn ich mit Hyperterminal genau das gleiche sende wie der master, dann funktionierts beim Slave!

    Grüße,

    Tom

    Edit:
    Sagtmal kann es sein das die Server-Zeit um eine Stunde zu spät ist?

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Wenn es vom Hyperterminal aus geht, zwischen den µC aber nicht, dann würde ich mal auf einen Unterschied zwischen den CR/New_Line Zeichen tippen.
    Lass dir doch mal die Länge des Strings ausgeben, bevor der Split Befehl es zerstückelt, und danach die Längen der einzelnen Stücke.
    Evtl. kannst du auch die ASCII Werte aller Zeichen ausgeben.
    Wenn dann irgendwo noch der Wert 10 oder 13 auftaucht, dann ist das der Grund für den Fehler.

    Gruß

    Rolf

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied Avatar von iBot
    Registriert seit
    12.05.2008
    Ort
    ca. 20km von Nürnberg
    Beiträge
    160
    Moin,
    kann man eig. auch 2 Atmega über Pins und Ports miteinander "reden" lassen ?
    Wäre doch deutlich einfacher oder nicht ?
    MfG iBot

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    13.06.2008
    Ort
    Nürnberg
    Alter
    30
    Beiträge
    94
    Hi,

    danke Rolf, das hilft mir weiter:
    Ich hab jetzt herausgefunden, dass der Gesamtstring (New_command) eine länge von 6 hat, und Command_Array(1) eine Länge von 3. (Bei "A ON").
    Es besteht aus den Ascii Zeichen: 53, 10, 66, 32,79, 78.
    Command_Array(1) besteht aus 53, 10, 66.
    Was ja völliger quatsch ist!!
    Wenn ichs per Hyperterminal mache dann bekomm ich meine 64, etc...

    Was läuft da denn schief?

    Grüße,
    Tom

    Edit:
    Geht bestimmt auch, aber mit UART hat man halt schon das Protokoll vorgefertigt...............

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen