TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: treur en 18 de Mayo de 2011, 19:27:36

Título: PIC16F887 problemas con entradas analogicas
Publicado por: treur en 18 de Mayo de 2011, 19:27:36
Hola a todos, recien estoy entrando con los pics 16f887 y tengo un problema con las lecturas de las entradas analogicas...les pongo mi prog para que vean:
Código: [Seleccionar]
#include <16f887.h>
#device adc=10
#FUSES XT,NOWDT
#FUSES
#use delay (clock=4000000)
#include <math.h>
#use standard_io(B)


void main(){
   float r;
   int16 dato;

   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);

output_high(pin_b0);


While(True){
      
      set_adc_channel(0);
      delay_us(20);
      dato= read_adc();
      r=1*dato;
    
      switch (r){
      
               case '2'= output_high(pin_b2);
               break;
               case '3'= output_high(pin_b3);
               break;
               case '4'= output_high(pin_b4);
               break;
               case '5'= output_high(pin_b5);
               break;}
}
}
en si la funcion del prog es que deacuerdo a la lectura del canal analogico encienda uno leds pero no logro que funcione....ojala me puedan ayudar y gracias
Título: Re: PIC16F887 problemas con entradas analogicas
Publicado por: Suky en 18 de Mayo de 2011, 19:56:32
Cual es la idea de hacer r=1*dato ? Convertís, por ejemplo, la conversión (Puede ir desde 0 a 1023) 478 a 478.0  :mrgreen: Y después lo comparas con un carácter ascii?

Con una conversión analogica nunca vas a poder hacer lo que pretendes, primero porque por más que coloques 4.000V a la entrada del canal analógico va a estar dando medidas entre 3.95 y 4.05V. Así que lo que debes hacer es definir rangos entre los cuales seleccionar y usar if. Por ejemplo

if((dato>0)&&(dato<100)){
    output_high(pin_b2);
}else{
    output_high(pin_b3);
}


Saludos!
Título: Re: PIC16F887 problemas con entradas analogicas
Publicado por: bmb en 18 de Mayo de 2011, 22:48:58
Hola treur, adicionalmente a lo que te ha dicho Suky, después de cada case no va un signo = sino un signo :
Además, no se si habrás notado que en ningún momento cambias de estado las salidas, ya que solo les das la instrucción output_high(), pero nunca les das output_low().  La cuarta línea del código te sobra: #FUSES.

Saludos!
Título: Re: PIC16F887 problemas con entradas analogicas
Publicado por: treur en 24 de Mayo de 2011, 16:21:16
Muchas gracias por su ayuda por fin pude leer las entradas analogicas, pero el problema que tengo ahora es que al mandar las salidas parpadean constantemente no se si sea por que debo poner una interrupcion o tenga algun problema con el if aqui el codigo espero me puedan ayudar muchas gracias:

Código: [Seleccionar]
#include <16F887.h>
#device adc=10
#FUSES XT,NOWDT
#use delay(clock=4000000)
#include <math.h>
#include <LCD.C>
#Byte TRISA =0x85
#Byte PORTA =0x05
#Byte TRISB =0x86
#Byte PORTB =0x06

void main() {
   int16 q;
   float tv,tr,temp,y,tf,error;                          //Variables ecuaciones
   float p,pr,presion,pres_atm,pres_psi,alt;       //Variables cálculo presión
   TRISB= 0x00;
   
   setup_adc_ports(ALL_ANALOG);  //TODAS ANALOGICAS
   setup_adc(ADC_CLOCK_INTERNAL);
   lcd_init();
   
   While (TRUE) {
      set_adc_channel(0);                       //Lectura presión en voltios
      delay_us(20);
      q = read_adc();
      p = 5.0 * q / 1024.0;
      presion= (0.475+p)/0.045;           //Lectura presión en Kpa
 
      printf(lcd_putc, "\nP1= %f Kpa", PRESION);
      if(presion<=50 && presion>=40)
      bit_set(PORTB,0);
      else bit_clear(PORTB,0);
     
      set_adc_channel(1);                       //Lectura presión en voltios
      delay_us(20);
      q = read_adc();
      tv = 5.0 * q / 1024.0;
      pr= (0.475+tv)/0.045;           //Lectura presión en Kpa
 
      if(pr<=50 && pr>=40)
      bit_set(PORTB,1);
      else bit_clear(PORTB,1);
}
   }
Título: Re: PIC16F887 problemas con entradas analogicas
Publicado por: Suky en 24 de Mayo de 2011, 22:18:05
Utiliza {} para controlar el flujo de tu programa, así estas seguro, más que nada por eso. Y utiliza solo < o > en el if, no >=.


Saludos!