USB mit PIC 18xxxxx

Gast #573031
Lesenswert?

Hallo liebe Leute,

ich beabsichtige, einen PIC18F4455 an den USB-Bus anzuschließen um damit 
ein (intelligentes) I/O-Modul aufzubauen. Der Einfachheit halber will 
ich die RS232-Emulation über USB (CDC-Firmware von Microchip) einsetzen. 
Programmieren werde ich wohl in C mit dem C18 (notgedrungen). Die 
Schaltung ist auch schon fertig und aufgebaut, Controller mit einem 
kleinen Test-Programm und CDC-Firmware programmiert und am USB 
angeschlossen. Soweit, so gut...

Aber, es läuft nicht. Um den Fehler zu finden benötige ich Eure Hilfe, 
denn die CDC-Firmware ist nicht so ausführlich dokumentiert. Wer also 
damit schon Erfahrung gesammelt hat, den bitte ich, mir zu schreiben.

Es fängt an mit den Pull-Ups: Schaltet die Firmware die internen 
Pull-Ups des Controllers oder muss der angelötet werden? Wenn ja, dan 
müsste der an D+ für Full-Speed, oder?

Taktgenerator: benötigt die Firmware eine spezifische Takt-Quelle und 
Frequenz? Der 18F4xxx hat glaube ich ca. 2.000.000 Möglichkeiten ;-)

Im Moment sieht meine Schaltung so aus:
keine Pull-Ups (mit Pull-Up brachte keine Verbesserung)
Takt: Quartz mit 24Mhz an OSC1,OSC2, also 24MHz für CPU, Takt für USB 
(Full-Speed) über PLL: 24/6 = 4 -PLL-> 96 / 2 = 48 -> USB
Vbus speist meine Schaltung mit 5V.

Für jede Hilfe bin ich sehr dankbar.

Gruß

Christian
Gast #573039
Lesenswert?

Hallo Jupp,

also, mit anderen Worten, es tut sich gar nichts auf dem USB-Bus, aber 
der Controller scheint zu laufen, ein Test-Output an LEDs geht.

Ich habe leider auch keine ICD oder ähnliches. Ich kann also immer nur 
Programmieren, Einstecken und gucken.

Programm sieht so aus, nur Test: CDC vorausgesetzt

void UserInit(void)
{
  TRISA = 0x0F8;
  TRISB = 0;
  TRISD = 0x0FF;
  //PORTAbits.RA1
  PORTAbits.RA0 = 1;
  PORTAbits.RA1 = 0;
  PORTAbits.RA2 = 0;
}

void ProcessIO(void)
{
  if (mUSBUSARTIsTxTrfReady())
  {
    putrsUSBUSART("Hello PC");
    PORTAbits.RA1 = 1;
    PORTAbits.RA2 = 0;
  } else
  {
    PORTAbits.RA1 = 0;
    PORTAbits.RA2 = 1;
  }
}

Gruß

Christian
Gast #573169
Lesenswert?

Hallo,

gut, sprut hat auch seine eigene Sache geschrieben. Microchip lässt sich 
aber nicht sehr über den CDC aus.

Etwas bereitet mir Kopfzerbrechen: Beim Messen an der Schaltung sehe ich 
keine 3.3V an Vusb, obwohl Configuration-Bit gesetzt und nur ein 220nF 
zur Stabilisierung gegen Masse daran hängt.
Nun könnte man argumentieren, der Controller ist defekt. Dachte ich auch 
und nahm einen Ersatz vom gleichen Typ, gleiches Programm, gleiche Bits 
und trotzdem keine Spannung an Vusb. Wie geht das denn? 
Versorgungsspannung ist hingegen ok, Multimeter auch.

Gruß

Christian
Gast #573362
Lesenswert?

µF auf keine Fall, eher 470nF. Daran sollte es aber nicht liegen.

Da fällt mir aber etwas ein, dass ich beim HID-Framework auch machen 
mußte. Sei doch bitte mal so nett, und lösche (bzw. auskommentieren) in 
der Datei

     usbcfg.h

die beiden Zeilen

     #define USE_SELF_POWER_SENSE_IO
     #define USE_USB_BUS_SENSE_IO

und probiere es nochmal aus.
Gast #573395
Lesenswert?

Hallo Jupp,

das könnte eine SEHR gute Idee sein.
Denn ich habe PortA ohnehin anderweitig genutzt, also gibt es bei mir 
auch keine Sense-Leitungen.

