PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgabe von RS485 Daten auf LCD



elkokiller
13.11.2006, 19: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

Vitis
14.11.2006, 16:25
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, 21: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

Vitis
16.11.2006, 19:23
$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, 21: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!

Vitis
16.11.2006, 22:06
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, 16: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, 17: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

Vitis
19.11.2006, 01:56
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, 09: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?

Vitis
19.11.2006, 12:10
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, 18: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!!