Autor Tema: Problema: analogico digital  (Leído 2335 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Problema: analogico digital
« 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.
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Problema: analogico digital
« Respuesta #1 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
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: Problema: analogico digital
« Respuesta #2 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
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Problema: analogico digital
« Respuesta #3 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);
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema: analogico digital
« Respuesta #4 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.
No contesto mensajes privados, las consultas en el foro

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: Problema: analogico digital
« Respuesta #5 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?
 :-/
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Problema: analogico digital
« Respuesta #6 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);
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: Problema: analogico digital
« Respuesta #7 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.
 :-/
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Problema: analogico digital
« Respuesta #8 en: 17 de Mayo de 2009, 20:11:17 »
correcto así es
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: Problema: analogico digital
« Respuesta #9 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.
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema: analogico digital
« Respuesta #10 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í un manual en español que explica todo eso del CCS.
No contesto mensajes privados, las consultas en el foro


 

anything