Forum: Mikrocontroller und Digitale Elektronik pic 18f4550 als CDC, wo stell ich das ein?


von Marco S. (sharkman)


Lesenswert?

Hi.

Ich bin grad bei mich in die USB Schnittstelle des PIC 18F4550 
einzuarbeiten. Ich habe mir das entsprechende Demopaket von der 
microchip Seite geladen.

Jetzt möchte ich das ganze als CDC innitialisieren lassen. Ich find mich 
nur in dem Wust von Dateien nicht zurecht. In welcher von den 50 Dateien 
steht drin, als was sich der PIC am Conroller (PC) anmeldet?

von Master S. (snowman)


Lesenswert?

www.sprut.de (ich weiss gerade den exakten link auch nicht, aber klicke
dort etwas rum)

von Marco S. (sharkman)


Lesenswert?

Die Seite kenne ich, allerdings hab ich das Problem, dass ich es nicht 
finde. Es steht zwar dort welche Modi es gibt, aber nicht wo ich sie 
einstellen kann. Zumindest finde ich es nicht.

von Master S. (snowman)


Lesenswert?

ok, habe jetzt selbst die seiten angeguckt. naja ist einfach eine 
nachbildung einer rs232-schnittstelle und dafür sollte es im 
installationspfad ein beispiel von Microchip haben, wenn ich's recht im 
kopf habe ;-)

von Marco S. (sharkman)


Lesenswert?

Joa.

Ich hoffe ich hab überhaupt das richtige erwischt. Das hier hatte ich 
mir runtergeladen
http://www.microchipc.com/sourcecode/index.php#pic18f4550usb

Allerdings muss ich sagen, dass ich es da nicht finde.

von Εrnst B. (ernst)


Lesenswert?

Hier:

http://www.holger-klabunde.de/usb/18f2550.htm

gibts ein "CDC-Echo"-Beispielprojekt.

Dort dann einfach den "echo"-Teil durch deinen Code ersetzen.

von Master Snwoman (Gast)


Lesenswert?

@Marco:
Microchipc ist auch nicht Microchip. ;-) letzterer ist hersteller und 
stellt viele beispielprojekte und -code zur verfügung.

von Marco S. (sharkman)


Lesenswert?

So nach nun doch etwas tieferer Recherche, bin ich schon etwas weiter. 
Ich kriege jetzt mit umgestellter Konfiguration zum laufen. Allerdngs 
habe ich die ConfigurationBits jetzt erstmal über die mplab ide 
verstellt. In welcher Datei befinden sich die Dinger denn. Ich find 
nirgendwo die #pragma befehle dazu. Allerdings sagt er mir, dass die 
irgendwo liegen sollen.

von Master S. (snowman)


Lesenswert?

die musst du selber schreiben ;-)
am besten "zu oberst" in der main-datei (oder welche es auch ist)

von Marco S. (sharkman)


Lesenswert?

Hmm, naja gut, dass mach ich ja sonst auch, dass sollte nicht das 
Problem sein. Ich dacht nur weil er gemeckert hat, dass die irgendwo 
vergraben sind und ich mich zu dumm anstelle sie in dem Dateiwust wieder 
zu finden.

von Windows User (Gast)


Lesenswert?

Wenn Du Windows als Betriebssystem verwendest, dann kannst Du den 
Explorer öffnen und den Ordner mit Deiner Firmware rechts-klicken. Es 
sollte sich dann ein Such-Formular öffnen bei dem Du nach und in Dateien 
suchen kannst. Gib in das entsprechende Feld einfach '#pragma' ein (ohne 
die Hochkommas).

Gruß Windows User

von Marco S. (sharkman)


Lesenswert?

@windows user

Naja das Problem hatten wir ja jetzt schon geklärt. Der PIC wurde 
schlichtweg mit der default Einstellung geladen, weil nichts anderes 
definiert war.

Ich weiß auch nicht, in wie weit du in der Programmierung von PIC µC 
steckst, aber es gibt etliche dieser pragma befehle, da wäre es glaube 
ich ein glückstreffer, das richtige zu treffen.

von Marco S. (sharkman)


Lesenswert?

So. Ich hab das gute Stück jetzt soweit, dass er sich im CDC Mode 
anmeldet. Soweit ist auch alles schick, allerdings find ich nicht, wo 
ich die Baudrate einstelle. Ich würde zu Testzwecken gerne über den 
Hyperterminal kommunizieren. Dieser, sagt aber immer, dass er sich nicht 
verbinden kann. Ich vermute mal, dass das an der Baudrate liegt, oder 
ist das falsch?

von Terminal User (Gast)


Lesenswert?

Das ist falsch. Ein VCP verbindet sich immer (falls die Firmware passt) 
- egal welche Baudrate. Der USB überträgt die Daten immer so schnell wie 
möglich, also unabhängig von der eingestellten Geschwindigkeit. Es würde 
ja auch keinen Sinn machen, wenn Du 2400 Baud einstellst, und sich der 
USB-Host ewig damit rumquält.

Gruß Terminal User

von Gast (Gast)


Lesenswert?

Der Snowman hat Dich ja schon auf microchip.com hingewiesen. Da suche 
mal nach MCHPFSUSB. Das ist deren USB-Stack - alles fix-und-fertig aber 
auch recht komplex.

Gruß

von Marco S. (sharkman)


Lesenswert?

