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.
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
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.
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.
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..
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
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?
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.
> 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
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 :-)
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.
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.
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.
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
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?
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
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.
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..
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ß
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?
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ß
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ß