Autor Tema: 12f683 y el ADC  (Leído 6096 veces)

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

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
12f683 y el ADC
« en: 06 de Febrero de 2009, 23:03:09 »
Buenas compañeros picmaniacos, despues de mucho tiempo regreso por estos lares. Pues bien, ahora me encuentro dando mis primeros pasos en el mundo del lenguaje C para pics y como no podia ser de otra manera con mi compañero CCS. Ahora lo que trato de hacer es usar un puerto del 12f683 como entrada analoga y en primera instancia deseo guardarla en una varible y es ahi en donde tengo problemas, por que al momento de simularlo parece que no estoy seteando algunas cosas, bueno espero que comprendan ya que es mi primer programa en CCS  :D, y que vengo del mundo del asm, este es el primer paso por que luego debo transmitir por usart(por software) ese dato a la PC, no se si podran decirme en que estoy fallando para poder realizar los correctivos pertinentes. muchas gracias por la ayuda que me puedan brindar. trato de usar el oscilador interno a 8 mhz. Uso la version 4.065 de CCS y proteus 7.2 sp6

Código: [Seleccionar]
#include <12f683.h>
#device adc=8
#fuses   INTRC,NOWDT,PUT,NOMCLR,NOPROTECT,NOBROWNOUT,NOIESO,NOCPD,NOFCMEN
#use  delay(clock=8000000)   
#use  fast_io(a)


#zero_ram         //pone a "0" todos los registros internos que son usados como
                  //variables

int8 valor_adc;

void main()
   {
   setup_adc_ports(sAN1);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(1);
   delay_us(10);   
      while(true)           
         { 
         read_adc(ADC_START_ONLY);
         while(adc_done()==1)
            valor_adc=read_adc(ADC_READ_ONLY);
         }         
   }
« Última modificación: 06 de Febrero de 2009, 23:07:15 por poseidon20 »

Desconectado hectdiaf

  • PIC10
  • *
  • Mensajes: 18
Re: 12f683 y el ADC
« Respuesta #1 en: 07 de Febrero de 2009, 03:19:02 »
hola poseidon20 si te entendi bien necesitas guardar los resultados que te de la convercion A/D.

Si es asi entonces yo lo haria de la siguente forma.
primero asignamos una variable que la podremos llamaremos dato, que es donde guardaremos las lecturas del A/D.

 while(true)           
         { 
         read_adc(ADC_START_ONLY);
              while(adc_done()==1)
              valor_adc=read_adc(ADC_READ_ONLY);
              write_eeprom(dato,valor_adc);
              dato++;
         }       

y luego para leer los datos recogidos utilizamos la instruccion

read_eeprom(dato);
dato++;

espero que sea lo que necesitabas,en lo de la comunicacion usart no te podria decir nada ya que nuca
lo he manejado.
chao suerte.

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: 12f683 y el ADC
« Respuesta #2 en: 07 de Febrero de 2009, 12:44:38 »
Gracias por el aporte hectdiaf, pero no necesito (por ahora) guardar el valor del adc en la eeprom del pic, solo deseo guardarla en la ram del pic para luego ser procesada y posteriormente enviada por usart.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: 12f683 y el ADC
« Respuesta #3 en: 07 de Febrero de 2009, 13:01:06 »
Me parece que puedes omitir el read only y el start_adc con solo read_ADC(); hace lo mismo y espera a que temrine la conversion para dar el valor.

Si vas a guardar en ram pues hay que definir cuantos datos .

Asi que haria un arreglo.

Código: [Seleccionar]
char valores[50];


int x=0;

while(x==50)            // lo hace 50 veces
         { 
       
         valores[x]=read_adc();
         x++;


         }         


Tmabién estoy empezando asi que puedo errar un poco  :mrgreen:

Y tengo entendido que si usas el fast_io, debemos asignar en el programa la configuracion del pin.

con set_trisX

« Última modificación: 07 de Febrero de 2009, 13:06:15 por AKENAFAB »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 12f683 y el ADC
« Respuesta #4 en: 07 de Febrero de 2009, 13:08:27 »
Se puede hacer asi:
Código: C
  1. // Configuramos entradas analogicas:
  2.    setup_adc_ports(AN0_AN1_AN3);
  3.    setup_adc(ADC_CLOCK_INTERNAL);
  4.    // .....
  5.    // Tomamos las medidas
  6.    set_adc_channel(0);
  7.    delay_us(20);
  8.    Valor1=read_adc();
  9.    set_adc_channel(1);
  10.    delay_us(20);
  11.    Valor2=read_adc();
  12.    // Listo!!!
No contesto mensajes privados, las consultas en el foro

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: 12f683 y el ADC
« Respuesta #5 en: 07 de Febrero de 2009, 14:44:33 »
hay una forma para que el salto de asembler a c sea menos traumatico y sería definir los bytes y cambiar bit a bit, mejor lo explico con un ejemplo algo asi....

Código: [Seleccionar]
#byte ARDES=0xFC4
#byte ADREL=0xFC3
#byte ADCON0=0xFC2
#byte ADCON1=0xFC1
#byte ADCON2=0xFC0



void configurar_AD(){
//paso1

//seleccion de la referencia

bit_clear(ADCON1,5);//elegimos Vss (poniendo un uno elegimos AN2(-vref))
bit_clear(ADCON1,4);//elegimos Vdd (=1 AN3(+vref))

//seleccion de canal A o D (AN0-AN2)
bit_set(ADCON1,3);
bit_set(ADCON1,2);
bit_clear(ADCON1,1);
bit_clear(ADCON1,0);

//seleccion del canalA0 como analogico
bit_clear(ADCON0,2);
bit_clear(ADCON0,3);
bit_clear(ADCON0,4);
bit_clear(ADCON0,5);

//fustificacion izq
bit_clear(ADCON2,7);

//elegimos el tiempo de adquisicion 2Tad
bit_clear(ADCON2,5);
bit_clear(ADCON2,4);
bit_set(ADCON2,3);

//Clock del conversor Fosc/64
bit_set(ADCON2,2);
bit_set(ADCON2,1);
bit_clear(ADCON2,0);



bit_set(ADCON0,0);              // activamos el conversor AD tacq=2,66 us

}


de esta forma, si manejas asembler es sencillo.....
Muchas veces lo hice para ver que hacian algunas funciones  :mrgreen:.
si te agrada y queres otro ejemplo lo subo, no problem...
LAS MALVINAS SON ARGENTINAS!

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: 12f683 y el ADC
« Respuesta #6 en: 07 de Febrero de 2009, 20:17:11 »
muchas gracias a todos por los aportes y sugerencias que me dan. cerebro esta muy bueno el salto que sugieres de asm a C, lo voy a tomar en cuenta y a practicar en paralelo, pero mi duda es si he seteado bien los parametros del pic para poder trabajar con el el oscilador interno del pic y el adc del mismo ya que antes habia realizado una prueba con solo poniendo GPx como salidas y haciendo encender un led cada segundo y me salio en el simulador pero cuando me mando con el tema del adc no me resulta como quiero por que veo que en el registro valor_adc no se guarda el valor del mismo siempre esta en cero.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: 12f683 y el ADC
« Respuesta #7 en: 08 de Febrero de 2009, 01:07:47 »
Que tal poseidon!
Podrias modificar el codigo asi a ver si te funciona mejor:

void main()
   {
   setup_adc_ports(AN1);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(1);
   delay_us(10);   
      while(true)           
         { 
         read_adc(ADC_START_ONLY);
         while (!adc_done());        //Espera a que termine la conversion del ADC  :mrgreen:
            valor_adc=read_adc(ADC_READ_ONLY);
         }         
   }

SAludos
« Última modificación: 08 de Febrero de 2009, 09:58:31 por RALF2 »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 12f683 y el ADC
« Respuesta #8 en: 08 de Febrero de 2009, 01:23:18 »
Las configuraciones que hiciste estan bien hechas, #device adc=8 indica cuantos bits se van a utilizar en la conversion, y esto depende del PIC que utilices (puede ser 8, 10, 11 o 16)
No contesto mensajes privados, las consultas en el foro

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: 12f683 y el ADC
« Respuesta #9 en: 08 de Febrero de 2009, 08:19:07 »
 read_adc(); ya lo tiene todo como lo expuse arriba.

Si revisas el asm genrado te daras cuenta que queda en loop hasta que la conversion termine.

En caso de que usaras interrupcion en la cnnversion adc entonces si seria solo el start y seguir con tu programa.

En fin .

Saludos!

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: 12f683 y el ADC
« Respuesta #10 en: 08 de Febrero de 2009, 10:29:22 »
Que tal amigos!
Poseidon mira probe el circuito y tal como te coloque arriba alli esta el problema  :mrgreen:

while(adc_done()==1)  esta es la instruccion que te esta dando el problema  :mrgreen:
ya que la funcion adc_done() una vez que es verdadera (1) se queda en un lazo sin fin que no te permite salir del lazo y asi poder volver a realizar una convercion ADC  :mrgreen:

Para resolverlo coloque lo que te indique arriba!  :mrgreen:
Y por si hay algunas dudas, aqui esta el circuito funcionando  :shock: :-/

Espero que te sea util  :P
Yo tambien estoy empesando con el CCS

Saludos

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: 12f683 y el ADC
« Respuesta #11 en: 08 de Febrero de 2009, 17:06:22 »
muchas gracias RALF2, de inmediato compilando, simulando y renegando  :mrgreen:.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: 12f683 y el ADC
« Respuesta #12 en: 08 de Febrero de 2009, 17:09:41 »
De nada mi amigo!
Cualquir duda por aqui estaremos  :mrgreen:

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: 12f683 y el ADC
« Respuesta #13 en: 08 de Febrero de 2009, 21:26:43 »
Despues de probar el codigo que pusistes, dejame decirte que ahora si corre, por lo menos en la simulacion  :D, ahora trato de hacer de convertir el rango de 0-255 a 0-100, este ultimo es un valor representado en porcentaje trato de aplicar operacion matematicas pero simpre me arroja 0, bueno seguire luchaando con este pic  :mrgreen: con la ayuda de todos. Tengo una duda, es necesario poner force_sw en la configuracion del rs232?

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: 12f683 y el ADC
« Respuesta #14 en: 08 de Febrero de 2009, 21:56:24 »
Citar
Tengo una duda, es necesario poner force_sw en la configuracion del rs232?
No no hace falta para nada  :mrgreen: si el pic que esta utilizando posee hardware usart pero utilizas los pines que no son para el usart, como por ejemplo el pin_A0 el compilador usara las rutinas rs232 por software, pero si el pic emplea hardware usart y utilizas los pines del hardware el compilador utilizara las rutinas por hardware para el manejo del rs232, a menos que, uses force_sw en cuyo caso el compilador se vera obligado a utilizar las rutinas por software  :shock:  :mrgreen:
Para hacer calculos matematicos algo complejos es preferible que emplees un micro de la serie pic16xxxx o pic18fxxxx, son mejores para ello  :-/

SAludos