Seite 1 von 2

Digitale PIO Karte ansprechen.

Verfasst: 31.03.2011 19:28
von tinux
Habe folgendes Problem
Versuche eine Digitale PIO Karte anzusprechen. (μPIO / GPIO18 von ABACOM)
Ich weis überhaupt nicht wie ich das Umsetzen kann.
Wer kann mir weiterhelfen. Ich weis überhaupt nicht was ich ihm senden soll (sieben Datenbytes ?)

Datenprotokoll des Hersteller
Das μPIO / GPIO18 arbeitet als PC-Interface mit 18 digitalen I/O-Kanälen deren Datenrichtung umschaltbar ist (18 GPIO).
Die I/O-Leitungen sind zu drei Ports zusammengefasst (Port B, Port C, Port D). Jeder Port
besitzt sechs I/O-Leitungen:
Die Kommunikation mit dem PC erfolgt per USB. Der USB-Treiber installiert einen virtuellen COM-Port. Der Datenaustausch erfolgt somit wie über eine ‚echte’ RS232-Schnittstelle.
Die Schnittstellenparameter sind: 57600, 8 N, 1
Baud 57600. 8 Datenbits, Keine Parität, 1 Stopbit
Die Kommunikation erfolgt nach dem Frage-Antwort-Prizip (Request/Response). Dabei bestehtein Request immer aus genau sieben Datenbytes. Nachdem Empfang dieser sieben Datenbytes sendet die Firmware 15 Bytes als Antwort an den PC zurück.
Request: 7 Bytes
Byte1: ADC-Referenzumschaltung (0=EXTERN; 1=INTERN VCC; 3=INTERN 1.1V)
Byte2: Richtung Port B
Byte3: Richtung Port C
Byte4: Richtung Port D
Byte5: Daten Port B
Byte6: Daten Port C
Byte7: Daten Port D
Die Bytes 2..4 geben die Datenrichtung an. Ein gesetztes Bit setzt die zugehörige Portleitung auf AUSGANG, ein gelöschtes Bit setzt die Portleitung auf EINGANG.
Die Bytes 5..7 setzen den Ausgangszustand der I/O-Leitungen deren Datenrichtung auf
AUSGANG gesetzt ist. Ein gesetztes Bit schalten den Ausgang HIGH (5V), ein gelöschtes Bit schaltet den Ausgang LOW (0V). Für I/O-Leitungen die nicht als Ausgang sondern als
EINGANG definiert wurden, wird mit den Datenbytes (Byte 5…Byte7) ein interner Pullup-
Widerstand aktiviert . Ein gesetztes Bit aktiviert den Pullup für eine I/O-Leitung. Ein gelöschtes Bit deaktiviert den Pullup für die zugehörige I/O-Leitung.
Die Bits-Nummern der Datenbytes sind den Leitungsnummern der Portleitungen zugeordnet.
Ein gesetztes Bit2 in Byte4 eines Requests setzt also z.B. die Datenrichtung der Portleitung D2 auf Ausgang.
Response: 15 Bytes

Hinweise zur Verwendung des Protokolls
Zum Datenaustausch wird zunächst ein Request-Datenblock (Byte.array) mit einer Länge von
genau sieben Bytes definiert, der mit ALLEN Informationen belegt sein muss, die zum Gerät
geschickt werden sollen. Dann überträgt man diesen Block über die Schnittstelle.
Anschliessend müssen die 15 Antwort-Bytes von der Schnittstelle eingelesen und nach Bedarf
ausgewertet werden. Ein neuer Reqest-Block sollte erst dann ausgegeben werden, wenn alle
15 Bytes als Antwort auf den vorhergehenden Request empfangen wurden.

Code: Alles auswählen

OpenSerialPort(6, "COM6", 57600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)

Dim Byte.s(6)
Byte(0)="000001"
Byte(1)="000001"
Byte(2)="000001"
Byte(3)="000001"
Byte(4)="111111"
Byte(5)="111111"
Byte(6)="111111"

WriteSerialPortData(6, @Byte(), 6)

Re: Digitale PIO Karte ansprechen.

Verfasst: 01.04.2011 18:32
von H.Brill
Du hast ja auch ein String - Array definiert.
Versuch mal sowas :

Code: Alles auswählen

