Hier als Beispiel mal ADC-Funktionen, wie sie aussehen könnten.
Diese Funktion initialisiert den ADC vor der Hauptschleife:
1 | void adc_init(void) {
|
2 | uint8_t __attribute__ ((unused)) result;
|
3 |
|
4 | ACSR |= 1 << ACD; // Komparator abschalten
|
5 | ADMUX |= 1<<ADLAR; // Resultat linksbündig
|
6 |
|
7 | ADCSRA |= ((1 << ADPS1) | (1 << ADPS0)); // Frequenzvorteiler 8
|
8 | ADCSRA |= (1 << ADEN); // ADC aktivieren
|
9 |
|
10 | ADCSRA |= (1 << ADSC); // eine ADC-Wandlung
|
11 | while (ADCSRA & (1 <<ADSC)); // auf Abschluss der Konvertierung warten
|
12 |
|
13 | result = ADCH;
|
14 | }
|
Und diese Funktion wird dann immer zum Auslesen aufgerufen:
1 | uint8_t adc_read(uint8_t channel) {
|
2 | uint8_t adcwert;
|
3 | channel &= 0x0F; // Sicherstellen, dass Kanal im erlaubten Bereich liegt
|
4 | ADMUX &= 0xF0; // Kanalbits 0 setzen
|
5 | ADMUX |= channel; // Kanal einstellen
|
6 | ADCSRA |= (1 << ADSC); // eine Wandlung "single conversion"
|
7 | while (ADCSRA & (1 << ADSC)); // auf Abschluss der Konvertierung warten
|
8 | adcwert = ADCH;
|
9 |
|
10 | return adcwert;
|
11 | }
|
Das gibt keine Probleme, solange du die ADC-Register nicht zwischendurch
anderweitig überschreibst.