Forum: Mikrocontroller und Digitale Elektronik GPIB-nach-USB-Konverter


von Emmanuel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Community,

ich bin neu hier und habe ein Problem bei meinem GPIB-nach-USB-Konverter 
Projekt. Aber zuerst einmal zu den Details:

Für das Projekt nutze ich den PIC18F25J50. Der Schaltplan ist im Anhang 
zu sehen (PIC18F2550 wurde durch PIC18J25J50 ersetzt und die 
Verschaltung dementsprechend angepasst).
Auch die main.c sowie die gpib.c habe ich angehängt.

Nun habe ich folgendes Problem: wenn ich in der main.c die Funktion 
"readgpib()" ausklammere, wird mein Konverter als serielle Schnittstelle 
erkannt. Um das zu testen, nutze ich das Programm Tera Term. Sobald ich 
allerdings die Funktion mit in mein Programmcode nehme, wird der 
Konverter nicht mehr als serielle Schnittstelle erkannt.

Ich finde den Fehler allerdings nicht und bin fast am verzeifeln :(

Ich hoffe Ihr könnt mir helfen! Falls weitere Informationen benötigt 
werden, versuche ich so schnell wie möglich zu reagieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vielleicht braucht Deine Funktion "readgpib" zu lange?

von GB (Gast)


Lesenswert?

Steht doch im Sourcecode:
Zitat:
> Receive a string of maximum GPIB_MAX_LEN chars from GPIB.
> Routine will loop forever and only exit when it has seen
> an LF, EOI or if the buffer is full. It will also exit
> if you send new data over USB

von Emmanuel (Gast)


Lesenswert?

Hallo und danke für die schnelle Antwort !

Allerdings habe ich im Moment noch kein Messgerät an die 
GPIB-Schnittstelle angeschlossen. Meiner Meinung nach sollte dann nur 
NDAC leuchten.
Wenn ich "readgpib" ausklammere, leuchtet keine LED und der Konverter 
wird als serielle Schnittstelle erkannt.
Wenn ich "readgpib" einbinde, leuchtet NDAC, jedoch wird der Konverter 
nicht als serielle Schnittstelle erkannt.

von X4U (Gast)


Lesenswert?

Emmanuel schrieb:
> Wenn ich "readgpib" einbinde, leuchtet NDAC, jedoch wird der Konverter
> nicht als serielle Schnittstelle erkannt.

was wohl daran liegt das:

GB schrieb:
> Routine will loop forever and only exit when it has seen
> an LF, EOI or if the buffer is full.

da USB Routinen periodisch aufgerufen werden müssen.

von Emmanuel (Gast)


Lesenswert?

okay, also das bedeutet, dass erst ein Messgerät dranhängen muss, damit 
es als Schnittstelle erkannt wird und ich mit diesem Messgerät 
kommunizieren muss? Ich steh grad n bisschen auf dem Schlauch..

von Olaf (Gast)


Lesenswert?

Du baust ein Geraet und entwickelst die Software dafuer und stehst auf 
dem Schlauch bei dem was dein Geraet macht? Erklaer uns das mal. Das ist 
ein Verhalten das im Datenblatt zum Entwickler normalerweise nicht 
vorgesehen ist.

Olaf

von Emmanuel (Gast)


Lesenswert?

okay das war vielleicht unpassend ausgedrückt...
Meiner Meinung nach sollte es folgendermaßen sein:

Sobald der Konverter an den USB Port angeschlossen wird und nichts am 
GPIB Port angeschlossen ist, sollte nur NDAC leuchten. Wenn ich dann 
Tera Term öffne und einen String sende, sollte ich Aktivität auf den 
LEDs sehen. Wenn ich etwas tippe und nichts am GPIB-Bus dran ist, sollte 
NRFD leuchten und wenn ich STRG-Enter drücke, sollten der Rest der LEDs 
kurz leuchten und daraufhin NRFD ausgehen.

Aber ich komme nicht zum eintippen, weil der Konverter nicht als 
serielle Schnittstelle erkannt wird.
Somit kann die Routine doch auch kein LF oder EOI registrieren oder?

von Peter D. (peda)


Lesenswert?

Emmanuel schrieb:
> Sobald ich
> allerdings die Funktion mit in mein Programmcode nehme, wird der
> Konverter nicht mehr als serielle Schnittstelle erkannt.

Vermutlich benutzt Du einen blockierenden Programmablauf, das ist ganz 
schlecht.
Jedes Interface sollte als Interrupt arbeiten, d.h. solange kein neues 
Ereignis eintritt, wird einfach kein Interrupt ausgelöst. Das Main kann 
dann aber weiter laufen.
Jedes Interface hat seine eigenen Sende- und Empfangspuffer. Das Main 
nimmt dann die Daten aus dem einen Puffer, interpretiert sie und 
übergibt sie an das andere Interface und umgekehrt. Das Main wertet auch 
die Steuerkommandos vom USB für den GPIB aus (Init, Adressen, Status, 
Timeout usw.).

Der USB-Interrupt muß auf jeden Fall immer behandelt werden, sonst 
bricht der PC die Verbindung ab.


Geht der Schaltplan nicht noch kleiner, ich kann überhaupt nichts 
erkennen.
Die meisten Monitore können 1920*1080, das solltest Du auch benutzen.
Und verkleinen kann der Betrachter immer, aber fehlende Pixel kann man 
nicht wieder hinzudichten.

von Olaf (Gast)


Lesenswert?

> Aber ich komme nicht zum eintippen, weil der Konverter nicht als
> serielle Schnittstelle erkannt wird.

Ich glaube du hast ein grundsaetzliches Verstaendnisproblem. Serielle 
Schnittstellen muessen zwar im inneren eines PCs erkannt werden damit 
der dafuer einen Treiber laedt, aber danach sind sie immer da und 
funktionieren auch immer. Das ist anders wie bei USB wo sich auch 
Devices anmelden muessen. Wenn also etwas an deiner seriellen Verbindung 
nicht stimmt, dann stimmt einfach etwas mit deiner Software im Slave 
nicht weil die nicht antwortet. Und dafür koennte man ja einfach einen 
Debugger verwenden um mal zu schauen was die Software gerade so macht.

Olaf

von Emmanuel (Gast)


Angehängte Dateien:

Lesenswert?

Okay vielen Dank schonmal für die Antworten !


Also ich fixiere mich im Moment ziemlich auf die readgpib() Funktion, da 
es ohne diese Funktion eben funktioniert.
Zum Debuggen benutze ich das PICkit 3.
Wenn ich nun einen Breakpoint bei der Funktion (readgpib) setzte, kann 
ich durchklicken bis zu der Funktion 
memset(gpib_buff,0,sizeof(gpib_buff)). Dort schmeisst er mich das erste 
mal raus.
Wenn ich diese überspringe, geht er in die while Schleife und geht wie 
geplant in die CDCTxService() Funktion und fragt danach die if-Anweisung 
ab, geht aber nicht rein, sondern springt gleich zur nächsten 
if-Anweisung, in die er auch nicht rein geht.
Danach wird die switch-case Funktion abgearbeitet. Er springt nur die 
den 3. case (case GPIB_RX_WAIT_DAV) und dann beginnt es wieder von 
vorne.
Soviel zum Debuggen der readgpib Funktion.

Leider hilft mir das nicht viel weiter im Bezug auf die Geschichte mit 
der Erkennung der seriellen Schnittstelle.

@Olaf: Ich verstehe was du meinst. Natürlich wird der Konverter erkannt 
und die richtigen Treiber sind installiert. Und wie oben beschrieben 
habe ich es naütrlich auch mit Debuggen versucht.

@Peter Dannegger: Ich finde es merkwürdig, dass der Konverter ohne die 
"readgpib" Funktion als serielle Schnittstelle erkannt wird. Somit gehe 
ich davon aus, dass der USB-Interrupt behandelt wird ?
Im Anhang habe ich ein größeren Schaltplan hochgeladen.

Ich bin Student und im Moment arbeite ich an diesem Projekt. Ich weiß, 
ich habe im Moment nicht das größte Wissen in dem Bereich, allerdings 
lernt man bekanntlich am schnellsten durch Praxis. Ich hoffe ihr habt 
Verständnis dafür und versucht mir bei dem Problem zu helfen :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du darfst die Funktion readgpib nicht an dieser Stelle (aus der Funktion 
ProcessIO heraus) aufrufen.

readgpib braucht, wenn kein Gegenstück angeschlossen ist, ewig.

An dieser Stelle aber muss, damit die USB-Funktionalität gewährleistet 
bleibt, so wenig Zeit wie möglich verbraucht werden.

ProcessIO wird aus main heraus zyklisch aufgerufen.

Du musst also readgpib so umschreiben, daß die Funktion auch dann so 
schnell wie irgend möglich zurückkehrt, wenn sie nichts empfangen hat.

Geht das nicht, musst Du versuchen, die Funktion nebenläufig zu 
implementieren, d.h. in einem eigenen Thread o.ä., und aus ProcessIO 
heraus auf das in einem globalen Puffer o.ä. abgelegte Ergebnis dieser 
nebenläufigen Funktion zugreifen.

von Emmanuel (Gast)


Lesenswert?

Alles klar, damit kann ich was anfangen und nachvollziehen :)

