hola foro no se si este tema ya se halla tratado pero nesecito ayuda con Input Capture de los dspic ya que cuando simulo en Proteus me sale el siguiente error:
[DSPIC33LPIC1]input capture doesn't occur because ICOV bit is set.
esto aprece proqeu hay un desbordamiento del buffer interno pero no logor entender porque no me funciona bien el programa le programa en el queme base fue en el de el gran nocturno que po sierto muchas gracias por todo el materia que tienes colgado.
aqui les vala pagina de la pagian de noctruno y espero que me ayuden
http://www.micropic.es/index.php?option=com_content&task=view&id=72&Itemid=61en esta pagian noctruno lo hace con un sensor de ultrasonido peor lo mio es mucho mas sencillo solo quiero determianr la frecuencia de una senal de entra y su ciclo util.aqui les va mi programa
#include <p33FJ12GP202.h>
#include <stdio.h>
#include <timer.h>
#include <InCap.h>
#include <math.h>
#include <adc.h>
//#include <stdio.h>
//#include <uart.h>
//#include <p33FJ12GP202.h>
//#include <portb.h>
///////////////////////////////definicon///////////////////////
#define IC1 PORTBbits.RB1
#define TRIS_IC1 TRISBbits.TRISB1
unsigned int Duracion_Pulso1;
unsigned int Duracion_Pulso2;
unsigned int Int_flag;
_FOSCSEL(FNOSC_FRC);
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);
int counter; // for TRISB and PORTB declarations
void Init232(void){
RPINR18bits.U1RXR =0;
//RPINR18=0xF0;
RPOR1bits.RP2R=0x03;
U1MODE=0;
U1STA=0;
U1MODEbits.UARTEN=1; //Enable UART (implies reception)
U1BRG=129;//(((FCY/BAUDRATE) / 16) - 1); //Initialize BRG
IFS0bits.U1TXIF=0; //Clear the interrupt flag
IEC0bits.U1TXIE=0; //Disable ISR processing
U1STAbits.UTXEN=1; //Enable Transmission
}
void Send232(int envio){
while (U1STAbits.UTXBF==1){}
U1TXREG=envio;
}
int Read232(){
if (U1STAbits.URXDA==0) return(1000); // no hay dato en el buffer
return (U1RXREG);
}
void Texto(char *caracter) {//MANDA LETRAS POR PUERTO SERIE
/******************************************************/
char letra;
letra=*caracter;
while (letra!=0){
Send232(letra);
caracter++;
letra=*caracter;
}
}
void __attribute__((__interrupt__)) _IC1Interrupt(void)
{
putsUART1("fuk");
if (IC1) { // si la interrupción aparece al subir el pulso, iniciamos el Timer2
//if(Int_flag == 0)
//{
//putsUART1("fuk");
//Duracion_Pulso2=TMR2;
//Int_flag=1;
//}
TMR2=0;
}
else { // si aparece al bajar el pulso, capturamos la anchura del pulso mirando Timer2
Duracion_Pulso1=IC1BUF; // o bien, Duracion_Pulso=IC1BUF;
Int_flag = 1; // y marcamos el flag para salir de la espera
}
IFS0bits.IC1IF = 0;
}
/*
*/unsigned int MideDistancia()
{
unsigned int frecuencia;
//TRIS_IC2=0; // usamos el pin de comunicación con SRF05 poniéndolo como salida
//IC1=1; // y sacamos un pulso alto
//delay_us(10); // que dure 10 us
//IC1=0; // se termina el pulso señalizador
TRIS_IC1=1; // y ponemos el pin como entrada para "escuchar" al SRF05
Int_flag=0; // mientras el flag sea 0, estaremos esperando la captura del pulso
// configuramos la interrupción Input Capture
ConfigIntCapture1(IC_INT_PRIOR_1 & IC_INT_ON);
putsUART1("entra...");
TMR2=0;
while(BusyUART1())
{}
while (!Int_flag); // y esperamos que el flag cambie de valor
//while (Int_flag);
//Int_flag=0;
DisableIntIC1; // ya podemos desconectar la interrupción
frecuencia=40000000/(256*(Duracion_Pulso1+Duracion_Pulso2));
return (frecuencia);
}
int main (void)
{
// Configure Oscillator to operate the device at 40Mhz
// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
// Fosc= 8M*40/(2*2)=80Mhz for 8M input clock
unsigned int m;
AD1PCFGL=0x00000;
//AD2PCFGL=0xFFFF;
TRIS_IC1=1;
RPINR7bits.IC1R =0x05;
//RPINR7bits.IC1=0x1;
PLLFBD=38; // M=40
CLKDIVbits.PLLPOST=0; // N1=2
CLKDIVbits.PLLPRE=0; // N2=2
OSCTUN=0; // Tune FRC oscillator, if FRC is used
RCONbits.SWDTEN=0; /* Disable Watch Dog Timer*/
// Clock switch to incorporate PLL
__builtin_write_OSCCONH(0x03); // Initiate Clock Switch to Primary
// Oscillator with PLL (NOSC=0b011)
__builtin_write_OSCCONL(0x01); // Start clock switching
// while (OSCCONbits.COSC != 0b011); // Wait for Clock switch to occur
// while(OSCCONbits.LOCK!=1) {}; /* Wait for PLL to lock*/
//TRISBbits.TRISB1 = 1; /* RD1 como salida */
counter = 1;
PLLFBD=38; // M=40
//Configuramos el Input Capture 1 para utilizar el Timer2 e interrumpir con cada flanco
OpenCapture1(IC_IDLE_STOP & IC_TIMER2_SRC & IC_INT_1CAPTURE & IC_EVERY_EDGE);
IC1CONbits.ICOV=1;
T2CON = 0x8030; // Timer 2 On con prescaler 1:256
Init232();
putsUART1("init programa");
while(BusyUART1())
{}
while(1) // do forever
{
m=MideDistancia();
putsUART1("realizo la frecuencia");
while(BusyUART1())
{}
while(1){}
}
}