Autor Tema: ayuda con el modulo Input Capture  (Leído 3139 veces)

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

Desconectado andres_64

  • PIC10
  • *
  • Mensajes: 1
ayuda con el modulo Input Capture
« en: 05 de Noviembre de 2008, 23:29:05 »
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=61

en 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){}

}
}

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ayuda con el modulo Input Capture
« Respuesta #1 en: 08 de Noviembre de 2008, 05:44:39 »
Si puedes cuelga un fichero comprimido con el código fuente completo (el .C, los .H y el .PJT) y pruebo a compilarlo yo.


 

anything