TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: juansi en 17 de Mayo de 2009, 17:40:22

Título: Problema: analogico digital
Publicado por: juansi en 17 de Mayo de 2009, 17:40:22
Estoy aprendiendo lo de analogico y he hecho un programilla y no se q es lo q falla, me podriais aconsejar?
aqui esta el codigo:

#include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include<lcd.c>

int i=0x00;

void main()
{
do{
  setup_adc(ADC_CLOCK_INTERNAL);
  setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
  disable_interrupts(global);
   
  set_adc_channel(0);
  delay_ms(1);
  i=read_adc();
  delay_ms(1);

  printf(lcd_putc,"%u",i);
  delay_ms(1000);
}while(true);
}

gracias de antemano.
Título: Re: Problema: analogico digital
Publicado por: QIQE en 17 de Mayo de 2009, 17:51:54
no tienes ninguna función que sea LCDINIT () o algo asi para arrancar la lcd??

danos mas datos...

prueba primero solo la lcd y luego añade el puerto analógico
Título: Re: Problema: analogico digital
Publicado por: juansi en 17 de Mayo de 2009, 18:22:38
perdon este es el codigo:

#include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include<lcd.c>

int i=0x00;

void main()
{
lcd_init();
do{
  setup_adc(ADC_CLOCK_INTERNAL);
  setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
  disable_interrupts(global);
   
  set_adc_channel(0);
  delay_ms(1);
  i=read_adc();
  delay_ms(1);
 
  lcd_gotoxy(1,1);
  printf(lcd_putc,"%u",i);
  delay_ms(1000);
}while(true);
}


lo que me pasa es q el valor de i al mostrarlo en la lcd siempre es 0.
que hago mal???
gracias por la ayuda
Título: Re: Problema: analogico digital
Publicado por: QIQE en 17 de Mayo de 2009, 18:39:34
has medido la tensión de referencia de RA3??, puede ser que ese pin lo tengas a 0 y por eso no mida bien, si no necesitas referencia, cambia la comfiguración d ela linea setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
Título: Re: Problema: analogico digital
Publicado por: Suky en 17 de Mayo de 2009, 19:32:09
Ese ejemplo mejor organizado seria de la siguiente manera:
Código: C
  1. #include <16F876A.h>
  2. // Indica cuantos bits se utilizan el conversion
  3. #device adc=8
  4.  
  5. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
  6. #use delay(clock=4000000)
  7. #define use_portb_lcd TRUE
  8. #include <lcd.c>
  9.  
  10. int i=0x00;
  11.  
  12. void main()
  13. {
  14.    setup_adc_ports(AN0_AN1_VSS_VREF);
  15.    setup_adc(ADC_CLOCK_INTERNAL);
  16.    set_adc_channel(0);
  17.    delay_us(30);
  18.    do{
  19.       i=read_adc();
  20.       // Se puede reemplazar por lcd_putc("\f");
  21.       lcd_gotoxy(1,1);
  22.       printf(lcd_putc,"%u",i);
  23.       delay_ms(1000);
  24.    }while(true);
  25. }

Fíjate que le agregue la instrucción #device adc=8 y saque del bucle lo que no es necesario volver a configurar. Estas usando Referencia externa así que verificalo como ha dicho QIQE.
Título: Re: Problema: analogico digital
Publicado por: juansi en 17 de Mayo de 2009, 19:52:26
gracias quique y suky, ya me funciona, ¿pero como defino la variable i si quiero q la conversion sea de 10 bits?
 :-/
Título: Re: Problema: analogico digital
Publicado por: QIQE en 17 de Mayo de 2009, 19:56:09
en #device adc=8 en vez de 8 adivinalo jejee si lo cambias por un 10 y así será de 10 bits el conversor

Cuando declaras la variable i en vez d eser int la declaras como int16 así será de 16 bits

y el printf lo debes de modificar de la siguiente manera

printf(lcd_putc,"%lu",i);
Título: Re: Problema: analogico digital
Publicado por: juansi en 17 de Mayo de 2009, 20:09:09
gracias ya va de lujo.
solo me fallaba lo de " %lu ", deduzco q es para variables de 16 bits.¿estoy en lo cierto?
gracias de nuevo.
 :-/
Título: Re: Problema: analogico digital
Publicado por: QIQE en 17 de Mayo de 2009, 20:11:17
correcto así es
Título: Re: Problema: analogico digital
Publicado por: juansi en 21 de Mayo de 2009, 09:02:09
otra dudilla:
puedo configurar parte del puerto a como analogico y otra digital???
¿como seria?
¿quizas usando?       #use fast_io
la cuestion es q necesito usar un pin como analogico y dos o tres como digitales.
gracias de antemano.
Título: Re: Problema: analogico digital
Publicado por: Suky en 21 de Mayo de 2009, 10:52:25
Código: [Seleccionar]
Si se puede, pégale una miradita al datasheet del PIC.

[code=]// Constants used in SETUP_ADC_PORTS() are:
#define NO_ANALOGS                           7    // None
#define ALL_ANALOG                           0    // A0 A1 A2 A3 A4         
#define AN0_AN1_AN2_AN4_VSS_VREF             3    // A0 A1 A2 A4 VRefh=A3             
#define AN0_AN1_AN3                          4    // A0 A1 A3
#define AN0_AN1_VSS_VREF                     5    // A0 A1 VRefh=A3
#define AN0_AN1_AN4_VREF_VREF             0x08    // A0 A1 A4 VRefh=A3 VRefl=A2             
#define AN0_AN1_VREF_VREF                 0x0D    // A0 A1 VRefh=A3 VRefl=A2
#define AN0                               0x0E    // A0
#define AN0_VREF_VREF                     0x0F    // A0 VRefh=A3 VRefl=A2

Para tu caso iría solamente:
setup_adc_ports(AN0);

#use fast_io(a) se refiere a como el compilador va a utilizar la configuración de puerto. Usándolo el compilador da como hecho la configuración del tris del puerto. En cambio dejándolo como default, al escribir/leer un puerto, el compilador configura el tris antes de la operación. Aquí (http://infopic-suky.blogspot.com/2009/04/lenguajes-de-programacion.html) un manual en español que explica todo eso del CCS.