|
|
  |
не могу мегу 8 загнать во внешнее прерывание int0 |
|
|
|
Sep 4 2013, 15:04
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Код char __low_level_init (void) { ... MCUCR = (1<<ISC01)|(0<<ISC00); // разрешил внешнее прерывание INT0 по падению фронта GICR = (1<<INT0); // разрешил глобальное прерывание по INT0 ... PORTD = (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0); DDRD =(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(0<<2)|(1<<1)|(1<<0); // PD2 (int0) вход return 1; } вот в main () разрешаю глобальные прерывания Код void main (void) { __enable_interrupt(); ... а вот уже в др. файле обработчик прерывания Код #pragma vector = INT0_vect __interrupt void INT0_interrupt (void) { putString ("прерывание"); putString ("\r\n"); ... на осцилле при старте единица. Подаю ноль, в обработчик не вваливается. Чего не вижу?
Сообщение отредактировал Метценгерштейн - Sep 4 2013, 15:04
|
|
|
|
|
Sep 4 2013, 16:55
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(Метценгерштейн @ Sep 4 2013, 20:42)  да должна вроде выполняться, т.к. описал проект на С++ (указал в ИАРе), так он точно ее тогда выкинул. И получились завалы фронтов по всем ногам. Так что вызывается она. Но я попробую. А то, что обработчик прерывания описан в др. подключенном файле- нормально? сам обработчик- без ошибок же? На вид все правильно. У меня тоже на Меге8 прерывание от кнопочки (землит INT0): Код // Сконфигурируем порты PORTD = 0; DDRD = 0;
// Port interrupts MCUCR = (1<<ISC01); // falling edge GIFR = (1<<INTF0); GICR = (1<<INT0); // INT0 enable
...
#pragma vector=INT0_vect __interrupt void INT0_interrupt() { Flag ^= Flag_Protocol; } Может быть у вас снова стека не хватает  , чтобы вызвать putString из прерывания?
|
|
|
|
|
Sep 4 2013, 20:50
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(ILYAUL @ Sep 5 2013, 00:32)  Может всё таки #asm("sei"); вместо __enable_interrupt(); IAR-компилятор допускает еще и другую альтернативу: _SEI(); но это устаревшая конструкция, а по нынешним временам правильнее писать: __enable_interrupt(); Между тем, всё это полные синонимы, в чем легко убедиться, заглянув в ассеблерный листиг. Генерацию последнего всегда стоит заказывать в проекте. Метценгерштейн, если ничего не помогло - увеличьте напряжение на INT0 (до 5 вольт). Помнится, на форуме уже была аналогичная жалоба, которая была так вылечена.
|
|
|
|
|
Sep 5 2013, 05:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Цитата(Xenia @ Sep 5 2013, 00:50)  IAR-компилятор допускает еще и другую альтернативу: _SEI(); но это устаревшая конструкция, а по нынешним временам правильнее писать: __enable_interrupt();
Между тем, всё это полные синонимы, в чем легко убедиться, заглянув в ассеблерный листиг. Генерацию последнего всегда стоит заказывать в проекте.
Метценгерштейн, если ничего не помогло - увеличьте напряжение на INT0 (до 5 вольт). Помнится, на форуме уже была аналогичная жалоба, которая была так вылечена. а вот это идея с напряжением, т.к. запускаю модуль Wiznet W5100- он 3,3 В. Самое интересное, что для STM32 я его запустил гораздо проще) Будем пробовать.
Сообщение отредактировал Метценгерштейн - Sep 5 2013, 05:11
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|