TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cucuruy en 09 de Abril de 2008, 07:01:34
-
Hola compañeros, estoy cerca de volverme lelo, no entiendo qué es lo que estoy haciendo mal.
Estoy haciendo el PFC con un PIC18F2550 y ahora he tenido la necesidad de meter mano a las interrupciones del timer0.
El código que pongo a continuación es un pequeño algoritmo para probar estas interrupciones.
Como resultado, lo que veo en mi led es que parpadea cada 1,3 segundos aproximadamente, y en teoría el tic del timer0 debería ser de 2,73ms.
¿Alguien ve algo anormal en el código?
Muchísimas gracias de antemano.
#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000) //el cristal es de 20mhz pero el reloj es de 48mhz
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, stream=PC)
#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 1 //size to allocate for the tx endpoint 1 buffer (1 byte)
#define USB_EP1_RX_SIZE 1 //size to allocate for the rx endpoint 1 buffer (1 byte)
//#define USB_CON_SENSE_PIN PIN_B2 //pin B2 detecta si USB conectado
#include <pic18_usb.h>
#include <PicModem.h> //Configuración del USB y los descriptores para este dispositivo
#include <string.h>
#include <usb.c>
#define LED1 PIN_B7
#define LED2 PIN_B6
#define LED_ON output_high
#define LED_OFF output_low
int tics=0;
int flag=0;
#int_TIMER0
RTCC_isr()
{
if(flag==0)
flag=1;
else
flag=0;
}
void main(void)
{
setup_counters(RTCC_INTERNAL,RTCC_DIV_128);
enable_interrupts(global);
enable_interrupts(INT_RTCC);
while (TRUE)
{
if(flag==1)
{
LED_ON(LED1);
}
else
{
LED_OFF(LED1);
}
}
}
-
¿ Podrías mostrar los cálculos con los que te salen 2,73ms ? (a mí no me sale eso)
Creo que el error está aquí: setup_counters(RTCC_INTERNAL,RTCC_DIV_128)
Prueba con setup_counters(RTCC_8_BIT,RTCC_DIV_128)
En los PICs18 el TMR0 por defecto es de 16bits a no ser que lo programes como 8 bits.
UN SALUDO
-
Pues seguramente me liara con el cálculo ya que he ido cambiando el reloj del sistema y el preescaler, de hecho es lo de menos, 1.3 segundos anda muy lejos de 2.73 ms o 5.46ms o lo que sea. Ahora utilizo un reloj de 24MHz y un prescaler de 256, consiguiendo un tic, creo, de 10.92ms.
No sé cual de los muchos cambios que he hecho ha sido el 'clave', pero al fin funciona, y seguramente sea lo que has comentado, ya que he modificado el "setup_conters" tal que así:
setup_counters( RTCC_INTERNAL, RTCC_DIV_256 | RTCC_8_BIT);
Muchas gracias por la respuesta, ahora me estoy peleando con la otra interrupción que manejo, la INT_RDA, que parece que no me entra en la isr.
Saludos.
Editado: Solucionado también el problema con la INT_RDA, como ahora comunico DCE-DCE, he tenido que poner un doble conmutador para cruzar las lineas Rx y Tx del RS-232.