Ich werde das nachher mal ausprobieren, nach dem "Wochen-Einkauf" in der 
Stadt.

Die Configuration-Bits (Quartz, etc...) habe ich übrigens alle nochmal 
mit dem Beispiel-Projekt von Microchip abgegelichen. Die arbeiten 
tatsächlich mit 20MHz und nicht mit 24Mhz von aussen, aber das sollte 
nicht schlimm sein, wenn am USB-Modul der richtige Takt (48MHz) ankommt?

Schöne Grüße

Christian
Gast #573434
Lesenswert?

>Die arbeiten tatsächlich mit 20MHz und nicht mit 24Mhz von aussen,
>aber das sollte nicht schlimm sein, wenn am USB-Modul der richtige
>Takt (48MHz) ankommt?

Nein, ist definitiv kein Problem. Ich hab z. B. einen 12 MHz Quarz 
benutzt, man muß halt nur die PLL anpassen, aber das hast du ja gemacht.
Gast #573515
Lesenswert?

Hallo Leute,

erstmal vielen Dank an Jupp: der Beste Tipp!
Wahrscheinlich habe ich durch Dich viele Stunden Suche gespart! Es lag 
tatsächlich an den #defines, dass keine Spannung am Vusb anlag. Nun mit 
Spannung identifiziert sich der Controller am Bus korrekt und verlangt 
nach dem Treiber. Mittels der INF von Microchip habe ich dann einen 
zusätzlichen COM-Port. Allerdings lässt der sich noch nicht öffnen. 
Definitiv muss die Hardware aber ok sein, weil der Controller sich ja 
identifiziert und daher die Kommunikation auch läuft.

Es ist (mal wieder) die böse Software ;-)

Muss man dem CDC Einstellungen für die Schnittstelle mitgeben, wie beim 
USART, etwa Baud-Rate, Parity, etc??

Gruß

Christian
Gast #573539
Lesenswert?

Hallo,

ja, ich hab den COM Port schon auf 2 gelegt, der Computer wollte mir 
zunächst 12(!) anbieten, obwohl 2 frei war.
Habe dann versucht die Verbinung mit Hyperterm aufzunehmen, aber es kam 
die Fehlermeldung, dass COM2 nicht geöffnet werden kann.

Gruß

CHristian
Gast #573969
Lesenswert?

Hallo,

also es läuft jetzt. Ursache war ein Programmierfehler meinerseits, ich 
habe nicht abgewartet, dass USB bereit ist:
if((usb_device_state < CONFIGURED_STATE)||(UCONbits.SUSPND==1)) return;

Allerdings, wer wirbt denn da mit so niedrigem Stromverbrauch?? 
Microchip??
Mit aktivem USB und im Run-Mode schluck der µC gut und gerne 40mA, bei 
4MHz Takt OSC1/OSC2 und PLL aktiv. (mit 24MHz OSC1/OSC2 ungefähr 
gleich).
Schaut man in die Specs, in die Tabelle bei USB, dann steht da 'TBD' 'To 
Be Determined', tz tz tz.

Da wirds für meine restliche Schaltung knapp (viele Optokoppler) und ich 
muss sehen was ich hier noch sparen kann.

Hat jemand ähnliche Erfahrung mit dem PIC18xxxx und hohem Stromverbrauch 
im Vollbetrieb mit USB?

Gruß

Christian
Gast #573986
Lesenswert?

Hallo Christian,

wie oben geschrieben benutze ich ja das HID-Framework und ich habe 
gerade mal den Stromverbrauch gemessen. Er beträgt 70mA bei 12 MHz 
Quarz, der Controller ist ein F4550. Außer einer LED, deren Strom ich 
schon abgezogen habe, ist nichts weiter angeschlossen.

Im Datenblatt ist auch nur der Strom für den EC-Oszillator mit 48 MHz 
angegeben, welcher bei 50 mA liegen soll. D. h. die PLL braucht 20 mA?

Oder habe ich da was übersehen? Oder ist das mal wieder typisch 
Microchip, unvollständige oder falsche Datenblätter oder gar 
fehlerhafter Controller?

MfG
Jupp
Gast #574031
Lesenswert?

Hallo,

