Allgemeine Fragen zum Thema UART-Übertragung zwischen 2 Controllern

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Pluto25 schrieb:

      Übrigens das Du das ganze ohne Terminal ausführst.
      tja...irgendwie Blindflug


      Pluto25 schrieb:

      Vielleicht versuchsweise mal
      FB Oled zeigt weiterhin ne 0 an


      der Stand ist jetzt wie folgt:

      Sender- Controller:
      senden:
      Printbin 250 'Start-Byte
      Printbin Befehl_byte
      Printbin Daten_byte
      Printbin 64
      Printbin 65
      Printbin 66
      Printbin 251 'Ende-Byte
      Return


      empfängercontroller:

      Uart0:


      Dat = Udr 'empfangenes Byte einlesen
      If Dat = 251 Then 'Ende-Byte erkennen
      Flag = 0
      Neue_daten = 1
      End If
      If Flag = 1 Then 'Byte's in Empfangstabelle schreiben
      Daten(z) = Dat
      Z = Z + 1
      End If
      If Dat = 250 Then 'Start-Byte erkennen
      Flag = 1
      Z = 1


      End If
      Return
    • Allgemeine Fragen zum Thema UART-Übertragung zwischen 2 Controllern

      @'ceperiga: Vielleicht kann man den größten Teil des vorherigen Threads (4 Elkos..) hierher schaufeln?

      Ich habe noch ein paar allgemeine Fragen:

      1. Die Datenübertragung (oder sollte man sagen Datenverarbeitung?) läuft für mich überraschend langsam. das Empfänger OLED zeigt den Inhalt des Sender- OLED mit ca. 0,3 bis 0,5 Sek. Verzögerung an.
      Woran könnte das liegen und wie kann man das noch beschleunigen? Ich habe z.B. das Gefühl, daß es ohne URXC schneller läuft. Kann das sein? Die UART Daten müssen noch am uC in I2C umgewandelt werden,
      damit das Empfänger OLED das versteht. Bremst das so erheblich? Die Baudraten machen bei meiner Konfiguration keinen erkennbaren Unterschied, ob nun 9600 oder 1 Mio. Normal?
      2. Bei dieser Senden-Sub:
      Senden:
      Printbin 250 'Start-Byte
      Printbin Befehl_byte
      Printbin Daten_byte
      Printbin La
      Printbin La2
      Printbin Chaos2_dauer
      Printbin Autostart
      Printbin Dimmfunktion
      Printbin 251 'Ende-Byte
      Return

      kann man die Liste der printbin- Befehle beliebig verlängern, oder wirds irgendwann kritisch? Also ich meine jetzt nicht 200 printbins sondern ca. 20 - 30
      3. Ich habe immer noch keine reproduzierbare Methode herausgefunden, wie man zuverlssig eine Variable vom einen uC zum anderen schickt
      Momentan will es mir z.B. einfach nicht gelingen, den Zustand von 2 LEDs des Senders an den Empänger zu übertragen.
      Damit andere, die das gleiche Problem haben, sich nicht immer durch meinen Spaghetti Code wühlen müssen, habe ich im Anhang einen kleinen LED-Blinker,
      der seinen LED-Zustand (an/aus) per Printbin befehl senden soll. Ist da jetzt schon ein Fehler drin oder sollte das so laufen?
      Dateien
    • Hallo Ichbinsmoin,
      poste doch lieber komplette Programme, die man bei sich auch kompilieren und laufen lassen kann.
      Also in deinem Fall sowohl den Sender als auch den Empfänger.
      Und ich würde es genau so machen, wie du hier zeigst: Ein kleines Programm, ohne den ganzen Verarbeitungs- und Anzeigeteil.
      Dieser Teil scheint 200ms zu warten und dann die Variable LED_send 200 mal jede 1ms zu übertragen.
      Ich bin mir nicht sicher, ob es das ist, was du willst.

      In meinem Anwendungsfall übertrage ich jede Sekunde 60 Byte von einem Controller zum anderen, mit 115200 baud mit TTL Pegel.
      Neben den Nutzdaten wird auch eine CRC übertragen, damit ich nicht auf falsche Daten reagiere.
      Dabei verwende ich auch Printbin, allerdings schicke ich ein Array.

      Das sähe in deinem Fall dann so aus:
      Dim Start_Byte as byte ‘11
      Dim Befehl_byte as byte‘12
      Dim Daten_byte as word‘23-4
      Dim La as long‘45-8
      Dim La2 as byte‘19
      Dim Chaos2_dauer as byte‘110
      Dim Autostart as byte‘111
      Dim Dimmfunktion as byte‘112
      Dim Ende_Byte as byte‘113
      Dim CRC as byte‘114
      Dim my_data(14) as byte at start_byte overlay
      Start_byte = 250
      Ende_byte = 251
      Ich habe jetzt mal beliebige Variablen Typen angenommen, die mit deinen nicht übereinstimmen müssen.
      Es geht mir nur darum, dass diese Typen nicht alle gleich sein müssen.
      Die CRC wird dann unmittelbar vor der Übertragung so berechnet:
      CRC=CRC8(my_data(1),13)
      Printbin my_data(1) ‘print ganzes Array, also 14 byte

      Die Variablen werden an verschiedenen Stellen im Programm geschrieben, vollkommen unabhängig von der Übertragung.
      Wenn der Timer nach 1 Sekunde ein Flag setzt, wird dies in der Main Loop ausgewertet und die Übertragung gestartet.
      Damit die Daten konsistent sind, dürfen sie in einem Interrupt nicht geändert werden.
      Dort werden also auch nur Flags gesetzt, die in der Main ausgewertet werden.
      Das unterbricht zwar die Übertragung, das macht aber nichts.
      Dadurch ist sichergestellt, dass die CRC immer zu den übertragenen Daten passt.

      Auf der Empfängerseite kannst du die Daten dann in gleicher Weise dimensionieren.
      Allerdings verwende ich im URXC Interrupt zunächst einmal ein Temp-Array, weil ich letzten guten Daten nicht einfach überschreiben möchte, bevor ich die CRC ausgewertet habe.
      War die CRC ok, kopiere ich die empfangenen Daten in das richtige Array und habe sie durch das Overlay dann auch in den einzelnen Variablen.
    • ichbinsmoin schrieb:

      kann man die Liste der printbin- Befehle beliebig verlängern, oder wirds irgendwann kritisch?
      Begrenzt nur durch den vorhandenen Speicher (und die Lust "Printbin" zu schreiben) Bei größeren Datenmengen empfehlen sich Array oder Strings. Der Übertragung ist egal wo es herkommt. Die Geschwindigkeit kannst Du leicht überschlagen: z.b. 19200 Baud sind 19200 bit pro Sekunde - (bit fürs Byte ein + ein Start + ein Stopp =11. 19200/11 = ungefähr 1745 Byte pro Sekunde - also fast 2 pro ms.
      Die 0,3-0,5 Verzögerung werden durch die Hauptroutine Verursacht nicht von der Übertragung.
      Ps sind die waitms 200 noch da?

      Auch wenns jetzt nicht wirklich hilfreich ist hab ich eben mal die Laufzeit einer Anfrage mit 17Byte zu einer Antwort mit 13Bytes nachgeschaut: ca 38ms bei 9600 Baud

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()

    • Guenther schrieb:

      Dieser Teil scheint 200ms zu warten und dann die Variable LED_send 200 mal jede 1ms zu übertragen.
      Ich bin mir nicht sicher, ob es das ist, was du willst.
      ich habe extra einen kleinen Fehler eingebaut, um Eure Aufmerksamkeit zu teste...ha ha ha
      nein,wollte ich nicht natürlich nicht so. Korrektur im Anhang. Bin noch im Büro, deshalb nur kurz vielen Dank schon mal für die ausführliche Antwort!!!
      Dateien
    • Guenther schrieb:

      poste doch lieber komplette Programme, die man bei sich auch kompilieren und laufen lassen kann.
      Also in deinem Fall sowohl den Sender als auch den Empfänger.
      ok!
      Im Anhang Sender UND Empfänger + header
      Jetzt sollten doch bei Sender und Empfänger die LEDs synchron blinken, oder?
      Ich habe in diesem Mini-Programm kein Start byte oder End byte. Sollte doch trotzdem gehen, oder?
      Dateien