Hola gente del foro. Tengo una duda sobre el uso del modulo CCP2. Supuestamente al usar este modulo teniendo un tren de pulsos entrando por RB3, lo que ocurrira en cada flanco de subida es que se entrara a una rutina de interrupcion y se cargara automaticamente el registro de 16 bits de este comparador con el valor del timer 1, luego configuro el modulo para que vuelva a entrar a la rutina de interrupcion en el flanco de bajada y que me capture un nuevo valor. Hago esto para medir el ancho de los pulsos. La instruccion que se usa en estos casos es CCP_2, la cual luego yo cargo en una variable creada por mi. Tengo que comentar que mi programa es casi una copia fiel del ejemplo utilizado por RedPic o RedRaven. Ahora, mi duda era saber cual es en realidad la ventaja de utilizar esta funcion cuando usando el get_timer1() hago lo mismo. Es decir probablemente el pic al usar CCP_2 automaticamente cargue el valor del timer1 en un registro (si no me equivoco CCPR2), pero luego yo tengo que cargar lo que hay en CCPR2 en mi variable; que es lo mismo que cargar en mi variable directamente el valor que esta en el timer1 en ese momento. Ahora, supuestamente estos 2 metodos deberian entregarme los mismos resultados, pero no es asi. No se si yo me estoy olvidando de hacer algo o que es lo que pasa. A continuacion copiare mi programa para que lo puedan ver:
/***********************************************************************************/
/* Dispositivo: PIC18f4620 */
/* Autor: Piero Michelle Gavidia Panesi */
/***********************************************************************************/
#include "18F4620.h"
#include <stdlib.h>
#fuses INTRC,NOWDT,NOMCLR,PUT,BROWNOUT,PROTECT,CCP2B3
#use delay (clock=4000000,restart_wdt)
#use rs232(baud=9600,bits=8,parity=N,Stop=1,xmit=PIN_C6,rcv=PIN_C7,restart_wdt)
////////////////////////////////////////////////////////
// VARIABLES //
////////////////////////////////////////////////////////
int1 Cambio_Flanco=0;
int1 Hay_Datos=0;
int16 T1a,T2a,T1b,T2b;
////////////////////////////////////////////////////////
// FUNCIONES //
////////////////////////////////////////////////////////
void config_puertos(void)
{
set_tris_D(0x00);
set_tris_C(0xFB); // RC2 como salida
port_b_pullups(TRUE);
set_tris_B(0x1F); // Puerto B - Entradas
}
//////////////////////////////////////////////////////////////////
// MAIN //
//////////////////////////////////////////////////////////////////
void main()
{
config_puertos();
disable_interrupts(GLOBAL);
//setup_timer_1(T1_INTERNAL);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // inicializo el Flag para cambiar de flanco
setup_timer_3(T3_DISABLED);
setup_ccp2(CCP_CAPTURE_FE); // Configuro captura de 1er flanco de subida
enable_interrupts(int_ccp2);
enable_interrupts(GLOBAL);
Cambio_Flanco = 0;
set_timer1(0); // Reinicio TMR1
while(1)
{
if(Hay_Datos==1) // Detecto que ya hay datos de flancos ...
{
printf("T1a = %Lu uS T2a = %Lu uS T1b = %Lu uS T2b = %Lu uS \r\n\n",T1a,T2a,T1b,T2b);
Hay_Datos=0;
}
}
}
/*****************************************************************************
********************** RUTINA DE INTERRUPCION *******************************
*****************************************************************************/
#int_ccp2
void handle_ccp2_int()
{
if(Cambio_Flanco==0) // He recibido Flanco de Subida
{
T1a=CCP_2;
T2a=get_timer1();
setup_ccp2(CCP_CAPTURE_RE); // Configuro para capturar siguiente flanco de Bajada
Cambio_Flanco=1; // Indico que el siguiente flanco será de Bajada
}
else // He recibido Flanco de Bajada
{
T1b=CCP_2;
T2b=get_timer1(); // Guardo en T el valor de TMR1 al Flanco de Bajada
setup_ccp2(CCP_CAPTURE_FE); // Configuro para capturar siguiente flanco de subida
Cambio_Flanco=0; // Indico que el siguiente flanco será de Subida
Hay_Datos=1;
set_timer1(0); // Reinicio TMR1
}
}
Y los resultados que obtengo por el hiperterminal (en realidad el docklight que es similar) es lo siguiente:
T1a = 5 uS T2a = 87 uS T1b = 111 uS T2b = 186 uS <CR><LF>
Como ven T1a y T2a en vez de tener los mismos valores (o al menos con un par de uSegs de diferencia), tienen valores muy distintos, con 82uS de diferencia habiendose ejecutado la instruccion una a continuacion de la otra. Lo mismo pasa con las variables T1b y T2b que cargo en el flanco de bajada. Ojo que me he adentrado en el codigo en ensamblador y no hay muchas instrucciones adicionales; digamos que en el caso de T1a directamente esta variable es cargada con lo que hay en CCPR2 y la variable T2a es cargada con lo que hay en TMR1.
Que esta ocurriendo?? Alguien me podria ayudar? Lo agradeceria mucho.
Saludos
Piero