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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
mrKirill на пути к лучшему
По умолчанию

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

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

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

Дальше. В обработчике прерывания АЦП вписаны функции работы с дисплеем. Они по времени тоже достаточны длительны - убирайте их оттуда. И задержку 200мс в корзину.
mrKirill вне форума  
Непрочитано 23.06.2009, 14:40  
avr123-nm-ru
Почётный гражданин KAZUS.RU
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 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
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
mrKirill на пути к лучшему
По умолчанию

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

Вообще, avr123, что у Вас за манера постоянно давать ссылки на другие сайты и форумы? Пишите своими словами, или приводите цитаты.
mrKirill вне форума  
Непрочитано 23.06.2009, 17:42  
avr123-nm-ru
Почётный гражданин KAZUS.RU
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 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
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
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
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
mrKirill на пути к лучшему
По умолчанию

В одно прерывание можно (и нужно!) не только обработку одной какой-то задачи делать, а комбинировать несколько задач.
mrKirill вне форума  
Непрочитано 24.06.2009, 13:29  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 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
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
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, время: 12:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot