Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
23.06.2009, 12:13
|
|
Частый гость
Регистрация: 08.05.2005
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Проблема с прерыванием от АЦП, Atmega8
Пишу довольно большой проект. И столкнулся с проблемой. В программе используются два прерывания: при переполнении таймера0, и при завершении АЦП. Обработчик прерывания от tmr0 довольно длинный. В самом его начале запускается начало АЦП (ADSRA.6 = 1). Но атмега8 просто игнорирует прерывание от АЦП, в него она просто не залетает. В-общем, проблема свелась в следующему простому коду:
Код:
|
#include ‹mega8.h›
#include ‹delay.h›
#include ‹MyLCD.inc›
interrupt [TIM0_OVF] void timer0_ovf_isr(void);
interrupt [ADC_INT] void adc_isr(void);
void lcd_putnum(unsigned char num);
void main(void);
//======== TIMER0 INTERRUPT HANDLER ========//
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
ADCSRA.6 = 1;
// delay_ms(500);
}
//==== END OF TIMER0 INTERRUPT HANDLER =====//
//======== ADC INTERRUPT HANDLER ========//
interrupt [ADC_INT] void adc_isr(void)
{
unsigned char adc_data;
adc_data = ADCH;
lcd_clear();
lcd_putsf("ADC = ");
lcd_putnum(adc_data);
delay_ms(200);
}
//==== END OF ADC INTERRUPT HANDLER =====//
void lcd_putnum(unsigned char num)
{
unsigned char tmp1, tmp2;
tmp1 = num / 100;
tmp2 = ( num / 10 ) % 10;
if (tmp1)
lcd_putchar(tmp1 + 48);
if ( ((!tmp2) && (tmp1)) ||(tmp2))
lcd_putchar(tmp2 + 48);
lcd_putchar((num%100)%10 + 48);
}
void main(void)
{
DDRC = 0b00110110;
PORTC = 0b00111110;
ADMUX = 0b01100000;
ADCSRA = 0x8B;
TCCR0=0x03;
TIMSK=0x01;
ACSR=0x80;
lcd_init();
lcd_putsf("TEST");
delay_ms(200);
ADCSRA.6 = 1;
#asm("sei");
while (1)
{
}
} |
При комментировании delay(500) в прерывании от таймера, прерывание от АЦП СРАБАТЫВАЕТ. При внесении же delay_ms (500), т.е. "удлинения по времени" прерывания от таймера, прерывание от АЦП игнорируется. В чем может быть дело?
P.S. Контроль данных АЦП выводится на ЛСД дисплей (100% рабочий).
P.S.S. В протеусе все эмулится нормально.
|
|
|
|
23.06.2009, 14:16
|
|
Вид на жительство
Регистрация: 12.04.2007
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
|
Вам чисто случайно никто никогда не говорил, что - работа программы в прерывании должна быть МИНИМАЛЬНОЙ по времени, а Вы туда еще и задержки впихнули...
Вообще удивительно что вообще хоть что-то работает...
Proteus в данном случае не показатель правильности.
Положим 500мс задержка, за это время при Ваших настройках таймера сколько раз произойдет прерывание таймера? АЦП?
стр.44 даташита на ATmega8 - вектора прерываний. Очередность прерываний таймера 0 - 10, у прерывания АЦП - 15... Отсюда делаем выводы...
Дальше. В обработчике прерывания АЦП вписаны функции работы с дисплеем. Они по времени тоже достаточны длительны - убирайте их оттуда. И задержку 200мс в корзину.
|
|
|
|
23.06.2009, 14:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Подробное толкование ответа о накоплении флагов прерываний.
http://roboforum.ru/viewtopic.php?f=...105824#p105824
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
23.06.2009, 14:49
|
|
Вид на жительство
Регистрация: 12.04.2007
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
|
Своими словами я описал тоже самое что там написано.
Вообще, avr123, что у Вас за манера постоянно давать ссылки на другие сайты и форумы? Пишите своими словами, или приводите цитаты.
|
|
|
|
23.06.2009, 17:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Я чужими написал чтоль ?
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
23.06.2009, 19:46
|
|
Вид на жительство
Регистрация: 12.04.2007
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
|
Сообщение от avr123-nm-ru
|
Я чужими написал чтоль ?
|
Но через ссылку на другой форум...
|
|
|
|
23.06.2009, 20:34
|
|
Частый гость
Регистрация: 08.05.2005
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Эх, чуял я, что дело в приоритетности прерываний... И про "как можно быстрее обрабатывать прерывания" тоже догадывался... Что ж, придется в тело main'a засовывать все, что в таймере лежит. Просто 8МГц для проверки кнопок слишком "жирно" (быстро), придется сделать "искусственный" таймер в мэйне.
P.S. Видимо невнимательно даташит читал... Сегодня несколько раз перечитывал про эти прерывания. Ладно, спасибо, добрые люди!
|
|
|
|
23.06.2009, 22:42
|
|
Вид на жительство
Регистрация: 12.04.2007
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
|
В одно прерывание можно (и нужно!) не только обработку одной какой-то задачи делать, а комбинировать несколько задач.
|
|
|
|
24.06.2009, 13:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от R-a-v-e-n
|
Просто 8МГц для проверки кнопок слишком "жирно" (быстро),
|
А нафига голова? Да хоть 1000 Мегагерц...а какая разница?
Или ты реагируеш на клавишу по ЕДЕНИЧНОМУ СЧИТЫВАНИЮ?...
В прерывание от таймера вызываеш функцию обработки клавиш с периодом 5-20 миллисек.
В функции счётчик ПОВТОРНЫХ ОДИНКАОВЫХ состояний клави УМЕНЬШАЕШЬ, когда равен 0 значит какие то клавиши нажаты. Выставляешь флаг НАЖАТО, и прекращаешь опрос. Можно написать с ПОВТОРНЫМ срабатванием при удержании.. с ускорением повтора, со срабатыванием ПОСЛЕ отпускания.. вариантов море...
Прерывание медленное, в нём же можно написать реагирование на нажатие клавишь + вывод на ЖКИ или АЛС ...
Думай голова.. пряник куплю ))
Сообщение от mrKirill
|
В одно прерывание можно (и нужно!) не только обработку одной какой-то задачи делать, а комбинировать несколько задач.
|
ИСТИНУ глаголишь )))
можно ВСЕ задачи в прерываниях делать, только время правильно распределить...
По скорости требуемой реакции на внешние события, распределять функци по прерываниям, рулить флагами.
|
|
|
|
24.06.2009, 13:56
|
|
Вид на жительство
Регистрация: 12.04.2007
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
|
Сообщение от picavr
|
можно ВСЕ задачи в прерываниях делать, только время правильно распределить...
По скорости требуемой реакции на внешние события, распределять функци по прерываниям, рулить флагами.
|
Суть RTOS...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Проблема с USART в Atmega8
|
tvilsa |
Микроконтроллеры, АЦП, память и т.д |
21 |
14.01.2009 16:27 |
Проблема с АЦП Мега16
|
malyshevsergey |
Микроконтроллеры, АЦП, память и т.д |
14 |
14.12.2007 17:44 |
Проблема с АЦП CS5381
|
Igor535 |
Микроконтроллеры, АЦП, память и т.д |
9 |
14.12.2007 16:25 |
ЖКИ МТ-12864 + ATmega8: проблема
|
123max12345 |
Микроконтроллеры, АЦП, память и т.д |
0 |
01.10.2007 11:56 |
проблема с АЦП
|
xelos |
Микроконтроллеры, АЦП, память и т.д |
4 |
30.06.2005 21:20 |
Часовой пояс GMT +4, время: 12:02.
|
|