Autor Tema: pic16f886 ADC  (Leído 2189 veces)

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

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
pic16f886 ADC
« en: 01 de Febrero de 2011, 15:02:34 »
Hola a todos, estoy intentando utilizar el modulo ADC del PIC,estoy simulando con el proteus, y consigo que utilizando el instrumento virtual del proteus el Virtual Terminal, que me muestre el valor de tension que toma por la patilla RA0, esto lo necesito para controlar el valor de V,de  carga/descarga de una Bateria.

Mi problema es con el vitual terminal me aprece el resultado correctamente y con el  hiperterminal me sale solo un simbolo extraño,o se desplaza el cursor sin mostrar valor alguno, este el valor que este en RA0, siempre es el mismo simbolo, he probado la configuracion del hiperterminal con otros programas y funciona,con esta configuracion---BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7--- lo que quiero es utilizar solo el pin RA0 para que me tome el valor, y lo muestre en pantalla,no quiero tener que utilizar otros dos pines como referencia por arriba y referencia por abajo como he visto en otros ejemplos....os adjunto el codigo por si me podeis ayudar.
Gracias.


#include <16F886.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES RC                       //Resistor/Capacitor Osc with CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V

#use delay(clock=2000000)

#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

int16 valor;

void main()
{
   setup_adc_ports(sAN0|VREF_VREF);  //AKI SOLO KIERO USAR RA0
   setup_adc(ADC_CLOCK_DIV_32);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  // setup_wdt(WDT_18MS);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
   do{
   
      delay_ms(100);
      valor = read_adc();
      printf("\r\n Valor: %s",valor);
      printf("\r\n Valor: %c",valor);
      printf("\r\n Valor: %x",valor);
             
//HE PORBADO CON OPCIONES DE PRINTF (%Ld.%u,%Lu) Y NADA   

   }while(TRUE);

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: pic16f886 ADC
« Respuesta #1 en: 01 de Febrero de 2011, 15:30:55 »
Hola ferorts, te falta seleccionar el canal ADC a leer: set_adc_channel(0)  Por otro lado si utilizas:
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

entonces debes utilizar set_tris_x() para cada puerto.

Saludos!

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: pic16f886 ADC
« Respuesta #2 en: 07 de Febrero de 2011, 11:38:08 »
Citar
   do{
   
      delay_ms(100);
      valor = read_adc();
      printf("\r\n Valor: %s",valor);
      printf("\r\n Valor: %c",valor);
      printf("\r\n Valor: %x",valor);
             
//HE PORBADO CON OPCIONES DE PRINTF (%Ld.%u,%Lu) Y NADA   

   }while(TRUE);

yo en ves de utilizar printf para enviarlo por rs232 probraria con putc() o puts(), y yo siempre hago una pausa de 20 uS despues de leer el valo del conversor y antes de entrar al do( )while agregaria
set_adc_channel(0); para seleccionar el canal q deseas leer, y acordate cuando configuras el hiperterminal en windows que el control de flujo se coloca ninguno
pequeñas cositas que pueden ser tontas a mi me llevo mucho entenderlo jejej
saludos-
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo