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.
Viel ErfolgCode:/* >> 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 ===================================================== // =================================================================================







Zitieren

Lesezeichen