реклама на сайте
подробности

 
 
> Проблема при запуске АЦП от таймера 0, Входит в прерывание ровно 2 раза...
Dikoy
сообщение Oct 2 2012, 21:13
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Имею скромное желание запускать встроенный АЦП 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В на лапе я тоже вижу.
Шо ей таки надо?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
RabidRabbit
сообщение Oct 3 2012, 06:21
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Таки оно хочет, чтобы кто-нибудь сбрасывал взведённый бит TIFR0.TOV0, например, в обработчике прерывания от АЦП sm.gif Ну, во всяком случае, в даташите вроде так пишут...
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Oct 3 2012, 13:57
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Таки действительно, флажок сбрасывается только в прерывании... Аппаратно нет...
Спасибо, TIFR0 |= (1 << TOV0); исправило ситуацию!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016