TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dennis_ab 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!
#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);
}
}
-
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:
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);
-
Comenta las tres lineas siguientes (o las sacas sino) y prueba compilarlo de nuevo...
#BYTE TRISA=0X85
#BYTE PORTA=0X05
#BYTE PORTB=0X06
-
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!
-
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
-
GRacias, pero ya probé con setup_adc_ports(AN0_AN1_AN3);
y no obtengo resultaodos :(
-
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
-
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.
-
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
-
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 :)
#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);
}
}
}