Dim myarray.b(6)
myarray(0) = %000001
usw.
Manchmal mögen solche externen Karten keine
Strings.

Re: Digitale PIO Karte ansprechen.

Verfasst: 01.04.2011 18:41
von tinux
Dank @ H.Brill , geht aber leider auch nicht.

Re: Digitale PIO Karte ansprechen.

Verfasst: 01.04.2011 19:38
von H.Brill
1 Byte hat ja bekanntlich 8 Bit.
Fülle mal das Byte ganz auf :

Code: Alles auswählen

Dim myarray.b(6)
myarray(0) = %00000100
Und mal nach dem Senden ein Delay(50)
reinmachen, da der prozessor ja auch ein paar
Takte braucht.

und daran denken, daß du von rechts zählen
mußt. Im obigen Beispiel ist dann Bit 2 (0-7)
gesetzt.

Wie ich sehe, ist das ganze mit einem AVR
Controller aufgebaut. Müßte mal am Wochenende
mein MyAVR - Board rausholen und mal was probieren.

PS: 49 € ist aber ganz schön teuer für so ein Board
mit USB + TTL Wandler, AVR, und ein paar Kleinigkeiten.

Re: Digitale PIO Karte ansprechen.

Verfasst: 01.04.2011 20:37
von tinux
Dank @ H.Brill , geht aber leider auch wieder nicht.

währe dir sehr dankbar wenn du mir weiter helfen könntest.

Re: Digitale PIO Karte ansprechen.

Verfasst: 02.04.2011 00:08
von Falko
Vielleicht braucht der AVR ja auch HEX-Werte.

Code: Alles auswählen

OpenSerialPort(6, "COM6", 57600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)

Dim A_Byte.s(7); Es sind doch sieben Bytes oder?
A_Byte(0)=Hex(%000001)
A_Byte(1)=Hex(%000001)
A_Byte(2)=Hex(%000001)
A_Byte(3)=Hex(%000001)
A_Byte(4)=Hex(%111111)
A_Byte(5)=Hex(%111111)
A_Byte(6)=Hex(%111111)

;Testausgabe in Hex
For i= 0 To 6
  Debug A_Byte(i)
Next

WriteSerialPortData(6, @Byte(), 7)
Leider kann ich das nicht testen, obwohl ich profilab habe, worin diese Hardware
angesteuert werden kann.


Gruß, Falko

Re: Digitale PIO Karte ansprechen.

Verfasst: 02.04.2011 07:32
von H.Brill
Ist vielleicht ein Quellcode für VB
dabei ? Da könnte man mal schauen.

Oder auch den Code (Bascom, ASM oder C)
für den Atmel. Dann könnte man auch sehen,
was wie dem Atmel übergeben wird.

Ist halt immer ewtas schwierig, wenn man die
Hardware nicht selber hat.

Re: Digitale PIO Karte ansprechen.

Verfasst: 02.04.2011 11:16
von tinux
Ist leider kein Quellcode dabei.

Gruß tinux

Re: Digitale PIO Karte ansprechen.

Verfasst: 02.04.2011 11:37
von - chris -
Und wie sieht dein Quellcode aus?

z.B. so:
es müssen sieben Bytes gesendet werden!

Code: Alles auswählen


OpenSerialPort(6, "COM6", 57600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)

Dim Byte.a(6)
Byte(0)=%00000001
Byte(1)=%00000001
Byte(2)=%00000001
Byte(3)=%00000001
Byte(4)=%00111111
Byte(5)=%00111111
Byte(6)=%00111111

WriteSerialPortData(6, @Byte(), 7)


Re: Digitale PIO Karte ansprechen.

Verfasst: 02.04.2011 12:11
von tinux
Danke, geht auch nicht.

was ich mich frage, ist ob die 7 Bytes überhaupt so angenommen.

Code: Alles auswählen

OpenSerialPort(6, "COM6", 57600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)

Dim Byte.b(6)
Byte(0)=%00000001
Byte(1)=%00111111
Byte(2)=%00111111
Byte(3)=%00111111
Byte(4)=%00111111
Byte(5)=%00111111
Byte(6)=%00111111

;WriteSerialPortData(6, @Byte(), 7)

For i=0 To 6
  Debug @Byte(i)
Next
Gruß, tinux