USB med PIC18F4550
USB med PIC18F4550
Tjena! Tidigare när jag kört kommunikation med datorn så har jag kört med ett FTDI-chip för att emulera en serieport, men nu tänkte jag att det är lika bra att göra det ordentligt. PIC18F4550 har stöd för USB och jag hittade en guide på youtube där de beskrev allt. Koden verkar inte vara överdrivet avancerad. Men problemet är att de använder sig av tre filer:
usbfunctions.c
usbfunctions.h
usbfunctions.lnk
Jag tolkar det som att de är utgivna av microchip men jag kan ej hitta dem på deras hemsida. Jag laddade ner "Microchip Application Libraries" och där finns en mängd saker till USB men dessa filer kan jag ej hitta. Någon som har koll på var man får tag på dem?
Här är videoguiden som jag pratar om.
https://www.youtube.com/watch?v=7FL9ZaVye_M
Mvh. Daniel
usbfunctions.c
usbfunctions.h
usbfunctions.lnk
Jag tolkar det som att de är utgivna av microchip men jag kan ej hitta dem på deras hemsida. Jag laddade ner "Microchip Application Libraries" och där finns en mängd saker till USB men dessa filer kan jag ej hitta. Någon som har koll på var man får tag på dem?
Här är videoguiden som jag pratar om.
https://www.youtube.com/watch?v=7FL9ZaVye_M
Mvh. Daniel
Re: USB med PIC18F4550
Jag har använt 45K50 med USB-anslutning.
Jag är långt hemifrån och var det ett tag sedan jag satte upp miljön så jag kanske glömt något, men tror att det såg ut något enligt nedan.
MPLAB X
C18 kompilator.
Paket med USB-funktioner från Microchip. Installerade i rooten för dina MPLAB-projekt (det här tog tid att få till)
Med USB-paketet på rätt plats behövde jag bara komplettera exempelfilen för 4550 med de configparametrar som tillkommit till 45K50 så kompilerade det fint.
Då min målsättning var produkter som bara arbetade med ansluten USB var 45K50 att föredra över 4550 främst på grund av stabil 48 MHz intern ocsillator, men även friare pinkonfigurering lockade.
Sen är ju även priset till fördel för 45K50.
När jag kommer tillbaka till maskinen jag har miljön på kan jag kanske vara till ytterligare hjälp om du inte kommit vidare då
Jag är långt hemifrån och var det ett tag sedan jag satte upp miljön så jag kanske glömt något, men tror att det såg ut något enligt nedan.
MPLAB X
C18 kompilator.
Paket med USB-funktioner från Microchip. Installerade i rooten för dina MPLAB-projekt (det här tog tid att få till)
Med USB-paketet på rätt plats behövde jag bara komplettera exempelfilen för 4550 med de configparametrar som tillkommit till 45K50 så kompilerade det fint.
Då min målsättning var produkter som bara arbetade med ansluten USB var 45K50 att föredra över 4550 främst på grund av stabil 48 MHz intern ocsillator, men även friare pinkonfigurering lockade.
Sen är ju även priset till fördel för 45K50.
När jag kommer tillbaka till maskinen jag har miljön på kan jag kanske vara till ytterligare hjälp om du inte kommit vidare då

