Hi Horsty,
manchmal wundere ich mich, mit wie wenig Kommentar man auskommen kann. Bei mir ist das viel mehr Schreibarbeit *kopfschüttel*. Für eine interruptgetriebene ADC-Erfassung auf Kanal ADC3 habe ich diese beiden Routinen in Betrieb. Wenn Du ADC0 haben willst, wird ADMUX entsprechend geändert. Die Angabe der Spannungsreferenz mit REFS2..0 ist sinnvoll, wenn Du nichts angibst, dann gilt nach Datenblatt "... VCC used as Voltage Reference, disconnected from PB0 (AREF) ...". Meine Angabe REFS0 ist kommentiert, genauer stehts im Datenblatt "... External Voltage Reference at PB0 (AREF) pin, Internal Voltage Reference turned off..." - hängt halt mit meiner Controllerbeschaltung zusammen. Für eine genauere Messung habe ich eine "Statistik" und nehme den Durchschnitt (arithmetisches Mittel ā) von 12 Messungen. WENN Du ein 8bittiges Ergebnis möchtest, dann musst Du entsprechend angepasst coden. Die Variablen sind alle extern und volatile deklariert.
Code:
// =================================================================================
// === Initialisierung fuer ADC mega168 MIT Interrupt ========================
// === ADC3/PC3 auf 10 Bit, Wandlung #####>>>>> Interrupt ausgelöst =============
void ADC3_10_init_irupt(void) //
{
ADMUX |= (1<<MUX1)|(1<<MUX0); // Wandlung mit ADC3
ADMUX |= (1<<REFS0); // Referenzspannung ist Vcc doc S 256
ADCSRA |= (1<<ADATE); // Auto Triggering Enable doc S 247 + 257
ADCSRB |= (1<<ADTS1)|(1<<ADTS0); // Triggersource = TC0 CmpA doc S 260
// es wird also mit 1/1220 getriggert ca. 0,82 ms
ADCSRA |= (1<<ADIE); // ADC Interrupt Enable doc S 258
ADCSRA |= (1<<ADEN); // AD Enable
ADCSRA |= (1<<ADSC); // starte gleich die erste Wandlung
adc3_cnt = 0; // ADC-Wert wird x-fach aufaddiert
adc3_tmp = 0; // ADC-x-fach-Speicher
}
// =================================================================================
// =================================================================================
// === Nicht unterbrechbare ISR für ADC3 auf Pin 26/PC3/mega168 ==================
// === Routine übernimmt ADC-Wert ==============================================
ISR(ADC_vect) // _VECTOR(21)
{
adc3_tmp = ADC; // Hole Wert
adc3_sum = adc3_sum + adc3_tmp; // ADC-Werte aufsummieren
adc3_cnt = adc3_cnt + 1; // Hochzählen Counter für ISR-Aufruf
if (adc3_cnt > 12) // Wenn Counter >= x, dann Messwert ausrechnen
{ // Wenn adc3_counter < x, dann keine Aktion
adc3_dat = adc3_sum / 12; // Gemittelten ADC-Wert ausrechnen
adc3_sum = 0; // adc3_sum und Counter rücksetzen
adc3_cnt = 1;
}
}
// =================================================================================
Viel Erfolg
Anmerkung: uuuups - da war Hubert.G wieder schneller
Lesezeichen