Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Проблема с прерыванием от АЦП, Atmega8

Непрочитано 23.06.2009, 12:13  
R-a-v-e-n
Частый гость
 
Регистрация: 08.05.2005
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
R-a-v-e-n на пути к лучшему
По умолчанию Проблема с прерыванием от АЦП, 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. В протеусе все эмулится нормально.
Реклама:
R-a-v-e-n вне форума  
Непрочитано 23.06.2009, 14:16  
mrKirill
Вид на жительство
 
Аватар для mrKirill
 
Регистрация: 12.04.2007
Сообщений: 339
Сказал спасибо: 2
Сказали Спасибо 34 раз(а) в 30 сообщении(ях)
mrKirill на пути к лучшему
По умолчанию

Вам чисто случайно никто никогда не говорил, что - работа программы в прерывании должна быть МИНИМАЛЬНОЙ по времени, а Вы туда еще и задержки впихнули...
Вообще удивительно что вообще хоть что-то работает...
Proteus в данном случае не показатель правильности.

Положим 500мс задержка, за это время при Ваших настройках таймера сколько раз произойдет прерывание таймера? АЦП?

стр.44 даташита на ATmega8 - вектора прерываний. Очередность прерываний таймера 0 - 10, у прерывания АЦП - 15... Отсюда делаем выводы...

Дальше. В обработчике прерывания АЦП вписаны функции работы с дисплеем. Они по времени тоже достаточны длительны - убирайте их оттуда. И задержку 200мс в корзину.
mrKirill вне форума  
Непрочитано 23.06.2009, 14:40  
avr123-nm-ru
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
avr123-nm-ru на пути к лучшему
По умолчанию

Подробное толкование ответа о накоплении флагов прерываний.

http://roboforum.ru/viewtopic.php?f=...105824#p105824
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
avr123-nm-ru вне форума  
Непрочитано 23.06.2009, 14:49  
mrKirill
Вид на жительство
 
Аватар для mrKirill
 
Регистрация: 12.04.2007
Сообщений: 339
Сказал спасибо: 2
Сказали Спасибо 34 раз(а) в 30 сообщении(ях)
mrKirill на пути к лучшему
По умолчанию

Сообщение от avr123-nm-ru
Подробное толкование ответа о накоплении флагов прерываний.
http://roboforum.ru/viewtopic.php?f=...105824#p105824
Своими словами я описал тоже самое что там написано.

Вообще, avr123, что у Вас за манера постоянно давать ссылки на другие сайты и форумы? Пишите своими словами, или приводите цитаты.
mrKirill вне форума  
Непрочитано 23.06.2009, 17:42  
avr123-nm-ru
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
avr123-nm-ru на пути к лучшему
По умолчанию

Я чужими написал чтоль ?
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
avr123-nm-ru вне форума  
Непрочитано 23.06.2009, 19:46  
mrKirill
Вид на жительство
 
Аватар для mrKirill
 
Регистрация: 12.04.2007
Сообщений: 339
Сказал спасибо: 2
Сказали Спасибо 34 раз(а) в 30 сообщении(ях)
mrKirill на пути к лучшему
По умолчанию

Сообщение от avr123-nm-ru
Я чужими написал чтоль ?
Но через ссылку на другой форум...
mrKirill вне форума  
Непрочитано 23.06.2009, 20:34  
R-a-v-e-n
Частый гость
 
Регистрация: 08.05.2005
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
R-a-v-e-n на пути к лучшему
По умолчанию

Эх, чуял я, что дело в приоритетности прерываний... И про "как можно быстрее обрабатывать прерывания" тоже догадывался... Что ж, придется в тело main'a засовывать все, что в таймере лежит. Просто 8МГц для проверки кнопок слишком "жирно" (быстро), придется сделать "искусственный" таймер в мэйне.
P.S. Видимо невнимательно даташит читал... Сегодня несколько раз перечитывал про эти прерывания. Ладно, спасибо, добрые люди!
R-a-v-e-n вне форума  
Непрочитано 23.06.2009, 22:42  
mrKirill
Вид на жительство
 
Аватар для mrKirill
 
Регистрация: 12.04.2007
Сообщений: 339
Сказал спасибо: 2
Сказали Спасибо 34 раз(а) в 30 сообщении(ях)
mrKirill на пути к лучшему
По умолчанию

В одно прерывание можно (и нужно!) не только обработку одной какой-то задачи делать, а комбинировать несколько задач.
mrKirill вне форума  
Непрочитано 24.06.2009, 13:29  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию

Сообщение от R-a-v-e-n
Просто 8МГц для проверки кнопок слишком "жирно" (быстро),
А нафига голова? Да хоть 1000 Мегагерц...а какая разница?
Или ты реагируеш на клавишу по ЕДЕНИЧНОМУ СЧИТЫВАНИЮ?...

В прерывание от таймера вызываеш функцию обработки клавиш с периодом 5-20 миллисек.

В функции счётчик ПОВТОРНЫХ ОДИНКАОВЫХ состояний клави УМЕНЬШАЕШЬ, когда равен 0 значит какие то клавиши нажаты. Выставляешь флаг НАЖАТО, и прекращаешь опрос. Можно написать с ПОВТОРНЫМ срабатванием при удержании.. с ускорением повтора, со срабатыванием ПОСЛЕ отпускания.. вариантов море...

Прерывание медленное, в нём же можно написать реагирование на нажатие клавишь + вывод на ЖКИ или АЛС ...

Думай голова.. пряник куплю ))

Сообщение от mrKirill
В одно прерывание можно (и нужно!) не только обработку одной какой-то задачи делать, а комбинировать несколько задач.
ИСТИНУ глаголишь )))
можно ВСЕ задачи в прерываниях делать, только время правильно распределить...
По скорости требуемой реакции на внешние события, распределять функци по прерываниям, рулить флагами.
picavr вне форума  
Непрочитано 24.06.2009, 13:56  
mrKirill
Вид на жительство
 
Аватар для mrKirill
 
Регистрация: 12.04.2007
Сообщений: 339
Сказал спасибо: 2
Сказали Спасибо 34 раз(а) в 30 сообщении(ях)
mrKirill на пути к лучшему
По умолчанию

Сообщение от picavr
можно ВСЕ задачи в прерываниях делать, только время правильно распределить...
По скорости требуемой реакции на внешние события, распределять функци по прерываниям, рулить флагами.
Суть RTOS...
mrKirill вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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, время: 01:37.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.