Hola amigos!!Estoy realizando mi proyecto y trabajo con el PIC18f4620.
Utilizo MPlab con el compilador C18.
He encontrado mucha información en CCS pero en C18 no he encontrado lo que necesito...a ver si alguno de vosotros puede ayudarme...
Necesito medir con el PIC el período, o la frecuencia, lo mismo me da, de una señal cuadrada.
He leido que puedo utilizar la interrupción externa por flanco en RB0, con la cual detectaría que me ha entrado un flanco de subida.
A la vez la debo combinarlo con un timer, que calcule cuanto tiempo ha pasado desde que llegó mi flanco de subida hasta el próximo que me llegue...
Aquí está mi problema...cómo configuro el timer en c18??existe alguna sentencia que me capture directamente el dato temporal??hay una equivalencia de "get_timer" de ccs en c18???get_timer es utilizado en el código que copio a continuación.
Este es el código que he encontrado en CCS...a ver si alguien tuviera algo parecido en C18 o me pudiera dar algunas indicaciones..muchas gracias!un saludo!
PD: yo no necesito la tx por R232 que utilizan en est código..gracias!
Utilizo MPlab con el compilador C18.
He encontrado mucha información en CCS pero en C18 no he encontrado lo que necesito...a ver si alguno de vosotros puede ayudarme...
Necesito medir con el PIC el período, o la frecuencia, lo mismo me da, de una señal cuadrada.
He leido que puedo utilizar la interrupción externa por flanco en RB0, con la cual detectaría que me ha entrado un flanco de subida.
A la vez la debo combinarlo con un timer, que calcule cuanto tiempo ha pasado desde que llegó mi flanco de subida hasta el próximo que me llegue...
Aquí está mi problema...cómo configuro el timer en c18??existe alguna sentencia que me capture directamente el dato temporal??hay una equivalencia de "get_timer" de ccs en c18???get_timer es utilizado en el código que copio a continuación.
Este es el código que he encontrado en CCS...a ver si alguien tuviera algo parecido en C18 o me pudiera dar algunas indicaciones..muchas gracias!un saludo!
PHP:
#include <18f4550.h>
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN, NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
////////////////////////////////////////////////////////////////////////////////////
//
// Defines y Constantes
//
////////////////////////////////////////////////////////////////////////////////////
#define LED PIN_E0 // Defino el Pin del Led
#define FLASH Output_Toggle(LED) // Defino la funcion Flash de monitor
float const uSxTick = 0.2; // Microsegundos por Tick de TMR1 a 20 Mhz
////////////////////////////////////////////////////////////////////////////////////
//
// Variables en RAM
//
////////////////////////////////////////////////////////////////////////////////////
char cRec=0x00; // Último caracter recibido via serie
char Command=0x00; // Comando a procesar
int8 numFlancoQueLlega=0; // Número de Flanco que llega
int1 flagToggleFlanco=0; // Flag para cambiar de flanco
int16 t1=0x00,t2=0x00,t3=0x00; // Variables para guardar estados de ...
int16 tth=0x00,ttl=0x00,tt=0x00; // Timers y pulsos.
float sth=0.0,stl=0.0,st=0.0,f=0.00; // Para hacer las restas oportunas en uS
int1 flagHayDatos=0; // Flag para indicar que ya hay datos de ..
// dos flancos (de subida y bajada)
int1 flagHayTransmitir=0; // Flag para indicar que hay datos para ...
// Transmitir al PC.
////////////////////////////////////////////////////////////////////////////////////
//
// Interrupción por Recepción Serie RS232
//
////////////////////////////////////////////////////////////////////////////////////
#int_rda
void handle_rda_int(){
if(kbhit()){ // Si hay algo pdte de recibir ...
cRec=getc(); // lo recibo sobre cRec ...
if(cRec!=0x00){ // Si es distinto de \0 ...
Command=ToUpper(cRec); // cargo cRec sobre Command para procesarlo
} // pasándolo a Mayúsculas para no confundir.
}
}
////////////////////////////////////////////////////////////////////////////////////
//
// Interrupción por Externa por Cambio de Flanco en RB0
//
////////////////////////////////////////////////////////////////////////////////////
#int_ext
void handle_ext_int(){
++numFlancoQueLlega; // Cuento flanco que nos llega
if(flagToggleFlanco==0){ // He recibido Flanco de Subida
if(numFlancoQueLlega==1){
set_timer1(0); // Reinicio TMR1
t1=[COLOR="Red"]get_timer1[/COLOR](); // Guardo en t1 el valor de TMR1 al primer Flanco de Subida
}
if(numFlancoQueLlega==3){
t3=get_timer1(); // Guardo en t1 el valor de TMR1 al primer Flanco de Subida
if(flagHayDatos==0){ // Si los datos anteriores han sido procesados ...
flagHayDatos=1; // Indico que ya hay nuevos datos de flancos para calcular
}
}
ext_int_edge(0,H_TO_L); // Configuro para capturar siguiente flanco de Bajada
flagToggleFlanco=1; // Indico que el siguiente flanco será de Bajada
} else { // He recibido Flanco de Bajada
t2=get_timer1(); // Guardo en t2 el valor de TMR1 al Flanco de Bajada
ext_int_edge(0,L_TO_H); // Configuro para capturar siguiente flanco de subida
flagToggleFlanco=0; // Indico que el siguiente flanco será de Subida
}
FLASH; // Reproduzco la entrada mediante un LEd en E0;
if(numFlancoQueLlega==3){
numFlancoQueLlega=0;
}
}
void main() {
////////////////////////////////////////// INICIALIZACIONES GENERALES
delay_ms(333); // Espero a que todo se estabilice e ...
disable_interrupts(global); // Inicializo el Micro y ...
disable_interrupts(int_timer1); // deshabilitando todo lo no necesario ...
disable_interrupts(int_rda);
disable_interrupts(int_ext);
disable_interrupts(int_ext1);
disable_interrupts(int_ext2);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_0(RTCC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(FALSE);
delay_ms(333);
/////////////////////////////////////////// INICIALIZACIONES PERTINENTES A LA APLICACION
set_tris_c(0b10000000); // Habilito como entrada RC7 para canal RS232
ext_int_edge(0,L_TO_H); // Configuro captura de 1er flanco de subida
flagToggleFlanco = 0; // inicializo el Flag para cambiar de flanco
enable_interrupts(int_rda); // Habilito las interrupciones necesarias
enable_interrupts(int_ext);
enable_interrupts(global);
printf("\r\nMidiendo un pulso : Periodo\r\n");
printf("By Redpic para Foro TODOPIC\r\n\n");
do {
if(flagHayDatos==1){ // Detecto que ya hay datos de flancos ...
if((t3>t2)&&(t2>t1)){ // Compruebo que estoy en la misma vuelta de TMR1
tth = t2 - t1; // Calculo en Tick's de TMR1 el tiempo en Alto
ttl = t3 - t2; // Calculo en Tick's de TMR1 el tiempo en Bajo
tt = tth + ttl; // Calculo en Tick's de TMR1 el Periodo del Pulso
sth = uSxTick * tth; // Calculo en uS el tiempo.
stl = uSxTick * ttl; // Calculo en uS el tiempo.
st = uSxTick * tt; // Calculo en uS el tiempo.
f = 1 / (st / 1000000); // Calculo la Frecuencia
flagHayTransmitir=1; // Indico que tengo nuevo valor para transmitir
}
flagHayDatos=0; // Indico que ya han sido procesados los datos.
}
if(Command!=0x00){ // Si he recibido un comando vía Serie ...
if(Command=='T'){ // Si el comando es 'T' (Transmite) ...
if(flagHayTransmitir==1){ // Si hay algo pendiente de transmitir ...
printf("Ticks ....... H %4Lu + L %4Lu = %4Lu\r\n",tth,ttl,tt);
printf("uSegundos ... H %3.1f + L %3.1f = %3.1f F = %4.2f Hz\r\n\n",sth,stl,st,f);
flagHayTransmitir=0; // Indico que ya he transmitido lo pendiente.
}
}
Command=0x00; // Indico que ya he procesado el comando.
}
} while (TRUE);
}
PD: yo no necesito la tx por R232 que utilizan en est código..gracias!
Última edición por un moderador: