Autor Tema: Como puedo mejorar código para hacer un ADC con PIC 12F675  (Leído 4875 veces)

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

Desconectado juanes790415

  • PIC10
  • *
  • Mensajes: 6
Como puedo mejorar código para hacer un ADC con PIC 12F675
« en: 17 de Julio de 2013, 12:58:08 »
Hola amigos, les cuento que estoy iniciandome en el mundo de la programación, por lo tanto tengo pocos conocimientos en este campo. Necesito con la ayuda de ustedes construir un convertidor analogo digital con un pic 12F675. He visto en internet varios ejemplos pero en lenguaje ASM y uno en lenguaje c, el cual no entiendo muy bien. Les pido su colaboración con el siguiente codigo, el cual esta en lenguaje "C" con el pic16F87 para adaptar este código que a continuación les doy a conocer y poderlo hacer con el pic 12F675. Estoy utilizanco el programa PIC C COMPILER CCS para programar. Tambien les pregunto si es confiables simular este circuito en proteus.

Las dudas que tengo son las siguientes:

1. como se programan los pines en un micro de ocho pines, algún ejemplo que me pueda orientar.
En un micro de otros pines se programa

La idea que tengo es poder configurar el micro 12F675 para que a traves de una entrada analogica  con el micro alimentado con 5V pueda coger ese voltaje analogo y poderlo convertir en señal digital y que me muestre a traves de unos led en la salida como a medida que vario el voltaje analogico de 0 a 5V en la salida se me encienden led, de acuerdo al voltaje de entrada.

Asi lo pienso programar el circuito, alguna sugerencia, ayuda bienvenida.

El micro 12F675 tiene 8 pines.

distribucion de pines.

pin 1. VDD  aqui llevo este ping a 5V
pin2. no utilizarlo
pin3. no utilizarlo
pin4. según lo que he leido, solo se puede configurar como entrada. por el momento no utilizarlo.
pin5. Utilizarlo para configurarlo como salida y que me muestre que el voltaje que le llega a este pin se active un led.
pin6. pienso utilizarlo como entrada (colocar un potenciometro conectadando los extremos asi: un extremo a 5V, el otro a tierra, el de la mitad como entrada analoga
pin7. Utilizarlo para configurarlo como salida y que me muestre que el voltaje que le llega a este pin se active un led.
pin8. llevarlo a tierra.

La idea del circuito es que cuando yo vario un potenciometro a traves del pin 6 del micro 12F675 (queme orienten de que valor puede ser) me muestre a la salida un valor de voltaje y me encienda un led ya sea en la salida 5 o 7 del pic, dependiendo del voltaje a la entrada.

Espero me puedan ayudar para lograr construir este circuito.

Saludos.


Aqui le coloco el código que me logre descargar de internet y al frente de los comentarios entre parentesis coloco mis dudas.


#include <pic16F877A.h>

#byte PORTB = 0x06  //Definimos PORTB con la dirección del registro PORTB. (como se puede configurar esto en el micro 12F675)


void main()
{
   ////Configuración///
   setup_adc_ports(AN0_AN1_AN3);               
   setup_adc(ADC_CLOCK_INTERNAL);
   //setup_pp(PMP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   
   unsigned int16 tension=0; //Variable para almacenar el valor de tensión leido por el ADC
   unsigned int8 valor; //Variable temporal.
   
   set_tris_b(0x00); //0b0000000// Configuramos el puerto B como salida.     (cuales son los puertos del micro 12F675)
 
   set_adc_channel(0); //elegimos el canal que vamos a leer.    (mirando en el datasheet los canales del pic12F675 son 4 y se enumeran 00,01,02,03)
   delay_us(10);  // esperamos 10uS necesarios para el ADC
   
   
   while(1){
   
      tension=read_adc(); //Leemos la tensión en el canal que elegimos.
      delay_ms(1); //Esperamos un poco.
      valor=tension/127; //Calculamos a cuantos LEDs encendidos corresponde la tensión leida.
     
      switch(valor){  //Encendemos los leds que hagan falta.
         case 0:  PORTB=0b00000000;
                  break;
         case 1:  PORTB=0b00000001;
                  break;
         case 2:  PORTB=0b00000011;
                  break;
         case 3:  PORTB=0b00000111;
                  break;
         case 4:  PORTB=0b00001111;
                  break;
         case 5:  PORTB=0b00011111;
                  break;
         case 6:  PORTB=0b00111111;
                  break; 
         case 7:  PORTB=0b01111111;
                  break;
         case 8:  PORTB=0b11111111;
                  break;
                 
         default:  break;
      }
     
     
   }

 

}







Desconectado R-a-ú-l

  • PIC10
  • *
  • Mensajes: 6
Re: Como puedo mejorar código para hacer un ADC con PIC 12F675
« Respuesta #1 en: 20 de Junio de 2015, 23:52:27 »
lo que tienes que hacer es un bucle de decision ( if , else ) donde preguntes si tu entrada analogica que esta representada por un numero entre 0 y 127 ( por ejemplo 2.5v = 63, 1v = 25 aprox etc etc) es mayor, menor o igual a un valor que tu decidas ( una vez mas comprendido entre 0 y 127) ponga en estado alto a uno de pines 5,7 o ambos, este bucle en vez del case que tienes.

esta es una solucion que se me ocurre recuerda que se puede hacer lo mismo de muchas maneras distintas.
y si, si es conveniente lo simules en proteus

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Como puedo mejorar código para hacer un ADC con PIC 12F675
« Respuesta #2 en: 21 de Junio de 2015, 14:36:51 »
Mas que mejorar... es hacer el codigo completo.

Primero que compilador usas?, eso es del compilador CCS, pero puede que estes usando MikroC o el de Microchip XC8.

Voy a responder tus dudas del codigo, vuelvo a repetirte, esto es de CCS, si fuera XC8 algunas cosas no harian falta.


Citar
#byte PORTB = 0x06  //Definimos PORTB con la dirección del registro PORTB. (como se puede configurar esto en el micro 12F675)
Como bien dice el comentario, ahi se define la direccion de memoria del PORTB, para eso te vas al datasheet del PIC12F675
http://ww1.microchip.com/downloads/en/devicedoc/41190c.pdf
En la pagina 8 comienzas a mostrarte todos los registros especiales.

En ese PIC como es un solo puerto, no lo define como PORTA , sino que directamente esta como GPIO ( General Porpuse I/O ) Y corresponde a la direccion de memoria 0x05

Citar
  set_tris_b(0x00); //0b0000000// Configuramos el puerto B como salida.     (cuales son los puertos del micro 12F675)
Esa linea no tiene sentido en tu micro, por que no tiene PuertoB, tal ves funcione set_tris_a() , Sino vas a tener que definir como lo de arriba el registro TRISIO ( 0x85 ). De todas formas CCS viene por defecto con la directiva
#use Standard_io
Esto hace que si al pin lo usas de entrada el compilador solo le agregue el codigo cambiando el TRISIO , igual si escribis ocurre lo mismo. Si queres definirlo como salida/entrada directamente usas
#use fast_io

Citar
  set_adc_channel(0); //elegimos el canal que vamos a leer.    (mirando en el datasheet los canales del pic12F675 son 4 y se enumeran 00,01,02,03)
Si... esta bien, pero aqui lo importante es configurar bien el ADC y las demas cosas, es decir esto:

   ////Configuración///
   setup_adc_ports(AN0_AN1_AN3);                
   setup_adc(ADC_CLOCK_INTERNAL);
   //setup_pp(PMP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);

Lo que va dentro depende exclusivamente del micro, por ejemplo el PIC que tenes tiene solo 2 timers ( 0 y 1 ) asi que la linea de timer 2 no va. El tema de los puertos ADC ( AN0,AN1,AN2,AN3 ) eso vas a tener que ver en el archivo
pic12F675.h
Que deberias tener en el include
deberias quitar lo del SPI

Deberias modificar todo la parte del PORTB, ya que como dijiste tenes: 1 entrada, 1 entrada analogica y te quedan solo 4 pines para salida. Y tu programa usa 8 ( un puerto completo)


Lamento no poder ser de mas ayuda pero odio CCS, y alguno te va a tener que ayudar con eso.
En mi opinion no hay nada mejor que modificar los registros y no tener que adivinar que usar en CCS.
« Última modificación: 21 de Junio de 2015, 14:46:51 por KILLERJC »