TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: andreaymaria en 05 de Mayo de 2010, 06:40:44
-
Hola a todos!!Tengo que medir el período de una señal y por lo que me he estado informando por ahí, lo más exacto es utilizando el módulo CCP en modo captura.
El problema es que todo lo que encuentro sobre el módulo CCP es en CCS y yo trabajo con el compilador C18...alguien tiene algún ejemplo donde utilice el CCP o algún sitio donde haya información??
Muchisimas gracias!Un saludo! ;-)
-
Revicen en ../MCC18/Docs/Library. Está lo necesario para que entiendas como se trabaja en C18 y más el datasheet del microcontrolador lo sacan ;-)
Saludos!
-
Pero hay algún ejemplo para que yo pueda ver como funciona más o menos???gracias!
-
Si, en donde yo te indique, muestra las funciones y un pequeño ejemplo. Solo hay que leer, leer y leer :mrgreen:
Saludos!
-
Hola a todos!!Estuve leyendo por aquí y por allá como trabajar con el ccp y las interrupciones y con la información que saqué, he escrito este código para conseguir medir mi pulso.
No me hace nada...y yo creo que el problema está en que no me entra a las interrupciones...me falta algo por configurar??tengo que llamar a la interrupción desde otro sitio para que se ejecuten...
Aquí os lo dejo...a ver si me podeis echar una mano...UN saludo!!y muchas gracias!!
#include <P18f4620.h>
#include <capture.h>
#include <timers.h>
#include <math.h>
#include <stdio.h>
#pragma config DEBUG=ON
#pragma config OSC=XT
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config PWRT=OFF
#pragma config MCLRE=ON
#pragma config CCP2MX = PORTBE
int nuevopulso=0; //Entra otro pulso
int TFB=0; //Tiempo flancos
int TFS=0;
int TF=0;
float AP; //Valor final del ancho de pulso
float APFIN; //Periodo completo
float FRECUENCIA;
int cambio=0; //Cambio de flanco de disparo
/*******************************************************************************************************
/* Interrupcion con direccion 0x18
/***************************************************************************************************** */
void InterruptServiceLow(void);
#pragma code InterruptVectorLow = 0x18
void InterruptVectorLow (void)
{
_asm
goto InterruptServiceLow //Salta a la direccion de interrupcion BAJA
_endasm
}
#pragma interruptlow InterruptServiceLow// Directiva pragma "interruptlow" para interrupcion de baja prioridad
void InterruptServiceLow(void)
{
if(cambio==0){ //Flanco de subida
TFS= ReadCapture2(); //Carga del valor del registro CCPR2 en flanco subida
LATA=0x01;
cambio=1;
OpenCapture2( C2_EVERY_FALL_EDGE &
CAPTURE_INT_ON ); //Configuración modo Captura en flanco de bajada
//Control de cambio de flanco
} else { //Flanco de Bajada
TFB= ReadCapture2(); //Carga del valor del registro CCPR2 en flanco bajada
LATA=0x00;
cambio=0;
OpenCapture2( C2_EVERY_RISE_EDGE &
CAPTURE_INT_ON ); //Configuración modo Captura en flanco de subida
//Control de cambio de flanco
if(nuevopulso==0){ //Fin de pulso...
nuevopulso=1; //pulso a medir
}
}
}
void main() {
TRISAbits.TRISA0=0;
TRISBbits.TRISB3=1;
INTCONbits.GIE=0 ;//disable_interrupts(global);
OpenCapture2( C2_EVERY_RISE_EDGE &
CAPTURE_INT_ON );
OpenTimer3( TIMER_INT_OFF &
T3_SOURCE_INT );
cambio = 0; //Control de cambio a 0
PIR2bits.CCP2IF=0;
INTCONbits.GIE=1;
while (1){
if(nuevopulso==1){ //¿Pulso nuevo?
TF=(TFB-TFS); //Ancho de pulso.
AP = TF*1.0; //Ancho de pulso en microsegundos (a 4MHz:1us)
APFIN = AP*2;
FRECUENCIA = 1/APFIN;
nuevopulso=0; //Pulso ya medido, espera nuevo
}
}
}
-
En el main hay que configurar y encender el timer, además de configurar el modulo CCP en modo captura. Habilitar las interrupciones globales y la del módulo CCP.
En la interrupción para cambiar en que momento capturar, apagas el módulo CCP, modificas los bits para seleccionar el flanco y lo enciendes nuevamente.
Saludos!
-
En el main hay que configurar y encender el timer
Lo configuro en mi código ya no??por eso he puesto:
OpenTimer3( TIMER_INT_OFF &
T3_SOURCE_INT );
Habilitar las interrupciones globales y la del módulo CCP.
Las he habilitado así no??:
INTCONbits.GIE=1;
y la del ccp con:
OpenCapture2( C2_EVERY_FALL_EDGE &
CAPTURE_INT_ON )
En la interrupción para cambiar en que momento capturar, apagas el módulo CCP, modificas los bits para seleccionar el flanco y lo enciendes nuevamente.
Y por útlimo...cuando cierro el CCP??después de leer la captura???la cierro y la vuelvo a configurar no??
Gracias!!
-
Hola!!!Encontré un programa por internet y lo he modificado para versi realiza lo que yo quiero...
El problema es que no me entra en el segundo while y no entiendo el porqué ...porque se supone que estoy recibiendo pulsos continuamente...
Alguien podría decirme algo??Muchas gracias!
#include <P18f4620.h>
#include <capture.h>
#include <timers.h>
#include <math.h>
#include <stdio.h>
#pragma config DEBUG=OFF
#pragma config OSC=XT
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config PWRT=OFF
#pragma config MCLRE=OFF
#pragma config CCP2MX = PORTBE
unsigned int initial = 0x00;
unsigned int final = 0x00;
unsigned int elapsed = 0x00;
void main() {
// Configure High-Frequency Timer3, no Interrupts, Internal clock, prescale 1 (20MHz / 4 = 0,2 us)
OpenTimer3(TIMER_INT_OFF & T3_SOURCE_INT & T3_PS_1_1 );
// Configure Capture2
OpenCapture2(C2_EVERY_RISE_EDGE & CAPTURE_INT_OFF);
TRISBbits.TRISB3 = 0x01; //set CCP2 as input
PIR2bits.CCP2IF = 0x00; // make sure flag is 0
while(!PIR2bits.CCP2IF){; //wait for first event
initial = ReadCapture2 (); //get first time stamp
PIR2bits.CCP2IF = 0x00;// make sure flag is 0
}
while(!PIR2bits.CCP2IF){; //wait for second event
final = ReadCapture2 (); //get second time stamp
}
CloseCapture2 ();
CloseTimer3 ();
elapsed = final - initial; // compute elapsed time
}