Aber ich möchte erwähnen, dass ich es auch schon versucht, wenn ein 
Gerät angeschlossen ist.
Ich habe ein Multimeter von Fluke 
(http://www.testequity.com/documents/pdf/fluke45.pdf), an dem ein 10 Ohm 
Widerstand hängt.

Leider hat auch hier die Erkennung nicht geklappt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Emmanuel schrieb:
> Leider hat auch hier die Erkennung nicht geklappt.

Dann braucht auch in diesem Falle die readgpib-Funktion zu lange.

von X4U (Gast)


Lesenswert?

Emmanuel schrieb:
> Leider hat auch hier die Erkennung nicht geklappt.

Du hast bei deinem Interface 2 Baustellen. Die USB und die GPIB Seite. 
Beide sind zeitkritisch aber jeder auf seine Art.

GPIB Geräte sind häufig eher langsam (auch wenn der Bus schnell ist). Um 
Sie mit USB zu verheiraten kannst du nicht auf GPIB Events warten. Die 
die USB-Connection kann auch mitten im Betrieb verschwinden.

Als erstmal statt While und Repeat Flags setzen und die USB Routine 
periodisch aufrufen.

von Emmanuel (Gast)


Lesenswert?

So, ich habe jetzt nochmal das Multimeter angeschlossen und nachdem ich 
erst Spannung und dann das Messgerät angeschlossen habe, wurde der 
Konverter als serielle Schnittstelle von Tera Term erkannt ! :)
An dieser Stelle schonmal vielen Dank !

