ATmega mit ATmega über UART verbinden und Daten senden

    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!

    • ATmega mit ATmega über UART verbinden und Daten senden

      Hallo zusammen,

      lang, lang ist's her, als ich mich das letzte Mal hier eingeloggt hatte; die Zeit für die interessanten Dinge des Lebens wird scheinbar immer geringer! Neu anmelden mußte ich mich auch - das sagt eigentlich alles!

      Nun wollte ich mal zwei ATmega8 über RXD und TXD verbinden zur Porterweiterung etc. und erst einmal vom sendenden mega8 das zeitlich nacheinander durchgeführte Blniken dreier LEDs zum empfangenden 8-ter übermitteln. Stefan hat in seinem Buch auf Seite 399 eine tolle Vorlage zum Übertragen und Auswerten von Zahlen gegeben, doch auf meinen Fall bezogen, habe ich wohl Fehler eingebaut, die mir blöderweise nicht auffallen. Hier mal die Quelltexte für beide µCs.

      Ich hoffe, ich habe beim Hochladen der Dateianhänge alles richtig gemacht und würde mich über jeden Rat richtig freuen!

      Schöne Grüße und besten Dank schon mal vorab.

      mega
      Dateien
    • Hallo djmsc,

      danke für Deine Antwort. In der letzten Version, die ich hier eingestellt habe, ist das Inputbin links mit einem Häkchen versehen, also herausgenommen. Die bascom-Hilfe habe ich mir mehrfach angesehen, doch sie hilft mir dabei leider nicht weiter.

      Schöne Grüße
    • Du brauchst aber einem Input für deinen Empfänger.
      Mal als Beispiel:
      Ein Terminal-Programm wartet auch auf einen Input vom AVR bevor es etwas anzeigt.
      Bzw. wenn du etwas über ein Terminal-Programm sendest würde dein AVR auf einen "Befehl" warten.
      Wenn aber kein Input im "Empfänger" ist, also auf Daten wartet, kann er auch nichts empfangen bzw damit anfangen.

      Probier mal

      Sender:Print var

      Empfänger:
      Input var
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hab's mal geändert, funktioniert aber immer noch nicht mit print A und input A, anstatt printbin A und inputbin A. Wenn ich im Quelltext des Senders die waitms 100 aktiviere, blinkt jede LED viermal pro sec hintereinander, bevor der LED-Wechsel stattfindet - für mich nicht nachvollziehbar.

      Schöne Grüße
      Dateien
    • Hallo mega,
      zu den Leitungsproblemen kommen dann noch falsche Fuse-Einstellungen.
      Und wenn das alles passt, dann kann es auch noch daran liegen, dass Print CR/LF hinterherschickt, dein Input aber nur CR erwartet. Schau mal in der Hilfe bei Config Input dazu.
      Du siehst, eine Menge möglicher Probleme bei einer so simplen Sache.
    • hero schrieb:

      Hallo mega,
      zu den Leitungsproblemen kommen dann noch falsche Fuse-Einstellungen.
      Und wenn das alles passt, dann kann es auch noch daran liegen, dass Print CR/LF hinterherschickt, dein Input aber nur CR erwartet. Schau mal in der Hilfe bei Config Input dazu.
      Du siehst, eine Menge möglicher Probleme bei einer so simplen Sache.

      Bei solchen "Fehlern" hat es sich bewährt einen PC mit Terminalprogramm zu bemühen.

      Da sieht man was geschickt wird und im HEX-Modus auch die Steuerzeichen.

      Kurt
    • @mega

      ich hab das ganze mal nachgebaut und folgenden Code für dich

      Sender:

      BASCOM-Quellcode

      1. 'Vers. 2 Sendende ATmega8
      2. $regfile "m8def.dat"
      3. $crystal = 8000000
      4. $hwstack = 32
      5. $swstack = 10
      6. $framesize = 40
      7. $baud = 9600
      8. 'Config Timer1 = Timer , Prescale = 256
      9. 'On Timer1 Timer1_isr
      10. 'Enable Timer1
      11. 'Timer1 = 3036
      12. Dim A As Byte
      13. Dim Texte(6) As String * 5
      14. Dim Gesendet As String * 5
      15. 'A = 0
      16. 'Dim S As Bit
      17. 'S = 0
      18. 'Enable Interrupts
      19. 'Versuchsweise, bringt aber nichts
      20. 'Config Pind.0 = Input 'RXD
      21. 'Config Portd.1 = Output 'TXD
      22. '---------------------------------
      23. Config Portd.6 = Output 'LED für A = 0 u. 1
      24. Config Portd.7 = Output 'LED für A = 2 u. 3
      25. Config Portb.0 = Output 'LED für A = 4 u. 5
      26. Config Portc.5 = Output 'Led für S
      27. Texte(1) = "SET1"
      28. Texte(2) = "SET2"
      29. Texte(3) = "SET3"
      30. Texte(4) = "SET4"
      31. Texte(5) = "SET5"
      32. Texte(6) = "SET6"
      33. A = 1
      34. Do
      35. Print Texte(a)
      36. Gesendet = Texte(a)
      37. Wait 5
      38. Incr A
      39. If A = 7 Then A = 1
      40. If Gesendet = "SET1" Then
      41. Portd.6 = 0
      42. Else
      43. Portd.6 = 0
      44. 'Printbin 0
      45. 'Waitms 100
      46. 'Gosub Sub_a
      47. End If
      48. If Gesendet = "SET2" Then
      49. Portd.6 = 1
      50. Else
      51. Portd.6 = 0
      52. 'Printbin 1
      53. 'Waitms 100
      54. 'Gosub Sub_a
      55. End If
      56. If Gesendet = "SET3" Then
      57. Portd.7 = 0
      58. Else
      59. Portd.7 = 0
      60. 'Printbin 2
      61. 'Waitms 100
      62. 'Gosub Sub_a
      63. End If
      64. If Gesendet = "SET4" Then
      65. Portd.7 = 1
      66. Else
      67. Portd.7 = 0
      68. 'Printbin 3
      69. 'Waitms 100
      70. 'Gosub Sub_a
      71. End If
      72. If Gesendet = "SET5" Then
      73. Portb.0 = 0
      74. Else
      75. Portb.0 = 0
      76. 'Printbin 4
      77. 'Waitms 100
      78. 'Gosub Sub_a
      79. End If
      80. If Gesendet = "SET6" Then
      81. Portb.0 = 1
      82. Else
      83. Portb.0 = 0
      84. 'Printbin 5
      85. 'Waitms 100
      86. 'Gosub Sub_a
      87. End If
      88. Loop
      89. End
      90. '(
      91. Timer1_isr:
      92. Timer1 = 3036
      93. Toggle S
      94. Return
      95. Sub_a:
      96. If S = 1 Then
      97. Incr A
      98. S = 0
      99. End If
      100. If A > 5 Then
      101. A = 0
      102. End If
      103. Return
      104. ')
      Alles anzeigen

      Empfänger:

      BASCOM-Quellcode

      1. 'Empfangs ATmega8 Vers. 2.3
      2. $regfile "m8adef.dat"
      3. $crystal = 8000000
      4. $hwstack = 32
      5. $swstack = 10
      6. $framesize = 40
      7. $baud = 9600
      8. 'Config Pind.0 = Input 'RXD
      9. Config Portb.5 = Output 'LED grün
      10. Led_gruen Alias Portb.5
      11. Config Portb.3 = Output
      12. Led_rot Alias Portb.3 'LED rot
      13. Config Portb.4 = Output 'LED gelb
      14. Led_gelb Alias Portb.4
      15. 'Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
      16. 'Config Lcd = 16 * 2
      17. 'Enable Interrupts
      18. Dim A As String * 5
      19. 'Cls
      20. 'Cursor Off
      21. 'Locate 1 , 1
      22. 'Lcd "UART Test"
      23. 'Wait 5
      24. 'Cls
      25. Do
      26. Input A
      27. A = Mid(a , 2 , 6)
      28. If A = "SET1" Then
      29. Led_rot = 0
      30. End If
      31. If A = "SET2" Then
      32. Led_rot = 1
      33. Else
      34. Led_rot = 0
      35. End If
      36. If A = "SET3" Then
      37. Led_gelb = 0
      38. End If
      39. If A = "SET4" Then
      40. Led_gelb = 1
      41. Else
      42. Led_gelb = 0
      43. End If
      44. If A = "SET5" Then
      45. Led_gruen = 0
      46. End If
      47. If A = "SET6" Then
      48. Led_gruen = 1
      49. Else
      50. Led_gruen = 0
      51. End If
      52. Loop
      Alles anzeigen

      Natürlich musst du das ganze noch für dich anpassen.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.

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

    • Hallo zusammen,

      erst einmal vielen Dank für die vielen Beiträge von Euch, die während meiner Abwesenheit eingestellt worden sind. Ich bekam am 12.4. einen Anruf eines Bekannten, ob ich für einen anderen, urplötzlich schwer erkrankten Bekannten einspringen und dessen Urlaubsreise antreten wolle. Wollte ich und innerhalb von 3 Stunden musste ich gepackt haben. Nun kehrte ich gestern erst am späten Abend zurück und bitte um Nachsicht, dass ich nicht mehr die Zeit fand, hier eine kurze Nachricht zu hinterlassen.

      Hallo Dekaman. Beide Atmega 8 befinden sich gemeinsam auf einem Streckbrett und liegen an gemeinsamer Masse und +5V.

      Hallo hero: Fuse-bits sind bei beiden identisch. Nach Auskunft der Experten Stefan Hoffmann und Roland Walter benötigt man bei der Übertragung einer dezimalen Ziffer oder Zahl kein CR etc sondern nur, wenn Texte übertragen werden sollen. Ich hatte mich hieran orientiert:

      rowalt.de/mc/index.htm

      Quellcode

      1. '0003.BAS: UART-Sender
      2. 'Hardware: MAX232 an PD0/PD1, Nullmodemkabel zum PC
      3. '---------------------------------------------------
      4. $Regfile = "2313def.dat" 'AT90S2313-Deklarationen
      5. $Crystal = 3686400 'Quarz: 3.6864 MHz
      6. $Baud = 9600 'Baudrate der UART: 9600 Baud
      7. Dim i As Byte
      8. Dim wTest As Word
      9. i = 1
      10. wTest = 35000
      11. Do
      12. Printbin i ; wTest
      13. Print "Hallo AVR: " ; i ; wTest
      14. Print "<--->" ;
      15. Loop
      16. End
      Alles anzeigen

      Und für den Empfänger:


      Quellcode

      1. '004.BAS: UART-Empfänger ohne Interrupt
      2. 'Hardware: MAX232 an PD0/PD1, Nullmodemkabel zum PC
      3. '---------------------------------------------------
      4. $Regfile = "2313def.dat" 'AT90S2313-Deklarationen
      5. $Crystal = 3686400 'Quarz: 3.6864 MHz
      6. $Baud = 9600 'Baudrate der UART: 9600 Baud
      7. Dim i As Byte
      8. Do
      9. If USR.RXC = 1 Then 'Wenn Byte empfangen...
      10. i = UDR 'Byte aus UART auslesen
      11. Select Case i
      12. Case "H"
      13. Print "Hallo AVR"
      14. Case "h"
      15. Print "hallo avr"
      16. Case Else
      17. Print "Unbekannter Befehl"
      18. End Select
      19. End If
      20. Loop
      21. End
      Alles anzeigen


      Aber ich verstehe nicht, warum ich zwischen den beiden mega8 einen RS232 hängen soll? Beide mega8 liegen auf dem selben Spannungspotential und produzieren bzw. empfangen TTL-Signale von max. +5V zu GND. Ein RS232 -IC gleicht doch nur unterschiedliche Spannungen aus und gibt saubere TTL-Signale aus.


      Hallo Kurt: Du hast recht. Mein Mainboard hat keine serielle Schnittstelle mehr und eine Mimik, die von einen USB-As auf DSub 9 umstrickt, funktioniert nicht. Ich würde gerne ein Terminalprogramm verwenden, doch.... ich weiß nicht wie. ;)

      Hallo djmsc: Besten Dank, dass Du Dir große Mühe gemacht hattest, einen Quelltext zu schreiben!!!! Ich werde die beiden achter heute abend mal damit programmieren und mich danach wieder hier melden.

      Nochmals vielen Dank für die Anregungen und vor allem für die beiden Quelltexte von djmsc!

      Schöne Grüße
    • Hallo Mega,

      mega schrieb:

      Aber ich verstehe nicht, warum ich zwischen den beiden mega8 einen RS232 hängen soll?
      brauchst du auch nicht, es geht auch ohne, weil gleiche Spannungsebene.
      (In einem von mir gebastelten Modelleisenbahnprojekt unterhalten sich 1 M48 mit 6 Tiny2313 nur über Tx-RX)
      Musst du aber, wenn du mit dem PC kommunizieren willst / musst.

      Mein Mainbord hatte auch kein RS232 mehr, bis ich dann in einer Ecke den
      Pfostenstecker gefunden habe. Slotblech ran, seitdem bin ich "stolzer Besitzer"
      einer seriellen Schnittstelle. Vielleicht hast du auch noch Glück.

      Aber werte erst mal die anderen Ratschläge aus.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Dekaman schrieb:

      Hallo Mega,

      mega schrieb:

      Aber ich verstehe nicht, warum ich zwischen den beiden mega8 einen RS232 hängen soll?
      brauchst du auch nicht, es geht auch ohne, weil gleiche Spannungsebene.(In einem von mir gebastelten Modelleisenbahnprojekt unterhalten sich 1 M48 mit 6 Tiny2313 nur über Tx-RX)
      Musst du aber, wenn du mit dem PC kommunizieren willst / musst.

      Mein Mainbord hatte auch kein RS232 mehr, bis ich dann in einer Ecke den
      Pfostenstecker gefunden habe. Slotblech ran, seitdem bin ich "stolzer Besitzer"
      einer seriellen Schnittstelle. Vielleicht hast du auch noch Glück.

      Aber werte erst mal die anderen Ratschläge aus.

      Detlef
      Und wie haste TX entkoppelt?
    • Hallo djmcs,

      leider, leider funktioniert Dein Quelltext für den empfangenden mega8 bei mir nicht und ich gehe davon aus, daß Du ihn getestet hast und er bei Dir funktionierte. Ich habe gestern und auch heute abend bis jetzt versucht, den Fehler bei mir zu finden, ..... vergebens. Die Kabelverbindungen zwischen den megas habe ich an den Pins durchgepiepst - alles ok. Ich habe beide megas durch flatschneue ersetzt - keine Änderung. Auch der Tausch des Steckbretts hatte keinen Erfolg.

      Im Quellcode für den "Sender" dimensionierst Du Texte(6) As String * 5 und Gesendet As String * 5
      , dann Texte(1) = "SET1" etc. - alles für mich verständlich und nachvollziehbar.


      Im Quelltext des "Empfängers" wird A als String * 5, für mich auch nachvollziehbar, dimensioniert, aber der Bezug zu "SET1" ist m. E. in dem Quellcode des Empfängers nicht hergestellt. Kann es sein, daß der Empfänger nicht weiß, auf was er reagieren soll, da "SET!" nicht dimensioniert ist? Oder wartet der Empfänger nur auf Strings, die 5(+1) bytes lang sind? Mir fehlt dazu das Wissen. Auch A = Mid(a , 2 , 6) kannte ich bisher nicht und auch die vielgelobte Bascom-Hilfe hat mich keineswegs schlauer gemacht. Kann es sein, daß erst ab Stelle 2 abgefragt wird? Die 6 steht sicherlich für die 6 Möglichkeiten, das a für die String-Variable A, aber was MID bewirken soll, weiß ich nicht.


      Nun werde ich erstmal zu Bett gehen, schon spät geworden und morgen mal weitersehen.


      LG

      Wilfried
    • Hi Wilfried,

      ja klar hat es bei mir funktioniert ich hatte es ja nachgebaut. Falls du ein 16x2 LCD da hast kannst du das mal am Emfpänger mit anschließen und dir das "A" ausgeben lassen.

      mega schrieb:

      Im Quelltext des "Empfängers" wird A als String * 5, für mich auch nachvollziehbar, dimensioniert, aber der Bezug zu "SET1" ist m. E. in dem Quellcode des Empfängers nicht hergestellt.
      Die Funktion "Input" übergibt an "A" das was der Sender ausgibt also z.B. das "SET1". In "A" steht dann also " SET1" (mit Leerzeichen vor SET1). Mit der Funktion a = Mid(a, 2, 6) wird lediglich das Leerzeichen raus genommen. Die 6 ist allerdings ein Tippfehler es sollte 4 drin stehen.
      Ich hatte mir das Ganze mal über ein Display im Empfänger anzeigen lassen. Ohne die "Mid" Funktion kam eben das Leerzeichen mit aufs Display.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.