Autor Tema: Módulo CCP en modo Captura con compilador C18  (Leído 6301 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado andreaymaria

  • PIC10
  • *
  • Mensajes: 45
Módulo CCP en modo Captura con compilador C18
« 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! ;-)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Módulo CCP en modo Captura con compilador C18
« Respuesta #1 en: 05 de Mayo de 2010, 12:07:13 »
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!
No contesto mensajes privados, las consultas en el foro

Desconectado andreaymaria

  • PIC10
  • *
  • Mensajes: 45
Re: Módulo CCP en modo Captura con compilador C18
« Respuesta #2 en: 06 de Mayo de 2010, 04:58:05 »
Pero hay algún ejemplo para que yo pueda ver como funciona más o menos???gracias!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Módulo CCP en modo Captura con compilador C18
« Respuesta #3 en: 06 de Mayo de 2010, 10:48:41 »
Si, en donde yo te indique, muestra las funciones y un pequeño ejemplo. Solo hay que leer, leer y leer  :mrgreen:



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado andreaymaria

  • PIC10
  • *
  • Mensajes: 45
Re: Módulo CCP en modo Captura con compilador C18
« Respuesta #4 en: 17 de Mayo de 2010, 07:43:29 »
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
}
}
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Módulo CCP en modo Captura con compilador C18
« Respuesta #5 en: 17 de Mayo de 2010, 11:54:09 »
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!
No contesto mensajes privados, las consultas en el foro

Desconectado andreaymaria

  • PIC10
  • *
  • Mensajes: 45
Re: Módulo CCP en modo Captura con compilador C18
« Respuesta #6 en: 17 de Mayo de 2010, 18:09:22 »
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!!

Desconectado andreaymaria

  • PIC10
  • *
  • Mensajes: 45
Re: Módulo CCP en modo Captura con compilador C18
« Respuesta #7 en: 03 de Junio de 2010, 06:37:43 »
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

}


 

anything