PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wieso funktioniert es über das Terminalprogramm



elkokiller
26.11.2006, 09:47
Hallo,

ich "kämpfe" schon lange Zeit mit der Übertragung über RS485.
Mittlerweile ist es mir gelungen, mehrere Module an einen Bus zu hängen und die Steuerung der einzelenen Module über ein Terminalfenster am PC zu ermöglichen.
Bei der Eingabe eines Steuerungsbefehls am T-Fenster schaltet das jeweilige Modul und gibt eine Rückmeldung über den Bus den ich sowohl am T-Fenster als auch auf einem LCD Display sehe.
Jetzt möchte ich gerne über einen Taster an einem Modul, ein anderes Steuern.
Der Taster sendet exakt das über den Bus, was ich vorher am T-Fenster eingegeben habe.
Ich sehe den Text im T-Fenster.
Leider schalten die Module nicht.
Ich lasse mir jetzt im T-Fenster anzeigen was im Modul (nach der Interrupt auslösung) ankommt. Das Ergebnis sind wieder lauter wirre Zeichen.

Woran kann das liegen?

Tobias

elkokiller
26.11.2006, 11:45
Hallo,

hier habe ich noch einmal meine Sende und Empfangsfunktionen zusammen gestellt:

Sender



$regfile = "m8def.dat"
$crystal = 7372800
$baud = 4800

Config Pinc.0 = Input
Config Pinb.2 = Input


Dim I As Byte
Dim Key As Byte
Const Keys = 2

Do


For I = 1 To Keys
Key = I
Select Case Key
Case 1 : Debounce Pinc.0 , 0 , Key_o1 , Sub
Case 2 : Debounce Pinb.2 , 0 , Key_o2 , Sub

End Select

Next

Loop


' Tasterfunktionen

Key_o1:

Gosub Abfrage

Return


' Abfrage der angeschlossenen Module

Abfrage:

Portd.2 = 1
Waitms 5
Print "test"
Portd.2 = 0

Return


Key_o2:

Return





Empfänger:



$regfile = "m8def.dat"
$crystal = 7372800
$baud = 4800


Dim S As String * 10
Dim A As String * 10
Dim Z As String * 10

Dim V As Word


On Urxc Onrxd
Enable Urxc
Enable Interrupts


Do



Loop


' **** RS485 Aktivieren und Bus prüfen


Onrxd:

V = V + 1

S = S + Chr(udr)

If Len(s) > 3 Then
A = S
Goto Pruefung


Else
End If


Return

'************************************************* ***


Pruefung:

Z = Mid(a , 1 , 2 )

Gosub Zustand


A = ""
S = ""


Return

'************************************************* ***

Zustand:



Disable Urxc
Disable Interrupts


Config Portd.2 = Output

Waitms 5
Portd.2 = 1

Print "Angekommen" ; S

Print "Zustand"

Waitms 5
Portd.2 = 0

Config Portd.2 = Input

Enable Urxc
Enable Interrupts


A = ""


Return



Wie gesagt, wenn ich am angeschlossenen Terminalprogramm unter Win XP das Wort "test" eingebe, meldet sich der empfänger und bestätigt mir mit der Rückmeldung "Angekommen test".
Sende ich dies über den Sender so erhalte ich nur wirre Zeichen.

Tobias

Vitis
26.11.2006, 12:05
Zunächst mal, Du hast vermutlich n Fehler in der Senderoutine:


Portd.2 = 1
Waitms 5
Print "test"
Portd.2 = 0

Also Du schaltest den 485 Busbaustein auf Senden, mit

Portd.2 = 1

Dann warteste 5ms um sicherzustellen, dass der Bus auch wirklich auf senden ist, soweit richtig.

Dann verwendeste den Print Befehl zum Senden, das kann man auch so machen, der Haken ist, dass das Programm dann schon auf
Portd.2 = 0 geht, obwohl das Senden selbst noch nicht abgeschlossen
ist. Du hast übersehen, das der Mega8 nen Sendepuffer hat, der mit dem
Print beschrieben wird und dann die Zeichen in die UART schiebt,
während das Programm schon weiter läuft.
Du musst also sicherstellen, dass der Bus erst umgeschaltet wird, wenn
auch wirklich die Daten raus sind und nicht noch was im Puffer hängt.
Am Einfachsten machste das mit dem TXC - Flag.

elkokiller
26.11.2006, 12:44
oh - das wusste ich nicht.
ich ging in der Tat davon aus, dass der Printbefehl zunächst vollständig ausgeführt wird und erst dann der Port wieder auf 0 gesetzt wird.

Kannst du mir sagen wie ich ein TXC-Flag einbauen muss?

Vitis
26.11.2006, 12:53
Portd.2 = 1
Waitms 5
Print "test"
do
loop until ucsra.txc=1
reset ucsra.txc
waitms 5
Portd.2 = 0

elkokiller
26.11.2006, 19:43
Danke Vitis,
das werde ich mir auf jeden Fall auch noch einbauen.

Leider hat es daran nicht gelegen.

Ist es möglich dass die Lage des Busses auf der Platine ein Rolle spielt?

Vitis
27.11.2006, 14:47
bei 4800 Baud normalerweise noch nicht, solange kein Kurzer drinne ist.
beim LTC485 hab ich pullups und pulldowns auf den busleitungen
und n Abschlusswiderstand sollte auch drauf sein.
Hatte da mal Probleme mit floatenden Pegeln auf'm bus ohne
das.
Dann natürlich der Kardinalsfehler: AB-Tausch?

elkokiller
27.11.2006, 20:47
beim AB Tausch geht aber doch gar nichts mehr

Vitis
28.11.2006, 08:40
Nichts mehr? Oh doch, es sind dann nachwievor Zustandsänderungen
von H nach L, nur eben invertiert und ich hab bei eigenen
Projekten festgestellt, das der Controller dann irgendwo mal
n Startbit findet, das zwar keins ist aber halt ähnlich und schon
läuft die UART los. Da kommt dann wirklich nur noch Mist raus

elkokiller
30.11.2006, 13:25
o.k. ich habe das Problem identifiziert!

Meine Schaltung mit der ich den Bus am PC abhöre (RS232-RS485) ist die Ursache.
Ich habe ihn weggenommen und schon klappts!

Jetzt habe ich aber noch ein zweites Problem gefunden.
Wenn ich meine ISP Leitung, die am LPT Anschluss des PC's angeschlossen ist wegnehme, versteht der Controller auch nichts mehr.
Woran liegt das?

Vitis
30.11.2006, 13:52
Der COntroller versteht nix mehr von wem?
vom PC under von anderem Controller?
Ich schätze mal, nur so ein Schuss ins Blaue,
GND-Fehler

elkokiller
30.11.2006, 15:34
Hallo Vitis,

Fehler gefunden. Es war ein Pull Up Widerstand am Int0.

Welche Hardware nutzt du um den Buss mit dem PC ab zu hören?

Vitis
30.11.2006, 22:23
ich hab aufm steckbrett nen Max232 und n 485 drauf gesteckt und
die miteinander verbunden, ist nicht gerade ne höllenmaschine aber funzt.
normalerweise brauch ich das aber nicht, da ich bei problemen das
speicheroszi dranhäng, dann hab ich gleich das timing und die pegel zum fehler eingrenzen, wieso?

elkokiller
01.12.2006, 16:16
kannst du mir mal den Scahltplan deines steckbrettes geben