Autor Tema: recogida de datos 16f877  (Leído 2009 veces)

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

Desconectado wenceslao666

  • PIC10
  • *
  • Mensajes: 5
recogida de datos 16f877
« 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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: recogida de datos 16f877
« Respuesta #1 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.
No contesto mensajes privados, las consultas en el foro

Desconectado wenceslao666

  • PIC10
  • *
  • Mensajes: 5
Re: recogida de datos 16f877
« Respuesta #2 en: 28 de Abril de 2009, 07:54:40 »
lo tengo que programar en C
Muchas gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: recogida de datos 16f877
« Respuesta #3 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. }
No contesto mensajes privados, las consultas en el foro

Desconectado wenceslao666

  • PIC10
  • *
  • Mensajes: 5
Re: recogida de datos 16f877
« Respuesta #4 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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: recogida de datos 16f877
« Respuesta #5 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. }
No contesto mensajes privados, las consultas en el foro

Desconectado wenceslao666

  • PIC10
  • *
  • Mensajes: 5
Re: recogida de datos 16f877
« Respuesta #6 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


 

anything