Mega 2560 UART Interrunpt

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

    • Mega 2560 UART Interrunpt

      Hallo zusammen,

      Ich habe ein kleines Projekt mit dem Uno und einem Nextion Display realisiert und alles funktioniert.

      Wie so immer hat man neue Ideen und will sie auch umsetzten.

      Da ich mehr Timer brauche, habe ich das Projekt auf den 2560 gespielt und angepasst.
      Leider funktioniert beim 2560 der Eingangsinteruppt nicht mehr.

      Am Uno waren die beiden seriellen Leitungen TX und RX auch bei RX/TX angeschlossen.
      Alles funktionierte . Die Eingabe am Display haben zum Interrupt geführt.

      hier mein Code:


      '---------------------------------------------------------------------
      ' Interrupt serielle Schnittstelle

      On Urxc Rec_isr 'define serial receive ISR
      Enable Urxc 'enable receive isr

      '----------------------------------------------------------------------


      Beim 2560 habe ich die Leitungen vom Display auf RX1 und RX1 gelegt.
      Folgende Programmänderung durchgeführt.


      Config Com1 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      Config Com2 = 57600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0


      Open "Com1:" For Binary As #1
      Open "Com2:" For Binary As #2


      Auf dem Nextion wird alles angezeigt, nur das Senden an den 2560 funktioniert nicht mehr.

      Habe auch folgendes probiert. Es gab keine Fehlermeldung.

      On Urxc2 Rec_isr 'define serial receive ISR
      Enable Urxc2 'enable receive isr


      Wo habe ich meinen Fehler eingebaut?
      Oder geht der serielle Interunpt nur auf Com0=

      Danke im Voraus

      Gruß
      Thomas
    • Danke Limo,


      wenn ich Deine vorgeschlagene Änderung nehme,

      hängt das Programm immer im Interrupt Uart1

      Der Interrupt soll doch nur ausgelöst werden, wenn Daten vom Netion Display geschickt werden.

      Ich habe das komplette Programm mal angehängt.

      Ich komme leider nicht weiter
      Files
    • Das Problem ist, das das Nextion nichts sende und trotzdem der Interrupt ausgelöst wird.

      Beim Uno ist es so, daß der Interrupt nur ausgelöst wird, wenn das Nextion was sendet.

      Beim 2560 wird der Interrupt immer ausgelöst. Kontrolliert habe ich es mit Zeile 262 ( print "bin hier")
      Den Text bekomme ich kontinuierlich in einem Terminal Programm angezeigt.
    • Ich habe gestern noch sehr viel probiert.

      Leider nimmt der 2560 nur Infos über die Serielle 0 (RX0) an.
      Egal was ich probiert habe, der serielle Interrupt wird nur über RX0 angesprungen.

      Die Ausgabe auf das Display kann ich variieren

      Config Com3 = 57600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      Open "Com3:" For Binary As #3

      Das funktioniert, egal wie ich die Config ComX beschreibe,.

      Mit
      '---------------------------------------------------------------------
      ' Interrupt serielle Schnittstelle

      On Urxc3 Rec_isr 'define serial receive ISR
      Enable Urxc3 'enable receive isr

      Funktioniert es nicht.

      IEine Fuktion ist nur gegeben, wenn ich auf RX0 umstecke und
      '---------------------------------------------------------------------
      ' Interrupt serielle Schnittstelle

      On Urxc Rec_isr 'define serial receive ISR
      Enable Urxc 'enable receive isr

      anwende. Dann wird der serielle Interrupt ausgelöst.

      Ich nutze die Bascom Version 2.0.8.1

      Funktioniert der serielle Interrupt nur auf Com 0 ?





    • Was mir auffällt ist, dass Config Com = ... Clockpol =0 angegeben ist.
      Typischerweise sind RxD und TxD im Ruhezustand High.

      Der RxD ist Eingang und Hochohmig, wenn kein interner oder externer PullUp angeschlossen ist. Damit empfängt der Pin Radio Moskow und löst immer unkontrollierte Interrupts aus.

      Weiterhin gilt, wenn man Config COM und Open COM verwendet, müssen die Parameter zueinander passen.
      Auch die ISR muss auf den richtigen Interrupt gelegt werden und der richtige Interrupt freigegeben werden.

      Weiterhin muss man dann auch, wie Pluto schon erwähnte, die korrekten Register auslesen.
      Also beispielsweise bei UART1 das UDR1 und nicht UDR.

      Alleine mit dem Umstellen von Config Com und On URXCn ist es dann nicht getan.

      Wieso liest du die Werte in der ISR nicht mit dem konfigurierten Kanal ein? Input #n,var?

      Vielleicht solltest du aber auch erst mal auf die aktuelle Version 2.0.8.3 updaten, vielleicht liegt es ja daran.
    • Hallo,

      danke erst einmal für Eure Ratschläge.

      Ich habe sie gerade umgesetzt.

      Clockpol =0 habe ich aus der Bascom Hilfe entnommen.

      Mit UDR1 bzw. UDR2 hatte ich übersehen.

      Jetzt habe ich alles mehrfach kontrolliert und mehrfach auf den Mega übertragen.

      Meine Werte werden angezeigt. Aber der Interrupt wird immer noch nicht ausgelöst b.z.w
      in die Rec_isr wird nicht verzweigt obwohl ich folgendes im Programm habe


      Enable Urxc2 'enable receive isr
      On Urxc2 Rec_isr 'define serial receive ISR

      Ich habe das ganze Programm noch einmal mit angehängt.

      Wo ist mein Fehler?


      Gruß
      Thomas
      Files

      The post was edited 1 time, last by towaes ().

    • Werde ich gleich mal probieren.

      Die Daueraufrufe sind weg.
      Das Nextion Display hat Fehlermeldungen geschickt. Dadurch wurde der Interrupt immer ausgelöst.

      Da war es aber auch nur der Com1, seriell 0.

      Jetzt sieht es so aus, daß On Urxc(x) nur auf seriell 0 reagiert
    • Und warum jetzt Urxc2 ? Du benutzt doch immer noch COM2. Und das ist UART1, also RXD1/TXD1. Dazu mußt Du Urxc1 einschalten und in der ISR UDR1 eintragen.
      Lösch mal alle Config für PortD, die brauchst Du doch nicht mehr, ohne LCD. Oder nutze doch einfach den UART2 oder 3.
      Für UART2 (PortH.0 / PortH.1) würde dann gelten:

      Config Com3 = 57600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

      Open "Com3:" For Binary As #2

      Enable Urxc2 'enable receive isr
      On Urxc2 Rec_isr 'define serial receive ISR

      Und in der ISR:
      Din = Udr2 'Byte einlesen

      Probier das mal. Alle 4 UART sind Int fähig. Die Zählweise ist etwas unterschiedlich:

      UART0 RXD0 / TXD0 COM1 Urxc UDR
      UART1 RXD1 / TXD1 COM2 Urxc1 UDR1
      UART2 RXD2 / TXD2 COM3 Urxc2 UDR2
      UART3 RXD3 / TXD3 COM4 Urxc3 UDR3

      Gruß Thomas