also ich finde die ganze Clock-Schaltung noch etwas verwirrend. 
Offensichtlich habe ich wohl den CPU-Kern auch mit 48MHz vom PLL 
gespeist und habe deswegen auch keinen Unterschied im Stromverbrauch 
gesehen. Ich hatte 24MHz und 4MHz-Oszillator an OSC1/2 angelötet und 
verglichen.

Ich muss mich damit noch näher befassen.

Wie generierts Du den Takt?

Ich habe jetzt mal die Bits so gesetzt, dass eigentlich 4MHz zur CPU 
kommen und 48MHz (durch den PLL) zum USB. Allerdings läuft jetzt das 
Programm nicht mehr ordentlich.

#pragma config CPUDIV = OSC1_PLL2  //Postscaler = 1
#pragma config USBDIV = 2  //from PLL 96Mhz/2 = 48Mhz for USB-Full-Speed
#pragma config FOSC = HS  //HS: Clock from ext Osc.
#pragma config FCMEN = OFF

Gruß

Christian
Gast #574107
Lesenswert?

Hallo Leute, Jupp,

nach einigem Nachlesen des Clock-Kapitels und Ausprobieren kann man also 
folgendes sagen:
Was ich vorhatte geht nicht. Entweder PLL oder direkt Oszillator!
Wenn man also den PLL aktiv schaltet um den USB-Takt zu generieren, dann 
kann man für die CPU (speziell Primary Clock) nur noch PLL/2 bis PLL/6 
auswählen, aber nicht den außen anliegenden Oszillator - deswegen lief 
mein Programm auch nicht mehr. Ich hab das wohl zunächst falsch 
verstanden.

Momentan sieht meine Schaltung so aus, dass ich außen einen 4MHz 
Oszillator habe und den PLL einschalte, der USB bekommt 48MHz(PLL/2) und 
meine CPU 16MHz (PLL/6) um etwas Strom zu sparen. Der Stromverbrauch 
liegt damit etwa knapp unter 30mA, damit kann ich schon wieder besser 
leben.

Wenn man nun für die CPU den internen Oszillator mit geringer 
Taktfrequenz einsetzt (Internal Oscilator) kann man sicher noch ein 
wenig Strom sparen. Soweit bin ich aber noch nicht vorgedrungen.

Nachdem ich nun weiß, dass es so theoretisch geht, werde ich nun noch 
einiges damit zu tun haben, eine Firmware für mein Projekt zu schreiben 
und den Stromverbrauch der restlichen Schaltung noch ein bisschen 
einzudämmen.

Wenn jemand zum Thema "USB mit PIC" noch Anmerkungen, Tipps hat, freue 
ich mich darauf.

Schönen Gruß

Christian
Gast #574158
Lesenswert?

> ... den Stromverbrauch der restlichen Schaltung noch ein bisschen
> einzudämmen.

Da Du weiter oben "viele Optokoppler" erwähnt hattest, schau mal nach 
den ADuM Bausteinen von Analog Devices. Das sind Koppler auf 
magnetischer Basis die mit relativ wenig Strom auskommen. Ausserdem 
lassen sich sowohl Eingangs- wie auch Ausgangsseite wahlweise mit 5V 
oder 3,3V betreiben.

http://www.analog.com/UploadedFiles/Data_Sheets/ADUM1200_1201.pdf

Im SO16wide Gehäuse gibt es die Teile auch als 3 und 4-Kanal Version.
Der Typ mit integrierter Stromversorgung hat allerdings einen ziemlich 
schlechten Wirkungsgrad, ist m.E. derzeit nicht geeignet um Strom zu 
sparen.

Bezugsquelle für Privatkunden in Deutschland ist mir nicht bekannt.
Gast #574364
Lesenswert?

Hallo Dieter,

guter Tipp, ich wusste bisher gar nicht, dass es sowas gibt. Ich hatte 
bisher auf Darlington-Typen 4N32 (bzw. 4N33) gesetzt, da die eine 
relativ hohe Übertragung (ca 500%) haben.

Ich werd mir das bei Analog mal ansehen.

Danke und Gruß

Christian
Gast #575753
Lesenswert?

Hallo,

um die Vorgänge auf dem USB Bus weiter beobachten zu können, ist das 
Programm Snoopy 0.22 sehr hilfreich. Bin mir aber nicht sicher, ob das 
Programm auch in Verbindung mit dem emulierten COM Port läuft, weiß ich 
nicht.

Gruß Stampede

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren