-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Ausgabe von RS485 Daten auf LCD

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180

    Ausgabe von RS485 Daten auf LCD

    Anzeige

    Hallo,

    ich möchte Daten, die über einen RS485 Bus übertragen wurden, auf einem LCD Display anzeigen.
    Dazu habe ich das Display an einen Atmega8 angeschlossen und diesen über einen Max485 an den Bus.
    Auf dem Terminalfenster am PC sehe ich die übertragenen Texte im Klartext.
    Auf dem LCD Display werden nur wirre Zeichen angezeigt.
    Die Daten werden z.B. im Format "$n2-10110" übertragen.

    Woran kann der Übersetzungsfehler liegen?

    Das Quarz hat eine Frequenz von 7372800 Hz, die Bautrate beträgt 4800

    Tobias

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    Wenn nur käse ankommt stimmt die Baudrate meist nicht.
    Bei 485 kommt dazu, dass man A und B-Leitung vertauschen kann,
    dann stimmt auch nix mehr.
    Erster Schritt, tauschen und testen, wenns dann nicht geht Fuses
    überprüfen ob externer Quarz aktiviert, wenns dann noch nicht geht
    hier das Programm reinposten, damit man mal reinschaun kann
    ob die Config stimmt usw.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180
    Hallo vitis,

    leider haben deine Vorschläge keine Besserung gebracht.

    Hier ist mein Code, der mir das Zahlenwirrwar bringt:

    Code:
    $regfile = "m8def.dat"
    $crystal = 7372800
    $baud = 4800
    
    
    'Initialisierung LCD Display
    
    Config Lcd = 20 * 4                                         'LCD-Display mit 20 Zeichen in 4 Zeilen verwendet
    Config Lcdbus = 4                                           '4 bit mode
    Config Lcdmode = Port
    Config Lcdpin = Pin , Db4 = Portc.1 , Db5 = Portc.2 , Db6 = Portc.3 , Db7 = Portc.4 , E = Portc.5 , Rs = Portd.6       'war Portc.6
    
    
    Config Serialin = Normal
    
    
    Dim S As String * 7
    Dim A As String * 4
    
    
    
    
    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts
    
    
    
    Cls
    Lcd "RS485 Test"
    
    
    Main:
    
    Thirdline
    'Lowerline
    Wait 1
    Lcd A
    
    
    'Lcd "Zweite Zeile"
    'Thirdline
    'Wait 1
    'Lcd "Dritte Zeile"
    'Fourthline
    
    
    Goto Main
    
    
    
    
    ' **** RS485 Aktivieren und Bus prüfen
    
    
    Onrxd:
    
    
    
    S = S + Chr(udr)
    
     If Len(s) > 3 Then
        A = S
    
          S = ""
          Goto Anzeige
    
    
     Else
      A = ""
    
     End If
    
    
     Return
    
    
    
    '***********
    
    
    Anzeige:
    
    Lowerline
    
    Lcd A
    
    
       Waitms 900
    
    
    
    Return
    
    
    '************
    Und weils meistens an den Fuse liegt, habe ich meine derzeitige Einstellung angehängt
    Wäre klasse wenn du meinen fehler finden würdest!

    Tobias
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken fuse_lcd_anzeige.jpg  

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    Code:
    $regfile = "m8def.dat"
    $crystal = 7372800
    $baud = 4800
    
    'Initialisierung LCD Display
    Config Lcd = 20 * 4                                         'LCD-Display mit 20 Zeichen in 4 Zeilen verwendet
    Config Lcdbus = 4                                           '4 bit mode
    Config Lcdmode = Port
    Config Lcdpin = Pin , Db4 = Portc.1 , Db5 = Portc.2 , Db6 = Portc.3 , Db7 = Portc.4 , E = Portc.5 , Rs = Portd.6       'war Portc.6
    
    
    Dim S As String * 7
    Dim A As String * 4
    
    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts
    
    Cls
    Lcd "RS485 Test"
    
    
    do
    
    Thirdline
    Wait 1
    Lcd A
    
    loop
    
    
    
    ' **** RS485 Aktivieren und Bus prüfen
    
    
    Onrxd:
    
    S = S + Chr(udr)
    
     If Len(s) > 3 Then
          A = S
          S = ""
     Else
          A = ""
     End If
    
     Return
    
    '***********
    Ich hab mal den Code zusammengestrichen, der effektiv tatsächlich ausgeführt wird. Wenn ich dich richtig verstanden habe überträgst du
    in 8n2-Format die Daten. Die UART des Mega8 ist aber auf 8n1 konfiguriert.
    Könnte aber trotzdem gehen. stimmt die Baudrate von 4800 ? Das ist nicht gerade schnell. Die Fuses sollten stimmen, externer Quarz. Stimmt auch der Quarz? Welches Terminal verwendest Du?
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180
    Hallo Vitis,

    deine kleine Änderung hat eine Menge bewirkt.
    Der Text, der über den Bus kommt wird jetzt fast richtig angezeigt.
    Einziger Fehler sind 4 Sonderzeichen die mit jeder Übertargung ankommen.
    Wie kann ich diese Wegschalten? (Es sind immer die selben)

    Und gleich noch eine Frage:
    Woraus ließt du, dass ich die Daten im 8n2-Format übertrage.
    Im Terminalprogramm von XP arbeite ich mit 8n1!
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken img_0296.jpg  

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    ist ja witzig ... hab doch garnicht viel gemacht

    ich vermute es war an diesem dubiosen config serial in irgendwas mit "normal" was weiß ich ... gelegen. Das sagte mir garnix ... ach und das goto dings hab ich in ne do loop schleife geändert, aber das ist eher Kosmetik. find ich halt einfach schöner so.
    wo kommen denn die sonderzeichen? am Anfang, oder zwischendrinn?
    Um strings zu schneiden kann man die Funktionen Right, Left und Mid
    verwenden.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180
    Hallo Vitis,

    nach einigen versuchen habe ich es heraus gefunden.
    Zunächst kommen eine ganze Kette von Zeichen wenn der erste Interrupt ausgelöst wird. Scheinbar wir die Variable "S" mit irgent etwas gefüllt?!
    Ich habe dieses Problem gelöst in dem ich sie zu beginn des Programms einfach fülle.
    Die nachsten 4 Sonderzeichen (obern beschrieben) kommen dann mit jeder Übertragung (jedem neuen Interrupt). Ich verstehe zwar nicht woher aber ich habe es mit Right und Left gelöst. Mid funktionierte merkwürdiger weise auch nicht.

    Jetzt habe ich noch mal eine andere Frage:
    Ich möchte den übertragenen Text/Code gerne auswerten.
    Aus diesem Grund habe ich einiges vergeblich ausprobiert.
    Durch Zufall habe ich einen Anweisung im Code nicht geändert und hatte plötzlich das gewünschte Ergebnis. Jetzt verstehe ich die Welt nicht mehr!!

    Eigentlich sollte in der Anweisung "Z2 = Left(x , 3) " statt dem x ein a stehen.
    Mit a geht es nicht. Mit x bekomme ich die ersten 3 Zeichen meines Codes angezeigt.

    Wo bekommt die Variable X ihren Inhalt her? Ich begreifs nicht

    Code:
     
    
    
    $regfile = "m8def.dat"
    $crystal = 7372800
    $baud = 4800
    
    'Initialisierung LCD Display
    Config Lcd = 20 * 4                                         'LCD-Display mit 20 Zeichen in 4 Zeilen verwendet
    Config Lcdbus = 4                                           '4 bit mode
    Config Lcdmode = Port
    Config Lcdpin = Pin , Db4 = Portc.1 , Db5 = Portc.2 , Db6 = Portc.3 , Db7 = Portc.4 , E = Portc.5 , Rs = Portd.6       'war Portc.6
    
    
    Dim S As String * 11
    Dim A As String * 11
    Dim X As String * 10
    'S = "Testanzeige"                                           '11Stellen
    
    
    Dim Z1 As String * 10
    Dim Z2 As String * 10
    Dim Z3 As String * 10
    
    
    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts
    
    Cls
    
    Lcd "RS485 Test"
    
    Do
    
    Z2 = Left(x , 3)                                            ' wo bekommt die Veriable X ihren Inhalt her?
    
    
    
    'Lcd "erste Zeile"
    
    Locate 1 , 1
    
    
    
    'LCD "zweite Zeile"
    
    Locate 2 , 1
    
    Lcd Z2
    
    
    
    
    
    'Lcd "vierte Zeile"
    Locate 4 , 1
    Lcd Z1
    
    Loop
    
    
    
    ' **** RS485 Aktivieren und Bus prüfen
    ' Übertragener Text: z.B. $t1-10101
    
    Onrxd:
    
    
    
    S = S + Chr(udr)
    
     If Len(s) > 9 Then
    
        A = Right(s , 11)
        Z1 = Left(a , 9)
    
    
     Else
          A = ""
     End If
    
     Return
    
    '***********
    Kannst du mir das erklären?

    Tobias

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180
    Ist es möglich dass nach einem Reset bzw. nach dem Einspielen eines neuen Programms der bisherige Inhalt einer Variable erhalten bleibt?
    Ich schreibe meine Programme mit Ponyprog2000 und nutze einen Mega8

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    Mit was Du Dein prog auf den AVR transferierst ist
    dem AVR wurst, Hauptsache die Übertragung ist OK.
    Bei einem Reset wird der SRAM gelöscht,
    enthaltene Daten sind futsch und das ist auch mitunter
    ganz gut so.

    Das Überlappen von Variablen kmmt daher, dass Du die
    Framesize vermutlich noch zu klein hast für Dein Programm.
    erhöhe mal den Wert im Compiler unter:

    Options -> Compiler -> Chip -> Framesize

    Ein Wert um 60 sollte in etwa hinkommen. Standard ist 24,
    was in etwa Deinen ersten Variablen entspricht, daher liegen die
    nachfolgenden übereinander, quasi als Overlay.

    Da ich aber die Struktur der Daten nicht kenne, weil
    die hier bisher nicht aufgetaucht sin kann ich Dir auch nicht
    sagen warum wann was angezeigt wird.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180
    Hallo Vitis,

    Meine Framesize war sogar nur auf 16 eingestellt. Ich habs geändert.

    Zu meinem eigentlichen Problem.

    Auf der Senderseite wird folgender Text gesendet: t1-00100
    und zwar mit folgendem Code:

    Code:
    ....
       R1 = Portb.0
       R2 = Portb.1
       R3 = Portb.2
       R4 = Portd.6
       R5 = Portd.7
    
       Disable Urxc
       Disable Interrupts
    
    
       Config Portd.2 = Output
    
       Waitms 5
       Portd.2 = 1
       Waitms 10
       Print
       Print "t1-" ; R3 ; R2 ; R1 ; R5 ; R4
       Waitms 5
       Portd.2 = 0
    
       Config Portd.2 = Input
    
    ....
    Übertrage ich hier vielleicht schon irgent welche Sonderzeichen?

    Im Display beim Empfänger kommen dann 9 Zeichen an da ich bei der Anweisung


    Onrxd:



    S = S + Chr(udr)

    If Len(s) > 9 Then

    Zeile4 = S

    den vollst Text erhalte bzw. ab 10 nicht mehr bekomme.

    Was ich hier allerdings nicht verstehe, ist dass bei der nächsten Übertragung quasi der Textteil der eigentlich garnicht vom Sender stammt, nach links verschoben wird und die nächsten übertragenen Daten angehängt wird.
    Es sieht ungefähr so aus:

    erste Übertragung ++t1-00100
    zweite Übertragung ++++t1-001
    dritte Übvertragung 00++++t1-0
    vierte Übertragung 0100++++t1
    fünfte Übertragung t1-00100++
    sechste Übertragung ++t1-00100
    siebte Übertragung ++++t1-001
    u.s.w.

    (die + sollen die Sonderzeichen beschreiben)

    Hast du eine Idee wie ich diesem Problem Herr werden kann?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •