Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не могу мегу 8 загнать во внешнее прерывание int0
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Метценгерштейн
Код
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");
...

на осцилле при старте единица. Подаю ноль, в обработчик не вваливается.

Чего не вижу?
Xenia
Попробуйте содержимое __low_level_init() поставить в начало main() или вызовите ее оттуда явно. А то сомнительно, что функция __low_level_init() у вас вообще выполняется.
Метценгерштейн
да должна вроде выполняться, т.к. описал проект на С++ (указал в ИАРе), так он точно ее тогда выкинул. И получились завалы фронтов по всем ногам. Так что вызывается она. Но я попробую.
А то, что обработчик прерывания описан в др. подключенном файле- нормально?
сам обработчик- без ошибок же?
Xenia
Цитата(Метценгерштейн @ 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 из прерывания?
mdmitry
Цитата
да должна вроде выполняться, т.к. описал проект на С++ (указал в ИАРе), так он точно ее тогда выкинул. И получились завалы фронтов по всем ногам. Так что вызывается она. Но я попробую.

extern C для обработчика указано? На эту тему на форуме масса постов.
Xenia
Цитата(Метценгерштейн @ Sep 4 2013, 20:42) *
... описал проект на С++ ...


Оп-па! Тогда поворачиваюсь к вам спиной и ухожу из темы.
Метценгерштейн
не, не , не, никакой спиной ))
проект, конечно же как Си.
Это я для примера того, что когда на С++ случайно описал проект, то эту ф-ю выкинуло...
ILYAUL
Может всё таки
#asm("sei");
вместо
__enable_interrupt();
Xenia
Цитата(ILYAUL @ Sep 5 2013, 00:32) *
Может всё таки
#asm("sei");
вместо
__enable_interrupt();


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

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

Метценгерштейн, если ничего не помогло - увеличьте напряжение на INT0 (до 5 вольт). Помнится, на форуме уже была аналогичная жалоба, которая была так вылечена.
Метценгерштейн
Цитата(Xenia @ Sep 5 2013, 00:50) *
IAR-компилятор допускает еще и другую альтернативу:
_SEI();
но это устаревшая конструкция, а по нынешним временам правильнее писать:
__enable_interrupt();

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

Метценгерштейн, если ничего не помогло - увеличьте напряжение на INT0 (до 5 вольт). Помнится, на форуме уже была аналогичная жалоба, которая была так вылечена.

а вот это идея с напряжением, т.к. запускаю модуль Wiznet W5100- он 3,3 В.
Самое интересное, что для STM32 я его запустил гораздо проще)
Будем пробовать.
Метценгерштейн
что-то с кодом у меня не то, т.к. вынес отдельно обработчик прерывания и нормально лампочку поджигаю от с 3,3 вольт перепад в ноль.
Разбираюсь.

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

А кто-нить может поделиться готовым файлом вывода на консольку, чтобы все грамотно было и с FIFO буферами и в прерываниях работало?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.