Autor Tema: Problema ADC con pic16f819 y hitech  (Leído 1995 veces)

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

Desconectado el_loco

  • PIC10
  • *
  • Mensajes: 17
Problema ADC con pic16f819 y hitech
« en: 02 de Agosto de 2011, 00:19:24 »
Hola compañeros, antes que nada gracias por brindar su tiempo y conocimientos. Les paso a comentar mi problema, estoy migrando de aca poco del CCS a HITECH y he encontrado un atasco, lo que pretendo es que me muestre en el lcd el maximo valor del conversor ingresando +5V por el canal 0 del ADC o sea 1023 no pido mas que eso, a todo esto estoy simulando con proteus lo que con CCS no he tenido ningun problema. (en otra consulta me dijeron que no tenia que fiar de un simulador). El tamaño del buffer esta bien defino como un arreglo de 10 elementos? cuando le doy play en proteus y el programa corre indefinidamente me muestra en el primer ciclo -10240 y en los ciclos siguientes 0. Les adjunto el codigo por si alguien tiene tiempo y me puede dar una mano. Muchas gracias a todos.

Codigo:

#include "htc.h"
#include <lcd.h>
#include <stdlib.h>
__CONFIG(WDTE_OFF&FOSC_INTOSCIO);   //desabilito el WDT (ver el .h del micro)
                            //FOSC_INTOSCIO: INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin

#define _XTAL_FREQ 8000000         //defino frecuencia para usar con delay
 

void main(void)
{
   OSCCON=0b01110000;  // Oscilador interno 8MHz   
   /*Controla los pines */
   ADCON1=0b00100100;            // bits 7,6: no implementado los lee como 0
                           // bit 5: 1,los 6 bits mas significativos de ADRESH los toma como 0
                           // bit 4: no implementado lo lee como 0
                           // bit 3a0: configuracion del puerto,100:Vref+=VCC,Vref-=VSS,ANO=AN1=AN3=A
                     
   /*Configura el conversor AD*/
   ADCON0=0b00000001;            
                           // bit 7,6: Clock AD,fosc/2
                           // bit 5,3: Canal   
                           // bit 2:go/done (ver)
                           // bit 1: sin implementar
                           // bit 0: adon=1
   
   
   int i;
   unsigned int valor;         
   //float valor;
   char buffer[10];

   
   lcd_init();            //inicio LCD
   lcd_goto(0x00);
   lcd_puts("Cargando soft...");
   
   /*PRUEBA DE IMPRIMIR UN CARACTER EN EL LCD*/
   for(i=0;i<16;i++)
   {
   lcd_goto(0x40+i);         // select first line
   lcd_putch(0xFF);         // imprimo caracter en display
   __delay_ms(100);
   }
   __delay_ms(1000);
   lcd_init();
   lcd_goto(0x00);
   lcd_puts("Tension BAT:");
   
   
   //ADON=1;      //enciendo el ADC
   __delay_ms(10);
   GO_DONE=1;   //GO
   
   
   /* aca va un bucle esperando que el BIT2 GO/DONE se ponga a 0 */
   
   while (GO_DONE!=0)
   valor=((ADRESH<<8)+(ADRESL)); // es un ocho donde sale la carita
      
   __delay_ms(2000);
   
   /*imprimir el valor*/
   itoa(buffer,valor,10);   //convierto variable entera a string, 10 es la base=decimal
   lcd_goto(0x40);
   lcd_puts(buffer);      //imprimo string
   __delay_ms(2000);
   
   
   
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema ADC con pic16f819 y hitech
« Respuesta #1 en: 02 de Agosto de 2011, 09:43:24 »
  El lcd sólo lo tenés que inicializar una vez, así que el segundo lcd_init() lo debés eliminar.

  Para que no aparezca la carita tenés que separar el paréntesis del 8 (ADRESH >> 8 )  ;-)

  Y por otro lado, no hay un bucle infinito haciendo la lectura del ADC constantemente , por lo tanto el ciclo se realiza una sola vez. Tendrías que poner algo así...

Código: C
  1. while (1)
  2. {
  3.   GO_DONE=1;   //GO
  4.   while (GO_DONE!=0)
  5.   valor=( (ADRESH << 8 + (ADRESL) ); // es un ocho donde sale la carita
  6.      
  7.    __delay_ms(2000);
  8.    
  9.    /*imprimir el valor*/
  10.    itoa(buffer,valor,10);   //convierto variable entera a string, 10 es la base=decimal
  11.    lcd_goto(0x40);
  12.    lcd_puts(buffer);      //imprimo string
  13.    __delay_ms(2000);
  14. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado el_loco

  • PIC10
  • *
  • Mensajes: 17
Re: Problema ADC con pic16f819 y hitech
« Respuesta #2 en: 02 de Agosto de 2011, 10:49:09 »
Hola AngelGris, gracias por responder, si ya se que va un while para que haga un bucle infinito pero cuando pongo "play" automaticamente el proteus hace ese bucle sin un while como pegue el codigo, no deberia correr una vez y detenerse?. gracias por responder esos puntos, espero saber porque no me funciona el conversor AD. Un abrazo

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema ADC con pic16f819 y hitech
« Respuesta #3 en: 02 de Agosto de 2011, 19:38:34 »
  No sabría decirte con exactitud que es lo que está pasando. Puede ser un error de proteus o puede ser que al terminar el programa no sepa donde saltar el registro Programm Counter y se reinicie el pic.

  Para forzarlo a que haga un solo ciclo poné al final de tu programa un While (1); y de ese manera el programa hará sólo un ciclo de lectura y luego quedará colgado en el while.
  Siempre que tus programas tengan un solo paso (es decir no un buble infinito) debes terminarlo con un bucle infinito que no haga nada. Para asegurarte que el PIC se "quede allí" porque sino el PC se sigue incrementando y puede llegar a hacer cosas extrañas o reiniciarse el PIC sin que uno quiera que ello ocurra.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything