Ob Dir mein Beispiel unten hilft, weiß ich nicht. Es läuft korrekt, aber eben NICHT auf einem m32 - ausserdem mit 10 bit (daher NICHT mit ADLAR), dummerweise auch noch mit einer Triggersource aus einer "fremden" Interruptquelle. Es sind zwei Bruchstücke: Initialisierung des Ports im main, initialisierung des ADC und die zugehörige ISR.
Code:
/* >>
Sicherung 10Okt09 1810 ..\C2\D01-3_40\D01-3_40x23.c
===================================================================================
Target MCU : ATmega328
... */
...
// =================================================================================
// === HAUPTProgramm ==============================================================
// =================================================================================
int main(void)
{
...
// Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
// A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
.....
DDRC = 0b01110000; // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
PORTC = 0b00000111; // Beachte für ADC: PC3 ist ADC-Eingang ##>> OHNE Pullup !!
....
// ================================================================================
----- o ----- o ----- o ----- o ----- o ----- o ----- o ----- o ----- o -----
/* >>
Sicherung 15Sep09 2150 .\C2\D01-3_40\D01-3_40_gpd_x21.c ###>>> noch nicht
===================================================================================
Target MCU : M168
....
================================================================================ */
// =================================================================================
// === 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
}
// =================================================================================
// =================================================================================
// === 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_sum += ADC; // Werte aufsummieren für Durchschnitt
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;
PORTC ^= (1<<PC4); // Zeitmessung: Port PC4 toggeln
}
}
// =================================================================================
// =================================================================================
// ===== ENDE Subroutinen =====================================================
// =================================================================================
Viel Erfolg
Lesezeichen