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

|
Отлаженый проект переношу с MEGA324P на AT90USB1287. После соответствующей коррекции программы перестало отрабатывать нажатия на матричной клавиатуре 4х4. Изменилась схема подключения клавиатуры: раньше COL и RAW подключались к двум разным портам. Теперь занимают один PORTF. И, так как у AT90USB1287 только PORTB имеет PCINT (зачем было так ограничивать функциональность МК ?!!), то выводы RAW через диоды анодами подключены к выводу внешнего прерывания INT6 (PORTE6). Прерывания настраиваю как обычно: Код int main() { // Initialise ACSR = (1<<ACD); // Analog Comparator Disable ................. PORTE = (1<<KEY_INT); // INT6 -> input, pull-up - ON
key_Init(); __enable_interrupt(); // set the Global Interrupt Enable Bit ..................................... ///////////////////////////////////////////
#define ENABLE_INT6 {EIFR |= (1<<INTF6); EIMSK |= (1<<INT6);}// Clear interrupt status flag, Enable external interrupt INT6 #define DISABLE_INT6 EIMSK &= ~(1<<INT6) // Disable external interrupt INT6
void key_Init(void) { /* Init ports */ KEYMATRIX_DDR = 0x0f; // Set row lines to input, Set column lines to output KEYMATRIX_PORT = 0xf0; // Pull row lines high, Drive all column lines low /* Enable external interrupt */ ENABLE_INT6; // Enable pin change interrupt INT6 } Выяснилось, что не вызывается обработчик прерывания INT6. Проверяю по звуковому сигналу BEEP. В симуляторе в AVRSTUDIO тоже прогнал - не вызываются прерывания: ни по низкому уровню, ни по фронтам (заднему и переднему). АЦП (PORTF) не использую. В чем дело? PS. Схему и код выкладываю, чтобы не возникало лишних вопросов.
|
|
|
|
|
 |
Ответов
|
Aug 6 2008, 14:38
|

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

|
А можно понтересоваться (в целях повышения образованности  ), у вас ОС какая-то используется? Код #pragma vector=INT6_vect OS_INTERRUPT void INT6_ISR() { OS::TISRW_SS ISRW; //... } Собрал на WinAVR простенький код, прерывание работает в отладчике AVRStudio правильно. Код #include <avr\io.h> #include <avr\interrupt.h>
#define ENABLE_INT6 {EIFR |= (1<<INTF6); EIMSK |= (1<<INT6);}// Clear interrupt status flag, Enable external interrupt INT6 #define DISABLE_INT6 EIMSK &= ~(1<<INT6) // Disable external interrupt INT6
volatile unsigned char a = 0, b = 0;
SIGNAL(INT6_vect) { a++; DISABLE_INT6; // Prevent further external interrupts }
int main(void) { ACSR = (1 << ACD); // Analog Comparator Disable PORTE = (1 << 6); // INT6 -> input, pull-up - ON sei(); while(1) { b++; ENABLE_INT6; } return 0; } Makefile стандартный, создан через MFile из комплекта WinAVR, и задан MCU = at90usb1287.
|
|
|
|
|
Aug 6 2008, 15:43
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(SysRq @ Aug 6 2008, 17:38)  у вас ОС какая-то используется? scmRTOS Рекомендую! Цитата(SysRq @ Aug 6 2008, 17:38)  Собрал на WinAVR простенький код, прерывание работает в отладчике AVRStudio правильно. А у меня тот же код, сгенеренный в IARе (ubrof8) для AT90USB1287 не работает в AVRStudio. Получается, что IAR v5.11B виноват? Я уже начал писать рекламацию Atmel.
|
|
|
|
|
Aug 6 2008, 23:20
|

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

|
Цитата(alux @ Aug 6 2008, 19:43)  Получается, что IAR v5.11B виноват? Хм. Поставил под VirtualBox'ом на XPFundamentals себе IAR (30 дней триал) посмотреть что за зверь и за что его все любят  , собрал такой код: Код #include <ioavr.h> #include <inavr.h>
#define INT6 6 // почему-то пришлось задать вручную; видимо, с IAR с разбегу не разобрался #define INTF6 6 // почему-то пришлось задать вручную; видимо, с IAR с разбегу не разобрался
#define ENABLE_INT6 {EIFR |= (1<<INTF6); EIMSK |= (1<<INT6);}// Clear interrupt status flag, Enable external interrupt INT6 #define DISABLE_INT6 EIMSK &= ~(1<<INT6) // Disable external interrupt INT6
volatile unsigned char a = 0, b = 0;
#pragma vector=INT6_vect __interrupt void INT6_ISR() { a++; DISABLE_INT6; // Prevent further external interrupts }
int main( void ) { PORTE = (1 << 6); // INT6 -> input, pull-up - ON __enable_interrupt(); // set the Global Interrupt Enable Bit while(1) { b++; ENABLE_INT6; } return 0; } При отладке в AVRStudio прерывание работает правильно! В опциях проекта ничего не менял, кроме установки --cpu=usb1287. IAR: Цитата IAR Assembler for AVR 5.11B/W32 (5.11.2.5) Translates Atmel assembler to IAR assembler 1.25 (1.2.4.109) IAR C/C++ Compiler for AVR 5.11B/W32 [Evaluation] (5.11.2.3) IAR XLINK 4.61C (4.61.3.0) IAR Build Utility 5.1.1.453.7838 (5.1.1.453) AVRStudio: 4.14 build 589
|
|
|
|
Сообщений в этой теме
alux AT90USB1287 не отрабатывает внешние прерывания Aug 4 2008, 03:41 alux Глас вопиющего в пустыне... У меня проект останови... Aug 5 2008, 03:17 SysRq Фьюз JTAGEN проверьте. Если включен JTAG (можно и ... Aug 5 2008, 09:48 alux Цитата(SysRq @ Aug 5 2008, 12:48) Фьюз JT... Aug 5 2008, 10:47 GDI Проверьте в симуляторе какие значения в регистры п... Aug 5 2008, 10:59 alux По-умолчанию, при разрешении соответствующего внеш... Aug 5 2008, 12:34 GDI В вшем коде не видно настройки DDRE, надеюсь на вх... Aug 5 2008, 12:44 alux Цитата(GDI @ Aug 5 2008, 15:44) В вшем ко... Aug 5 2008, 13:40 GDI Цитатау этого камня не правильно пронумерованы век... Aug 5 2008, 13:47 sKWO alux, прочитайте ответ Александра Редчука на телес... Aug 5 2008, 14:47 alux Цитата(sKWO @ Aug 5 2008, 17:47) прочитай... Aug 5 2008, 15:42  sKWO Цитата(alux @ Aug 5 2008, 18:42) Этот пос... Aug 6 2008, 15:02 Т.Достоевский По уровню? То-есть если на порту INTx = 0, то заст... Aug 7 2008, 00:44 alux Цитата(Т.Достоевский @ Aug 7 2008, 03:44)... Aug 7 2008, 05:00  SysRq Цитата(alux @ Aug 7 2008, 09:00) Сделал т... Aug 7 2008, 05:53   alux Проверить проект смогу вечером. Пока могу предполо... Aug 7 2008, 09:01    sKWO Цитата(alux @ Aug 7 2008, 12:01) Проверит... Aug 7 2008, 10:12     alux Цитата(sKWO @ Aug 7 2008, 13:12) не молов... Aug 7 2008, 10:16 SysRq Цитата(alux @ Aug 7 2008, 14:16) ...раско... Aug 7 2008, 14:08 alux Цитата(SysRq @ Aug 7 2008, 17:08) На этом... Aug 7 2008, 15:25 SysRq А в железе? Aug 7 2008, 18:17 alux Цитата(SysRq @ Aug 7 2008, 21:17) А в жел... Aug 7 2008, 19:25 alux Обработчик внешнего прерывания не вызывается из-за... Aug 8 2008, 18:58 alux Снова проблема с внешним прерыванием. На этот раз ... Sep 4 2008, 15:38 ReAl Цитата(alux @ Sep 4 2008, 18:38) Кодint m... Sep 5 2008, 07:33  alux Цитата(ReAl @ Sep 5 2008, 10:33) не реком... Sep 5 2008, 09:12   ReAl Цитата(alux @ Sep 5 2008, 12:12) Потребно... Sep 6 2008, 12:53 SasaVitebsk Надеюсь вы учли, что просыпаться только Only ... Sep 4 2008, 18:55 alux Цитата(SasaVitebsk @ Sep 4 2008, 21:55) Н... Sep 5 2008, 06:12 alux Второй раз наступаю на одни и те же грабли:
Кодvo... Sep 6 2008, 08:33
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|