|
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 5 2008, 10:47
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(SysRq @ Aug 5 2008, 12:48)  Фьюз JTAGEN проверьте. JTAGEN=1 -> отключен. Какие еще будут варианты?
|
|
|
|
|
Aug 5 2008, 13:40
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(GDI @ Aug 5 2008, 15:44)  В вшем коде не видно настройки DDRE... DDRE6 (INT6) = 0 (input). Я - не новичек  . В Интернете пробегала информация, что у этого камня не правильно пронумерованы вектора прерывания. Прийду домой проверю, хотя на мой взгляд, эта версия очень уж невероятная...
|
|
|
|
|
Aug 5 2008, 13:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата у этого камня не правильно пронумерованы вектора прерывания. Вполне возможно что не в самом камне а в заголовочном файле где они описаны, да и в эррату заглянуть тоже можно. Цитата Я - не новичек  И на старуху бывает проруха
--------------------
|
|
|
|
|
Aug 5 2008, 14:47
|

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

|
alux, прочитайте ответ Александра Редчука на телесиськах Вот оно, добавлять смысла нету
Сообщение отредактировал sKWO - Aug 5 2008, 14:51
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Aug 5 2008, 15:42
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(sKWO @ Aug 5 2008, 17:47)  прочитайте ответ Александра Редчука на телесиськах Этот пост я и раньше видел. Лишний раз подтверждает, что с прерываниями не все чисто. Но там у нее хоть одно прерывание срабатывало. У меня же ни в симуляторе, ни в железе не срабатывает ни по PCINT0, ни по INT0...INT7. При симуляции внешних прерываний никакие флаги прерываний не взводятся. Может стоит написать в поддержку Atmel? PS. Ради интереса создал тестовый проект для ATmega128. Те же условия, что и для AT90USB1287. Симулирую прерывания,- все срабатывают, как и положено. Нужно предъявлять рекламацию Atmel. Или я чего-то не учел ?..
|
|
|
|
|
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:02
|

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

|
Цитата(alux @ Aug 5 2008, 18:42)  Этот пост я и раньше видел. Лишний раз подтверждает, что с прерываниями не все чисто. Но там у нее хоть одно прерывание срабатывало. Читайте внимательно, второе не срабатывало изза того, что она перепутала порт на седьмое прерывание. Как по мне то INT даже удобнее и оперативнее чем РСINT(в качестве обработкаи) хотя, правда если захотите будить МК по нажатию любой кнопки то РСINT имеет преимущество. Поискал в нете, для винавр номера векторов в хедере отличны от ДШ, но это ничего страшного, всё работает. Есть правда какаято запара с вотчдогом, до конца не разобрался.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|