Ir ao conteúdo
  • Cadastre-se

Conversor AD com PIC16F676


Ir à solução Resolvido por Lucas Pereira de Souza,

Posts recomendados

Olá pessoa,l eu venho trabalhando em um voltimetro, porém, encontrei dificuldades com o vonversor AD, eu ja configurei, porntanto, o meu programa não funcionou queria saber se alguem pode me ajudar....

 

veja o código:

 

 

// Projeto com crystal de 20mhZ
// TOSC = 1/FOSC
// FOSC: Frequêcia do oscilador
// TOSC: Oscilador interno
// Formula para o timer  Tempo_requerido = (4)*[(1)/(FOSC)]*Prescaler*(8bits_our_16bits - Carga_do_timer)

// Cálculos para este projeto

// Ciclo de maquina = (1/20mhZ)*4 = 200*10^-9S ou 0,2uS//200uS

// 500000*10^-6 = (0,2*10^-6)*(8)*(65536 - Q)


//Voltimetro de Bancada

#include <stdio.h>
#include <stdlib.h>
#include <pic16f676.h>
#include <delays.h>
#include <xc.h>


// CONFIG
#pragma config FOSC = HS            // Oscillator Selection bits (HS oscillator: High speed crystal/resonator on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN)
#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          // RA3/MCLR pin function select (RA3/MCLR pin function is MCLR)
#pragma config BOREN = OFF          // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF             // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF            // Data Code Protection bit (Data memory code protection is disabled)

#define A   PORTAbits.RA0
#define B   PORTCbits.RC0
#define C   PORTCbits.RC1
#define D   PORTCbits.RC2
#define Q1  PORTCbits.RC3
#define Q2  PORTCbits.RC4
#define Q3  PORTCbits.RC5


void interrupt  interrup(void)   // Interrupção de Alta Prioridade
{
    //PIR1bits.TMR1IF = 0;
   // PIR1bits.T1IF = 0;
}

void Configura_AD();
void bank(int num);                     //Protótipo da função do banco para acesso do banco da memório
void delay_mS_125();                    //Protótipo da função Timer1 125mS
void delay_ms_5();                      //Protótipo da função Timer1 5mS
void pic_init();                        //Protótipo para iniciar o pic
void Dysplay_7_segmentos(char digito);  //Protótipo para display
void var_dysplay(char var);

int main()                          //Programa principal
{
    float long tensão = 0;
    pic_init();                     //Iniciar configurações do PIC
    Configura_AD();

   while(1)
   {

    float long Result_AD;
    ADCON0bits.GO = 1;
    ADCON0bits.GO_DONE = 1;
    ADCON0bits.GO_nDONE = 1;
    while(ADCON0bits.GO);
    //while(ADCON0bits.GO_DONE);
    //while(ADCON0bits.GO_nDONE);
    Result_AD = (((char)ADRESH)<<8)|(ADRESL);
    Result_AD = tensão;
    tensão = tensão*5.0/1023;

      if (tensão > 2.5)
      {
       //Dysplay_7_segmentos(2);
       Q1 = 1;
       delay_ms_5();
       Q1 = 0;
      }
      else
      {
          //Dysplay_7_segmentos(4);
          Q2 = 1;
          delay_ms_5();
          Q2 = 0;
      }
    
     
   }

}

void bank(int num)
{
    //Banco 0
    if(num == 0)
    {
        STATUSbits.RP0 = 0;
    }
    //Banco 1
    else if(num == 1)
    {
        STATUSbits.RP0 = 1;
    }
}
void delay_mS_125()
{
       //start
       TMR1H = 0x31;                   //Timer 1 para 125mS
       TMR1L = 0x2D;
       T1CONbits.TMR1ON = 1;
       while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);
       T1CONbits.TMR1ON = 0;
       PIR1bits.TMR1IF = 0;
       PIR1bits.T1IF = 0;
       TMR1H = 0x00;                  
       TMR1L = 0x00;
}
void delay_ms_5()
{
       //start
       TMR1H = 0xF3;                   //Timer 1 para 125mS
       TMR1L = 0xCA;
       T1CONbits.TMR1ON = 1;
       while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);
       T1CONbits.TMR1ON = 0;
       PIR1bits.TMR1IF = 0;
       PIR1bits.T1IF = 0;
       TMR1H = 0x00;
       TMR1L = 0x00;
}
void pic_init()
{
    CMCON = 0b00000111;
    bank(1);
    TRISA = 0x00;
    TRISC = 0x00;
    bank(0);
    //TIMER1
    INTCONbits.GIE = 1;             //GIE:Global Habilitar Interrupção bit
    INTCONbits.PEIE = 1;            //Habilitar Interrupção bit Peripheral
    //PIE1 ? PERIPHERAL INTERRUPT ENABLE REGISTER 1 (ADDRESS: 8Ch)
    PIE1bits.TMR1IE = 0;            //TMR1 Overflow Interrupt Enable bit
    PIE1bits.T1IE = 0;
    //PIR1 ? PERIPHERAL INTERRUPT REGISTER 1 (ADDRESS: 0Ch)
    PIR1bits.TMR1IF = 0;            //TMR1IF: TMR1 Overflow Interrupt Flag bit
    PIR1bits.T1IF = 0;
    //T1CON ? TIMER1 CONTROL REGISTER (ADDRESS: 10h)
    T1CONbits.T1CKPS0 = 1;
    T1CONbits.T1CKPS1 = 1;          //T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits
    T1CONbits.TMR1CS = 0;           //TMR1CS: Timer1 Clock Source Select bit
    T1CONbits.TMR1ON = 0;           //TIMER 1 DESABILITADO
    //TMR1H = 0x31;                   //Timer 1 para 125mS
    //TMR1L = 0x2D;
    T1CONbits.TMR1ON = 0;
}

void Dysplay_7_segmentos(char digito)
{
    switch(digito)
    {
        case 0:
            A=0;B=0;C=0;D=0;
            break;
        case 1:
            A=1;B=0;C=0;D=0;
            break;
        case 2:
            A=0;B=1;C=0;D=0;
            break;
        case 3:
            A=1;B=1;C=0;D=0;
            break;
        case 4:
            A=0;B=0;C=1;D=0;
            break;
        case 5:
            A=1;B=0;C=1;D=0;
            break;
        case 6:
            A=0;B=1;C=1;D=0;
            break;
        case 7:
            A=1;B=1;C=1;D=0;
            break;
        case 8:
            A=0;B=0;C=0;D=1;
            break;
        case 9:
            A=1;B=0;C=0;D=1;
            break;
    }
}
void Configura_AD()
{
   
    ANSEL = 0b00000010;         // APENAS PORTA1 COMO ANALÓGICA
    ADCON0bits.VCFG = 0;        // Tensão de referencia di PIC
    ADCON0bits.CHS0 = 1;        //Selecionando canal 1
    ADCON0bits.CHS1 = 0;
    ADCON0bits.CHS2 = 0;
    ADCON0bits.ADON = 1;        //Conversor desligado
    ADCON1bits.ADCS0 = 0;       //FOSC/2
    ADCON1bits.ADCS1 = 0;
    ADCON1bits.ADCS2 = 0;
    ADCON0bits.ADFM = 1;        //Justificado para Direita  
}

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

sorry por não analisar o código todo. "não funcionou" tá muito vago. Qual parte não funcionou mesmo? Se auto-responda-se a si próprio.

 

Sugiro por partes.

 

0°: pisca led: etapa inqueimável!!

1°: escreva uma variável qualquer no display. (ou algum número qualquer). Entenda o processo todo

2°: leia com sucesso e coerência o resultado ad numa variável qualquer. Entenda o processo todo

3°: 2° + 1°

 

abç e sucessos!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução

sorry por não analisar o código todo. "não funcionou" tá muito vago. Qual parte não funcionou mesmo? Se auto-responda-se a si próprio.

 

Sugiro por partes.

 

0°: pisca led: etapa inqueimável!!

1°: escreva uma variável qualquer no display. (ou algum número qualquer). Entenda o processo todo

2°: leia com sucesso e coerência o resultado ad numa variável qualquer. Entenda o processo todo

3°: 2° + 1°

 

abç e sucessos!

aí valeu por tentar ajudar eu,

 

Fiquei se matando aqui até conseguir puts alegria consegui configurar o conversor AD, quando eu terminar o projetinho do voltimetro vou postar ele no forum para a galera ver veja como o código ficou polido agora:

 

// Voltimetro de Bancada digital

// Autor: Lucas Pereira de Souza Pinto   DATA: 21/04/2015

// Projeto com crystal de 20mhZ

// TOSC = 1/FOSC

// FOSC: Frequêcia do oscilador

// TOSC: Oscilador interno

// Formula para o timer  Tempo_requerido = (4)*[(1)/(FOSC)]*Prescaler*(8bits_our_16bits - Carga_do_timer)

// Cálculos para este projeto

// Ciclo de maquina = (1/20mhZ)*4 = 200*10^-9S ou 0,2uS//200uS

// 500000*10^-6 = (0,2*10^-6)*(8)*(65536 - Q)

//Include

#include <stdio.h>

#include <stdlib.h>

#include <pic16f676.h>

//#include <xc.h>

#define _XTAL_FREQ 20000000         // cristal de 20 Mhz

//#define delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))

//define delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

//CONFIG

#pragma config FOSC = HS            // Oscillator Selection bits (HS oscillator: High speed crystal/resonator on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN)

#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          // RA3/MCLR pin function select (RA3/MCLR pin function is MCLR)

#pragma config BOREN = OFF          // Brown-out Detect Enable bit (BOD disabled)

#pragma config CP = OFF             // Code Protection bit (Program Memory code protection is disabled)

#pragma config CPD = OFF            // Data Code Protection bit (Data memory code protection is disabled)

//Definições

#define A       PORTCbits.RC0

#define B       PORTCbits.RC1

#define C       PORTCbits.RC2

#define D       PORTCbits.RC3

#define Q1      PORTCbits.RC4

#define LED     PORTCbits.RC5

//Protótipos de Funções

void bank(char num);                     //Protótipo da função do banco para acesso do banco da memória

void delay_mS_125();                     //Protótipo da função Timer1 125mS

void delay_ms_5();                       //Protótipo da função Timer1 5mS

void delay_ms_1();                       //Protótipo da função Timer1 1mS

void pic_init();                         //Protótipo para iniciar o pic

void config_AD();                        //Protótipo para configurar conversor AD

int  read_AD();                          //Protótipo para conversão AD

void Dysplay_7_segmentos(char digito);   //Protótipo para display 7 Segmentos

void interrupt  interrup(void)           // Vetor nterrupção

{

}

int main()

{

    pic_init();                         //START PIC

    config_AD();                        //CONFIG AD

    float var = 0;                     //VARIAVEl GLOBAL

    while(1)

    {   

        var = ((float)read_AD());

        var = var*5;

        var = var/1023;

        if(var > 2.5)

        {

            LED = 1;

        }

        else

        {

            LED = 0;

        }

    }//End_while

}//End_main

//Trabalhos das funções

void delay_mS_125()

{

       //start

       TMR1H = 0x31;                   //Timer 1 para 125mS

       TMR1L = 0x2D;

       T1CONbits.TMR1ON = 1;

       while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);

       T1CONbits.TMR1ON = 0;

       PIR1bits.TMR1IF = 0;

       PIR1bits.T1IF = 0;

       TMR1H = 0x00;

       TMR1L = 0x00;

}

void delay_ms_5()

{

       //start

       TMR1H = 0xF3;                   //Timer 1 para 5mS

       TMR1L = 0xCA;

       T1CONbits.TMR1ON = 1;

       while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);

       T1CONbits.TMR1ON = 0;

       PIR1bits.TMR1IF = 0;

       PIR1bits.T1IF = 0;

       TMR1H = 0x00;

       TMR1L = 0x00;

}

void delay_ms_1()

{

       //start

       TMR1H = 0xFF;                   //Timer 1 para 5mS

       TMR1L = 0xC1;

       T1CONbits.TMR1ON = 1;

       while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);

       T1CONbits.TMR1ON = 0;

       PIR1bits.TMR1IF = 0;

       PIR1bits.T1IF = 0;

       TMR1H = 0x00;

       TMR1L = 0x00;

}

void pic_init()

