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

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • eine Frage:
      worin liegt eigentlich der Unterschied zwischen UDR, inputbin und inkey() ?

      im uC 1 läuft eine do-loop, in der permanent über den printbin- Befehl ein byte zum uC 2 gesendet wird.
      Der uC 2 möchte sich das byte an einer bestimmten Stelle des Prgramms "abholen" (oder wie nennt man das, einlesen?)

      Welches der drei (UDR, inputbin und inkey() )wird dafür klassischerweise verwendet?
    • allerdings bin ich bei der ganzen UART Geschichte noch fieberhaft am Grundlagenlernen.
      Denn hier liegt glaube ich mein Hase im Pfeffer. Den Beispielcode von Limo post #18 hatte
      ich nicht so ganz verstanden. So nach und nach komme ich aber langsam dahinter.
      Ich wußte z. B . nicht, wie man auf die 250 und 251 kam. Ich glaube nun, daß es willkürlich gewählte Zahlen sind, um Start-Stopp-Übertragung
      zu definieren. Man hätte wohl genauso 1 und 2 oder 252 und 253 nehmen können. So vermute ich jedenfalls.
      Warum hat man hier ein Flag als byte- und nicht als bit dimensioniert? Ist nicht so wichtig, aber soetwas verwirrt mich als Anfänger.
      Wenn ich eine URXC ISR einrichte, verlangsamt dies EXTREM mein uC-Empfänger- Programm. Ich vermute nun, daß es daran liegt, daß ich beim Sender-uC einen printbin-Befehl
      in der Dauerschleife sende und NICHT nur dann, wenn sich die Variable tatsächlich verändert hat. Das hält wohl die URXC iSR im Empfänger uC in Dauerbeschäftigung und
      verhindert den restlichen Programmablauf. Ist das so?
    • @Limo
      In Deinem Code (post#18) steht folgendes:


      Dim Daten(10) As Byte
      Woher kommt die (10) ?

      Hast Du einfach mal grob über den Daumen gepeilt, daß es in meinem Programm etwa 10 Variablen gibt?

      In der Hauptschleife heißt es dann:

      Do
      If Neue_daten = 1 Then 'wenn neue Daten angekommen sind,
      Befehl_byte = Daten(1) 'aus der Empfangstabelle in die Variablen schreiben
      Daten_byte = Daten(2)
      Neue_daten = 0 'Merker setzen auf neue Daten warten
      End If

      Mir ist nicht klar, woher die (1) und die (2) kommen. Gäbe es dann also bytes von (1-10)?
      Das heißt 10 verschieden Variablen, die ich als Byte vom Sender zum Empfänger schicken kann?

      Das ist gerade ganz entscheidend für mein Verständnis, weil es bei mir gerade daran hakt, daß ich die empfangenen Daten nicht exakt zuordnen kann.
      EINE Variable rüberschicken ist kein Problem, aber bei zweien wird mit "printbin/inputbin" alles durcheinader gewirbelt.

      Könntest Du mir bitte die Hauptschleife nochmal in Worten erklären, was genau da passiert?
    • Grob über den Daumen gepeilt das 10 Bytes maximal nötig werden.
      Im Moment hätten zwei gereicht. Nähmlich (1) für die Adresse und (2) für Deine Daten .
      Das Register in dem die Daten beim Empfang abgelegt werden heißt UDR und läßt sich mit Bascom wie eine (Byte)Variable benützen.
      Mit Bit zu arbeiten verlangsamt das Program auch erheblich weil er jedesmal das gewünschte Bit aus dem bereitgestelltem Byte herausfiltern muß.
      Nach ASCII währen 1=Start of heading und 4=End of transmission wobei es die Frage ist ob der Start angezeigt werden sollte. Er meldet sich schon wenn was ankommt bzw wenns fertig ist (ein 251 empfangen wurde).
      Zum Verständniss: Bei jedem Eingegangenen Byte wird die Uart0: angesprugen und dort wird entschieden obs eine Anfangsmarkierung war (zeile 80) oder Daten (zeile 75) die dann der Reihe nach in das Datenarray eingespeist werden wenn ein Anfang bekannt ist und wenn ein Ende (Zeile 70) erkannt wird wird das neue_Daten Flag gesetzt womit Deine Hauproutine weiß das eine Anweisung da ist.
      in Zeile 84 würde ich ein "if z > 9 then z = 1" einfügen damit Dein Ram nicht geschreddert wird falls mehr als 10 Bytes ohne Endmarkierung empfangen werden.

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

    • ah! Danke. Es kommt bei mir immer mehr Licht ins dunkle...
      Dieses Sart/Stopp Byte ist ZWINGEND erforderlich für die ORDNUNGSGEMÄßE Übertragung?
      Ich hatte das nämlich in meinen ersten Gehversuchen nicht gemacht, sondern nur printbin beim Sender uC und
      inputbin beim Empfänger uC verwendet. Das ging auch bei EINER Variablen, aber bei der zweiten gabs ein wildes Durcheinander.
      Also muss eine Übertragung IMMER zwingend aus mindestens 3 Bytes bestehen?
      Start, Daten und Stopp?
    • ichbinsmoin schrieb:

      Also muss eine Übertragung IMMER zwingend aus mindestens 3 Bytes bestehen?
      Start, Daten und Stopp?
      Nö, wenn du nur Daten sendest, dann brauchst du kein Start/Stopp. Das ist doch nur, um verschiedene 'Geräte' mit Daten zu versorgen. Denke ich zumindest, dass das hier der Fall ist. Wenn die Daten in Ascii übertragen werden, dann hättest du die Steuerzeichen des Ascii-codes frei, um ein Gerät zu adressieren, wem also die folgenden Daten zugeordnet werden soll.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Nein. Bei meinen Objecten gibts kein start .Die nehmen alles was kommt und melden sich wenn ein Enter (13) empfangen wurde. Wie lang die Übertragung ist liegt an Dir. Im moment benötigs Du zwei Daten
      (Adresse und Datenbyte) eine Endmarkierung ist in Limos Code zwingend nötig damit die Hauptroutine weiß das was ankam. Bei Deinem geringen Datenanteil wäre es auch möglich das nur von der Hauptroutine aus zu er ledigen und das gesendete Byte zu maskieren, Z.b Adresse 1 =100 , Adresse2 =200 und daten kleiner 99 womit der Code gut erkennen kann ob es Daten oder Adresse ist, Oder Alles in einem Byte? 106 = Adresse=1, ´Date=6

      Das Nein bezog sich auf die zwingenden drei Byte nicht auf tschoeatsch's Beitrag. Heute geht das Senden wieder super schlecht
    • ich brauche nochmal Eure Hilfe! Ich raffs einfach nicht. Limos Code in meinem Programm ist implementiert.
      Wie auf dem Video-Link zu sehen,
      - steht die UART Verbindung
      - Daten(1) (welche zeile gehighlightet wird) wird korrekt übertragen
      - Daten(2) (Tempo, die Zahl unten rechts im OLED, die ich mit dem Encoder verändern kann)
      Ich kann aber nicht Daten(3), die "blinkende 64" übertragen.
      Im Hauptprogramm (Zeile 2334) will ich die Variable LA dem Array DATEN zuordnen- und zwar DATEN (3)
      DATEN(3) soll dann über die Sub "senden" (Zeile 2398) an die FB übermittelt werden.
      In der FB soll dann die "64" oben rechts erscheinen- zwar nicht blinkend- aber immerhin. Stattdessen steht da dauerhaft 100 und ich weiß nicht warum.
      Frage:
      Wie kann ich Variablen aus dem Hauptprogramm so adressieren, daß sie nach der Übermittlung beim Empfänger (FB) EINDEUTIG zugeordnet werden können?
      Ich dachte, ich kann im Hauptprogramm die Variable LA als DATEN(3) bezeichnen, versenden und im FB Programm wieder weiterverarbeiten?!

      link:
      Dateien
      • Hauptprogramm.bas

        (46,17 kB, 16 mal heruntergeladen, zuletzt: )
      • FB.bas

        (6,08 kB, 12 mal heruntergeladen, zuletzt: )
    • Deine UART ist mit einer Baudrate von 1000000 (1 Million) angegeben.
      Dein Empfänger verschluckt sich einfach daran.
      Die Empfangsroutine holt sofort das erste Byte, damit wird der Puffer frei, dann gibt es Verarbeitung und dann holt es das 2. Byte aus dem Puffer, aber in der Zwischenzeit hat der Sender schon alles rausgeballert.
      Vielleicht erwischt er noch das letzte Byte, das dann >99 ist.
    • Erstmal eins vorweg: Du solltest deinen Code mal besser sortieren (einrücken), damit man ihn besser lesen kann.

      Deine Senden Sub sieht ja so aus:

      BASCOM-Quellcode

      1. Senden:
      2. Printbin 250 'Start-Byte
      3. Printbin Befehl_byte
      4. Printbin Daten_byte
      5. Printbin 251 'Ende-Byte
      6. Return
      und deine "Übergabe-Sub" so:

      BASCOM-Quellcode

      1. Autostart_abfrage:
      2. Incr Q
      3. If Q = 6 And Programm = 4 Then
      4. Q = 0
      5. Toggle F
      6. Else
      7. If Q = 50 Then
      8. Q = 0
      9. Toggle F
      10. End If
      11. End If
      12. If F = 1 Then
      13. If Programm = 4 Or Programm = 3 Then
      14. Lcdat 4 , 91 , La2
      15. Else
      16. Lcdat 4 , 91 , La
      17. End If
      18. Else
      19. Lcdat 4 , 91 , " " , 0
      20. End If
      21. Daten(3) = La
      22. Gosub Senden
      23. Return
      Alles anzeigen
      Wo wird denn da der Wert von Daten(3) an Daten_byte übergeben?
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.