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