Autor Tema: PIC16F887 problemas con entradas analogicas  (Leído 3149 veces)

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

Desconectado treur

  • PIC10
  • *
  • Mensajes: 2
PIC16F887 problemas con entradas analogicas
« 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
« Última modificación: 18 de Mayo de 2011, 19:31:28 por treur »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PIC16F887 problemas con entradas analogicas
« Respuesta #1 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!
No contesto mensajes privados, las consultas en el foro

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: PIC16F887 problemas con entradas analogicas
« Respuesta #2 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!

Desconectado treur

  • PIC10
  • *
  • Mensajes: 2
Re: PIC16F887 problemas con entradas analogicas
« Respuesta #3 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);
}
   }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PIC16F887 problemas con entradas analogicas
« Respuesta #4 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!
No contesto mensajes privados, las consultas en el foro