Autor Tema: [Solucionado] Ayuda con Basico de ADC  (Leído 2492 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado dennis_ab

  • PIC10
  • *
  • Mensajes: 5
[Solucionado] Ayuda con Basico de ADC
« en: 06 de Enero de 2015, 06:21:08 »
Hola a todos.

Espero y me puedan ayudar con un tema básico en ADC con el pic 16f877a, se que es básico pero no tengo los suficientes conocimientos.

Estoy haciendo un programa, este debe leer 3 entradas analógicas en el puerto A; y prender un pin especifico en el puerto B
Y debo comparar las 3 entradas analógicas, a fin de hacer una acción según el valor menor.

No logro ver mi error, compila, pero en el simulador no responde a nada.
Espero me puedan ayudar, muchas gracias!

Código: [Seleccionar]
#include <16F877A.h>
#device adc=10
#FUSES XT, NOWDT, NOPROTECT, PUT
#use delay (clock=4000000)
#BYTE TRISA=0X85
#BYTE PORTA=0X05
#BYTE PORTB=0X06
void main()
{
   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_tris_b(0x00);
   while(1);
   {
      int16 x;
      int16 y;
      int16 z;
      set_adc_channel(0);
      x=read_adc();
      delay_ms(100);
      set_adc_channel(1);
      delay_ms(100);
      y=read_adc();
      delay_ms(100);
      set_adc_channel(3);
      z=read_adc();
      delay_ms(100);
      
      if (x<y && x<z)
      {
        PORTB=0b11111111;
      }
      else
         {
             if (y<x && y<z)
              {
                   PORTB=0b01010101;
              }
      else
         {
             if(z<x && z<y)
             {
                    PORTB=0b00000000;
             }
         }
         }
         delay_ms(100);
   }
}

« Última modificación: 07 de Enero de 2015, 21:16:48 por dennis_ab »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con Basico de ADC
« Respuesta #1 en: 06 de Enero de 2015, 08:06:38 »
lo unico que se me ocurre es:

while(1);

TIENE UN PUNTO Y COMA!, y no lleva  :D , hasta me causo gracia por que me pase buscando sobre todas las demas funciones por que odio el CCS y despues que escribi lo de abajo me encontre con esto  :lol:

Tambien otras cosas:

Faltaria un set_tris_a(0xFF); poniendolo como entradas, aunque supuestamente el compilador lo hace solo ya que esta definido como standar_io, lo cual agrega lineas de tris en el programa por su cuenta.

Y que luego de cada set_adc_channel(); le pongas un delay ( 1ms ), o acomodes el delay de 100ms que tenes para que este luego de esa instruccion. Algo asi:

Código: [Seleccionar]
     set_adc_channel(0);
      delay_ms(100);
      x=read_adc();
      set_adc_channel(1);
      delay_ms(100);
      y=read_adc();
      set_adc_channel(3);
      delay_ms(100);
      z=read_adc();
      delay_ms(100);
« Última modificación: 06 de Enero de 2015, 08:11:43 por KILLERJC »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con Basico de ADC
« Respuesta #2 en: 06 de Enero de 2015, 08:14:34 »
Comenta las tres lineas siguientes (o las sacas sino) y prueba compilarlo de nuevo...

Citar
#BYTE TRISA=0X85
#BYTE PORTA=0X05
#BYTE PORTB=0X06
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado dennis_ab

  • PIC10
  • *
  • Mensajes: 5
Re: Ayuda con Basico de ADC
« Respuesta #3 en: 06 de Enero de 2015, 16:12:43 »
Hola, si, grave error el del while jaja  :D

Ya hice los cambios que me mencionaron, pero sigo sin obtener resultados al momento de simular.

Solo me encienden leds aleatorios en el puerto B,

No se donde pueda encontrarse el error.

Espero me puedan ayudar,

Gracias!

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Ayuda con Basico de ADC
« Respuesta #4 en: 06 de Enero de 2015, 16:16:28 »
Creo que el problema es que estás poniendo todo como analógico, intenta cambiar el all analog y sólo configura los que vayas a usar
"Nada es imposible, no si puedes imaginarlo"

Desconectado dennis_ab

  • PIC10
  • *
  • Mensajes: 5
Re: Ayuda con Basico de ADC
« Respuesta #5 en: 06 de Enero de 2015, 16:39:05 »
GRacias, pero ya probé con setup_adc_ports(AN0_AN1_AN3);
y no obtengo resultaodos  :(

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Ayuda con Basico de ADC
« Respuesta #6 en: 06 de Enero de 2015, 18:11:49 »
Que es lo que tienes conectado a tus entradas, puede que tengas ruido en tus entradas.

Primero comprueba que tus canales estén leyendo bien tus señales analógicas
"Nada es imposible, no si puedes imaginarlo"

Desconectado dennis_ab

  • PIC10
  • *
  • Mensajes: 5
Re: Ayuda con Basico de ADC
« Respuesta #7 en: 06 de Enero de 2015, 18:14:32 »
Que es lo que tienes conectado a tus entradas, puede que tengas ruido en tus entradas.

Primero comprueba que tus canales estén leyendo bien tus señales analógicas


Tengo resistencias de valores fijos en las entradas, y estas van conectadas a 5 volts

La idea es hacerlo con fotorresistencias en fisico

Pero en proteus no responde a los valores de entrada.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Ayuda con Basico de ADC
« Respuesta #8 en: 06 de Enero de 2015, 20:02:18 »
Seria bueno que colocaras una imagen del circuito en proteus, podria ser que te falto colocar el Vcc al MCLR?
Otra cosa que podrias verificar es corriendo el programa paso a paso ver si se cargan los valores del adc en las variables x,y,z si es asi el problema podria estar el los else...

Saludos

Desconectado dennis_ab

  • PIC10
  • *
  • Mensajes: 5
Re: Ayuda con Basico de ADC
« Respuesta #9 en: 07 de Enero de 2015, 21:15:12 »

Gracias a todos!
De hecho tenía bastantes cosas mal.  :D

Les comparto mi código, por si a alguien le ayuda algún día en el foro :)

Código: [Seleccionar]

#include <16f877a.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=8000000)

#byte PORTB = 0x06 //Definimos PORTB con la dirección del registro PORTB.



void main()
{

int16 x=0;
int16 y=0;
int16 z=0;

////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.





while(1){

set_adc_channel(0); //elegimos el canal que vamos a leer.
delay_us(10); // esperamos 10uS necesarios para el ADC
x=read_adc(); //Leemos la tensión en el canal que elegimos.

delay_us(10);
set_adc_channel(1);
delay_us(10);
y=read_adc();

delay_us(10);
set_adc_channel(3);
delay_us(10);
z=read_adc();





delay_ms(1); //Esperamos un poco.
//valor=tension/127;
//Calculamos a cuantos LEDs encendidos corresponde la tensión leida.

     
     
         if (((x<y) && (x<z)))     
         {
            PORTB=0b10000000;
            delay_ms(100);
         }
            else if (((y<x) && (y<z)))
         {
 
            PORTB=0b01000000;
            delay_ms(100);
         }
            else if(((z<x) && (z<y)))
         {
 
            PORTB=0b00100000;
            delay_ms(100);
         }

   }
}