TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: wenceslao666 en 27 de Abril de 2009, 20:53:15

Título: recogida de datos 16f877
Publicado por: wenceslao666 en 27 de Abril de 2009, 20:53:15
Hola tengo un problema, tengo que utilizar un 16f877 para introducir unos datos de unas baterías, el problemaa es que el pic tiene que recoger los datos cada 200 ms, es decir que cada 200 ms tome el dato y lo guarde, eso durante 2 segundos, por tanto al final se recogen 10 datos diferentes y que después ya no recoja más datos.
Me vendria muy bien si alguien me pudiese ayudar, ya que soy nuevo en el uso de microcontroladores
Muchas gracias
Título: Re: recogida de datos 16f877
Publicado por: Suky en 28 de Abril de 2009, 00:13:41
Bien, primero que nada que lenguaje vas a utilizar?
Una forma de tomar las medidas cada 200ms puede ser  configurar un temporizador para que al interrumpir realice la lectura del canal, y esto 10 veces. También puedes usar el módulo CCP en modo comparador y evento especial que inicie una conversión cada 200ms. Te podemos ayudar más específicamente sabiendo el lenguaje que vas a utilizar.
Título: Re: recogida de datos 16f877
Publicado por: wenceslao666 en 28 de Abril de 2009, 07:54:40
lo tengo que programar en C
Muchas gracias
Título: Re: recogida de datos 16f877
Publicado por: Suky en 28 de Abril de 2009, 11:31:50
Esta seria una idea. Se configura timer para que interrumpa cada 200 ms, al interrupir realizas la lectura del canal analógico (en este caso esta configurado como resolución de 8 bits) y la guardas en un vector hasta que se realicen 10 medidas.
Es una base, a partir de ahí puedes desarrollar tu trabajo.
Código: C
  1. #use delay(clock=4000000)
  2.  
  3. int Medida[10];
  4. int i=0;
  5.  
  6. #int_TIMER1
  7. void  TIMER1_isr(void)
  8. {
  9.    set_adc_channel(0);
  10.    delay_us(20);
  11.    Medida[i]=read_adc();
  12.    ++i;
  13.    set_timer1(15536);
  14.    if(i==10){
  15.       disable_interrupts(INT_TIMER1);
  16.       i=0;
  17.    }
  18. }
  19.  
  20.  
  21. void main()
  22. {
  23.    setup_adc_ports(ALL_ANALOG);
  24.    setup_adc(ADC_CLOCK_INTERNAL);
  25.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
  26.    enable_interrupts(INT_TIMER1);
  27.    enable_interrupts(GLOBAL);
  28.    set_timer1(15536);
  29.      
  30.    do{
  31.        
  32.    }while(1);
  33. }
Título: Re: recogida de datos 16f877
Publicado por: wenceslao666 en 03 de Mayo de 2009, 18:03:10
muchas gracias por la informacion, pero tengo un duda más, tengo que hacer eso con dos canales diferentes, osea, dos tipos de  datos, como hago despues para guardar cada dato en un sitio distinto para poder trabajar luego con esos datos por separado???
muchas gracias
Título: Re: recogida de datos 16f877
Publicado por: Suky en 03 de Mayo de 2009, 19:28:07
Creas dos vectores y lo guardas por separado:

Código: C
  1. int Medida1[10];
  2. int Medida2[10];
  3. int i=0;
  4.  
  5.  
  6. #int_TIMER1
  7. void  TIMER1_isr(void)
  8. {
  9.   set_adc_channel(0);
  10.   delay_us(20);
  11.   Medida1[i]=read_adc();
  12.   set_adc_channel(1);
  13.   delay_us(20);
  14.   Medida2[i]=read_adc();
  15.   ++i;
  16.   set_timer1(15536);
  17.   if(i==10){
  18.      disable_interrupts(INT_TIMER1);
  19.      i=0;
  20.   }
  21. }
Título: Re: recogida de datos 16f877
Publicado por: wenceslao666 en 04 de Mayo de 2009, 12:33:05
muchisimas gracias por todo, pero ya solo una cosa más, como tendría que programarse para obtener la diferencia entre el primer valor tomado y el ultimo valor y sacar este dato por una pantalla lcd, porque me hace falta obtener este valor y si esta comprendido entre 0.5 y 1 escribir en el lcd 50% y si es mayor que 1 escribir 100%
muchas gracias de antemano, me esta sirviendo mucho de ayuda