Wie gesgat, ich kriege ja auch eine Verbingung. Das einzige was nicht 
klappt, ist die Kommunikation mit dem Hyperterminal. Ich krieg immer die 
Meldung "Com3 konnte nicht geöffnet werden. Überprüfen sie die 
Anschlusseinstellungen."

Das ist das Problem was ich momentan habe

von Gast (Gast)


Lesenswert?

Hmm da bin ich nun auch ratlos. Ich kann Dir nur empfehlen die 
USB-Spezifikation zu lesen oder das Problem genauer zu beschreiben.

Denn Dein Problem ist nicht der COM-Port, sondern Deine Firmware - die 
läuft nämlich nicht richtig. Der Anmeldevorgang (Enumeration) scheint ja 
noch zu klappen, da das Gerät im Geräte-Manager erscheint.

Deine Firmware bedient aber offensichtlich die Endpunkt-Buffer nicht 
richtig. Um das genau zu beurteilen, benötigt man den Programm-Code. 
Woher soll hier irgend jemand wissen, was Du da programmiert hast?

von Marco S. (sharkman)


Angehängte Dateien:

Lesenswert?

So.

Ich habe jetzt einmal das ganze Projekt gepackt.  Ich werde mich dann 
aber gleich auch selber auf die Suche bei den Endpunkten machen.

Ich hoffe, dass mir so besser geholfen werden kann.

von Marco S. (sharkman)


Lesenswert?

Was ich eben vergessen habe dazuzuschreiben, die Konfiguration der 
Endpunkte steht in der Datei usb_config.h

von Gast (Gast)


Lesenswert?

Hi,

Du solltest zuerst einmal ein Beispiel von Microchip (ohne Änderungen) 
zum Laufen bekommen. Wenn das klappt, dann kannst Du es entsprechend 
anpassen. Es wird keiner die Zeit und Lust haben, Deine Sourcen 
durchzuarbeiten - debuggen musst Du schon selber!

Wenn das mit dem USB zu kompliziert ist für Dich, dann lies Dich ein 
(usb.org) oder nimm einen FTDI.

Das heisst nicht, dass wir Dir nicht helfen wollen. Aber das geht nur 
bei 'konkreten' Fragen und nicht nach dem Motto 'helft mal, ich weiss 
nicht was ich da gerade mache'.

Gruß

von Marco S. (sharkman)


Lesenswert?

naja, ich habe im prinzip das Mircochip beispiel genommen und genau das 
bekomme ich nicht zum laufen. Und genau da liegt dann auch mein Problem. 
Ich erwarte  jetzt auch nicht, dass sich da jemand für mich durchwühlt, 
ich dachte nur, dass ich vielleicht mal einen Anstoß kriege an dem ich 
ansetzen kann.

von RalfH. (Gast)


Lesenswert?

Zuerst mal eine LED zum leuchten bringen.

Der USB hat bei der Enumeration in etwa folgenden Ablauf:

1. Reset (Funktion: USB_Reset() o.ä.)
2. Deskriptor anfordern (Funktion: USB_GetDescriptor() o.ä.)
3. Reset
4. Adressieren (Funktion: USB_SetAddress() o.ä.)
5. Deskriptoren anfordern
6. Konfiguration setzen (Funktion: USB_SetConfiguration() o.ä.)

Du kannst jetzt bei jedem Abschnitt eine LED zum leuchten bringen :) 
(deshalb die Vorübung^^). Sollte irgendwo etwas nicht aufgerufen werden, 
dann ist wahrscheinlich Dein PIC nicht richtig konfiguriert (Typ, Takt 
o.ä.).

Probier das mal aus.

Gruß RalfH

von Marco S. (sharkman)


Lesenswert?

So, ich habe mich jetzt weiter mit der Demo auseinander gesetzt. Ich 
habe jetzt auch die Stelle gefunden an der er hängen bleibt. Ich kann 
mir allerdings noch nicht erklären warum er das tut.
1
BYTE getsUSBUSART(char *buffer, BYTE len)
2
{
3
    cdc_rx_len = 0;
4
    
5
    if(!USBHandleBusy(CDCDataOutHandle))
6
    {
7
        /*
8
         * Adjust the expected number of BYTEs to equal
9
         * the actual number of BYTEs received.
10
         */
11
        if(len > USBHandleGetLength(CDCDataOutHandle))
12
            len = USBHandleGetLength(CDCDataOutHandle);
13
        
14
        /*
15
         * Copy data from dual-ram buffer to user's buffer
16
         */
17
        for(cdc_rx_len = 0; cdc_rx_len < len; cdc_rx_len++)
18
            buffer[cdc_rx_len] = cdc_data_rx[cdc_rx_len];
19
20
        /*
21
         * Prepare dual-ram buffer for next OUT transaction
22
         */
23
24
        CDCDataOutHandle = USBRxOnePacket(CDC_DATA_EP,(BYTE*)&cdc_data_rx,sizeof(cdc_data_rx));
25
26
    }//end if
27
    
28
    return cdc_rx_len;
29
    
30
}//end getsUSBUSART

diesen Abschnitt scheint er in einer Endlosschleife zu durchlaufen. er 
kommt zwar immer bis zum Ende aber nicht darüber hinaus.

Der Code-Schnipsel befindet sich in der usb_function_cdc.c

Es wäre schön, wenn da vielleicht jemand einen Tipp hat, woran es liegen 
kann.

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.