sábado, 17 de noviembre de 2012

USB CDC 18f2550 C18

Hola a todos.

Os dejo después de algún tiempo, un proyecto donde se puede comunicar un PIC 18f2550 por USB con puerto COM Virtual (USB en modo CDC). El lenguaje utilizado es C18








Para ello basicamente he cogido el ejemplo de Suky que se ha encargado de eliminartodo lo que no sirve del propio ejemplo que Microchip proporciona  "USB Device - CDC - Basic Demo" ya que este esta creado para funcionar con distintas placas de desarrollo.

El ejemplo de Suky funciona para un PIC18f4550 y yo me he encargado de adaptarlo a un PIC18f2550 en la placa de desarrollo diseñada por Microingenia electronics.(Os dejo el Esquema porque me parece que la empresa no sigue funcionando)

Compatible con: Windows XP



Todas las modificaciones que he hecho están junto al código "//GLM". A continuación voy a explicar algunas de las modificaciones o elementos agregados más importantes.

1º- Configuración de bits de configuración (Para esta placa entrenadora en concreto)

//Entro con 8 Mhz
//Clock USB
#pragma config PLLDIV = 2 //Divido entre 2
#pragma config USBDIV = 2  //96Mhz/2 van para el USB 
//Clock CPU
#pragma config FOSC = HSPLL_HS //Cogemos 96Mhz
#pragma config CPUDIV = OSC1_PLL2 //96Mhz/2 van para el reloj

#pragma config WDT = OFF, WDTPS = 128
// #pragma config FSCM = ON
#pragma config IESO = ON
#pragma config PWRT = OFF
#pragma config BOR = ON
#pragma config MCLRE = ON //RA5
#pragma config VREGEN   = ON      //USB Voltage Regulator
// #pragma config STVR  = ON

2º- Un LED piloto que indica que esta funcionando mi programa (Esto nunca me falta =D)

Gestión de la interrupción TIMER0 (Cada 0.5s cambia el estado del LED)

void TMR0Int(void){

INTCONbits.TMR0IF=0; //Restaura el Flag del Timer Overflow

if(tmrLED++ > 8000)
{
tmrLED = 0;
if (LED_STATE == ENCENDIDO){ 
LED_STATE=0;
}
else{
LED_STATE=1;
}
}
}


3º- Configuración de Puertos

//Configura los puertos

PORTB=0; //Limpia las salidas
PORTC=0; //Limpia las salidas
LATB=0; //Limpia los latches de las salidas
//Configuración Canales A/D

ADCON1=0b00001110; //Establece AN0, resto digital
ADCON0=0b00000000; //Seleccionamos el canal AN0
ADCON2=0b10001110; // Tad= 48Mhz/64 = 1.3us
  // Tacq = 2*Tad = 2.6us (min 2.45us)
ADCON0bits.ADON = 1; //Habilita el conversor A/D

//Configura Leds

TRISBbits.TRISB2=PIN_OUTPUT; //Output - LED Check
TRISBbits.TRISB4=PIN_OUTPUT;
// Configuracion TMR0

OSCCON|= 0b01110000; //INTOSC a 8Mhz
OpenTimer0 (TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_4); // Desborda cada 0,128ms
// Habilita las interrupciones
// RCONbits.IPEN=0; //Deshabilita prioridades
// INTCONbits.PEIE=1; //Periféricos
// INTCONbits.GIE=1; //Global

4º- Activación del PIN USB SENSE (HardwareProfile.h)

#define USE_USB_BUS_SENSE_IO

5º- Mi pinMapping básico de cualquier proyecto

#define PIN_INPUT 1
#define PIN_OUTPUT 0

//Control LED//

#define ENCENDIDO 1
#define APAGADO 0

#define LEDG PORTBbits.RB2
#define LEDG_ON PORTBbits.RB2=1
#define LEDG_OFF PORTBbits.RB2=0

#define LEDR PORTBbits.RB4
#define LEDR_ON PORTBbits.RB4=1
#define LEDR_OFF PORTBbits.RB4=0

6º- Zonas comentadas y codigo no compilable

He definido zonas que no me interesaban compilar con la sintaxis
#if 0
...
...
#endif

El Mapeo de los leds en "HardwareProfile.h" también está comentado porque como ya he indicado uso mi propio mapeo.

El Resto de modificaciones no descritas, como he dicho están señaladas con el código "//GLM"

Cuando compilemos y programemos el Microcontrolador, al conectar, Windows nos tiene que mandar un maravilloso aviso de nuevo hardware encontrado.

En este punto simplemente ponemos la ruta de instalacion en la carpeta "inf" de este proyecto



2 comentarios:

  1. Gracias por el ejemplo Guillermo, no lo puedo compilar porque no encuentra './USB/usb.h' , './USB/usb_function_cdc.h' , 'Compiler.h' , 'USB\usb_device.h', 'USB\usb.h' instalé C:\microchip_solutions_v2013-02-15 pero hay varias carpetas usb no se cual elegir ni como decirle al MPLabX donde buscarlas, si me podés guiar te lo agradezco mucho Fabian

    ResponderEliminar
  2. Yo agregè todos los archivos que faltan, aun asi sale errores,...

    ResponderEliminar