{

        CMCON = 0b00000111;             //Desliga todos os comparadores

        bank(1);                        //Seleciona banco 1 da memória

        TRISA = 0b00000001;             //RA0 como entrada e as demais como saída

        TRISC = 0x00;                   //PORTC todos como saída

        bank(0);                        //Seleciona banco 0 da memória

        //TIMER1

        INTCONbits.GIE = 1;             //GIE:Global Habilitar Interrupção global

        INTCONbits.PEIE = 1;            //Habilitar Interrupção periférico

        //PIE1 ? PERIPHERAL INTERRUPT ENABLE REGISTER 1 (ADDRESS: 8Ch)

        PIE1bits.TMR1IE = 0;            //TMR1 Desabilitar estouro do Timer1

        PIE1bits.T1IE = 0;

        //PIR1 ? PERIPHERAL INTERRUPT REGISTER 1 (ADDRESS: 0Ch)

        PIR1bits.TMR1IF = 0;            //TMR1IF: TMR1 Flag de estouro

        PIR1bits.T1IF = 0;

        //T1CON ? TIMER1 CONTROL REGISTER (ADDRESS: 10h)

        T1CONbits.T1CKPS0 = 1;          //T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits

        T1CONbits.T1CKPS1 = 1;          //T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits

        T1CONbits.TMR1CS = 0;           //TMR1CS: Timer1 Clock Source Select bit

        T1CONbits.TMR1ON = 0;           //TIMER 1 DESABILITADO

        T1CONbits.TMR1ON = 0;           //TIMER 1 OFF

}

void Dysplay_7_segmentos(char digito)

{

    switch(digito)

    {

        case 0://escreve 0

            A=0;B=0;C=0;D=0;

            break;

        case 1://escreve 1

            A=1;B=0;C=0;D=0;

            break;

        case 2://escreve 2

            A=0;B=1;C=0;D=0;

            break;

        case 3://escreve 3

            A=1;B=1;C=0;D=0;

            break;

        case 4://escreve 4

            A=0;B=0;C=1;D=0;

            break;

        case 5://escreve 5

            A=1;B=0;C=1;D=0;

            break;

        case 6://escreve 6

            A=0;B=1;C=1;D=0;

            break;

        case 7://escreve 7

            A=1;B=1;C=1;D=0;

            break;

        case 8://escreve 8

            A=0;B=0;C=0;D=1;

            break;

        case 9://escreve 9

            A=1;B=0;C=0;D=1;

            break;

    }

}

void bank(char num)

{

    //Banco 0

    if(num == 0)

    {

        STATUSbits.RP0 = 0;

    }

    //Banco 1

    else if(num == 1)

    {

        STATUSbits.RP0 = 1;

    }

}

void config_AD()

{

    //CONFIGURAÇÃO DO REGISTRADOR ADCON0

    ADCON0bits.ADFM = 1;        //Justificar resultado para direita

    ADCON0bits.VCFG = 0;  //Tensão de referência do pic padrão 5V

    ADCON0bits.CHS0 = 0; //Seleção do canal (AN0)

    ADCON0bits.CHS1 = 0; //Seleção do canal (AN0)

    ADCON0bits.CHS2 = 0; //Seleção do canal (AN0)

    ADCON0bits.ADON = 1; //Conversor Analógico - Digital ligado

    //CONFIGURAÇÃO DO REGISTRADOR ADCON1

    ADCON1bits.ADCS0 = 1; //Clock do conversor analógico digital FOSC/8

    ADCON1bits.ADCS1 = 0; //Clock do conversor analógico digital FOSC/8

    ADCON1bits.ADCS2 = 0; //Clock do conversor analógico digital FOSC/8

    //CONFIGURAÇÃO DO REGISTRADOR ANSEL

    ANSELbits.ANS0 = 1;     //Apenas RA0 como analógica

    ANSELbits.ANS1 = 0;     //Apenas RA0 como analógica

    ANSELbits.ANS2 = 0;     //Apenas RA0 como analógica

    ANSELbits.ANS3 = 0;     //Apenas RA0 como analógica

    ANSELbits.ANS4 = 0;     //Apenas RA0 como analógica

    ANSELbits.ANS5 = 0;     //Apenas RA0 como analógica

    ANSELbits.ANS6 = 0;     //Apenas RA0 como analógica

    ANSELbits.ANS7 = 0;     //Apenas RA0 como analógica

    //CONFIGURAÇÃO DO REGISTRADOR PIE1

    PIE1bits.ADIE = 0;      //Interrupçao do para conversor A/D desligado

    //CONFIGURAÇÃO DO REGISTRADOR PIR1

    PIR1bits.ADIF = 0;      //Flag de interrupção para conversor A/D, limpa por software  

}

int read_AD()

{

    int result_AD;                              //Declaração variavel local

    ADCON0bits.GO = 1;                          //Inicia conversão

    while(ADCON0bits.GO);                       //aguarda conversão

    delay_ms_1();                               //delay_1ms

    result_AD = (((int)ADRESH)<<8)|(ADRESL);    //Obtem o valor da conversão

    return result_AD;                           //Retorna para result_AD

}

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!