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

 
 
 
Reply to this topicStart new topic
> не могу мегу 8 загнать во внешнее прерывание int0
Метценгерштейн
сообщение Sep 4 2013, 15:04
Сообщение #1


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

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Xenia
сообщение Sep 4 2013, 15:28
Сообщение #2


Гуру
******

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



Попробуйте содержимое __low_level_init() поставить в начало main() или вызовите ее оттуда явно. А то сомнительно, что функция __low_level_init() у вас вообще выполняется.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 4 2013, 16:42
Сообщение #3


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



да должна вроде выполняться, т.к. описал проект на С++ (указал в ИАРе), так он точно ее тогда выкинул. И получились завалы фронтов по всем ногам. Так что вызывается она. Но я попробую.
А то, что обработчик прерывания описан в др. подключенном файле- нормально?
сам обработчик- без ошибок же?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Sep 4 2013, 16:55
Сообщение #4


Гуру
******

Группа: Модератор 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;
}


Может быть у вас снова стека не хватает sm.gif, чтобы вызвать putString из прерывания?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Sep 4 2013, 17:00
Сообщение #5


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата
да должна вроде выполняться, т.к. описал проект на С++ (указал в ИАРе), так он точно ее тогда выкинул. И получились завалы фронтов по всем ногам. Так что вызывается она. Но я попробую.

extern C для обработчика указано? На эту тему на форуме масса постов.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Xenia
сообщение Sep 4 2013, 17:05
Сообщение #6


Гуру
******

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



Цитата(Метценгерштейн @ Sep 4 2013, 20:42) *
... описал проект на С++ ...


Оп-па! Тогда поворачиваюсь к вам спиной и ухожу из темы.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 4 2013, 18:44
Сообщение #7


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



не, не , не, никакой спиной ))
проект, конечно же как Си.
Это я для примера того, что когда на С++ случайно описал проект, то эту ф-ю выкинуло...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Sep 4 2013, 20:32
Сообщение #8


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Может всё таки
#asm("sei");
вместо
__enable_interrupt();


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Xenia
сообщение Sep 4 2013, 20:50
Сообщение #9


Гуру
******

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



Цитата(ILYAUL @ Sep 5 2013, 00:32) *
Может всё таки
#asm("sei");
вместо
__enable_interrupt();


IAR-компилятор допускает еще и другую альтернативу:
_SEI();
но это устаревшая конструкция, а по нынешним временам правильнее писать:
__enable_interrupt();

Между тем, всё это полные синонимы, в чем легко убедиться, заглянув в ассеблерный листиг. Генерацию последнего всегда стоит заказывать в проекте.

Метценгерштейн, если ничего не помогло - увеличьте напряжение на INT0 (до 5 вольт). Помнится, на форуме уже была аналогичная жалоба, которая была так вылечена.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 5 2013, 05:10
Сообщение #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
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 5 2013, 06:31
Сообщение #11


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



что-то с кодом у меня не то, т.к. вынес отдельно обработчик прерывания и нормально лампочку поджигаю от с 3,3 вольт перепад в ноль.
Разбираюсь.

Похоже, не хочет ф-я putString работать из прерывания.

А кто-нить может поделиться готовым файлом вывода на консольку, чтобы все грамотно было и с FIFO буферами и в прерываниях работало?

Сообщение отредактировал Метценгерштейн - Sep 5 2013, 07:33
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 01:49
Рейтинг@Mail.ru


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