Nun ist mein Ziel z.B. die Seriennummer dieses Messgerätes auszulesen. 
Wenn ich nun den passenden Befehl *IDN? in Tera Term eingebe und Enter 
drücke passiert leider nichts. Außerdem sehe ich keinerlei Aktivität bei 
den LEDs...
Mache ich etwas falsch?
Ich habs auch mal mit dem Program Hyperterminal versucht, allerdings 
kommt hier die Meldung: "Unable to open COM5. Please check your port 
settings"

Gruß Emmanuel

von X4U (Gast)


Lesenswert?

Emmanuel schrieb:
> Nun ist mein Ziel z.B. die Seriennummer dieses Messgerätes auszulesen.
> Wenn ich nun den passenden Befehl *IDN? in Tera Term eingebe und Enter
> drücke passiert leider nichts. Außerdem sehe ich keinerlei Aktivität bei
> den LEDs...

mach erstmal ne Loop über den Pic ob die Daten auch so ankommen wie du 
Sie sendest.


> Mache ich etwas falsch?
> Ich habs auch mal mit dem Program Hyperterminal versucht, allerdings
> kommt hier die Meldung: "Unable to open COM5. Please check your port
> settings"

Ist COM5 noch belegt?

von Emmanuel (Gast)


Lesenswert?

X4U schrieb:
> mach erstmal ne Loop über den Pic ob die Daten auch so ankommen wie du
> Sie sendest.

Ich verstehe nicht, wie du das meinst. Also bei der seriellen 
Übertragung (z.B. bei einer RS-232-Schnittstelle) kann ich einfach TX 
und RX loopen. Aber hier habe ich doch eine parallele Übertragung über 
die 8 Datenleitungen des GPIB-Buses.
Ich könnte höchstens mit einem Oszi prüfen, ob sich auf den D+ D- 
Leitungen was tut oder seh ich das falsch?

X4U schrieb:
> Ist COM5 noch belegt?

Nein, hier ist nur der Konverter angeschlossen

von X4U (Gast)


