AtMega168 zu AtMega 168 Verbindung mit Txd Rxd nur bis Zahl 255 übermittelbar

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • AtMega168 zu AtMega 168 Verbindung mit Txd Rxd nur bis Zahl 255 übermittelbar

      Werte Mehrwisser (als ich :) )
      Ich möchte zwischen 2 AtMega 168 Zahlen von 1-1023 (10Bit-Analaogwert) in eine Richtung schicken. Das geniale dabei ist, dass ich 2 Stromkreise so, via Optokoppler trennen könnte.
      Soweit bin ich aber noch nicht. Ich stehe bereits an, weil bei der Übermittlung die Zahlen über 255, Störungen beim Empfang auslösen (Ich sehe den Überlauf auf "0"). So nehme ich an, dass nur 8 Bit übermittelt werden.
      Was mich aber wundert, in meinen gekauften Fibeln u.a. von Stefan Hoffmann, sehe ich, dass er in einem Beispiel die Zahlen 1023 sendet plus Sonderzeichen und es geht auch.
      Die Beschaltung (HW) funktioniert (abgekupfert von einem andern Projekt; aber mit 2 AtMega32).
      Frage an die Spezialisten: Was mache ich falsch, das nur 8 Bit übermittelt werden.
      Die beiden BAS.-Dateien habe ich unten beigelegt (Aus Übersichtsgründen Unwesentliches rausgelöscht)
      Ich danke im Voraus für die Hilfe, verbunden mit AHA-Erlebnissen. Freundlicher Gruss Lindi13

      SENDEN:
      $regfile = "m168def.dat"
      $crystal = 1000000
      $baud = 1200

      dim strom2 as word

      Strom2 = 250
      Waitms 100
      'START PROGRAMM-LOOP
      '===================
      Do
      Printbin Strom2
      If Strom2 >= 1023 Then 'soweit kommt es momentan gar nicht!
      Strom2 = 0
      End If
      Incr Strom2
      Waitms 1000
      Loop
      End

      EMPFANGEN: (LCD weggelassen. Die zeigt mehr als 8 Bit an :) )
      $regfile = "m168def.dat"
      $crystal = 1000000
      $baud = 1200

      Dim Strom2 As Word

      Waitms 100

      Do

      If Ischarwaiting() = 1 Then
      Strom2 = inkey() ' Auch versucht mit: Strom2 = Waitkey()
      End If

      If Strom2 > 0 Then
      Locate 1 , 1 '(Achtung: da LCD funktioniert, habe ich die Deklaration rausgelöscht)
      Lcd "B:"
      Locate 1 , 3
      Select Case Strom2
      Case Is >= 10000 : Lcd Strom2
      Case Is >= 1000 : Lcd " " ; Strom2
      Case Is >= 100 : Lcd " " ; Strom2
      Case Is >= 10 : Lcd " " ; Strom2
      Case Is >= 0 : Lcd " " ; Strom2
      End Select
      End If

      Waitms 500

      Loop

      End
    • Stackwerte sind wichtig.

      Füge in den Header noch folgendes ein:

      $hwstack = 80
      $swstack = 64
      $framesize = 80

      serielle Daten werden immer Byteweise übertragen.
      Für einfache Bytes eignet sich Printbin, das überträgt den Wert direkt. Nachteil: keine Steuerzeichen möglich.

      Du könntest es als String senden mit CR und beim Empfänger einfach mit Input einlesen oder du denkst dir ein eigenes Protokoll aus, wie z.B. Anfangs- und Ende-Kennung und dazwischen eine feste Anzahl Bytes oder einfach nur die 2 Bytes hintereinander mit Erkennung der Pause.
    • Hallo Michael und Mitch
      Danke für Eure Ideen.
      probier ich aus...
      Antwort folgt...

      Hallo Pluto25
      Danke für Deine Antwort.
      Das Case habe ich nur gebraucht um die LCD-Anzeige "sauber" zu halten, wenn auf grössere Zahlen evt. Kleinere folgen.
      Ich möchte wie gesagt nur Zahlen zwischen 0-1023 senden/empfangen.

      Freundlicher Gruss Lindi13
    • Hallo Michael und Mitch64
      Ihr habt BEIDE mitgeholfen: Es funktioniert!
      1)Die Stack-Befehle machen die Übertragung sicherer. Beim Aus/Einschalten kann es vorkommen, dass ohne Stackbefehle undefinierte Zahlen übertragen werden; vorallem beim Programmstart.
      2)Der Inputbin-Befehl funktioniert bis 65535 einwandfrei(Vermutlich auch längere Werte und Zeichen). Für mich aber mit einem Nachteil: Er bringt den "Prozer" zum Stillstand und wartet auf ein Zeichen.
      Dazu aber eine gute Lösung gefunden:
      If Ischarwaiting() = 1 Then
      Inputbin Strom2
      End If

      Der "Ischarwaiting" Befehl. Er wird nur aktiv wenn ein fertiger Wert (bei mir Zahlen) im Buffer stehen. Sprich; dann hat auch "Inputbin" einen Wert zum Abrufen.
      Dank Euch viel gelernt. Vielen Herzlichen Dank, für Euer Fachwissen, das ich von Euch bekommen habe.
      Freundlicher Gruss Lindi13
    • Ganz sauber ist die Geschichte noch nicht.
      Dein Programm könnte erst beim 2. empfangenen Byte zum If Ischarwaiting kommen und dann will Inputbin 2 Zeichen holen.
      avrhelp.mcselec.com/index.html?inputbin.htm
      Da aber beide schon da sind, wartet es bis zum nächsten Telegramm, um das Problem wieder zu haben.
      Diesen Fall hatte ich in meinem ersten Beitrag hier angesprochen.
    • New

      Hallo Michael
      Zuerst: Herzlichen Dank für Deine proaktive Hilfe.
      Folgende Aussage in der Help des "Inputbin"-Befehls beruhigt mich aber:
      >The number of bytes to read depends on the variable you use.
      >....
      >An integer will wait for 2 characters and an array will wait until the whole array is filled.
      Bei mir einfach Word und nicht integer.

      Hab die Schaltung über 2 Stunden laufen gelassen. 0 Fehler. Hab jede Zahl beim Input-"Prozessor" jedes Mal geprüft und hätte eine Fehlermeldung ausgegeben, wenn eine Zahl falsch gekommen wäre.
      Für mich reicht diese Genauigkeit aus.

      Freundlicher Gruss und es hat mich sehr gefreut, wie Du Dich für mein Problem eingesetzt hast. Die Lösung hast Du mir gefunden :) Lindi13
    • New

      Lindi13 wrote:

      Folgende Aussage in der Help des "Inputbin"-Befehls beruhigt mich aber:
      >The number of bytes to read depends on the variable you use.
      >....
      >An integer will wait for 2 characters and an array will wait until the whole array is filled.
      wie gesagt, wenn dein Teilnehmer genau zwischen 2 Bytes einsteigt, hast du ein Problem.
      Z.B. wenn deine Programmabarbeitung länger dauert, als bis er wieder am Inputbin vorbeikommt, dann hat der Sender schon beide Bytes gesendet.
      Dein AVR hat auch beide empfangen, musste aber eines verwerfen, der Puffer ist ja nur ein Byte groß.
      Jetzt kommt Inputbin und erwartet 2 Bytes für Word und bekommt nur eines, weil das erste Byte schon weg ist und wartet bis zur nächsten Übertragung auf das erste Byte.

      Lindi13 wrote:

      Hab die Schaltung über 2 Stunden laufen gelassen. 0 Fehler.
      Du hast halt Glück bzw. kein Pech gehabt und bist in der Pause eingestiegen.
      Sauberer wäre es, zwei einzelne Bytes hintereinander zu holen.
      Beim 1. If Ischarwaiting das erste Byte holen und dann gleich nochmal ein If Ischarwaiting und das 2. Byte holen.
      Wenn beim 2. mal kein Byte zu holen ist, dann kannst du das Ergebnis verwerfen und bist synchron mit dem Sender.

      Ich würde hier aber die Hardware des AVRs nutzen, dafür ist die da ;)