Ir ao conteúdo
  • Cadastre-se

Conversor AD - Problema com os Registradores do PIC18F4550


PedroVieira16

Posts recomendados

Olá pessoal! Sou novo por aqui, e no mundo da programação em microcontroladores, então desculpa se na minha pergunta estiverem muitas besteiras.

O meu problema é simples. Estou trabalhando com o PIC18F4550 e pretendo fazer um coletor de dados. Comecei esses tempos e a principio gostaria de fazer uns testes de conversão A/D. Estou utilizando o PCWH da CCS. Então li muito e vi vários tutoriais a respeito e escrevi meu código. O problema é que o mesmo apresentou erro no que diz respeito aos registradores :

ADCON0

ADCON1

ADCON2

ADRESH

ADRESL

O compilador não reconhece esses registradores.. aparece o seguinte erro referentes a cada um dos registradores citados a cima "Undefined identifier ADCON0" por exemplo.

Será algo que eu deva declarar no inicio do meu programa?

Aqui a baixo segue o meu código. Lembrando que não configurei usando o Project Wizard, fiz tudo na mão.. E sou bastante cru em programação em C, comecei a muito pouco tempo, então relevem algumas besteiras que vocês irão ver:

#include <18F4550.h>

#device adc=10
float result;

#FUSES HSPLL,PLL5,CPUDIV1,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP,DEBUG,USBDIV,VREGEN

#use delay(clock=48000000)
#use rs232(baud=19200, parity=n, bits=8, xmit=PIN_C6, rcv=PIN_C7)


void getVoltage(void) // ler adc
{
ADCON1bits.VCFG =0b00; // Vss - Vdd
ADCON2 = 0b10100111; // Justificado a direita,8TAD,use internal conversion clock
ADCON0bits.ADON = 1; //Habilita ADC
ADCON0bits.GO = 1; //start ADC
delay_us(20);//tempo de aquisição
while(ADCON0bits.GO == 1); //agaurda a execução
result = ((ADRESH<<8)+(ADRESL));
result = result*0.0049;
delay_ms(100);
}


void main()
{
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
SET_TRIS_A (0xFF) ; //Porta A entrada
SET_TRIS_D (0X00); //Porta D saída
set_adc_channel(0); // ADCON0bits.CHS =0b0000; Seleciona o canal A0.

while(true)
{
getVoltage();

printf("%f \n \r ", result);

}

ESPERO MUITO A AJUDA DE VOCÊS! OBRIGADO PRA QUEM LEU ATÉ AQUI. VALEU!

Link para o comentário
Compartilhar em outros sites

Como você está aprendendo, já vai uma lição: No CCS, você NÃO precisa trabalhar com os registradores dessa forma.

Veja um exemplo limpo:

#include <18F4550.h>
#device adc=10

#FUSES HSPLL,PLL5,CPUDIV1,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP,DEBUG,USBDIV,VREGEN

#use delay(clock=48000000)

#use rs232(baud=19200, parity=n, bits=8, xmit=PIN_C6, rcv=PIN_C7)

float result;
int16 v;

void getVoltage(void) // ler adc
{
v = read_adc();
result = v * 0.0049;
delay_ms(500);
}

void main()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_64);

set_adc_channel(0);
delay_us(20);

while (TRUE)
{
getVoltage();

printf("%f Volts\n\r", result);
}
}

Circuito:

18F4550_AD_simples.png~original

Falou

Link para o comentário
Compartilhar em outros sites

Pedro,acessar os bytes diretamente no CCS é meio chatinho.

Caso queira codificar mais completamente ou com mais acessos,é melhor escolher outro compilador.

No seu caso,voce teria que definir os endereços dos registradores e carregar os bits,tipo:

#byte ADCON2=0xFC0
#byte ADCON1=0xFC1
#byte ADCON0=0xFC2
#byte ADRESL=0xFC3
#byte ADRESH=0xFC4

e depois usar algo tipo :

ADCON1=0b00001010; /
ADCON0=0b00010001;
ADCON2=0b10111110;

Desse modo voce poderia programar mais 'padronizado' caso usasse o código para outros compiladores.

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...