#include <p33FJ64GP802.h>
#include "D:\Tesis\DsPIC\Funciones ToF\Funciones general\funciones.h"
//CONFIGURATION BITS
_FBS( BWRP_WRPROTECT_OFF & BSS_NO_FLASH & RBS_NO_RAM )
_FSS( RSS_NO_RAM & SSS_NO_FLASH & SWRP_WRPROTECT_OFF )
_FGS( GSS_OFF & GCP_OFF & GWRP_OFF )
_FOSCSEL(FNOSC_PRIPLL & IESO_ON) // Primary oscillator (XT, HS, EC) w/ PLL, Two-speed Oscillator Startup : Enabled
_FOSC(FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT ) // Clock switching and clock monitor:Disabled & Single configuration for remappable I/O:Disabled & OSC2 is clock O/P & XT oscillator
_FWDT( FWDTEN_OFF & WINDIS_OFF )
_FPOR( ALTI2C_OFF & FPWRT_PWR128 )
_FICD( JTAGEN_OFF & ICS_PGD1 )
//_FICD( BKBUG_ON & COE_ON & JTAGEN_OFF & ICS_PGD1 )
//--------------------------------------DEFINICION DE CONSTANTES-------------------------------------------------------------------
#define MUESTRAS 1000 //total de muestras que se recogen en un tiempo de 206,1855us, su frecuencia es de 4850.
#define MUESTRAS_ZERO 64 //Muestras que se toman para el nivel zero.
//----------------------------------------------------------------------------------------------------------------------------------
/*Listado de funciones para prueba en baliza*/
extern void UART_inic(void);
extern void audio_4850(int PULSOS); //El valor de pulsos indica los pulsos que van a conformar el tren de senales.
extern void TIMER3_inic(void); //Se utiliza el timer3 para conteo de tiempo utilizado para para el ADC.
extern void ADC_FS_29k_inic(void);
//unsigned int signal[6] __attribute__(( space(xmemory),aligned(32) ));
//-------------------------------------------------------------------------------------------------------------------------------
/*Espacio para las variables*/
int accion = 1,zero, control = 1, picos=0;
int toggle=0,inc=0;
unsigned int tiempo1 =0; //Para contabilizar el tiempo que dura el proceso.
char Buf1[4];
unsigned int max[3]={1,1,1}, posicion[3]={2,2,2}, pos_gen=64, valor_ant[2]={0,0},resultado, tiempo=0;
unsigned int vector[MUESTRAS];
__extension__ typedef struct {
union {
struct {
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
unsigned bit8:1;
unsigned bit9:1;
unsigned bit10:1;
unsigned bit11:1;
unsigned bit12:1;
unsigned bit13:1;
unsigned bit14:1;
unsigned bit15:1;
};
struct {
unsigned char byte0;
unsigned char byte1;
};
struct {
unsigned int word;
};
};
} My_Word;
My_Word dato,contador;
//---------------------------------- Funciones de interupcion ---------------------------------------------------------------------------------------
void __attribute__((__interrupt__, shadow, no_auto_psv)) _T3Interrupt( void )
{
IFS0bits.T3IF = 0;
contador.word++;
}
/* This is UART1 transmit ISR */
void __attribute__((__interrupt__, no_auto_psv)) _U2TXInterrupt(void)
{
IFS1bits.U2TXIF = 0;
}
/* This is UART1 receive ISR */
void __attribute__((__interrupt__, no_auto_psv)) _U2RXInterrupt(void)
{
IFS1bits.U2RXIF = 0;
}
//-------------------------------------ISR del DAC//////
void __attribute__((interrupt, no_auto_psv)) _DAC1RInterrupt(void)
{
IFS4bits.DAC1RIF = 0; // Clear Right Channel Interrupt Flag
}
//---------------------------------------------------------------------------------------------------------------------------------------------------
//-------------------------Funciones locales---------------------------------------------------------------------------------------------------------
int zero_RMS(unsigned int *ptr_Valor) //Funcion para hallar la referencia de cero, el valor promedio de los valores positivos. En esta tabla el 0 es 492
{ //Calculamos el valor promedio por encima y por debajo del ruido con los primeros 270 datos.
int i; //tamaño es de 16 bits
unsigned long zero=0; //Se crean de tipo sin signo para que el valor maximo llegue hasta 65535
for (i=0;i<=(MUESTRAS_ZERO-1);i++) //Hallamos referencia de cero. 8 cycles
{
zero = (unsigned long)*ptr_Valor + zero; //6 cycles 0.15us
ptr_Valor++; //4 cycles
} //TOTAL incremento i en el for = 8+6+4 = 18 cycles 0.45us
return (zero>>6); //Los desplazamos a la derecha 6 posiciones de los bits para dividirlo en 2^6 = 64 //6 cycles 0.15us
} //6 cycles 0.15us
int max_min(int zero,unsigned int *ptr_gen, unsigned int *ptr_Valor, unsigned int *last_value)
{
unsigned int i,Datos[8],pos;
pos = *ptr_gen;
Datos[0] = *last_value;
last_value++;
Datos[1] = *last_value;
for(i=1;i<=6;i++)
{
Datos[i+1] = *ptr_Valor;
ptr_Valor++;
}
for(i=1;i <= 6;i++)
{
if( ((Datos[i] > zero) && Datos[i] >= Datos[i-1]) && (Datos[i] > Datos[i+1]) ) //(Datos[i] > zero)&&
{
if(picos == 0)
{
max[picos] = Datos[i];
posicion[picos] = pos;
picos++;
}
else if(picos == 1)
{
//resultado = ( max[picos-1] + (unsigned int)(0.15 * max[picos-1]) );
if( ((pos - posicion[picos-1]) == 5) || ((pos - posicion[picos-1]) == 6) )
{
//resultado = pos - posicion[picos-1];
if( Datos[i] > ( max[picos-1] + (unsigned int)(0.12 * max[picos-1]) ) )
{
max[picos] = Datos[i];
posicion[picos] = pos;
picos++;
}
}
else
{
picos=0;
max[picos] = Datos[i];
posicion[picos] = pos;
picos++;
}
}
else if(picos == 2)
{
//resultado = pos - posicion[picos-1];
if( ((pos - posicion[picos-1]) == 5) || ((pos - posicion[picos-1]) == 6) )
{
if(Datos[i] > max[picos-1])
{
max[picos] = Datos[i];
posicion[picos] = pos;
return 0;
}
picos = 0;
max[picos] = Datos[i];
posicion[picos] = pos;
picos++;
}
else
{
picos = 0;
max[picos] = Datos[i];
posicion[picos] = pos;
picos++;
}
}
}
pos++;
}
*last_value = Datos[7];
last_value--;
*last_value = Datos[6];
*ptr_gen = pos;
return 1;
}
//---------------------------------------------------------------------------------------------------------------------------------------------------
int main (void)
{
int i,control_recibido = 0;
//unsigned int nivel=0;
char Buf[3];
contador.byte1 = 0x00;
contador.byte0 = 0x00;
TRISBbits.TRISB15 = 0;
// Oscillator Special Function Control Registers
// Configure Oscillator to operate the device at 40MIPS
// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2 (XT=8MHz)
PLLFBD = 38; // PLL Feedback Divisor bits (also denoted as "M", PLL multiplier) 38 = 40
CLKDIVbits.PLLPRE = 0; // PLL Phase Detector Input Divider bits (also denoted as "N1", PLL prescaler) 0 = 2
CLKDIVbits.PLLPOST = 0; // PLL VCO Output Divider Select bits (also denoted as "N2", PLL postscaler) 0 = 2
//CLKDIVbits.FRCDIV = 0; // Internal Fast RC Oscillator Postscaler bits
CLKDIVbits.DOZEN = 0; // DOZE Mode Enable bit 0 = Processor clock/peripheral clock ratio forced to 1:1
//CLKDIVbits.DOZE = 0; // Processor Clock Reduction Select bits = FCY/1
CLKDIVbits.ROI = 0; // Recover on Interrupt bit 0 = Interrupts have no effect on the DOZEN bit
//OSCTUNbits.TUN = 0; // FRC Oscillator Tuning bits = Center frequency (7.37 MHz nominal)
RCONbits.SWDTEN = 0; // Disable watch dog timer
//---------------------------------------------------------------------------------------------------------------------------------------------
UART_inic(); //83346 cycles 2.08365ms
ADC_FS_29k_inic(); //Hasta aqui 1.719475ms //Inicializamos el ADC demora de la funcion 55 cycles
ADC_FS_29k(MUESTRAS_ZERO,&vector[0]); //Recogemos las muestras del ambiente
zero = zero_RMS((unsigned int *) vector); //1167 cycle 29.175us
while(control)
{
control = max_min(zero,&pos_gen,&vector[pos_gen],(unsigned int*)valor_ant);
if(pos_gen >= 1450)
{
control =0;
}
}
while(accion)
{
while(U2STAbits.URXDA) //Bit de control que le dice cuando hay un dato en el buffer de RX
{
Buf[0] = ReadUART2();
Buf[1] = '\0'; //Este retorno de carro es para avisar que es el ultimo dato en el buffer
control_recibido = 1;
}
if(control_recibido == 1)
{
if(Buf[0] == 'm')
{
// TIMER3_inic();
accion = 0;
}
else
{
control_recibido = 0;
}
}
}
for(i=0;i<MUESTRAS;i++)
{
// printf("%u\r",signal[i]);
dato.word = vector[i]; //Para el envio de Matlab no se utiliza printf para enviar datos.
Buf1[0] = dato.byte1;
Buf1[1] = dato.byte0;
Buf1[2] = '\0';
U1STAbits.UTXEN = 1; //Activar interupcion
__delay_us(200); //espero 1/Baudios
putsUART2 ((unsigned int *)Buf1); //Funcion de tranmision
while(BusyUART1()); //esperar un tiempo para estabilizacion de transmision
}
accion = 1;
control_recibido = 0;
while(accion)
{
while(U2STAbits.URXDA) //Bit de control que le dice cuando hay un dato en el buffer de RX
{
Buf[0] = ReadUART2();
Buf[1] = '\0'; //Este retorno de carro es para avisar que es el ultimo dato en el buffer
control_recibido = 1;
}
if(control_recibido == 1)
{
if(Buf[0] == 'p')
{
// TIMER3_inic();
accion = 0;
}
else
{
control_recibido = 0;
}
}
}
tiempo = posicion[1];
// printf("%u\r%u\r",max[i],posicion[i]);
dato.word = tiempo; //Para el envio de Matlab no se utiliza printf para enviar datos.
Buf1[0] = dato.byte1;
Buf1[1] = dato.byte0;
Buf1[2] = '\0';
U1STAbits.UTXEN = 1; //Activar interupcion
__delay_us(200); //espero 1/Baudios
putsUART2 ((unsigned int *)Buf1); //Funcion de tranmision
while(BusyUART1()); //esperar un tiempo para estabilizacion de transmision
// DAC_FS_39k_inic();
// audio_4850(1);
while(1){}
}