Mais um pequeno programa.
Neste procurei ambientar-me com os registos ADRESH e ADRESL assim como com o setup dos ADC.
É feita a leitura analógica do canal ANS0, que resulta na variável "adc3".
Deixo aqui apenas 2 curiosidades que nunca tinha visto "com olhos de ver":
* O resultado destas ADC é de 10bits, e cada registo é de apenas 8. Como não "cabe" tudo num só registo, tem de ser usados 2 registos, no entanto 2 registos armazenam até 16 bits. Quer dizer que há 6 bits sem informação.
O registo ADCON1.ADFM, define se esses 6 bits devem ficar à esquerda do registo mais significativo (ADRESH) ou à direita do registo menos significativo (ADRESL).
* Como mostra a figura o registo ADRESH deve ser colocado há esquerda do ADRESL e então o valor deve ser lido como um só. No caso de ADFM=1, tem de se fazer 8 deslocamentos há esquerda do ADRESH e depois fazer a soma com o ADRESL.
Agora tudo faz sentido, mas nesta história passei quase uma tarde a partir pedra.
O código de teste (para 16F88):
#include <xc.h>
#pragma config CP=1, DEBUG=1, LVP=0, BOREN=0, MCLRE=0, PWRTE=1, WDTE=0, FOSC=INTOSCIO
#define _XTAL_FREQ 4000000
void main()
{
int adc1, adc2, adc3;
//portos
TRISA = 0b00000001; //RA0 como entrada
TRISB = 0b00000000;
PORTA = 0;
PORTB = 0;
//oscilador
OSCCONbits.IRCF = 0b110;
OSCCONbits.OSTS = 1;
OSCCONbits.IOFS = 1;
OSCCONbits.SCS = 0b00;
//ADC config
ANSEL = 0b0000001;
ADCON1bits.ADFM = 1;
ADCON1bits.ADCS2 = 0;
ADCON1bits.VCFG = 0b00;
ADCON0bits.ADCS = 0b11;
ADCON0bits.CHS = 0b000;
ADCON0bits.ADON = 1;
//programa leitura
ADCON0bits.GO_nDONE = 1; //iniciar leitura da ADC
__delay_ms(10);
adc1=ADRESH;
adc2=ADRESL;
adc3=((ADRESH<<8)+(ADRESL)); //deslocamento à esquerda
__delay_ms(100);
}
0 Responses so far.
Enviar um comentário