Hola, buenas tardes.
Bueno vamos de lleno al caso: Tengo un pic 18f4550, con el cual ya he hecho varias cosas, pero ahora debo establecer un PWM fijo, los calculos ya los tengo hechos, y en el Proteus funciona perfecto... Pero que pasa, lo flasheo al pic y no hace nada...
Ademas, tengo un Timer0 con interrupcion habilitada, y en la interrupcion yo hago un pulso y nada mas... Y tampoco pasa eso en la vida real, pero en el proteus si...
El codigo que uso lo hice yo, pero esta basado en el Framework del USB LibUSB de la libreria de Microchip... (todavia no use las funciones usb).
Aqui tengo esto en el main.c (es donde se inicia todo)
void UserInit(void)
{
LATA = LATB = LATD = LATE = 0x00;
TRISA = TRISB = TRISC = TRISD = TRISE = 0xFF;
INTCONbits.PEIE = 1; // Habilitamos interrupcion de perifericos.-
INTCONbits.GIE = 1; // Habilitamos interrupcion Global.
RCONbits.IPEN = 1;
INTCON2bits.TMR0IP = 1;
INTCONbits.TMR0IF = 0;
tlc5940_init();
}
y en la funcion
tlc5940_init tengo:
void tlc5940_init(void)
{
DRIVER_TLC5940_TRIS_PWMPIN = 0;
DRIVER_TLC5940_TRIS_BLANK = 0;
OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
// PWM period =[(TMR2) + 1] x 4 x TOSC x TMR2 prescaler
// 375 kHz = 1/((31 + 1) x 4 x Tosc x TMR2)
// 750 kHz = 1/((15 + 1) x 4 x Tosc x TMR2)
// PWM Duty Cycle = (CCPRXL:CCPXCON<5:4>) • TOSC • (TMR2 Prescale Value)
// (1/375kHz)/2 = (17) x Tosc x TMR2
OpenPWM1(0x0F); // 15
SetDCPWM1(0x20); // 17
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_4);
WriteTimer0(0x8000); // 32768
}
Donde
DRIVER_TLC5940_TRIS_PWMPIN y
DRIVER_TLC5940_TRIS_BLANK estan declarados como:
#define DRIVER_TLC5940_TRIS_PWMPIN TRISCbits.TRISC2
#define DRIVER_TLC5940_TRIS_BLANK TRISAbits.TRISA3
Bueno ahi ven que seteo el PWM1, y el Timer0... En el manejador de interrupciones tengo:
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()
{
//Check which interrupt flag caused the interrupt.
//Service the interrupt
//Clear the interrupt flag
//Etc.
#if defined(USB_INTERRUPT)
USBDeviceTasks();
#endif
if (INTCONbits.TMR0IF) {
DRIVER_TLC5940_BLANK = 1;
DRIVER_TLC5940_BLANK = 0;
WriteTimer0(0x8000);
INTCONbits.TMR0IF = 0;
}
}
Donde DRIVER_TLC5940_BLANK esta definido como:
#define DRIVER_TLC5940_BLANK LATAbits.LATA3
.
Lo que me extraña es que como antes decia, en el Proteus funciona de maravilla, y en la vida real no...
Que puede ser???
Muchas gracias de antemano