Portierung RS232-Anzeigeprogramm von A-Nano auf A-Mega 2560 PRO MINI gelingt nicht

    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!

    • Portierung RS232-Anzeigeprogramm von A-Nano auf A-Mega 2560 PRO MINI gelingt nicht

      Hallo zusammen,

      bisher habe ich einiges mit Arduino-Nanos realisiert; Als Text- und Statusausgabe häufig mit LC-Displays. - Wegen der 4 Hardware-UART-Schnittstellen und der größeren Anzahl von Ports möchte ich jetzt ein auf dem Nano laufendes Programm auf einen ATmega 2560 pro portieren.

      Im ersten Step möchte ich von der UART RXD0 (Pin2 des 2560, 9600Baud, 8N1) lesen und die Daten auf dem LC-Display anzeigen. Im zweiten Step soll dann zusätzlich eine SIM800-Platine über eine weitere UART (z.B. RXD2 und TXD2) des ATmega 2560 kommunizieren.

      Momentan will sich mir -trotz Hilfe "Config COMx" und etlichem Herumprobieren damit- aber nicht erschließen, warum ich beim 2560 schon die LCD-Ausgabe der RS232 / UART-Daten nicht hinbekomme; Schätze es liegt an der Konfiguration der UART-Schnittstelle ?(

      Im angehängten u. auf das Wesentliche minimierten Code unterscheiden sich nur die Zeilen 1-49 von denen für den Arduino Nano; Die sind ab Zeile 150 auskommentiert angehängt.

      Hat jemand von euch hierzu einen Tipp für mich?

      BASCOM-Quellcode

      1. '###############################################################################
      2. ' Miniterminal-Ersatz für ATmega 2560pro
      3. '
      4. ' LC-Display:
      5. ' 1 - VSS(GND)
      6. ' 2 - VDD(+5V)
      7. ' 3 - Vo(0..5V) Kontrast
      8. ' 4 - RS D02 - PE4
      9. ' 5 - R/W - Auf GND legen!!!
      10. ' 6 - E D03 - PE5
      11. ' 7 - DB0 nc
      12. ' 8 - DB1 nc
      13. ' 9 - DB2 nc
      14. ' 10 - DB3 nc
      15. ' 11 - DB4 D10 - PB4
      16. ' 12 - DB5 D11 - PB5
      17. ' 13 - DB6 D12 - PB6
      18. ' 14 - DB7 D13 - PB7
      19. ' RX Haussystem = RXD0 (ATM2560 Pin2) via max232
      20. '###############################################################################
      21. 'Diese Anweisung setzt die Fusebits automatisch korrekt (https://www.mikrocontroller-elektronik.de/mini-controllerboard-mit-atmel-atmega2560-und-usb/)
      22. 'Syntax $PROG LB, FB , FBH , FBX
      23. $prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus
      24. $regfile = "m2560def.dat" ' benutzter Mikrocontroller
      25. $framesize = 40 ' Frame
      26. $swstack = 40 ' SW Stack
      27. $hwstack = 64 ' Hardware Stack
      28. Config Serialin = Buffered , Size = 26 ' UART-Daten mit kleinem Puffer
      29. Enable Interrupts
      30. $crystal = 16000000 ' Quarz-Frequenz
      31. $baud = 9600 ' Baudrate (Übertragungsgeschwindigkeit)
      32. Baud = 9600
      33. '*** Ein/Ausgänge deklarieren **************************************************
      34. Config Porte.3 = Output ' interne Led
      35. Led Alias Porte.3
      36. '
      37. Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Porte.5 , Rs = Porte.4
      38. Config Lcd = 20 * 4
      39. Cls
      40. '*** Variablen definieren ******************************************************
      41. Dim Ctrl_modeflag As Byte
      42. Ctrl_modeflag = 0
      43. Dim Line_in_string As String * 25 ' Line_In_String-Zeile mit 25 Zeichen
      44. Dim Newchar_asc As Byte
      45. Dim Newchar_str As String * 1
      46. Dim Serial_in_counter As Byte
      47. Dim Spalte_lcd As Byte
      48. Dim Zeile_lcd As Byte
      49. '*** Hauptschleife *************************************************************
      50. Cls
      51. Cursor Off Noblink
      52. Upperline
      53. Lcd "Upperline"
      54. Lowerline
      55. Lcd " Lowerline"
      56. Thirdline
      57. Lcd " THIRDLINE"
      58. Fourthline
      59. Lcd " FOURTHLINE"
      60. Wait 1
      61. Cls
      62. Do
      63. ' Warten auf Zeichen von der UART (RX0)
      64. If Ischarwaiting() = 1 Then ' Auf Zeichen von Uart warten
      65. Newchar_str = Waitkey()
      66. Newchar_asc = Asc(newchar_str )
      67. '
      68. If Newchar_asc = 27 Then ' chr 27 als Zeilenstart erkennen
      69. Line_in_string = ""
      70. Line_to_store_flag = 1
      71. Serial_in_counter = 0 ' Zeichenzähler für die Zeile auf 0 setzen
      72. Else ' ElseIf Newchar_asc = 27 Then
      73. If Newchar_asc => 31 Then ' Steuerzeichen kleiner chr(32) ausblenden
      74. Incr Serial_in_counter ' Zeichenzähler +1
      75. Line_in_string = Line_in_string + Newchar_str ' Neues Zeichen an Line_In_String anhängen
      76. '
      77. If Serial_in_counter = 1 Then
      78. If Newchar_str = "[" Then ' Zeilennummer folgt
      79. Ctrl_modeflag = 1 ' Zeilennummer folgt
      80. End If ' EndIf Newchar_str = "["
      81. '
      82. If Newchar_str = "&" Then ' Displaysteuerung folgt
      83. Ctrl_modeflag = 2 ' Displaysteuerung folgt
      84. End If ' EndIf Newchar_str = "&"
      85. End If ' EndIf Serial_in_counter = 1
      86. '
      87. If Serial_in_counter = 2 Then
      88. If Newchar_str = ";" Then ' Spaltennummer folgt
      89. Ctrl_modeflag = 3 ' Spaltennummer folgt
      90. End If ' EndIf Newchar_str = "["
      91. '
      92. If Newchar_str = "&" Then ' Displaysteuerung folgt
      93. Ctrl_modeflag = 2 ' Displaysteuerung folgt
      94. End If ' EndIf Newchar_str = "&"
      95. '
      96. End If ' EndIf Serial_in_counter = 1
      97. Else ' ElseIf Newchar_asc => 31 Then
      98. If Ctrl_modeflag = 1 Then
      99. Zeile_lcd = 1 + Newchar_asc ' plus 1 wg. unterschiedlicher Zählweise B&E / Locate
      100. End If ' EndIf Ctrl_modeflag = 1
      101. If Ctrl_modeflag = 3 Then
      102. Spalte_lcd = 1 + Newchar_asc
      103. End If ' EndIf Ctrl_modeflag = 3
      104. Ctrl_modeflag = 0
      105. End If ' EndIf Newchar_asc => 31 Then
      106. End If ' EndIf NewChar_str = Chr(27) Then
      107. '
      108. If Serial_in_counter = 23 Then ' mehr als 24 Zeichen können's nicht sein
      109. If Instr(line_in_string , "[;H") > 0 Then
      110. Line_in_string = Right(line_in_string , 20) ' "[;H" vorne wegschneiden
      111. End If ' EndIf Instr(line_in_string , "[;H")
      112. '
      113. Locate Zeile_lcd , Spalte_lcd
      114. Lcd Line_in_string
      115. '
      116. End If ' EndIf Serial_in_counter = 24 Then
      117. '
      118. End If ' EndIf Ischarwaiting() = 1 Then
      119. Loop
      120. End
      121. '(
      122. '###############################################################################
      123. ' Miniterminal-Ersatz für Arduino-Nano kompatible Boards
      124. ' auf Basis https://bascomforum.de/index.php?thread/11-i2c-scanner/
      125. '
      126. '
      127. ' LCD an Port D: LCD PinOut: Pin14............Pin1
      128. ' Data: D4, D5, D6, D7, 1 - VSS(GND) 11 - DB4
      129. ' E : D3 2 - VDD(+5V) 12 - DB5
      130. ' RS: D2 3 - Vo(0..5V) 13 - DB6
      131. ' 4 - RS 14 - DB7
      132. ' 5 - R/W - Auf GND legen!!!
      133. ' 6 - E
      134. ' 7 - DB0 nc
      135. ' 8 - DB1 nc
      136. ' Piezo: D8 9 - DB2 nc
      137. ' 10- DB3 nc
      138. '###############################################################################
      139. $regfile = "m328pdef.dat" ' benutzter Mikrocontroller
      140. $framesize = 32 ' Frame
      141. $swstack = 32 ' SW Stack
      142. $hwstack = 64 ' Hardware Stack
      143. Config Serialin = Buffered , Size = 26 ' UART-Daten mit kleinem Puffer
      144. Enable Interrupts
      145. $crystal = 16000000 'Quarz-Frequenz
      146. $baud = 9600 'Baudrate (Übertragungsgeschwindigkeit)
      147. Baud = 9600
      148. '*** Ein/Ausgänge deklarieren **************************************************
      149. Config Portb.0 = Output ' Piezo-Buzzer
      150. Config Portb.5 = Output ' interne Led
      151. '
      152. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
      153. Config Lcd = 20 * 4
      154. Cls
      155. '*** Variablen definieren ******************************************************
      156. ')
      Alles anzeigen
    • Da die RX-Led auf dem 2560-Board -wenn auch schwach- blinkt hatte ich das bisher nicht hinterfragt. Mit dem Logiktester nachgeschaut bleibt RXD0 jedoch im Gegensatz zum Aufbau beim Nano dauerhaft auf H-Pegel, während bei Empfangsdaten beim Nano Low-Pegel angezeigt wird. -

      Beim 2560-Aufbau habe ich die Verbindung zwischen MAX232 und RXD0 habe dann probeweise getrennt; Der Ausgang des MAX232 nimmt dann während des Datenempfangs Low-Pegel an.

      Das wirkt so, als wäre beim 2560 ein Pull-Up Widerstand geschaltet, der den Low-Pegel platt macht.
    • Die Beschriftungen des Arduino-ATmega 2560pro harmonieren nicht mit den Pin/Port-Bezeichnungen des 2560 und bergen somit in sich schon eine Fehlerquelle.
      Weil mir die Lesbarkeit von im Web erhältlichen Schematics nicht gut genug war habe ich mir die angeh. Excel-Tabelle erstellt.

      Könnt sie gerne nutzen, mir aber bitte auch über eventuelle Fehler berichten. - Also ohne Gewähr ;)
      Dateien
    • Mitch64 schrieb:

      Ich vermute mal, dass du durch das Portieren irgend einen Ausgang nicht "versetzt" hast, der einen High-Pegel ausgibt und da irgendwie dran hängt.
      Also das 'Portieren' beschränkt sich auf die Weichteile (~Software) - Ich habe die Hardware neu aufgebaut und beides (Nano mit LC-Display und 2560 mit LC-Display) hier zum Vergleichen liegen.
      Beim ATmega 2560 ist außer dem LC-Display, RX und natürlich +UB u. Masse noch gar nichts angeschlossen.

      Probeweise habe ich gerade ein anderes MAX 232-Platinchen fliegend an den nackten RXD0-Pin des 2560pro mini angeschlossen. - Mit gleichem Effekt und Ergebnis.

      Der RXD0 (Chip-Pin 2) des ATmega2560 ist über 22 Ohm mit Pin 2 des CH340 verbunden; Beim Nano (328p) ist hingegen RX immerhin über 1k-Ohm mit Pin 2 des CH340 für die USB-Schnittstelle verbunden.
    • Da du nur ein Auszug deines Programms dargestellt hast, und du die Eigenart hast, Aliasse für Pins nicht konsequent zu verwenden,
      ist bestimmt da das Problem zu finden.

      Ports, die nicht über Aliasse definiert sind, nehmen keine Notiz vom Controller-Umzug.
      D.H. für deinen Buzzer und die interne LED verwendest du keinen Alias. Und die Pins zwischen Mega2560 und Nano sind bestimmt nicht die gleichen, oder?

      Ich denke daher, du hast irgendwo im Code vergessen einen Pin umzustellen bei der Portierung.

      Da musst du wohl dein Programm durchsuchen und hoffentlich alles finden.

      Schön, wenn man Konsequent Aliasse für Pins definiert. Dann ist eine Portierung ein Kinderspiel.

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

    • Hast du mal in der Hilfe (F1) unter config COMx geschaut, soviel ich mich noch erinnere muss man die einzelnen COM's via Open.... selektieren.
      Siehe unten ein Beispiel aus meiner Anwendung:

      'TX0= erste UART,
      Config Com1 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 'TX0,first uart


      'TX2= zweite UART, Verbindung zu einem externen Terminal
      Config Com3 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 'TX2,second uart
      Open "Com3:" For Binary As #2

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

    • Also bevor ich hier einen Thread einstelle könnt ihr mal davon ausgehen, dass ich schon stundenlang sowohl meine Hardware, als auch meinen -rudimentären- Bascom-Code ohne konsequente Nutzung von Aliassen gecheckt habe. -

      Dass da nach ewigem probieren nicht alles schön ist sollte also nicht verwundern, wobei mir dann ein nicht bestückter Buzzer und eine nicht bestückte LED auch absolut uninteressant ist, solange mein LCD keine Daten anzeigt. -

      - - -

      Ich bin vielleicht eher Hardware-Affin; Den obigen -rudimentären- Code ohne konsequente Nutzung von Aliassen habe ich gerade per USB nochmals in das Platinchen rein geschoben.
      Danach abgestöpselt und den 22-Ohm SMD-Widerstand (Grüner Kreis) zum CH340 entfernt. - RS232-Signal wieder angeschlossen;

      Spannung wieder angeschlossen >>> LÄUFT !!! <<< :thumbsup: --- Das LCD zeigt meine Daten an !!

      Ich benötige die Verbindung zum CH340 also offenbar nur zum Programmieren per USB-Schnittstelle; Für den UART-Datenempfang an Pin2 des 2560 wirkt er dann aber wohl störend als Pull-Up, welcher bewirkt, das die Logik-Pegel nicht mehr stimmen. -
      Bin aber gerne offen für eure Erklärungen, da ich mir gar nicht vorstellen kann dass Niemand vor mir das Problem hatte. ;(

      ATmega 2560 pro_ed.jpg

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

    • soldermaSTer schrieb:

      Niemand vor mir das Problem hatte.
      Niemand, der auch 22Ohm dort hatte. Der 340 hält seinen Ausgang high solange er keine Daten weiterleitet. Wenn nun an dem Rx0 zusätzlich ein anderer Sender hängt muß der schon ordendlich Strom liefern um gegen die 22Ohm auf Low zu kommen. (gefährlich viel für den 340)
      Möglicherweise hat es auch niemand versucht, da er nicht mehr "USB spricht" solange dort ein weiterer Uart hängt.