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. Dann braucht auch in diesem Falle die readgpib-Funktion zu lange.
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.