Autor Tema: ADC 16F877  (Leído 2480 veces)

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

Desconectado championx

  • PIC10
  • *
  • Mensajes: 22
ADC 16F877
« en: 08 de Enero de 2006, 23:52:00 »
que tal amigos, tengo un problema con un micro 16F877, no me esta funcionando el conversos A/D aca les dejo el codigo del programa para ver si detectan algun error:

#include <16f877.h>
#device  ADC=10              //10 bits en el ADC



#use delay (clock=20000000) //Modo del oscilador

#fuses XT,NOWDT,NOPROTECT,BROWNOUT,NOLVP,PUT //Modo del oscilador


setup_adc_ports(RA0_RA1_RA2_RA3_RA4); // A0 A1 A2 A3 A4
   setup_adc(adc_clock_internal);

#include <lcd.c>
 
void main()

{


 // Variables del main
   unsigned long temp;
   float celcius;
   unsigned long bat;
   float volt;
   

   lcd_init();            // mandatory
 set_tris_a (0b11111111);   //Ra7-Ra6-Ra5-Ra4-Ra3-Ra2-Ra1-Ra0
 set_tris_b (0b00000000);   //Rb7-Rb6-Rb5-Rb4-Rb3-Rb2-Rb1-Rb0




      while(TRUE)

      {


//Definiciones del hardware
lcd_putc("inicializando..."Giño;
delay_ms(2000);

medicion:

set_adc_channel(0); //canal AN0 para temperatura
delay_ms(50);
temp=read_adc(); // mide la temperatura

celcius=temp/1333.5; //si uso el ao es 1333.3
delay_ms(200);

set_adc_channel(3); //canal AN3 para bateria
delay_ms(50);
bat=read_adc(); // mide el voltage de la bateria
volt=bat/4400.05;



lcd_gotoxy(1,1);
printf(lcd_putc,"Temp in %2.1fc Volt %2.1fv",celcius,volt);

goto medicion;

      }

}

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: ADC 16F877
« Respuesta #1 en: 09 de Enero de 2006, 06:03:00 »
Prueba comentar la linea :

set_tris_a (0b11111111);

Sonrisa Gigante
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: ADC 16F877
« Respuesta #2 en: 09 de Enero de 2006, 06:56:00 »
El set_tris_a no creo que sea un error, aunque se podría obiar.

Más bien los errores podrían ser:

- El fuse para 20MHz es HS no XT.

- Las dos líneas:

setup_adc_ports(RA0_RA1_RA2_RA3_RA4); // A0 A1 A2 A3 A4
setup_adc(adc_clock_internal);

deben de estar en el main.

- La línea setup_adc_ports(RA0_RA1_RA2_RA3_RA4); me parece que no la reconocerá el compilador. Mira el manual y cambia a por ejemplo setup_adc_ports(all_analog)

- La conversión es para 10 bits. Supongo que eso lo habrás tenido en cuenta para los números de los denominadores:

celcius=temp/1333.5;
volt=bat/4400.05;

- Puedes quitar el goto y la etiqueta si metes la inicialización de la lcd fuera del while(1)

Un saludo

Desconectado lovando

  • PIC16
  • ***
  • Mensajes: 193
RE: ADC 16F877
« Respuesta #3 en: 09 de Enero de 2006, 19:17:00 »
Escrito originalmente por championx
que tal amigos, tengo un problema con un micro 16F877, no me esta funcionando el conversos A/D aca les dejo el codigo del programa para ver si detectan algun error:

#include <16f877.h>
#device  ADC=10              //10 bits en el ADC



#use delay (clock=20000000) //Modo del oscilador

#fuses XT,NOWDT,NOPROTECT,BROWNOUT,NOLVP,PUT //Modo del oscilador


setup_adc_ports(RA0_RA1_RA2_RA3_RA4); // A0 A1 A2 A3 A4
   setup_adc(adc_clock_internal);

#include <lcd.c>
 
void main()

{


 // Variables del main
   unsigned long temp;
   float celcius;
   unsigned long bat;
   float volt;
   

   lcd_init();            // mandatory
 set_tris_a (0b11111111);   //Ra7-Ra6-Ra5-Ra4-Ra3-Ra2-Ra1-Ra0
 set_tris_b (0b00000000);   //Rb7-Rb6-Rb5-Rb4-Rb3-Rb2-Rb1-Rb0




      while(TRUE)

      {


//Definiciones del hardware
lcd_putc("inicializando..."Giño;
delay_ms(2000);

medicion:

set_adc_channel(0); //canal AN0 para temperatura
delay_ms(50);
temp=read_adc(); // mide la temperatura

celcius=temp/1333.5; //si uso el ao es 1333.3
delay_ms(200);

set_adc_channel(3); //canal AN3 para bateria
delay_ms(50);
bat=read_adc(); // mide el voltage de la bateria
volt=bat/4400.05;



lcd_gotoxy(1,1);
printf(lcd_putc,"Temp in %2.1fc Volt %2.1fv",celcius,volt);

goto medicion;

      }

}




prueba seteando los canales como:

setup_adc_ports(AN0,AN1,AN2,AN3,AN4) // Como canales analogicos


Pero obviamente dentro del main()


Chavela

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: ADC 16F877
« Respuesta #4 en: 09 de Enero de 2006, 23:28:00 »
Efectivamente. Recien miro el .h y estas son las definiciones que puedes usar:

Codigo:
// Constants used in SETUP_ADC_PORTS() are:
#define NO_ANALOGS                           7    // None
#define ALL_ANALOG                           0    // A0 A1 A2 A3 A5 E0 E1 E2
#define AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF 1    // A0 A1 A2 A5 E0 E1 E2 VRefh=A3    
#define AN0_AN1_AN2_AN3_AN4                  2    // A0 A1 A2 A3 A5          
#define AN0_AN1_AN2_AN4_VSS_VREF             3    // A0 A1 A2 A5 VRefh=A3              
#define AN0_AN1_AN3                          4    // A0 A1 A3
#define AN0_AN1_VSS_VREF                     5    // A0 A1 VRefh=A3
#define AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF 0x08    // A0 A1 A5 E0 E1 E2 VRefh=A3 VRefl=A2    
#define AN0_AN1_AN2_AN3_AN4_AN5           0x09    // A0 A1 A2 A3 A5 E0        
#define AN0_AN1_AN2_AN4_AN5_VSS_VREF      0x0A    // A0 A1 A2 A5 E0 VRefh=A3          
#define AN0_AN1_AN4_AN5_VREF_VREF         0x0B    // A0 A1 A5 E0 VRefh=A3 VRefl=A2          
#define AN0_AN1_AN4_VREF_VREF             0x0C    // A0 A1 A5 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
#define ANALOG_RA3_REF         0x1         //!old only provided for compatibility
#define A_ANALOG               0x2         //!old only provided for compatibility  
#define A_ANALOG_RA3_REF       0x3         //!old only provided for compatibility  
#define RA0_RA1_RA3_ANALOG     0x4         //!old only provided for compatibility
#define RA0_RA1_ANALOG_RA3_REF 0x5         //!old only provided for compatibility
#define ANALOG_RA3_RA2_REF              0x8   //!old only provided for compatibility
#define ANALOG_NOT_RE1_RE2              0x9   //!old only provided for compatibility  
#define ANALOG_NOT_RE1_RE2_REF_RA3      0xA   //!old only provided for compatibility  
#define ANALOG_NOT_RE1_RE2_REF_RA3_RA2  0xB   //!old only provided for compatibility  
#define A_ANALOG_RA3_RA2_REF            0xC   //!old only provided for compatibility  
#define RA0_RA1_ANALOG_RA3_RA2_REF      0xD   //!old only provided for compatibility
#define RA0_ANALOG                      0xE   //!old only provided for compatibility
#define RA0_ANALOG_RA3_RA2_REF          0xF   //!old only provided for compatibility



Un saludo


 

anything