реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> AT90USB1287 не отрабатывает внешние прерывания, В чем дело?
alux
сообщение Aug 4 2008, 03:41
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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. Схему и код выкладываю, чтобы не возникало лишних вопросов.
Прикрепленные файлы
Прикрепленный файл  shema1.pdf ( 103.82 килобайт ) Кол-во скачиваний: 304
Прикрепленный файл  shema2.pdf ( 77.4 килобайт ) Кол-во скачиваний: 225
Прикрепленный файл  keymatrix.rar ( 1.31 килобайт ) Кол-во скачиваний: 44
 
Go to the top of the page
 
+Quote Post
alux
сообщение Aug 5 2008, 03:17
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Глас вопиющего в пустыне... У меня проект остановился из-за этой ерунды. Исчерпал все версии...
Жду хоть какой-нибудь ответ. Ребята, проявите, пожалуйста, активность.
Прошу прощения за bb-offtopic.gif
Go to the top of the page
 
+Quote Post
SysRq
сообщение Aug 5 2008, 09:48
Сообщение #3


Чайник, 1 литр
****

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



Фьюз JTAGEN проверьте. Если включен JTAG (можно и программно отключать), он половину порта F съест (как раз ROW0...ROW3).
Go to the top of the page
 
+Quote Post
alux
сообщение Aug 5 2008, 10:47
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(SysRq @ Aug 5 2008, 12:48) *
Фьюз JTAGEN проверьте.

JTAGEN=1 -> отключен.

Какие еще будут варианты?
Go to the top of the page
 
+Quote Post
GDI
сообщение Aug 5 2008, 10:59
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Проверьте в симуляторе какие значения в регистры пишутся и реакцию там можно проверить. С таким камнем не работал, но внешние прерывания еще имеют настройки срабатывания по уровню, по спаду, по подъему и т.д. проверьте эти настройки для INT6


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
alux
сообщение Aug 5 2008, 12:34
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



По-умолчанию, при разрешении соответствующего внешнего прерывания, INTx настроен на срабатывание по низкому уровню. Пробовал разные настройки. Не в этом дело... В симуляторе (AVRSTUDIO) при симуляции внешнего прерывания (щелчок на PINE6) должен вызваться обработчик внешнего прерывния. А его нет sad.gif
Go to the top of the page
 
+Quote Post
GDI
сообщение Aug 5 2008, 12:44
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



В вшем коде не видно настройки DDRE, надеюсь на вход его переключили? Никакая периферия не включена, которая может PORTE занять? Если в АВРСтудии прерывание не наступает, нто значит где то в настройках ошибка. Вектор прерывания правильный? Кстати, прерывание не возникает, а флаг то взводится INT6?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
alux
сообщение Aug 5 2008, 13:40
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(GDI @ Aug 5 2008, 15:44) *
В вшем коде не видно настройки DDRE...
DDRE6 (INT6) = 0 (input). Я - не новичек smile.gif .
В Интернете пробегала информация, что у этого камня не правильно пронумерованы вектора прерывания. Прийду домой проверю, хотя на мой взгляд, эта версия очень уж невероятная...
Go to the top of the page
 
+Quote Post
GDI
сообщение Aug 5 2008, 13:47
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
у этого камня не правильно пронумерованы вектора прерывания.

Вполне возможно что не в самом камне а в заголовочном файле где они описаны, да и в эррату заглянуть тоже можно.

Цитата
Я - не новичек smile.gif
И на старуху бывает проруха smile.gif


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
sKWO
сообщение Aug 5 2008, 14:47
Сообщение #10


Местный
***

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



alux, прочитайте ответ Александра Редчука на телесиськах Вот оно, добавлять смысла нету

Сообщение отредактировал sKWO - Aug 5 2008, 14:51


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
alux
сообщение Aug 5 2008, 15:42
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(sKWO @ Aug 5 2008, 17:47) *
прочитайте ответ Александра Редчука на телесиськах
Этот пост я и раньше видел. Лишний раз подтверждает, что с прерываниями не все чисто. Но там у нее хоть одно прерывание срабатывало. У меня же ни в симуляторе, ни в железе не срабатывает ни по PCINT0, ни по INT0...INT7. При симуляции внешних прерываний никакие флаги прерываний не взводятся. Может стоит написать в поддержку Atmel?

PS.
Ради интереса создал тестовый проект для ATmega128. Те же условия, что и для AT90USB1287. Симулирую прерывания,- все срабатывают, как и положено. Нужно предъявлять рекламацию Atmel.
Или я чего-то не учел ?..
Go to the top of the page
 
+Quote Post
SysRq
сообщение Aug 6 2008, 14:38
Сообщение #12


Чайник, 1 литр
****

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



А можно понтересоваться (в целях повышения образованности smile.gif ), у вас ОС какая-то используется?
Код
#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.
Go to the top of the page
 
+Quote Post
sKWO
сообщение Aug 6 2008, 15:02
Сообщение #13


Местный
***

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



Цитата(alux @ Aug 5 2008, 18:42) *
Этот пост я и раньше видел. Лишний раз подтверждает, что с прерываниями не все чисто. Но там у нее хоть одно прерывание срабатывало.

Читайте внимательно, второе не срабатывало изза того, что она перепутала порт на седьмое прерывание. Как по мне то INT даже удобнее и оперативнее чем РСINT(в качестве обработкаи) хотя, правда если захотите будить МК по нажатию любой кнопки то РСINT имеет преимущество. Поискал в нете, для винавр номера векторов в хедере отличны от ДШ, но это ничего страшного, всё работает. Есть правда какаято запара с вотчдогом, до конца не разобрался.


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
alux
сообщение Aug 6 2008, 15:43
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 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 виноват? 05.gif
Я уже начал писать рекламацию Atmel.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Aug 6 2008, 23:20
Сообщение #15


Чайник, 1 литр
****

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



Цитата(alux @ Aug 6 2008, 19:43) *
Получается, что IAR v5.11B виноват?

Хм. Поставил под VirtualBox'ом на XPFundamentals себе IAR (30 дней триал) посмотреть что за зверь и за что его все любят smile.gif , собрал такой код:
Код
#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
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016