Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgabe von RS485 Daten auf LCD
elkokiller
13.11.2006, 20:17
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
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.
elkokiller
15.11.2006, 22:51
Hallo vitis,
leider haben deine Vorschläge keine Besserung gebracht.
Hier ist mein Code, der mir das Zahlenwirrwar bringt:
$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
$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?
elkokiller
16.11.2006, 22:22
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!
ist ja witzig ... hab doch garnicht viel gemacht :-b
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.
elkokiller
18.11.2006, 17:52
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
$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
elkokiller
18.11.2006, 18:23
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
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.
elkokiller
19.11.2006, 10:31
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:
....
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?
Ja, Du sendest nch Sonderzeichen,
nämlich ASCII 10 und ASCII 13 (CR + LF)
CR = Carrier Return, LF= Line Feed, die
am Ende der Print-Anweisung übertragen werden.
Das kann man aber recht einfach unterdrücken,
indem man am Ende der Print-Anweisung nochmal ein Semikolon setzt.
Print "t1-" ; R3 ; R2 ; R1 ; R5 ; R4 ;
elkokiller
19.11.2006, 19:19
wie sagt das Sprichwort: "Kleinvieh macht auch Mist"
Ich habs bestimmt schon 100mal überlesen; das Semikolon war der Grund für den verlorenen Samstag....
Herlichen Dank an Vitis!!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.