No puedo entender el comportamiento de la salida ADC PIC18F458 en el PUERTO B con LED

0

Recientemente he comenzado a entrometerme con el PIC18f458. A continuación se muestra el código en el que he configurado el adc interno de 10 bits.

#define _XTAL_FREQ 10000000
#include<P18F458.h>
#include <xc.h>
#pragma config OSC=HS
#pragma config WDT=OFF
#pragma config LVP=OFF


void main (void)
{
TRISAbits.TRISA0 = 1;       //Configure RA0 pin on PORTA as Input
TRISB = 0;


//ADC Configuration
ADCON1bits.PCFG3 = 1;       /*Configure AN0 as input channel and select 
ADCON1bits.PCFG2 = 1;          +VREF = VDD = 5V and -VREF = VSS = 0V*/
ADCON1bits.PCFG1 = 1;
ADCON1bits.PCFG0 = 0;
ADCON1bits.ADFM = 0;         //Store 8 bit in ADRESH and 2 bits in ADRESL

ADCON0bits.CHS0 = 0;       // Select AN0 as the input channel
ADCON0bits.CHS1 = 1;
ADCON0bits.CHS2 = 1;

ADCON0bits.ADCS1 = 1;              
ADCON0bits.ADCS0 = 1;

ADCON0bits.ADON = 1;      //Turn ON ADC
PIR1bits.ADIF = 0;        //AD Interrupt Flag
PIE1bits.ADIE = 1;        //Enable AD interrupt
INTCONbits.GIE = 1;       //Enable Global Interrupts

ADCON0bits.GO = 1;        //Start AD Conversion

while(!PIR1bits.ADIF);    
    PIR1bits.ADIF = 0;
while(1)
{

temp = 0;
ADCON0bits.GO = 1;
while(!PIR1bits.ADIF);     //Wait till conversion is completed
PIR1bits.ADIF = 0;        //If completed, clear ADIF bit
PORTB = ADRESH;            //Copy digital data to temp variable
}

He realizado los siguientes cambios dentro del código y, como se recomendó, conecté 8 LED a PORTB para verificar la salida de 8 bits de adc de ADRESH; sin embargo, los LEDS se están comportando de manera extraña. Los primeros 4 LED conectados al PORT - B0, B1, B2 y B3 están ENCENDIDOS constantemente, independientemente de cómo varíe la entrada 10K POT mientras que entre los últimos 3 LEDS, uno sigue parpadeando y el segundo último LED a veces se apaga y enciende mientras se enciende la olla. ¿Alguien puede decirme qué está pasando? ¿Hay algún problema con el código?

Actualmente, también estoy trabajando en la configuración de UART para transmitir estos datos para un mejor análisis. Mientras tanto, cualquier ayuda y orientación con respecto a esto sería apreciada. Gracias a todos.

    
pregunta PsychedGuy

1 respuesta

2

Una forma sencilla de ver el valor de ADRESH podría ser enviarlo a PORTB (configurado como un puerto de salida de 8 bits) y luego monitorear los voltajes en cada pin con un medidor o LED.

Es posible que no funcione porque este código,

while(!PIR1bits.ADIF)    
    PIR1bits.ADIF = 0;

es un bucle que restablece continuamente el indicador de interrupción de ADC hasta que se establece. El problema es que la bandera puede activarse después de la prueba, pero antes de restablecerse, su código se atasca en el bucle. Si logra salir del bucle, entonces el indicador no se restablece y usted lee el resultado del ADC antes de que esté listo.

Lo que quieres es esto: -

while(!PIR1bits.ADIF);   // wait until ADC int flag is set 
PIR1bits.ADIF = 0;       // clear ADC int flag
    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas