|
|
  |
AT90USB1287 не отрабатывает внешние прерывания, В чем дело? |
|
|
|
Aug 7 2008, 05:00
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(Т.Достоевский @ Aug 7 2008, 03:44)  если на порту INTx = 0, то застрянет в прерывании Я уже говорил, что пробовал разные варианты (по фронту, спаду, по уровню). Не в этом дело. Читайте внимательно посты. Цитата(SysRq @ Aug 7 2008, 02:20)  Хм. Поставил под VirtualBox'ом на XPFundamentals себе IAR (30 дней триал) посмотреть что за зверь и за что его все любят  , собрал такой код: ............. При отладке в AVRStudio прерывание работает правильно! В опциях проекта ничего не менял, кроме установки --cpu=usb1287. Сделал то же самое (этот же пример кода, IAR v.5.11B, ubrof8) - не работает!!! Кто то из нас двоих не прав!
|
|
|
|
|
Aug 7 2008, 10:12
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(alux @ Aug 7 2008, 12:01)  Проверить проект смогу вечером. Пока могу предположить две версии: 1) различия триальной и "вылеченной" версии IAR; (маловероятно) не моловероятно, а исключено. вылеч версия 4.21А нормально компилит и всё работает на ура. Проджект прикрепляю. Цитата(SysRq @ Aug 7 2008, 02:20)  [code] #define INT6 6 // почему-то пришлось задать вручную; видимо, с IAR с разбегу не разобрался #define INTF6 6 // почему-то пришлось задать вручную; видимо, с IAR с разбегу не разобрался SysRq, это всё решается настройками прожекта Project\Options, на закладке General Options находим System, и здесь ставим галочку напротив Enable bit definitions in I\O-include file.
Прикрепленные файлы
1287.rar ( 13.29 килобайт )
Кол-во скачиваний: 28
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Aug 7 2008, 10:16
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(sKWO @ Aug 7 2008, 13:12)  не моловероятно, а исключено. вылеч версия 4.21А нормально компилит и всё работает на ура. Остается версия номер 2. PS. Если не трудно, проверьте эту версию у себя. Т.е. в файле iousb1287.h раскомментировать определения для PE0...PE7 и изменить PE1 на UPE1.
|
|
|
|
|
Aug 7 2008, 14:08
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(alux @ Aug 7 2008, 14:16)  ...раскомментировать определения для PE0...PE7 и изменить PE1 на UPE1. На этом тестовом коде эти изменения никак не отражаются, все работает. -- Цитата(sKWO @ Aug 7 2008, 14:12)  SysRq, это всё решается настройками прожекта Благодарю! Этот пример выше был написан сильно с разбегу - за две минуты с момента установки IAR'а; сейчас я уже в курсе немного :)
|
|
|
|
|
Aug 7 2008, 15:25
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(SysRq @ Aug 7 2008, 17:08)  На этом тестовом коде эти изменения никак не отражаются, все работает. У меня с этими изменениями все-равно не работает  . Остается еще одно различие: у меня AVRStudio v.4.13. Качаю последнюю v.4.14. Там пофиксено: Код 7163: The simulator subscripts for AT90USB128/64 and AT90USB162/82 have been fixed. Хотя, на мой взгляд, это вряд ли поможет. Ведь в железе не работает! Цитата(sKWO @ Aug 7 2008, 13:12)  вылеч версия 4.21А нормально компилит и всё работает на ура. Проджект прикрепляю. У меня ни этот проект (у Вас AVRStudio какой версии?) Цитата(SysRq @ Aug 7 2008, 08:53)  ... ни этот проект НЕ РАБОТАЕТ!!! Это было бы смешно, если б не было так печально. Почему у меня не работают прерывания? PS. Проблема решилась установкой последней версии AVRStudio v4.14 build 589. По крайней мере в симуляторе уже стал вызываться обработчик внешнего прерывания. Спасибо всем за помощь.
|
|
|
|
|
Aug 8 2008, 18:58
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Обработчик внешнего прерывания не вызывается из-за OS::Run(); Код void main() { ........................ TCCR0B = 0x03; // Start System Timer f_clk/64 TIMSK0 |= (1<<TOIE0); // Разрешить прерывания Timer0 по переполнению (OVF) OS::Run(); // Период переполнения Timer0 при f_clk=7.3728 Mhz 2.222 ms }
#pragma vector=INT6_vect OS_INTERRUPT void INT6_ISR() { OS::TISRW_SS ISRW;
DISABLE_INT6; // Prevent further external interrupts
Int6.SignalISR(); PORTC |= (1<<BEEP); // <<<<<<<<< Это для контроля входа в прерывание } А почему, не пойму никак. Раньше на Mega324P работало нормально...  Этот вопрос скорее к отцам операционной системы scmRTOS. PS. Проблема решилась опять-таки установкой последней версии scmRTOS v.3.05  Причина была скорее всего из-за следующего Bugfixes: Код EWAVR port: support for devices with more then 64 kbytes flash added in target assembler file.
|
|
|
|
|
Sep 4 2008, 15:38
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Снова проблема с внешним прерыванием. На этот раз при входе в POWER_DOWN не выходит из него при нажатии на кнопку. Сигнал внешнего прерывания от клавиатурной матрицы 4х4 подключен через аноды диодов на PE6(INT6). Прерывание INT6 настроено на low level. Вот пример кода: Код // Sleep Functions #define SELECT_IDLE SMCR &= ~((1<<SM0)|(1<<SM1)|(1<<SM2)) // Idle mode #define SELECT_ADC SMCR |= (1<<SM0) // ADC Noise Reduction Mode #define SELECT_POWERDOWN SMCR |= (1<<SM1) // Macro to select powerdown sleep mode #define SELECT_POWERSAVE SMCR |= (1<<SM0)|(1<<SM1) // Power Save Mode #define SELECT_STANDBY SMCR |= (1<<SM1)|(1<<SM2) // Standby Mode #define SELECT_EXT_STANDBY SMCR |= (1<<SM0)|(1<<SM1)|(1<<SM2) // Extended Standby Mode
#define SLEEP_ENABLE SMCR |= (1<<SE) // Set the SE (sleep enable) bit #define SLEEP_DISABLE SMCR &= ~(1<<SE) // Clear the SE (sleep enable) bit
int main() { ................................ SLEEP_ENABLE; SELECT_IDLE;
__enable_interrupt(); // set the Global Interrupt Enable Bit TCCR0B = 0x03; // Start System Timer f_clk/64 TIMSK0 |= (1<<TOIE0); // Разрешить прерывания Timer0 по переполнению (OVF) // Период переполнения Timer0 при f_clk=7.3728 Mhz 2.222 ms OS::Run(); }
void TLCD::OnOff(bool On) { if(On) {;} else { ............................................... PORTD |= (1<<SHDN); // Отключить аналоговую периферию //TIMSK0 &= ~(1<<TOIE0); SELECT_POWERDOWN; __sleep(); SELECT_IDLE; //TIMSK0 |= (1<<TOIE0); PORTD &= ~(1<<SHDN); // Включить аналоговую периферию } По команде __sleep() входит в POWER_DOWN. Это подтверждает снижение токопотребления и высокий уровень на SHDN. Но почему не просыпается при нажатии на кнопку, не могу понять.  .. Перепад в "0" на INT6 при нажатии наблюдаю тестером. PS. В errata есть замечание по поводу: 2. High current consumption in sleep mode If a pending interrupt cannot wake the part up from the selected mode, the current consumption will increase during sleep when executing the SLEEP instruction directly after a SEI instruction.
Problem Fix/workaround Before entering sleep, interrupts not used to wake up the part from the sleep mode should be disabled.У меня используется прерывание таймера0. Но запрещение перед входом в режим и разрешение по выходу из режима Power_Down не решает проблему. Какие будут предположения по данной проблеме?
|
|
|
|
|
Sep 5 2008, 06:12
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(SasaVitebsk @ Sep 4 2008, 21:55)  Надеюсь вы учли, что просыпаться только Only "INT3:0 or level interrupt INT7:4" Повторю еще раз. Прерывание INT6 настроено на low level. PS. По даташиту AT90USB1287 : Wake-up Sources from Power-down -> For INT7:4, only level interrupt.
|
|
|
|
|
Sep 5 2008, 07:33
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(alux @ Sep 4 2008, 18:38)  Код int main() { ................................ SLEEP_ENABLE; SELECT_IDLE;
__enable_interrupt(); // set the Global Interrupt Enable Bit TCCR0B = 0x03; // Start System Timer f_clk/64 TIMSK0 |= (1<<TOIE0); // Разрешить прерывания Timer0 по переполнению (OVF) // Период переполнения Timer0 при f_clk=7.3728 Mhz 2.222 ms OS::Run(); } не читал, но осуждаюпролетая над ЧереповцомПробегая мимо интернета нет времени внимательно вчитываться во всю тему, поэтому по теме ответить могу лишь то, что в той старой теме "не всё чисто" было не с прерываниями у 90usb, а с "очиткой". Автором были спутаны INT7 и PCINT7. Не по основной теме: не рекомендую разрешать прерывания до запуска OS::Run() - потребности в этом нет, а что-то левое может и вылезти. Прерывания разрешаются автоматически в конце переключения на первый выполняемый процесс, так как стек каждого процесса инициализируется конструктором таким образом, что в нём сидит образ статусного регистра с установленным битом разрешения прерываний, таким образом при первом переключении на процесс "восстанавливается" SREG.I == 1 и прерывания разрешены.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|