Autor Tema: Problema C18 y almacenamiento de variable.  (Leído 1082 veces)

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

Desconectado hector915

  • PIC12
  • **
  • Mensajes: 78
    • Blog Personal.
Problema C18 y almacenamiento de variable.
« en: 06 de Septiembre de 2014, 23:38:39 »
Cordial Saludo

Hoy os escribo por que estoy haciendo unas pruebas con un programador Pickit3 el cual adquirí por un amigo  ((:-)) ,
el ejemplo que realizo es una lectura análoga de tres canales  y los guardo en distintas variables (dato0,dato1,dato2),
Cuando realizo el debug paso a paso , puede ver como cambian los bits de los registros asociados al ADCON, la cosa esta que
cuando el valor que queda en ADRESH, lo paso  a dato n pero no queda guardado  :shock: en la variable, el código implementado es el siguiente :

Código: C
  1. #include "fuses.h"
  2. #include <stdio.h>
  3. #include <adc.h>
  4. #include <p18f4550.h>
  5. #include <delays.h>
  6.  
  7. unsigned int dato0,dato1,dato2;
  8. #define  Time Delay10KTCYx(60)
  9.  
  10. //Variables a usar Globales
  11.  
  12. void main(void)
  13. {
  14.  
  15.     TRISA=0XFF;             //PORTA INPUTS
  16.     TRISB=0xFF;             //PORTB OUTPUTS
  17.     TRISC=0X00;
  18.     TRISD=0x00;             //PORTB OUTPUTS
  19.     PORTC=0x00;
  20.     PORTD=0x00;
  21.     PORTB=0x00;             //CLEAN PORTB
  22.  
  23.     //ADC Configs
  24.     ADCON1=0b00001011;      //  Canales AN0,AN1,AN2,AN3 ADCON1:|0|0|VSS(0)|VDD(0)|AN3(1)|AN2(0)|AN1(1)|AN0(1)|
  25.                             //  VSS,VDD 5v / 2^8 = 20mV por numero osea que para 100 = 20mV*1.953125~1.96
  26.     ADCON2=0b00011010;      //  ADCON2: ADFM Left justified(0)|-|6 TAD (0)|6 TAD(1)|6 TAD (1)|FOSC32(0)|FOSC32(1)|FOSC32(0)|
  27.     /*  . . .ADRESH . . : . . ADRESL. . .
  28.         7 6 5 4 3 2 1 0 : 7 6 5 4 3 2 1 0
  29.         X X X X X X X X . X X . . . . . . <-Left Justified
  30.         . . . . . . X X . X X X X X X X X <-Right Justified
  31.      */
  32.     ADCON0=0b00000000;      //  |-|-|CHS3(0)|CHS2(0)| CHS1 (0)| CHS0(0)| GO/DONE | ADON (0) AD DISABLED.
  33.     //when adon=1 , go_done 1 = A/D conversion in progress 0 = A/D Idle
  34.    ADCON0bits.ADON = 0x01;    //Enable A/D module
  35.  
  36.     while(1)
  37.     {
  38.         ADCON0bits.ADON = 0x01;//Enable A/D module
  39.         SetChanADC(ADC_CH0);  //Channel 0
  40.         Delay10TCYx(1);        
  41.         ConvertADC();
  42.         while(BusyADC()==1){}
  43.         dato0=ReadADC();           //I'm reading saving data here, I can see the result in ADRESH, but It can't save the value into the variable O_o !
  44.         Delay10TCYx(1);
  45.  
  46.         SetChanADC(ADC_CH1);  //Seleciono canal.
  47.         Delay10TCYx(1);
  48.         ConvertADC();
  49.         while(BusyADC()==1){}
  50.         dato1=ReadADC();
  51.         Delay10TCYx(1);
  52.  
  53.         SetChanADC(ADC_CH2);  //Seleciono canal.
  54.         Delay10TCYx(1);
  55.         ConvertADC();
  56.         while(BusyADC()==1){}
  57.         dato2=ReadADC();
  58.         Delay10TCYx(1);
  59.  
  60.     }
  61.  
  62. }

Puede alguien ayudarme a revisar este problema :oops: , pues no se por que no quedan almacenados los valores de la conversion adc  :? realizare un vídeo para ver si me pueden ayudar con esta situación de duda.

El video lo he subido en la siguiente url

https://www.youtube.com/watch?v=mowQaq5pvz4
« Última modificación: 07 de Septiembre de 2014, 14:39:28 por hector915 »
if you can imagine it, you can embed it

Desconectado hector915

  • PIC12
  • **
  • Mensajes: 78
    • Blog Personal.
Re: [Solucionado] Problema C18 y almacenamiento de variable.
« Respuesta #1 en: 07 de Septiembre de 2014, 14:39:06 »
Saludos ,
Me autorespondo  ;-)
 :5] Finalmente lo he resuelto pero aun no entiendo por que no funciona con la funcion ReadADC();  :shock: que proporciona el compilador c18, no se si sea un bug de este o es mi codigo.

Las dos situaciones que hay son :
1.
Código: C
  1. adc_result2=ReadADC();
el cual no trabaja por que el dato que me almacena es erroneo.
2.
Código: C
  1. adc_result = ADRESH;
 guarda el dato de adresh, y funciona perfectamente.

al principio pense que era el tipo de dato (unsigned int ), pero despues me puse a revisar la documentacion y era correcto.
El siguiente codigo fue el realizado para hacer la prueba.
Código: C
  1. while(1)
  2.  
  3.   {
  4.  
  5.     adc_result = 0x0000;
  6.     adc_result2 = 0x0000;
  7.     Canal0=0x000;
  8.     ADCON0bits.ADON = 0x01;//Enable A/D module
  9.     SetChanADC(ADC_CH0);  //Seleciono canal.
  10.     Delay10TCYx(1);        
  11.     ConvertADC();
  12.     while(BusyADC()==1){}
  13.     adc_result2=ReadADC();  //it Doesn't Work, sending a ticket to Microchip Devs.
  14.     adc_result = ADRESH;    // This works like a charm.
  15.     Delay10TCYx(1);
  16.  
  17. }

Alguna idea por que no funciona con ReadADC(); ?
if you can imagine it, you can embed it


 

anything