12F675 ADC Funciona en Proteus y no en Protoboard

#1
HOLA COMPAÑEROS :

Estoy realizando un programa simple con el pic 12f675 quiero leer un dato analógico un simple potenciómetro y si se encuentra dentro de un rango, si lo llevamos a porcentaje seria de 40% a 70% y no me ha funcionado, he revisado por internet y tengo dos programas distintos de los cuales ambos funcionan en proteus y ninguno en protoboard, para descartar opciones ingrese un programa simple de encendido de un led y funciona correctamente, acá les dejo ambos programas espero que me puedan ayudar y de antemano muchas gracias:

programa 1 :
Código:
#include <12f675.h>
#device adc=10;

#use delay (clock = 20000000)
#fuses HS,NOWDT,NOPROTECT
#define GP0 PIN_A0 
#define GP1 PIN_A1 
#define GP2 PIN_A2 
#define GP3 PIN_A3 
#define GP4 PIN_A4 
#define GP5 PIN_A5 
int16 val;



void main () {

disable_interrupts(GLOBAL);
   disable_interrupts(INT_EXT);
   disable_interrupts(INT_TIMER0);
   disable_interrupts(INT_TIMER1);

SET_TRIS_A(0b001001);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0_ANALOG|VSS_VDD);
set_adc_channel(0);
delay_us(20);
output_low(pin_a2);
output_low(pin_a1);

while(true) {

val=read_adc();
              if(val>=300 && val<=900)  {
                        output_high(pin_a2);
                        output_high(pin_a1);
                        val=0;
                      }
             else{
             output_low(pin_a2);
             output_low(pin_a1);
             val=0;
             }
 }
}
programa 2:
Código:
#include <12F675.h>          // Cambia para cada PIC. Esta y las 10 líneas siguientes las genera el PICWizard.
#device adc=10               // Setea el ADC a 10 BIT
#FUSES NOWDT                 // Watch Dog Timer: NO
#FUSES INTRC_IO              // Internal RC Osc, no CLKOUT
#FUSES NOCPD                 // Protección EE : NO
#FUSES NOPROTECT             // Protección lectura Codigo : NO
#FUSES NOMCLR                // MCLR usado como Puerto de Entrada/Salida
#FUSES NOPUT                 // Power Up Timer : NO
#FUSES NOBROWNOUT            // Brownout reset : NO
#use   delay(clock=4000000)  // Frecuencia del reloj interno elegido
#rom   0x3ff   = {0x3448}    // 0x34:RETLW; 0x48 valor de calibración del Osc. Interno
                             // Es válida solo para un determinado PIC. 
                             // Este valor lo graba en el PIC el fabricante
long valor           ;

void main()
{
   setup_adc_ports(sAN0|VSS_VDD); // Esta y las 5 líneas siguientes las genera el PICWizard.
   setup_adc(ADC_CLOCK_DIV_2);    // Si aumento DIV_2 a 16, baja muy poco la frecuencia
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   //               --543210    

while(true) {
   
   valor=read_adc();
                 if(valor>=300 && valor<=800)  {
                           output_high(pin_a2);
                           output_high(pin_a1);
                           valor=0;
                         }
                else{
                output_low(pin_a2);
                output_low(pin_a1);
                valor=0;
                }
    }
   }
 
Última edición por un moderador:
#2
Hola, no entiendo el por que de igualar a 0 la variable VAL al fin del IF y del ELSE. Revisa ademas estar conectando bien el hardware, un pin del trimpot a V+ , el pin del medio a la entrada analogica AN0 del PIC, y el otro pin a V- . Yo cuando hago lecturas analogicas con el modulo ADC, solo lo configuro asi:
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(20);
 
Última edición:
#3
Gracias Psyke por la respuesta, mira te explico igual la variante val a 0 para que tenga siempre que leer un dato para adquir uno nuevo valor creo que igual no es necesario pero me deja tranquilo le ha realizado algunas modificaciones al programa me decidí a trabajar con un cristal de 20Mhz externo, a pesar de mis modificaciones no me ha funcionado el circuito en protoboard, adjunto el programa a continuación:



programa 1 :
Código:
#include <12f675.h>
#device adc=10;
#fuses HS,NOWDT,NOPROTECT,MCLR 
#use delay (clock = 20000000)
#define GP0 PIN_A0 
#define GP1 PIN_A1 
#define GP2 PIN_A2 
#define GP3 PIN_A3 
#define GP4 PIN_A4 
#define GP5 PIN_A5 
int16 val;
int q= 0;



void main () {

disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
disable_interrupts(INT_TIMER0);
disable_interrupts(INT_TIMER1);

SET_TRIS_A(0b0010110);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0_ANALOG|VSS_VDD);
set_adc_channel(0);
delay_us(20);
output_low(pin_a2);
output_low(pin_a1);

while(true) {

q=read_adc();
val=(5*q)/1024;
              if(val>=300 && val<=900)  {
                        output_high(pin_a2);
                        output_high(pin_a1);
                        val=0;
                      }
            if(val<300 && val>900){
             output_low(pin_a2);
             output_low(pin_a1);
             val=0;
             }
  delay_ms(100);
 }
}
 
