TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: tecnoplus en 14 de Febrero de 2012, 23:03:48
-
#define FCY 15000000UL //utilizando oscilador interno 7,5 x 8pll 20mhz fcy =60mhz/4 = 15000000
#include "p30f4013.h"
#include "libpic30.h"
unsigned int uno=0x1234;
unsigned int dos=0x5678;
unsigned long total,tmp360 ;
unsigned int tmr5temporal,tmr4temporal,si_actadc=0,tmr6temporal;
unsigned int temphig,templow,num_muestras=0,numx_muestras,n_cp=3;
unsigned int *n_muestras,*nx_muestras ;
//**********************************
unsigned int muestras[360];
// Declaraciones de las funciones
void txt2LCD(char caracter);
void env_ent(unsigned entero);
void msg2LCD( char *cadena);
void InicializaUART();
void bit16_string (unsigned int valor16bit);
void ini_puertos();
void ini_adc();
void timer2_3();
void timer4_5();
void config_ccp1();
//void __attribute__((__interrupt__)) _ADCInterrupt(void)
{
if (num_muestras <= 360) // esto permite q solo guarde hasta 360 muestras y no se sobre pase la tabla
{
*n_muestras = ADCBUF0; //*n_muestras++ = ADCBUF0; verifikr ponerlo asi
n_muestras++ ;
num_muestras++;
}
else
{
num_muestras=0;
}
PORTDbits.RD0=1;
IFS0bits.ADIF=0; //desactiva bandera d interrupcion del adc
}
//**********************************************************************************************************************************************
// este utiliza el timer 4-5 d 32 bit para medir el tiempo d ela vuelta
/*for (n_muestras = &muestras - ;n_muestras != &muestras [360];n_muestras++)
{
*n_muestras = 0 ; //
}
n_muestras = &muestras - ; //esto inicia la toma de muestras empieza a tomar muestras desde 0
num_muestras=0;
*/
//--------------------------------
//IFS0bits.ADIF=0; //desactiva bandera d interrupcion del adc
//***************************************************************
//Programa principal
//***************************************************************
int main (void)
{
unsigned int tiempo;
unsigned int numeroejemplo;
long resultado,divide,dividiendo;
n_muestras = &muestras - ; //esto inicia la toma de muestras empieza a tomar muestras desde 0
ini_puertos();
ini_adc();
timer2_3();
//--------------------------------------------------------------
while(1) //
{
if(n_cp==3)
{
//__delay_ms(400);
n_cp=0;
}
__delay_us(1);
}
}
//******************************************************************************************************
//************************************************************
void ini_puertos()
{
asm("CLR PORTD"); // ; enable
asm("MOV #0xFFFE, W0"); // ; direction in=1
asm("MOV W0, TRISD "); //
}
void ini_adc()
{
ADPCFG=0XFFFE; // solo el puerto RB0 como entrada analogica AN0
ADCON1=0;
ADCHS=0; //selecciona canal 0 a positivo en AN0
ADCSSL=1; // selecciona el canal AN0
ADCON3=0; // pone todo a 0
ADCON3bits.ADCS=30; //
ADCON2=0;
ADCON3bits.SAMC=5;
ADCON1bits.SSRC=2; // el timer2-3 d 32 bit temina el sample y activa la convercion " cuando yo cambio 2 a 7 si me funciona pero qiero q lo active es el timer
ADCON1bits.ASAM =1; //inicia muestreo en fin de conversion
IPC2bits.ADIP = 1; //1 Fijamos nivel de prioridad
IFS0bits.ADIF=0; //desactiva bandera d interrupcion del adc
IEC0bits.ADIE=1; //activa interrupcion del adc
ADCON1bits.ADON = 1;
}
// este timer es para activar la convercion del adc
void timer2_3()
{
T2CONbits.T32 = 1; // modo de 32-bits
T2CONbits.TCS = 0; // Clock interno
T2CONbits.TGATE = 0; // Mode Gate deshabilitado.
T2CONbits.TCKPS = 0b00; // Preescaler 1:1
PR3 = 0; // Fijamos periodo (msw)
PR2 = 300; // Fijamos periodo (lsw)
//IPC1bits.T3IP = 1; // Fijamos nivel de prioridad
IFS0bits.T3IF = 0; // Borramos flag.
IEC0bits.T3IE = 0; // CANCELAMOS Habilitamos interrupción.
TMR3HLD = 0x00; // Borramos Timer3 (msw)
TMR2 = 0x00; // Borramos timer2 (lsw)
T2CONbits.TON = 1; // Encendemos timer de 32-bits.
}
hola el problema es q cuando llega el timer a 300 por q pr = 300 no se activa el sample del adc y cuando configuro SSRC con 7
si me activa el adc y cada cierto tiempo se activa la interrupcion del adc pero cuando lo pongo q lo active el timer de 32 bit no lo hace
espero puedan ayudarme gracias