Não esqueça de curtir a página do facebook (procure por "microcontroladores-c")!
/*
* usando ADC no MPlab XC8(voltimetro)
*
* Compilador : MPlabXC8
* Microcontrolador: 18F13K22
* Autor: aguivone
* Versão: 1
* Data : 12 de abril de 2013
*/
#include <stdio.h>
#include <string.h> //para usar funçoes de string deve se adicionar este header
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 12000000 /* required for __delay_ms, __delay_us macros */
/////////////////////////////////////////////////////configuraçôes do pic //////////////////////////////////////////////////
// CONFIG1H
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config PLLEN = OFF // 4 X PLL Enable bit (PLL is under software control)
#pragma config PCLKEN = ON // Primary Clock Enable bit (Primary clock enabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
// CONFIG2L
#pragma config PWRTEN = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
#pragma config BORV = 19 // Brown Out Reset Voltage bits (VBOR set to 1.9 V nominal)
// CONFIG2H
#pragma config WDTEN = OFF // Watchdog Timer Enable bit (WDT is controlled by SWDTEN bit of the WDTCON register)
#pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
// CONFIG3H
#pragma config HFOFST = ON // HFINTOSC Fast Start-up bit (HFINTOSC starts clocking the CPU without waiting for the oscillator to stablize.)
#pragma config MCLRE = OFF // MCLR Pin Enable bit (RA3 input pin enabled; MCLR disabled)
// CONFIG4L
#pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
#pragma config BBSIZ = OFF // Boot Block Size Select bit (512W boot block size)
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit (Block 0 not code-protected)
#pragma config CP1 = OFF // Code Protection bit (Block 1 not code-protected)
// CONFIG5H
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot block not code-protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit (Block 0 not write-protected)
#pragma config WRT1 = OFF // Write Protection bit (Block 1 not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot block not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block not protected from table reads executed in other blocks)
unsigned long tensao;
void delay_ms(long mili)
{
while(mili > 0)
{
_delay(12000);//1ms com clock de 12mhz
mili--;
}
// no caso do 18F o valor fica bem acima então é melhor montar essa funcão para que trabalhe bem
}
void Read_ADC (void)
{
tensao = 0; //globally defined as unsigned long
ADCON0bits.GO = 1; //inicia conversão
while (ADCON0bits.DONE == 1); //espera finalizar leitura
tensao = (ADRESH << 8) | ADRESL; //carrega valor
tensao = (tensao * 5000)/1023; //Vref está em milliVolts
}
//////////////////////////////////////////////////interrupção//////////////////////////////////////////////////////////////
void interrupt RS232(void)//vetor de interrupção
{
//não faz nada
RCIF = 0;// limpa flag de interrupção de recepção
}
/////////////////////////////////funçoes usadas pela uart //////////////////////////////////////////////////////
void inicializa_RS232(long velocidade,int modo)
{////por padrão é usado o modo 8 bits e sem paridade, mas se necessario ajuste aqui a configuração desejada.
//verifique datasheet para ver a porcentagem de erro e se a velocidade é possivel para o cristal utilizado.
RCSTA = 0X90;//habilita porta serial,recepção de 8 bit em modo continuo,assincrono.
int valor;
if(modo == 1)
{//modo = 1 ,modo alta velocidade
TXSTA = 0X24;//modo assincrono,trasmissao 8 bits.
valor =(int)(((_XTAL_FREQ/velocidade)-16)/16);//calculo do valor do gerador de baud rate
}
else
{//modo = 0 ,modo baixa velocidade
TXSTA = 0X20;//modo assincrono,trasmissao 8 bits.
valor =(int)(((_XTAL_FREQ/velocidade)-64)/64);//calculo do valor do gerador de baud rate
}
SPBRG = valor;
RCIE = 1;//habilita interrupção de recepção
TXIE = 0;//deixa interrupção de transmissão desligado(pois corre se o risco de ter uma interrupção escrita e leitura ao mesmo tempo)
}
void escreve(char valor)
{
TXIF = 0;//limpa flag que sinaliza envio completo.
TXREG = valor;
while(TXIF ==0);//espera enviar caracter
}
void imprime(const char frase[])
{
char indice = 0;
unsigned char tamanho = strlen(frase);
while(indice < tamanho ) ///veja que o programa pode travar se aqui não tiver as duas aspas
{
escreve(frase[indice]);
indice++;
}
}
void long_to_char(long quant)
{//converte long para char
char convert_char1='0';
char convert_char2='0';
char convert_char3='0';
char convert_char4='0';
while(quant>=1000)
{
quant=quant-1000;
convert_char1++;
}
while(quant>=100)
{
quant=quant-100;
convert_char2++;
}
while(quant>=10)
{
quant=quant-10;
convert_char3++;
}
while(quant>=1)
{
quant=quant-1;
convert_char4++;
}
escreve('\n');
escreve('\r');
escreve(convert_char1);
escreve(convert_char2);
escreve(convert_char3);
escreve(convert_char4);
}
//////////////////////////////////////////////////////Rotina principal///////////////////////////////////////////////////////////////
void main(void)
{
TRISA = 0XFF;//configura portA como entrada
TRISB = 0X20;//configura portB B5 (pino RX) como entrada
PORTB = 0; // limpar as portas que estão configuradas como saidas
inicializa_RS232(9600,1);//modo de alta velocidade
ADCON0 = 0X01;//liga modulo analogico digital e configura entrada de sinal para o pino RA0(AN0)
ADCON1 = 0X00;// Vref- seta ao Vss e Vref+ ao Vdd
ADCON2 = 0b10111110;// justificado a direita// tempo de aquisição 20TAD // clk Fosc/64
PEIE = 1;//habilita interrupção de perifericos do pic
GIE = 1; //GIE: Global Interrupt Enable bit
ANSEL = 0x01;//desabilita porta analogicas(para não atrapalhar recepção no pino)
ANSELH = 0x00;//em alguns casos não funciona nem a interrupção de recepção.
imprime("Voltagem em milivolts : \n\r");
while (1)
{
Nop();
Read_ADC();
long_to_char(tensao);
delay_ms(500);
}
}
A simulação:
Nenhum comentário :
Postar um comentário
olá,digite aqui seu comentário!