Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема при запуске АЦП от таймера 0
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Dikoy
Имею скромное желание запускать встроенный АЦП ATmega640 по переполнению таймера0, что оно должно уметь.
Тактовая таймера 250 кГц, что даёт период переполнения (1/250000)*256*1000 = 1,024 мс (сразу скажу, пробовал ставить 15 кГц == 16 мс, пофиг). Миллисекунда для этого АЦП должна быть плёвым временем.
АЦП тактируется от 125 кГц (минималка).
Кварц 16 МГц.
Код:
CODE


// Digital input buffers on ADC0: Off, ADC1: Off, ADC2: Off, ADC3: Off
// ADC4: On, ADC5: On, ADC6: On, ADC7: On
DIDR0 = 0x0F;
// Digital input buffers on ADC8: Off, ADC9: Off, ADC10: Off, ADC11: Off
// ADC12: Off, ADC13: Off, ADC14: Off, ADC15: Off
DIDR2 = 0xFF;
ADMUX = ((1<<REFS1)|(1<<REFS0)); // 2.56V
ADCSRA = ((1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0));
ADCSRB = (1 << ADTS2);


TCCR0A = 0x00;
TCCR0B = 0x03; // 250,000 kHz
TCNT0 = 0x00;
OCR0A = 0x00;
OCR0B = 0x00;

TIMSK0=0x00; // прерывания откл.

ADCSRA |= (1 << ADSC); // Запуск первого преобразования, потом должно работать автоматом.





// ADC interrupt service routine
#pragma vector=(0x3A*0x02)
__interrupt void adc_isr(void) { //

if( ADC_counter ) {
ADC_counter --;
mcu_adc_buffer += ADC;
}
}



А далее и в отладчике, и на осциллографе (если поставить инверсию лапки в прерывании) я вижу, что в прерывание код входит ровно 2 раза. И замирает.
Первый раз, видимо, после первого пустого преобразования, запускаемого вручную, потом по таймеру. По осциллу период 900 мкс, что меньше расчётной миллисекунды и позволяет думать именно так. И всё...
Бит ADCSRA |= (1<<ADIF); сбрасывать вручную пробовал - ничего не меняется, да и в ДШ написано, что автоматически он сбрасывается.
Питание на AVcc подаётся, опору 2,56В на лапе я тоже вижу.
Шо ей таки надо?
RabidRabbit
Таки оно хочет, чтобы кто-нибудь сбрасывал взведённый бит TIFR0.TOV0, например, в обработчике прерывания от АЦП sm.gif Ну, во всяком случае, в даташите вроде так пишут...
Dikoy
Таки действительно, флажок сбрасывается только в прерывании... Аппаратно нет...
Спасибо, TIFR0 |= (1 << TOV0); исправило ситуацию!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.