Ir ao conteúdo
  • Cadastre-se

Voltimetro e Amperimetro no PIC18f452 baseado no C18 Compiler


MezaqueJr1985

Posts recomendados

]

Olá pessoal

Vi muito tópicos sobre voltímetro e amperímetro aqui no CBH. Eu comecei o projeto usando o CCS C compiler e consegui fazer funcionar, mas tive problemas na hora de gravar o microcontrolador. Agora resolvi usar o C18 compiler e consegui fazer um led pisca ^^. Gravei e funcionou perfeitamente. Agora estou tentando programar nessa sintaxe mais ela é bem diferente do CCS C e estou tomando um surra feia do bichano aqui.

Eu estudei o datasheet do pic 18f452 e estou com dificuldade em entender como configura o ADCON0 E o ADCON1.

Eu estou usando o:

MPLAB v8.83

MCC v3.40

E para simulação o proteus 7.7.

Entendi que tenho q fazer algo como:

C18
ADCON0= 0b00000000 // seleciono o canal. NO caso eu quero um canal para medir a tensão e outro pra medir a corrente.


CCS C
SET_ADC_CHANNEL(0); // seleciona o canal 0
.
.
SET_ADC_CHANNEL(1); // seleciona o canal 1.

Como faço isso no C18?

Estou usando um pic18f452

Cristal externo de 4Mhz

Vref = VDD e Vss (5v-0v)

No datasheet vi que para selecionar os canal 0 e 1 é algo assim:

bit 5-3 CHS2:CHS0: Analog Channel Select bits
000 = channel 0, (AN0)
001 = channel 1, (AN1)
....

Eu fiz um robozinho com todos os materiais que encontrei nos blogs e foruns e ficou mais ou menos assim:

Nome do arquivo: firmware voltag meter.c

Data: 01 de fevereiro de 2012

Versao: 1.0

MPLAB IDE: v8.83

MCC v3.40

Autor: Mezaque Lima

*********************************************************************/
#include <p18f452.h> //Diretiva de compilação.
#include <delays.h> //Diretiva de compilação.
#include <stdio.h> //Diretiva de compilação.
#include <adc.h> //Diretiva de compilação.
#pragma config OSC = HS //Configuração do oscilador à cristal.
#pragma config WDT = OFF //Desabilita o Watchdog Timer (WDT).
#pragma config PWRT = OFF //Habilita o Power-up Timer (PWRT).
#pragma config BOR = ON //Brown-out Reset (BOR) habilitado somente no hardware.
#pragma config LVP = OFF //Desabilita o Low Voltage Program.
#define ADC = 10 //Configura o compilador para trabalhar com A/D 10 bits

//********************************************************************
//protótipos de funções
void Inic_Regs (void);
void Configura_AD (void);
int Conv_AD (void);


//********************************************************************
//variáveis globais
//int ???? [?];
//float ?? [?];
//********************************************************************
//definições

#define result_A PORTBbits.RB0 //Defini o portbit RB0 com o nome de result_A.
//#define ???????? PORTCbits.RC1
//********************************************************************
void main(void){ //função main

int valortensao; //
float tensão=0, AD_Result=0; //declaração de variável local inicializada
//**********************************
Inic_Regs (); //configurar SFRs
//**********************************/
Configura_AD();
//**********************************
//rotina principal
while (1){
Delay10KTCYx( 50);
ConvertADC(); //inicializa a conversão
while( BusyADC() ); //Espera a conversão do ADC
valortensao = ReadADC(); // Lê o resultado e coloca na variavel valortensao
CloseADC(); //Disable A/D converter
tensão = (valortensao * 0.0048828125);
if(tensão >= 4.5 && tensão <= 5.5) //Se a tensão for menor ou igual a 4.5v e menor ou igual a 5.5v
result_A = 1; //coloca o pino B0 em nível lógico alto - ligado
else
result_A = 0; //coloca o pino B0 em nivel lógico baixo - desligado

}// Fim do while
} // Fim da função principal
//*******************************************************************
/*Esta funcao inicializa os resgistradores SFRs.*/
void Inic_Regs (void){
TRISA = 0x01; //PORTA saída
TRISB = 0x01; //PORTB saída
TRISC = 0x00; //PORTC saída
TRISD = 0x00; //PORTD saída
TRISE = 0x00; //PORTE saída
ADCON1 = 0x0F; //configura pinos dos PORTA e PORTE como digitais
PORTA = 0; //limpa PORTA
PORTB = 0; //limpa PORTB
PORTC = 0; //limpa PORTC
PORTD = 0; //limpa PORTD
PORTE = 0; //limpa PORTE
}//********************************************************************
//esta função configura o conversor A/D
void Configura_AD(void){
ADCON0=0b00000001; //canal AN0 selecionado<5:2>
//Módulo conversor ligado<1>
ADCON1=0b00001110; //Vref- = VSS<5>
//Vref+ = VDD<4>
//pino RA0/AN0 analógico e demais pinos digitais<3:0>*/
//resultado justificado à direita<7>
//Tempo de aquisição de 12TAD<5:3>
//TAD = 1µs<2:0>
}//********************************************************************
//esta função efetua uma conversão A/D
int Conv_AD (void){
int Result_AD; //declaração de variável local
ADCON0bits.GO = 1; //inicia conversão
while (ADCON0bits.GO); //aguarda finalizar conversão
Result_AD = (((int)ADRESH)<<8)|(ADRESL); //obtém valor da conversão
return Result_AD; //retorna valor da conversão
}

desde já agradeço o tempo e atenção.

Pois ficou extenso esse tópico.

abraço

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!