Re: USB med PIC18F4550
Då microchips stack har lite tråkig licens (man får inte ge ut en open source lösning baserad på MLA) hittade jag en annan open source usb stack till PIC18:
http://dangerousprototypes.com/docs/Ope ... _echo_demo
Är det någon som har använt denna? Den verkar vara väldigt trevlig i sitt upplägg. Jag har laddat ned C18 kompilatorn för att kunna kompilera den men jag får ett error hela tiden. Det skumma är att felet alltid är sista funktionsanropet i main, så om jag tex tar bort "putc_cdc(RecvdByte+1);" så får jag iställer error på "usb_register_sof_handler(CDCFlushOnTimeout);"
Någon som har en aning?
Felmeddelandet:
Min main-kod
http://dangerousprototypes.com/docs/Ope ... _echo_demo
Är det någon som har använt denna? Den verkar vara väldigt trevlig i sitt upplägg. Jag har laddat ned C18 kompilatorn för att kunna kompilera den men jag får ett error hela tiden. Det skumma är att felet alltid är sista funktionsanropet i main, så om jag tex tar bort "putc_cdc(RecvdByte+1);" så får jag iställer error på "usb_register_sof_handler(CDCFlushOnTimeout);"
Någon som har en aning?
Felmeddelandet:
Kod: Markera allt
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/Daniel Andersson/Desktop/Open Source USB/usb_c18_open_source.X'
make -f nbproject/Makefile-default.mk dist/default/production/usb_c18_open_source.X.production.hex
make[2]: Entering directory 'C:/Users/Daniel Andersson/Desktop/Open Source USB/usb_c18_open_source.X'
"C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe" -p18F4550 -ms -oa- -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h -fo build/default/production/main.o main.c
"C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mplink.exe" "18f4550_usb.lkr" -p18f4550 -w -m"dist/default/production/usb_c18_open_source.X.production.map" -z__MPLAB_BUILD=1 -u_CRUNTIME -l "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\lib -o dist/default/production/usb_c18_open_source.X.production.cof build/default/production/main.o
MPLINK 5.00, LINKER
Device Database Version 1.17
Copyright (c) 1998-2013 Microchip Technology Inc.
make[2]: *** [dist/default/production/usb_c18_open_source.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
Error - could not find definition of symbol 'putc_cdc' in file './build/default/production/main.o'.
Errors : 1
nbproject/Makefile-default.mk:119: recipe for target 'dist/default/production/usb_c18_open_source.X.production.hex' failed
make[2]: Leaving directory 'C:/Users/Daniel Andersson/Desktop/Open Source USB/usb_c18_open_source.X'
nbproject/Makefile-default.mk:78: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/Users/Daniel Andersson/Desktop/Open Source USB/usb_c18_open_source.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
BUILD FAILED (exit value 2, total time: 905ms)
Kod: Markera allt
// Open source PIC USB stack echo demo
// USB stack by JTR and Honken
// CC-BY
//
// USB driver files should be in '..\dp_usb\'
// Enter a USB VID and PID in prj_usb_config.h
//USB stack
#include "..\dp_usb\usb_stack_globals.h" // USB stack only defines Not function related.
#include "descriptors.h" // JTR Only included in main.c
#include "configwords.h" // JTR only included in main.c
// PIC18F Move reset vectors for bootloader compatibility
#define REMAPPED_RESET_VECTOR_ADDRESS 0x800
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x808
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x818
void SetupBoard(void);
void InterruptHandlerHigh();
void InterruptHandlerLow();
void USBSuspend(void);
#pragma udata
extern BYTE usb_device_state;
#pragma code
void main(void)
{
BYTE RecvdByte;
initCDC(); // setup the CDC state machine
SetupBoard(); //setup the hardware, customize for your hardware
usb_init(cdc_device_descriptor, cdc_config_descriptor, cdc_str_descs, USB_NUM_STRINGS); // initialize USB. TODO: Remove magic with macro
usb_start(); //start the USB peripheral
// PIC18 INTERRUPTS
// It is the users resposibility to set up high, low or legacy mode
// interrupt operation. The following macros for high and low interrupt
// setup have been removed:
//#define EnableUsbHighPriInterrupt() do { RCONbits.IPEN = 1; IPR2bits.USBIP = 1; INTCONbits.GIEH = 1;} while(0) // JTR new
//#define EnableUsbLowPriInterrupt() do { RCONbits.IPEN = 1; IPR2bits.USBIP = 0; INTCONbits.GIEL = 1;} while(0) // JTR new
// By default, the interrupt mode will be LEGACY (ISR Vector 0x08)
// (Same as high priority vector wise but the operation (latency) is
// not the same. Consult the data sheet for details.)
// If a priority mode is enabled then this affects ALL other interrupt
// sources therefore it does not belong to the usb stack to be
// doing this. It is a global, user application choice.
EnableUsbPerifInterrupts(USB_TRN + USB_SOF + USB_UERR + USB_URST);
INTCONbits.PEIE = 1;
INTCONbits.GIE = 1;
EnableUsbGlobalInterrupt(); // Only enables global USB interrupt. Chip interrupts must be enabled by the user (PIC18)
// Wait for USB to connect
do {
} while (usb_device_state < CONFIGURED_STATE);
usb_register_sof_handler(CDCFlushOnTimeout); // Register our CDC timeout handler after device configured
// Main echo loop
do {
// If USB_INTERRUPT is not defined each loop should have at least one additional call to the usb handler to allow for control transfers.
// Receive and send method 1
// The CDC module will call usb_handler each time a BULK CDC packet is sent or received.
// If there is a byte ready will return with the number of bytes available and received byte in RecvdByte
if (poll_getc_cdc(&RecvdByte))
putc_cdc(RecvdByte+1); //
// Receive and send method 2
// Same as poll_getc_cdc except that byte is NOT removed from queue.
// This function will wait for a byte and return and remove it from the queue when it arrives.
// if (peek_getc_cdc(&RecvdByte)) {
// RecvdByte = getc_cdc();
// putc_cdc(RecvdByte+1);
// }
// Receive and send method 3
// If there is a byte ready will return with the number of bytes available and received byte in RecvdByte
// use CDC_Flush_In_Now(); when it has to be sent immediately and not wait for a timeout condition.
// if (poll_getc_cdc(&RecvdByte)) {
// putc_cdc(RecvdByte+1); //
// CDC_Flush_In_Now();
// }
} while (1);
} //end main
//board hardware setup
//add your hardware here
void SetupBoard(void) {
//disable some defaults
ADCON1 |= 0b1111; //all pins digital
CVRCON = 0b00000000;
}
// USB suspend not yet enabled
void USBSuspend(void) {}
// Interrupt remap chain
//
//This function directs the interrupt to
// the proper function depending on the mode
// set in the mode variable.
//USB stack on low priority interrupts,
#pragma interruptlow InterruptHandlerLow nosave= PROD, PCLATH, PCLATU, TBLPTR, TBLPTRU, TABLAT, section (".tmpdata"), section("MATH_DATA")
void InterruptHandlerLow(void) {
usb_handler();
ClearGlobalUsbInterruptFlag();
}
#pragma interrupt InterruptHandlerHigh nosave= PROD, PCLATH, PCLATU, TBLPTR, TBLPTRU, TABLAT, section (".tmpdata"), section("MATH_DATA")
void InterruptHandlerHigh(void) { //Also legacy mode interrupt.
usb_handler();
ClearGlobalUsbInterruptFlag();
}
//these statements remap the vector to our function
//When the interrupt fires the PIC checks here for directions
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
void Remapped_High_ISR(void) {
_asm goto InterruptHandlerHigh _endasm
}
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
void Remapped_Low_ISR(void) {
_asm goto InterruptHandlerLow _endasm
}
//relocate the reset vector
extern void _startup(void);
#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
void _reset(void) {
_asm goto _startup _endasm
}
//set the initial vectors so this works without the bootloader too.
#pragma code HIGH_INTERRUPT_VECTOR = 0x08
void High_ISR(void) {
_asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm
}
#pragma code LOW_INTERRUPT_VECTOR = 0x18
void Low_ISR(void) {
_asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm
}
#pragma code
Re: USB med PIC18F4550
Det löste sig! Jag hade fått med header filen i projektet där funktionerna definierades men inte c-filen. Så nu kompilerar det som det ska, när jag kommer hem skall jag bränna ner det på PICen och se om det fungerar!
Re: USB med PIC18F4550
Nu fungerar det utmärkt! När jag kopplar in den till datorn kommer den upp som en comport. Har inte satt mig in så mycket i koden än men jag trodde att baudraten var specificerad i PIC'en till 115200 BAUD (enligt följande kod) men det verkar som att det är autodetect.. Har testat att köra både på 57600 och 230400 BAUD och båda de fungerar också (med Termite 3.1).
Nu har jag något att leka med i all fall, blir nog en hel del läsande av koden innan man förstår sig på hur stacken är uppbyggd.
Nu har jag något att leka med i all fall, blir nog en hel del läsande av koden innan man förstår sig på hur stacken är uppbyggd.
Kod: Markera allt
void initCDC(void) {
// JTR The function usb_init() is now called from main.c prior to anything else belonging to the CDC CLASS
// If we have multiple functions we want the USB initialization to be in only one consistant place.
// The sort of things we would do in InitCDC would be to setup I/O pins and the HARDWARE UART so it
// is not transmitting junk between a RESET and the device being enumerated. Hardware CTS/RTS
// would also be setup here if being used.
linecodeing.dwDTERate = 115200;
linecodeing.bCharFormat = one;
linecodeing.bParityType = none;
linecodeing.bDataBits = 8;
cls.DTR = 0;
cls.RTS = 0;
usb_register_class_setup_handler(cdc_setup);
}
Re: USB med PIC18F4550
Hm, när man kör så här så finns det ju ingen seriell del där en
baud rate över huvudtaget spelar någon roll! Jag tror att oavsett
vad du ställer in så överförs det i alla fall med samma "fart" över USB...
baud rate över huvudtaget spelar någon roll! Jag tror att oavsett
vad du ställer in så överförs det i alla fall med samma "fart" över USB...
Re: USB med PIC18F4550
Det har du nog helt rätt i. Utan att ha hunnit kolla vidare på koden så kan det nog vara så att mjukvaran är skriven för att vidarebefordra datan via USART-modulen på PIC;en så att den kan användas som en USB-Serial converter med TTL nivåer.