Problema de la variable Globlal: Pic18f4550 y depuración Pickit3

0

Estoy trabajando en un proyecto que incluye el uso del módulo convertidor A / D en el microcontrolador (pic18f4550). No he tenido ningún problema en el pasado con el microcontrolador que utiliza un programador pickit3 para el proceso de depuración.

El problema surge cuando estoy en el proceso de depuración ya que sé que el valor del convertidor ADC puede ser almacenado en ADRESH en mi caso (Justificación a la izquierda), después de eso quiero guardar este resultado de manera simple variable, cuando hago este proceso, el resultado del convertidor ADC no se guarda correctamente, lo que da un resultado poco frecuente.

Se implementó el siguiente código, también he hecho un video para reproducir el problema.

#include "fuses.h"
#include <stdio.h>
#include <adc.h>
#include <p18f4550.h>
#include <delays.h>

int Canal0,dato1,dato2; 
#define  Time Delay10KTCYx(60)

void main(void)

{ 

TRISA=0XFF;             //PORTA INPUTS
TRISB=0xFF;             //PORTB OUTPUTS
TRISC=0X00;
TRISD=0x00;             //PORTB OUTPUTS
PORTC=0x00;
PORTD=0x00;
PORTB=0x00;             //CLEAN PORTB

 //ADC Configs
ADCON1=0b00001011;      //  Canales AN0,AN1,AN2,AN3 ADCON1:|0|0|VSS(0)|VDD(0)|AN3(1)|AN2(0)|AN1(1)|AN0(1)|
                        //  VSS,VDD 5v / 2^8 = 20mV por numero osea que para 100 = 20mV*1.953125~1.96
ADCON2=0b00011010;      //  ADCON2: ADFM Left justified(0)|-|6 TAD (0)|6 TAD(1)|6 TAD (1)|FOSC32(0)|FOSC32(1)|FOSC32(0)|
/*  . . .ADRESH . . : . . ADRESL. . .
    7 6 5 4 3 2 1 0 : 7 6 5 4 3 2 1 0
    X X X X X X X X . X X . . . . . . <-Left Justified
    . . . . . . X X . X X X X X X X X <-Right Justified
 */
ADCON0=0b00000000;      //  |-|-|CHS3(0)|CHS2(0)| CHS1 (0)| CHS0(0)| GO/DONE | ADON (0) AD DISABLED.
//when adon=1 , go_done 1 = A/D conversion in progress 0 = A/D Idle
ADCON0bits.ADON = 0x01;    //Enable A/D module

while(1)
{
    Canal0=0;
    //blinker();          //STATUS
    ADCON0bits.ADON = 0x01;//Enable A/D module
    SetChanADC(ADC_CH0);  //Seleciono canal.
    Delay10TCYx(1);         
    ConvertADC();
    while(BusyADC()==1){}
    dato0=ReadADC();
    Delay10TCYx(1);

    SetChanADC(ADC_CH1);  //Seleciono canal.
    Delay10TCYx(1); 
    ConvertADC();
    while(BusyADC()==1){}
    dato1=ReadADC();
    Delay10TCYx(1);

    SetChanADC(ADC_CH2);  //Seleciono canal.
    Delay10TCYx(1);
    ConvertADC();
    while(BusyADC()==1){}
    dato2=ReadADC();
    Delay10TCYx(1);

}

}

¿Cuál podría ser el problema? Si el módulo convertidor de ADC está configurado correctamente y el proceso de lectura es correcto, tal vez el problema sea el tipo de datos.

    SetChanADC(ADC_CH0);  //Channel
    Delay10TCYx(1);
    ConvertADC();          //Begin convertion
    while(BusyADC()==1){}  //Convertion in progress.
    dato2=ReadADC();       //Move the adresh result to the variable. unsigned int
    Delay10TCYx(1);

El video es: aquí

    
pregunta c1b3r

3 respuestas

0

Por supuesto. Observe que no uso una biblioteca ADC. Tal vez debería intentar leer el valor de ADC sin usar la biblioteca y ver si funciona.

    //confifure A/D-module
void adc_module_setup() {
    ADCON0bits.ADRMD = 0;           //12 bits result
    ADCON0bits.CHS = 0b01010;       //analog channel select
    ADCON0bits.GO_nDONE = 0;        //ADC conversion completed/not in progress

ADCON1bits.ADFM = 1;            //2's complement format
ADCON1bits.ADCS = 0b101;        //ADC conversion clock; 101 => Fosc/16
ADCON1bits.ADNREF = 0;          //negative voltage reference; 0 => Vss
ADCON1bits.ADPREF = 0b00;       //positive voltage reference; 00 => Vdd

ADCON2bits.CHSN = 0b1111;
ADCON0bits.ADON = 1;            //ADC enabled

}

// función para leer el resultado de ADC y devolver el valor

unsigned int read_analog_value (unsigned char channel) {

ADRESH = 0x00; ADRESL = 0x00; unsigned int adc_result; adc_result = 0x0000; ADCON0bits.CHS = channel; __delay_us(10); //acquisition time ADCON0bits.GO_nDONE = 1; //start conversion while(ADCON0bits.GO_nDONE) { } //conversion busy adc_result = ADRESH; adc_result <<= 8; adc_result |= ADRESL; PIR1bits.ADIF = 0; //clear interrupt flag ADCON0bits.GO_nDONE = 0; //clear GO_nDONE return adc_result;

}

    
respondido por el maikel
0

No estoy muy familiarizado con la biblioteca ADC, pero ¿has intentado usar un entero sin signo? Actualmente también estoy trabajando en un proyecto que utiliza el convertidor A / D y no tengo ningún problema (pic16f1788).

    
respondido por el maikel
0

Hola, he leído y entiendo tu código, es el mismo enfoque que mi código, sin embargo, noté que usas: adc_result = ADRESH; para guardar el resultado.

Lo pruebo y funciona como un hechizo y me pregunto por qué este adc_result2 = ReadADC (); no funciona si la función está documentada en la documentación de las bibliotecas de Microchip int ReadADC (void) debería ser trabajo O_ó, parece que un error de la biblioteca adc.h está presente aquí.

El siguiente código funciona correctamente con el depurador:

 while(1)

  {

    adc_result = 0x0000;
    adc_result2 = 0x0000;
    Canal0=0x000;
    ADCON0bits.ADON = 0x01;//Enable A/D module
    SetChanADC(ADC_CH0);  //Seleciono canal.
    Delay10TCYx(1);         
    ConvertADC();
    while(BusyADC()==1){}
    adc_result2=ReadADC();  //it Doesn't Work, sending a ticket to Microchip Devs.
    adc_result = ADRESH;    // This works like a charm.
    Delay10TCYx(1);

}

Gracias por su apoyo.

    
respondido por el c1b3r

Lea otras preguntas en las etiquetas