Forum: Mikrocontroller und Digitale Elektronik dsPIC USB CDC Serial Emulator


von Dominic A. (neo123)


Lesenswert?

Hallo zusammen,

Ich benötige mal wieder Eure Hilfe.
Ich probiere nun schon seit Stunden zu verstehen wie ich den USB Stack 
von Microchip in mein Projekt implementiere. Mein Ziel ist es eine 
einfach Datenverbindung über USB herzustellen. Also eine serielle 
Schnittstelle zu emulieren. Als uC verwende ich einen dsPIC33EP256MU810.

Die Microchip Libraries habe ich mir schon heruntergeladen. Jedoch finde 
ich mich darin überhaupt nicht zurecht. Es gibt nur fertige Projekte für 
alle möglichen Demo Boards. Nirgends finde ich eine Beschreibung was wo 
zu finden ist und wie die die Source Files aufgebaut sind.

Meine Frage ist nun gibt es irgendwo eine Anleitung was alles 
konfiguriert werden muss und welche Files alle benötigt werden?
Hat jemand von euch schon einmal eine USB Kommunikation mittels einem 
PIC realisiert?

Über eure Hilfe würde ich mich sehr Freuen.

von Frank M. (frank_m35)


Lesenswert?

Also bei mir gab es nach der Installation der Libraries folgenden 
Ordner:
\Microchip Solutions v2012-04-03\USB\Device - CDC - Serial 
Emulator\Firmware
in dem ein komplett fertiges Projekt für deinen PIC drin ist.
(der Pfad kann sich mit neueren Versionen der Libraries geändert haben.)

Das kannst du dir mal anschauen, in der main.c alles PIC18/32 Sach 
löschen, damit das für dich relevante ersichtlich wird.


Ansonsten um mal die grundlegenden Grundlagen zu verstehen fand ich 
diese Anleitung zu einem Demo-Board sehr gut:
http://ww1.microchip.com/downloads/en/DeviceDoc/41356B.pdf
worin dir die Grundlagen der USB Firmware, deren Aufbau und der Aufbau 
von USB generell erklärt wird. Natürlich nicht für deinen PIC, aber es 
ist am Ende ja eh überall das gleiche.

von Dominic A. (neo123)


Lesenswert?

Vielen Dank. Dieses PDF hat mir schon ziemlich geholfen.
Ich habe das Projekt nun einmal übernommen. Jedoch bekomme ich immer 
Unknown Device im Geräte Manager von Windows. Wahrscheinlich ist der 
Interne Quarz doch zu ungenau für eine USB Kommunikation.

von Frank M. (frank_m35)


Lesenswert?

Nach Spezifikation ist er der RC Oszillator in einigen PICs zu ungenau. 
(gibt spezielle die einen genaueren RC Oszillator wegen USB haben) 
Praktisch hatte ich bisher aber noch keine Probleme (PIC24FJ256GBxxx) 
bei normalem USB Betrieb (also nicht Full Speed). (Die Option auf einen 
Quarz bei fertigen Platinen würde ich trotzdem offen halten, man weiß ja 
nie)

Du musst bei CDC aber noch einen speziellen Treiber installieren, hast 
du den installiert?

Willst du das umgehen, musst du auf HID umsteigen, dafür verlierst du 
dann halt die Serielle Schnittstelle und somit den Komfort ein normales 
Terminal zu verwenden.

Auch sehr gut und umfangreich, in dem auch letzteres (HID zum debuggen) 
erklärt wird:
http://www.engscope.com/pic24-tutorial/14-1-usb-an-introduction/

von Dominic A. (neo123)


Lesenswert?

Ja leider habe ich nicht sehr genau hin geschaut als ich das Board 
gelayoutet habe und jetzt im nachhinein einen Quarz zu montieren ist 
nicht so praktisch.
Ich habe jetzt noch einmal ein bisschen mit den Oszillator Settings 
herumgespielt und jetzt geht gar nichts mehr. Wie hast du den die 
passenden 48MHz für das USB mit dem internen 7.37MHz Oszillator 
hinbekommen? Ich habe nun schon viele PLL Multiplier und Divider 
durchrechnet und liege meistens ziemlich weit daneben. In den meistens 
Beispielen wird ein 8MHz Quarz verwendet.

Ja der Treiber sollte eigentlich installiert sein. Einen Treiber zu 
installieren ist eigentlich kein Problem. Mein Ziel ist es 
schlussendlich Bilder vom PC aus auf das Display welches an dem PIC 
hängt zu senden. Im Moment funktioniert dies über UART. Jedoch ziemlich 
langsam. Wenn es keine allzu grosse Sache ist mittels C# Daten an ein 
HID Gerät zu senden überlege ich mir später vielleicht noch einmal 
umzusteigen. Vorerst wäre ich aber Froh wenn überhaupt irgendeine 
Kommunikation funktionieren würde.

Das Tutorial sieht sehr viel versprechend aus. Da werde ich mich 
aufjeden Fall auch noch durcharbeiten.

von Dingens23 (Gast)


Lesenswert?

Hallo,

ich habe das für einen PIC24FJ128GC006 durchgezogen.

Die Makros und #ifdefs in den Microchip examples sind allerdings 
wirklich schlimm...

Im Endeffekt würde ich mit dem CDC - USB-Seriell "Basic example" nehmen. 
Das Projekt enthält schon fast alles was man braucht und nicht allzu 
viel mehr.

Am besten speichert man dann das Projekt "Basic Example" als "Package" 
weg, das resultierende Zip hat alle notwendigen Files drin. Die sind 
nämlich ganz gut verstreut, ich habe die ganzen Files aber lieber im 
Projektordner.

Dann ein leeres Projekt für deinen Controller erstellen und alle Files 
dem Projekt hinzufügen und die nötigen Header inkludieren -dazu mit dem 
Microchip Projekt vergleichen. Am besten vorerst auch main.c aus dem 
Microchip Projekt übernehmen.

Danach muss man einen header "HardwareProrfile dsPIC33EP256MU810.h" 
erstellen, mit einer Vorlage von Microchip. Wichtig sind vor allem die 
Clockdefines.

Die usb_config.h muss man auch anpassen vor allem #define USB_INTERRUPT 
ist sinnvoll, das mach das ganze Interruptgesteuert und erspart lästiges 
pollen.

Die wichtigsten Funktionen sind:
USBDeviceAttach(); : meldet das Device am PC an
ProcessIO(); : der IO-Prozess für die seriellen Daten

Das ist das woran ich mich so adhoc noch erinnern kann.

Eventuell hilft dir das weiter.

@Frank M.: Es gibt Lösungen für USB 2.0 ohne Quarz, z.B. den oben 
genannten PIC24FJ128GC006. Der verwendet eine Taktregeneration - der 
interne RC wird über USB nachgeregelt. Das machen auch andere Hersteller 
so (ST, SILABS).

von Frank M. (frank_m35)


Lesenswert?

Dominic A. schrieb:
> Ja leider habe ich nicht sehr genau hin geschaut als ich das Board
> gelayoutet habe und jetzt im nachhinein einen Quarz zu montieren ist
> nicht so praktisch.
> Ich habe jetzt noch einmal ein bisschen mit den Oszillator Settings
> herumgespielt und jetzt geht gar nichts mehr. Wie hast du den die
> passenden 48MHz für das USB mit dem internen 7.37MHz Oszillator
> hinbekommen? Ich habe nun schon viele PLL Multiplier und Divider
> durchrechnet und liege meistens ziemlich weit daneben. In den meistens
> Beispielen wird ein 8MHz Quarz verwendet.

Ich weiß nicht inwieweit du es für den dsPIC übernehmen kannst aber so 
sieht bei mir die Konfiguration aus:
1
//******************************************************************************
2
// Configuration Bits
3
//******************************************************************************
4
#define PLL_96MHZ_OFF   0xFFFF
5
#define PLL_96MHZ_ON    0xF7FF
6
7
// Using the FRC (8MHz)    // NOTE: USB operation is not guaranteed
8
_CONFIG2(IESO_OFF & PLL_96MHZ_ON & PLLDIV_DIV2 & FNOSC_FRCPLL & POSCMOD_NONE & IOL1WAY_OFF) // Primary osc disabled, FRC OSC with PLL, USBPLL /2
9
_CONFIG1(JTAGEN_OFF & ICS_PGx2 & FWDTEN_OFF)        // JTAG off, watchdog timer off


Und ich sehe gerade, ich nutze USB_FULL_SPEED ohne Quarz.

von Dominic A. (neo123)


Lesenswert?

@Dingens23
Wenn ich das die Basic Demo nehme und ein Package mache sind aber auch 
alle möglichen Files irgendwie in diesem Package verstreut.

Ich habe einfach ein ziemliches Problem exakt 48MHz für das USB Modul 
hinzubekommen. Die von euch benutzens PICs haben ja immer schönen einen 
internen 8MHz Oszillator. Mit diesem ist es ja recht einfach 48MHz zu 
bekommen. Meiner jedoch hat einen 7.37 MHz Oszillator. Dieser lässt sich 
zwar ziemlich stark über das OSCTUN Register Trimmen aber nie auf einen 
schönen geraden Wert. Was haben sie sich dabei gedacht?

@Frank
Ich dachte die Register Einstellungen für den Quarz:
Also soetwas in dieser Art:
1
  PLLFBD = 38;        /* M  = 60  */
2
  CLKDIVbits.PLLPOST = 0;    /* N1 = 2  */
3
  CLKDIVbits.PLLPRE = 0;    /* N2 = 2  */
4
  OSCTUN = 0;    
5
6
  ACLKCON3 = 0x24C1;   
7
  ACLKDIV3 = 0x7;
8
        
9
  ACLKCON3bits.ENAPLL = 1;
10
  while(ACLKCON3bits.APLLCK != 1);

von Frank M. (frank_m35)


Lesenswert?

Ich habe am Quarz direkt, außer den geposteten configuration bits, 
nichts eingestellt.

Vielleicht hilft dir das weiter:
http://www.microchip.com/forums/m524417.aspx

Ansonsten hilft wohl nichts und du musst es mal mit einem externen Quarz 
probieren um wenigstens eine Fehlerquelle mal ausschließen zu können. Im 
Notfall eben direkt an die Beinchen löten wenn dein Gehäuse vom PIC noch 
nach außen liegende Beinchen hat.

von Dingens23 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

dass die Files auch im zip verstreut sind, stimmt schon. Man kann aber 
das Package entzippen (in einen Ordner) und mit dem Explorer nach allen 
*.c und *.h - files suchen. In dem Fall hat man alle nötigen Files und 
keine Überflüssigen.

Ich könnte auch ein Beispielprojekt hochladen, bin mir aber nicht 
sicher, ob man einzelne Teile aus der MAL einfach so anpassen und 
hochladen darf. Weiß hier jemand näheres?

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.