Lesenswert?

Emmanuel schrieb:
> Also bei der seriellen
> Übertragung (z.B. bei einer RS-232-Schnittstelle) kann ich einfach TX
> und RX loopen.

Damit weisst du aber nicht ob der Pic das korrekt empfängt.

Sende die Zeichen im Pic zurück und du weißt ob Sie korrekt ankommen.

von Emmanuel (Gast)


Lesenswert?

okay habe jetzt die Zeile

USB_In_Buffer[i] = USB_Out_Buffer[i] + 1;

in die ProzessIO eingefügt. Eigentlich sollte ich meine Eingabe um 1 
erhöht zurückbekommen, leider bekomm ich aber nichts..

von Emmanuel (Gast)


Lesenswert?

hallo,

der Stand ist folgender:

das Programm tera term erkennt den Konverter als serielle Schnittstelle, 
wenn ein Messgerät dran hängt. D.h dieses Problem ist gelöst.
Der nächste Schritt wäre ein Befehl zu senden wie z.B. *IDN? und die 
Seriennummer des Messgerätes zurück zu bekommen.
Leider klappt das nicht.
Beim Debuggen springt er von der if Anweisung (if((USBDeviceState < 
CONFIGURED_STATE)||(USBSuspendControl==1)) return;) direkt zum Ende der 
ProzessIO.
Das ist komisch, denn würde er nicht in die If-Anweisung gehen, könnte 
der PC den Konverter auch nicht erkennen.
Hat jemand eine Idee und kann mir weiterhelfen?

Gruß

von X4U (Gast)


Lesenswert?

Emmanuel schrieb:
> der Stand ist folgender:

....

Emmanuel schrieb:
> okay habe jetzt die Zeile
> USB_In_Buffer[i] = USB_Out_Buffer[i] + 1;
> in die ProzessIO eingefügt. Eigentlich sollte ich meine Eingabe um 1
> erhöht zurückbekommen, leider bekomm ich aber nichts.

Läuft das jetzt?

von Emmanuel (Gast)


Lesenswert?

X4U schrieb:
> Läuft das jetzt?

Nein leider noch nicht.
Ich habe mit dem Oszi gemessen, ob es Pegelwechsel an den 
Steuerleitungen gibt, wenn ich einen Befehl eingebe (wie z.B. ++ver). 
Jedoch bleiben die Leitungen auf 3,3 V, außer NDAC ist auf low und 
leuchtet.
Um zu prüfen, ob die Konnektivität vom USB Port zum Mikrocontroller 
stimmt, habe ich TX RX gebrückt und bekomme auch die richtigen Zeichen 
zurück.
Ich gehe davon aus, dass es an der Verbindung von Mikrokontroller und 
GPIB-Bus liegt.  Vielleicht eine falsche Konfiguration ?
Leider habe ich bisher noch nichts gefunden.

Gruß

von Emmanuel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich melde mich nochmal zurück mit dem aktuellen Stand:

Ich teste im Moment mit auf zwei Arten:
Tera Term: der Konverter wird als serielle Schnittstelle erkannt, jedoch 
reagiert er nicht auf Befehle. Es leuchten keine LEDs (welche die 
Steuerleitungen repräsentieren) und ich bekomme keine Antworten zurück 
(z.B. sollte ich die Seriennummer bekommen, wenn ich den Befehl ++ver 
oder *IDN? schicke)

Als zweiten Punkt habe ich ein kleines Programm mit Python geschrieben. 
Dieses habe ich in den Anhang geladen.
Dieses Programm habe ich auf seine Funktion getestet, indem ich einen 
GPIB nach USB Konverter von NI 
(http://sine.ni.com/nips/cds/view/p/lang/de/nid/201586) dran gehängt 
habe.
Zuerst frage ich ab, welche Geräte am PC hängen. Sowohl der Konverter 
von NI als auch mein Konverter werden hier erkannt.
Nun möchte ich Informationen auslesen und drücke 'g'. Daraufhin wird 
abgefragt, welches Gerät dafür verwendet werden soll. Wähle ich den 
NI-Konverter, klappt alles einwandfrei. Wähle ich jedoch meinen 
Konverter, kommt die Fehlermeldung: "That is not a valid interface!"

Hat jemand Ideen oder Anregungen und kann mir weiterhelfen?

Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.