Odkazy:
| bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| name | REFS1 | REFS0 | ADLAR | MUX4 | MUX3 | MUX2 | MUX1 | MUX0 |
| bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| name | ADEN | ADSC | ADATE | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 |
ADEN zapíná a vypíná AD převodník. (1 = zapnuto)
ADSC startuje převod v průběhu převodeu čteme 1. Pokud se bit změní na 0 je převod ukončen.
adc_init:
ADMUX =
ADCSRA =
rts
adc_read:
admux = kanal
adcsra |= 0x40;
while ((adcsra & 0x10) == 0); // Wait
ADCSRA |= 0x10;
// result in ADCW
#include <avr/io.h>
#include <inttypes.h>
uint16_t readADC(uint8_t channel) {
uint8_t i;
uint16_t result = 0;
// Den ADC aktivieren unr Teilungsfaktor auf 64 stellen
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
// Kanal des Multiplexers waehlen
ADMUX = channel;
// Interne Referenzspannung verwenden (also 2.56 V)
ADMUX |= (1<<REFS1) | (1<<REFS0);
// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));
for (i=0; i<3; i++) {
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));
result += ADCW;
}
ADCSRA &= ~(1<<ADEN);
result /= 3;
return result;
}
int main(void) {
uint16_t result = readADC(0)
return 0;
}Měření napětí
#include <avr/io.h>
#include <inttypes.h>
/*
* Inicializace ADC převodníku. Tato inicializace je specifická pro
* naši aplikaci a způsob použití převodníku.
*/
void initADC(void) {
ADCSR |= (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); /* Prescale = 16 */
ADMUX |= (1<<REFS1) | (1<<REFS0); /* Voltage refference 0b11 = 2.56V */
// ADCSR |= (1<<ADFR); /* Enable free-running mode */
ADMUX = currentChannel; /* Initial channel selection */
// ADCSR |= (1<<ADIE); /* Enable ADC conversion complete interrupt */
// _SEI(); /* Enable global interrupts */
// ADCSR |= (1<<ADSC); /* Start first conversion
} /* initADC() */
uint16_t readADC(uint8_t channel) {
ADMUX = channel;
ADCSRA |= (1<<ADSC);
ADCSRA |= (1<<ADEN); /* Start ADC conversion */
while (ADCSRA & (1<<ADSC));
result = ADCW;
ADCSRA &= ~(1<<ADEN); /* Stop ADC conversion */
}