PIC med USB ** Löst **

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
mcdanne82
EF Sponsor
Inlägg: 213
Blev medlem: 22 november 2004, 19:51:31

PIC med USB ** Löst **

Inlägg av mcdanne82 »

Hej

Tänkte att det skulle vara kul med lite USB istället för RS232 kommunikation.
Jag har Proton IDE som programmeringsprogram och hittade detta exempel.

Jag använder PIC 18F2550

http://www.protongeeks.com/index.php?op ... &Itemid=30

Bild
http://www.protongeeks.com/files/ideplu ... clarge.gif


Dock får jag det ej att fungera, windows meddelar bara att enheten inte känns igen.I hjälpfilen står det
CDC interface must work at an oscillator speed of 48MHz. While a HID interface should work at 24MHz, but will work successfully at 48MHz also. Achieving 48MHz is accomplished by using a 20MHz crystal or resonator and the use of the PICmicros divide and multiply fuse settings. See the 18F4550 datasheet for more information concerning these
http://ww1.microchip.com/downloads/en/D ... 39632c.pdf

Hur gör man för att få processorn att snurra i 48Mhz med en 20Mhz kristall? Om jag försöker aktivera PPL så klagar Proton på att det endast går med XTAL <10Mhz.

Kod snälla..


Har även inhandlat några av dessa 48Mhz Kristalloscillatorer, utan att lyckats att ens få PIC'en att leva.
http://www.elfa.se/elfa-bin/dyndok.pl?l ... _74_559_75

Bild

Har kopplat matning på 7 och 14 och sedan utgången på 8 till OSC1, pin 9 på PIC. Utan framgång. Denna kanske inte kan användas till PIC??
Senast redigerad av mcdanne82 20 juli 2006, 16:17:41, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26685
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Oscillatorn kan visst användas till PIC men jag känner inte till PIC som tuggar snabbare än 20MHz. Det stå ju tydligen att man ska mata USB-delen vid att använda den interna multiplier, alltså att man med den interna PLL fixar den rätta frekvens.

Så att koppla på en 48MHz oscillator är som att stoppa PIC'en, skaffa en oscillator eller ett kristall av lagom hastighet och testa med det.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det ska fungera med 48Mhz direkt in i EC eller ECIO mode.
Men även 20 Mhz kristall med rätt inställningar.

För övrigt är väl tabell 2-3 tydlig nog. Vad är problemet mer i detalj ?

20 Mhz -> /5 (=4Mhz) -> PLL (=96Mhz) -> /2 (=48Mhz)

Eller :

48 Mhz rakt genom (alltså förbi alla PLL och devide kretsar).
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Kolla på figur 2-1 och tabell 2-3 i databladet, tydligen rätt så komplicerat klocksystem...

I tabellen står det hur alla config-bitarna ska stå för olika infrekvenser, hur du fixar dessa i Proton kan jag tyvärr inte säga.

För 20MHz kristall ska det tydligen vara PLL div = 5, mode = HSPLL, CPUDIV = 4

Ger 48MHz till USB-delen och 24MHz till processorn.
mcdanne82
EF Sponsor
Inlägg: 213
Blev medlem: 22 november 2004, 19:51:31

Inlägg av mcdanne82 »

Nu har det löst sig med 20Mhz kristallen

Device = 18F2550
XTAL = 20

ASM
CONFIG_REQ
__CONFIG config1l, PLLDIV_5_1 & CPUDIV_1_1 & USBDIV_2_1
__config config1h, FOSC_HSPLL_HS_1
__CONFIG config2h, WDT_OFF_2 & WDTPS_128_2
__config config4l, LVP_OFF_4 & ICPRT_OFF_4 & XINST_OFF_4 & DEBUG_OFF_4
ENDASM
Dock får jag ej pic att funka med 48Mhz kristallen med separat matning. Inget speciellt man skall göra vid användning av sådan. inga kondingar ect som vanlig kristall behöver.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Nu har det löst sig med 20Mhz kristallen

Inkl USB kommunikationen ?

> Dock får jag ej pic att funka med 48Mhz kristallen

Det är ingen "kristall"...
Men fungerar det med 20 Mhz kristallen så behöver du väl inte
någon extern oscillator ?

PS: Genererar verktyget enbart Basic kod ? Lite synd i så fall...
mcdanne82
EF Sponsor
Inlägg: 213
Blev medlem: 22 november 2004, 19:51:31

Inlägg av mcdanne82 »

Jo USB kommunikationen fungerar nu bra. Dock emulerar den inger seriell port i PC utan man får koda eget prog i VB eller C med det medföljde exempelkod så det var enkelt när väl processorn snurrar.

Jo endast basic, vad jag vet eftersom det är till Proton
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK. Mot HID API'erna antar jag.
Hur generellt är det ? Är det enkelt att skicka valfri data ?
Eller måste det "se ut" som mus eller keyboard data ?
mcdanne82
EF Sponsor
Inlägg: 213
Blev medlem: 22 november 2004, 19:51:31

Inlägg av mcdanne82 »

Det är super enkelt, man anger bara vad som skall skickas i en byte array sedan tar pc programmer emot datan i HID precis som du sade.
Bifogar lite kod:

Device = 18F2550
XTAL = 20



ASM
CONFIG_REQ
__CONFIG config1l, PLLDIV_5_1 & CPUDIV_1_1 & USBDIV_2_1
__config config1h, FOSC_HSPLL_HS_1
__CONFIG config2h, WDT_OFF_2 & WDTPS_128_2
__config config4l, LVP_OFF_4 & ICPRT_OFF_4 & XINST_OFF_4 & DEBUG_OFF_4
ENDASM





' descriptor file, located in \inc\usb_18 - a copy
' is located in the same folder as this file
USB_DESCRIPTOR = "USBProjectDESC.inc"

' USB Buffer...
Symbol USBBufferSizeMax = 8
Symbol USBBufferSizeTX = 8
Symbol USBBufferSizeRX = 8
Dim USBBuffer[USBBufferSizeMax] As Byte

' some useful flags...
Dim PP0 As Byte SYSTEM ' USBPOLL status return
Symbol CARRY_FLAG = STATUS.0 ' high if microcontroller does not have control over the buffer
Symbol ATTACHED_STATE = 6 ' is USB attached

' ************************************************************
' * main program loop - remember, you must keep the USB *
' * connection alive with a call to USBPoll, USBIn or USBOut *
' * every couple of milliseconds or so *
' ************************************************************
GoSub AttachToUSB


ProgramLoop:
GoSub DoUSBIn
GoSub DoUSBOut
GoTo ProgramLoop

' ************************************************************
' * receive data from the USB bus *
' ************************************************************
DoUSBIn:
USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBInTimeOut
DoUSBInTimeOut:
USBBuffer[0]="9" ' Skicka tillbaka samma data fast med en inledande 9
Return

' ************************************************************
' * transmit data *
' ************************************************************
DoUSBOut:
USBOut 1, USBBuffer, USBBufferSizeTX, DoUSBOut
Return

' ************************************************************
' * wait for USB interface to attach *
' ************************************************************
AttachToUSB:
Repeat
USBPoll
Until PP0 = ATTACHED_STATE
Return
Den kanske inte sa så mycket med det finns en .inc fil med som sköter resten. Testprogrammet begär 8bytes från PC och skickar sedan tillbaka samma bytes men ändrar första byten till 9 för test...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK.

> ' * main program loop - remember, you must keep the USB *
> ' * connection alive with a call to USBPoll, USBIn or USBOut *
> ' * every couple of milliseconds or so *

Läggs väl lämpligen i ett timer-interrupt så man inte "glömmer bort" det
i main (eller "ProgramLoop" som det heter i ditt exempel)... :-)

> Testprogrammet begär 8 bytes från PC

"Begär" ?
Måste inte PC applikationen först ha skickat något ? Eller gör PC
applikationen något som "svar" på denna begäran ?

Hur som helst, intressant exempel !
mcdanne82
EF Sponsor
Inlägg: 213
Blev medlem: 22 november 2004, 19:51:31

Inlägg av mcdanne82 »

"Begär" ?
Omformulering

PIC'en ligger och väntar på inkommande data från PC'n fås ingen data skickar PIC tillbaka det senaste mottagna datan till PC
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK :-)
Då är jag med på banan...
Skriv svar