m@rkus33
30.07.2012, 15:56
Hallo zusammen,
ich bin gerade dabei einen eigenen Sensor an eine vorgegebene spezielle Schnittstelle anzubinden. Die Schnittstelle ist eine Eindrahtschnittstelle die ganz eigene Vorgaben hat.
Hier ein Auszug aus der Schnittstellenbeschreibung:
"...
Schnittstellenparameter:
38400, n, 8, 1
Eindrahtschnittstelle halbduplex
Protokoll:
Idle Line Multiprozessor
Protokoll
Der Sensor ist Slave. Er empfängt solange, bis ein Idle Line
Timeout auftritt. Anschließend werden die Daten ausgewertet
und entsprechend reagiert.
Datenabfrage:
Der Master schickt ca. alle 6ms eine Adresse auf den Bus (0x00
bis 0x0f rotierend).
Erkennt der Sensor die Adresse, antwortet dieser.
Antwort vom Sensor Die Antwort besteht aus 3 Bytes.
1. Byte:
Adresse (Echo) + Werteklasse (= Einheit)
2.+3. Byte:
Sensorwert und Alarmflag
Beispiel der Antwort auf die Adresse 3:
0x31 = Adr. 3 + Werteklasse 1 "Spannung"
0x005B = 45*2+1 = 4,5 Volt + Alarmflag
Ich bin schon so weit, das ich am besten mit den "Serin" und "Serout" Befehlen zurecht komme. Der Testcode reagiert schon mal auf die Adresse auf dem Pin A0 und schreibt dann zurück.
Komisch ist nur, das ganz andere Werte zurückgeschrieben werden. Ich lasse die Werte an zwei Pins mit Serout schreiben. An Pin A1 hängt ein Terminalprogramm.
$regfile = "M16def.dat"
$crystal = 3686000
$baud = 38400
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 16 ' default use 10 for the SW stack
$framesize = 64
Dim B As Byte
Dim Wert As Word
Dim Header As Byte
Header = &H31
Wert = &H005B
Do
Serin B , 1 , A , 0 , 38400 , 0 , 8 , 1
If B = 3 Then
Serout Header , 1 , A , 0 , 38400 , 0 , 8 , 1
Serout Wert , 2 , A , 0 , 38400 , 0 , 8 , 1
Serout Header , 1 , A , 1 , 38400 , 0 , 8 , 1
Serout Wert , 2 , A , 1 , 38400 , 0 , 8 , 1
End If
Loop
End
Aber anstelle von:
Header = &H31 (0x31) wird im Terminal Hex 0x61 zurückgeschrieben und anstelle von Wert = &H005B (0x005B) wird in Hex 0xBB00 ausgegeben.
Baudraten usw. passen.
Was läuft hier falsch? Hat jemand nen Tipp?
ich bin gerade dabei einen eigenen Sensor an eine vorgegebene spezielle Schnittstelle anzubinden. Die Schnittstelle ist eine Eindrahtschnittstelle die ganz eigene Vorgaben hat.
Hier ein Auszug aus der Schnittstellenbeschreibung:
"...
Schnittstellenparameter:
38400, n, 8, 1
Eindrahtschnittstelle halbduplex
Protokoll:
Idle Line Multiprozessor
Protokoll
Der Sensor ist Slave. Er empfängt solange, bis ein Idle Line
Timeout auftritt. Anschließend werden die Daten ausgewertet
und entsprechend reagiert.
Datenabfrage:
Der Master schickt ca. alle 6ms eine Adresse auf den Bus (0x00
bis 0x0f rotierend).
Erkennt der Sensor die Adresse, antwortet dieser.
Antwort vom Sensor Die Antwort besteht aus 3 Bytes.
1. Byte:
Adresse (Echo) + Werteklasse (= Einheit)
2.+3. Byte:
Sensorwert und Alarmflag
Beispiel der Antwort auf die Adresse 3:
0x31 = Adr. 3 + Werteklasse 1 "Spannung"
0x005B = 45*2+1 = 4,5 Volt + Alarmflag
Ich bin schon so weit, das ich am besten mit den "Serin" und "Serout" Befehlen zurecht komme. Der Testcode reagiert schon mal auf die Adresse auf dem Pin A0 und schreibt dann zurück.
Komisch ist nur, das ganz andere Werte zurückgeschrieben werden. Ich lasse die Werte an zwei Pins mit Serout schreiben. An Pin A1 hängt ein Terminalprogramm.
$regfile = "M16def.dat"
$crystal = 3686000
$baud = 38400
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 16 ' default use 10 for the SW stack
$framesize = 64
Dim B As Byte
Dim Wert As Word
Dim Header As Byte
Header = &H31
Wert = &H005B
Do
Serin B , 1 , A , 0 , 38400 , 0 , 8 , 1
If B = 3 Then
Serout Header , 1 , A , 0 , 38400 , 0 , 8 , 1
Serout Wert , 2 , A , 0 , 38400 , 0 , 8 , 1
Serout Header , 1 , A , 1 , 38400 , 0 , 8 , 1
Serout Wert , 2 , A , 1 , 38400 , 0 , 8 , 1
End If
Loop
End
Aber anstelle von:
Header = &H31 (0x31) wird im Terminal Hex 0x61 zurückgeschrieben und anstelle von Wert = &H005B (0x005B) wird in Hex 0xBB00 ausgegeben.
Baudraten usw. passen.
Was läuft hier falsch? Hat jemand nen Tipp?