Última edición por un moderador:
#4
Hola yay, te comento que estoy respondiendo desde mi celular, por si tengo algun error de tipeo. Si mal no razono, en el segundo IF tienes un gran error, val nunca sera menor a 300 y mayor a 900, es una contradiccion.
Si quieres un codigo que te garantizo que funciona, te paso el mio, que es para un pic16F877A. Fijate de declarar bien AN0 como entrada en tu pic, si en tu pic el AN0 esta en el pin A0 entonces lo haz declarado como salida en tu set_tris_a. Aqui el codigo.

Código:
#include <16f877a.h>
#device adc=10
#fuses XT,NOWDT,NOBROWNOUT,NOLVP,NOPUT
#use delay(clock=4000000)

void main ()
{
int16 q;
set_tris_a(0b00000001);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(20);
while(true)
{
q=read_adc();
}
}
luego en el while haces tus modificaciones.

Espero haberte ayudado, saludos.
 
#5
Gracias por las respuestas Psyke pero intente llegar a un programa final mezclando tu programa y mi programa pero aun sigue funcionando en proteus y en protoboard no funciona, le he cargado programas básicos como encender led en todas las salidas y funciona correctamente, realice mediciones con el multi tester en busca de continuidad de los cables y realice chequeo completo con el datasheet para comparar los pines y todo, te dejo el programa que llegue a continuación espero que encuentres el error de antemano muchas gracias:


programa 1:

Código:
#include <12F675.h>
#device adc=10
#fuses HS,NOWDT
#use delay(clock=20000000)

void main ()
{
int16 q;
int val;
set_tris_a(0b00000001);                   // 
setup_adc_ports(AN0_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(20);
while(true)
{
q=read_adc();
val=(5*q)/1024;
    if((val<2.5)&(val>1.5) ) {                     // Se realiza un rango 
                        output_high(pin_a2);
                        output_high(pin_a1);
                        val=0;
                      }
    
    else{
             output_low(pin_a2);
             output_low(pin_a1);
             val=0;
             }
  delay_ms(100);
 }
}
 
Última edición por un moderador:
#6
Ya lo estoy montando en proto y te comento que tal. En unos minutos tienes mi respuesta. Si ya estas leyendo esto, por tu parte lee el datasheet de ese PIC y verifica estar conectando correctamente el trimpot al puerto analogico



Pregunta... Este pic tiene ADC con resolucion de 10 bits? No lo busco por mi cuenta ya que me encuentro desde mi telefono celular, en mi computadora no tengo Internet
 
Última edición:
#7
Al parecer no era de 8 bit solo el pic 12f675, aunque me acabo de dar cuenta por lo que escribiste he modificado el programa y grabado en el pic y aun no me a servido modifique estas dos lineas:
linea numero 2: #device adc=8

linea numero 18: val=(5*q)/256;

quedo atento a tu respuesta que tal te va. Gracias.
 
#8
Bien, probe simulandolo con un 12F675 y funciona, en el if dentro del while puse como condicion if(val>1.5 && val<2.5) lo unico que en proteus, al conectar el trimpot al pic, el pote funciona horrorosamente mal, pero comprobando con un voltimetro verifique que el programa funciona como debe. Solo resta que verifiques tu hardware, revisa que tu potenciometro funcione, sino no se que mas decirte amigo, disculpa
 
#9
Muchas gracias seguire intentando simulando igual a mi me funcionan las cosas si es al momento de grabar un con voltimetro he realizado las mediciones y funciona correctamente. seguire intentando cuando me resulte te avisare. y no te preocupes se que resultara.
 
#10
Cordial saludo
Señores

Soy un poco nuevo en estos temas y requiero de todos. estoy pasando por algo similar :cry: a ver si me pueden ayudar con un programa que hice y que en proteus funciona muy bien pero al cargarlo al micro en real no funciona. El micro que estoy usando es el 12f675, carga lo mas de bien el programa pero cuando lo coloco en funcionamiento ya sea en protoboar o en el impreso no funciona y al tocar cualquiera de los pines 2 o 3 se activa la salida que la tengo por el 5.
este es el código.

Código:
#include <control_diesel.h>

#define GP0 PIN_A0 
#define GP1 PIN_A1 
#define GP2 PIN_A2 
#define GP3 PIN_A3 
#define GP4 PIN_A4 
#define GP5 PIN_A5 

int16 i;
void main()
{
   set_tris_a(0b00001);
   
   output_low(pin_a2);
  
   i=0;
   while(true)
   {
     if ((input(pin_a0)==1)&(i==0))
         {
          output_high(pin_a2);
          i=1;
           delay_ms(8000);      //se selecciona el tiempo para la activacion del precalentamiento
           output_low(pin_a2);
          }
      if ((input(pin_a0)==0)&(i==1))
         {
          output_low(pin_a2);
         }
      if ((input(pin_a0)==1)&(i==1))
         {
          output_low(pin_a2);
         }
      if ((input(pin_a0)==0)&(i==0))
         {
          output_low(pin_a2);
         } 
   }
}
 
Última edición por un moderador:
#11
y el esquema? publica tu esquema para evaluar todo, no te olvides que Proteus es un "simulador" no la realidad
 
Última edición:
Arriba