Ir ao conteúdo
  • Cadastre-se
marcelocolborges

DIFICULDADE EM USAR CONDIÇÕES COM VARIÁVEL ANALOGICA (PIC)

Recommended Posts

Boa noite galera,

 

Estou saindo do mundo do Arduino e me aventurando agora no mundo PIC, e estou tendo problemas quando entro na parte dos sinais analógicos. Como primeiro programa, estou fazendo um projeto até que bastante simples usando o pic 16F88, por ter o conversor AD, onde, quando faço a leitura de um sinal analógico e dependendo do valor ele acende um led (meio bobo por sinal).

Porém quando vou fazer a condição da leitura analógica, ele aparece o erro: "warning: (764) mismatched comparison".

Estou usando o MPLABX  IDE + MPLAB XC8 COMPILER.

Se alguém puder ajudar agradeço.

Segue abaixo o código:

 

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <pic16f88.h>  
 
#define _XTAL_FREQ 4000000      //freq operação 4 Mhz
 
#pragma config FOSC = HS  
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0      // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
 
 
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal External Switchover mode enabled)
 
void inicializa_ADC (void)
{
    ADCON0bits.ADON = 1;
    ADCON0bits.ADCS = 0b11;     //clock derived from the internal A/D module RC oscillator
    ADCON0bits.CHS = 0b000;     //RA0/AN0 como entrada analógica
    ADCON1bits.VCFG = 0b00;     //valor de tensão de refenrencia interna
    ADCON1bits.ADFM = 1;        //Right justified. Six Most Significant bits of ADRESH are read as ‘0’
    ANSELbits.ANS0 = 1;         //BIT ANS0 como entrada analógica
    OSCCONbits.IRCF = 0b110;    //Oscilacao interna do RC para 4 MHz
}
 
float leitura_analogica;
 
void main(void) {
    inicializa_ADC();
    
    
    TRISA=0b11111111;       //todos os pinos do PORTA como entrada
    TRISB=0b00000000;       //todos os pinos do PORTbBcomo entrada
    PORTA=0b00000000;
    PORTB=0b00000000;
    
    #define leitura_analogica  RA0
    #define saida RB7
       
    while(1)
    {
        ADCON0bits.GO_DONE = 1;     //habilita leitura da porta ANS0
        while(GO_DONE);             //só continua quando leitura acabar
        leitura_analogica = ADRESH;
        if(leitura_analogica >= 30)
        {
            saida = 0;
        }else{
           saida = 1;
        }
    }
    
   return;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

um errinho básico. leitura_abalogica foi definda duas vezes e na última como RA0 que é  bit e nunca vai ser >=30

tente com unsigned char. E evite ao máximo trabalhar com floats. Mc de 8 bits os odeiam e por isso cobram "caro" pra trabalhar com eles.

E não te esqueças de definir a entrada analógica como analógica e não digital (acho que já o fez). Passe os olhos pelo d.s.

Compartilhar este post


Link para o post
Compartilhar em outros sites

um errinho básico. leitura_abalogica foi definda duas vezes e na última como RA0 que é  bit e nunca vai ser >=30

tente com unsigned char. E evite ao máximo trabalhar com floats. Mc de 8 bits os odeiam e por isso cobram "caro" pra trabalhar com eles.

E não te esqueças de definir a entrada analógica como analógica e não digital (acho que já o fez). Passe os olhos pelo d.s.

 

Realmente, o erro era realmente a definição da porta RA0 tanto como uma leitura de um resultado tanto como bit.

 

O compilador não apresenta nenhum erro no momento, porém quando vou simular no proteus aparece o erro: "ADC conversion started before 'wait' time has expired following previous conversion or channel change"

Ai eu fiquei na dúvida se o problema está no proteus, compilador ou está no código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×