Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывание EXTINT в LPC2134
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Папа Карло
Нужно регистрировать внешнее изменение лог сигнала МК.
Не могу понять как мне настроить, чтоб МК выдавал прерывание по фрону сигнала.

В Кеил при симуляции биты EXTMODE, EXTPOLAR = 0.

При возникновении 0-ля на входе возникает прерывание, чтоб программа вышла из прерывания мне приходилось ставить 1-цу на ноге и скидывать EINT. В Кеил EINT не скидывался, если на ноге был 0.

Подскажите пожалуйста как мне настроить по фронтам прерывания ?
GetSmart
Код
    VPBDIV = 0x00;          // перед изменением EXTPOLAR или EXTMODE сбросить в ноль
    EXTMODE = 0x0f;         // все прерывания по изменению (edge)
    VPBDIV = 0x0f;          // то же самое значение, что и в EXTMODE
    VPBDIV = 0x00;          // перед изменением EXTPOLAR или EXTMODE сбросить в ноль
    EXTPOLAR = 0x0f;        // все прерывания по фронту
    VPBDIV = 0x00;          // то же самое значение, что и в EXTPOLAR
    VPBDIV = 0x00;          // перед изменением EXTPOLAR или EXTMODE сбросить в ноль (хз, может и не надо)
    EXTINT = 0x0f;          // сброс текущих флагов
    VPBDIV = 0x01;          // окончательное значение (можно изменить на другое)

    VICProtection = 0;
    VICIntEnClear = -1UL;
    VICSoftIntClear = -1UL;
//    VICDefVectAddr = (unsigned long)&DefDummyInterrupt;
    VICVectAddr = 0;

    VICIntSelect &= ~(1 << VIC_EINT0);      // IRQ on EINT0
    VICVectAddr3 = (unsigned long)&EInt0Interrupt;
    VICVectCntl3 = 0x20 | VIC_EINT0;
    VICIntEnable = (1 << VIC_EINT0);

    __enable_interrupt();


С EINTx есть ещё некоторые тонкости. Настройки для EINTx не всегда устанавливаются. Поищите по форуму. zltigo обнаруживал кое-что, чего нет даже в мануале.
Папа Карло
Настроил вот так:
Код
//EXTINT3
  EXTINT = 8;
  VPBDIV = 0x00;          //
  EXTMODE = 0x08;         //
  VPBDIV = 0x08;          //
  VPBDIV = 0x00;          //
  EXTPOLAR = 0x08;        //
  VPBDIV = 0x08;          //
  VPBDIV = 0x00;          //
  EXTINT = 0x08;          //
  VPBDIV = 0x00;          //


Но прерывание срабатывает только по фронту с 0 на 1, а наоборот не реагирует.
Может я что то упустил ?
zltigo
Цитата(Папа Карло @ Jun 5 2008, 23:05) *
Может я что то упустил ?

Напротив, почему-то нафантазировали, что прерывания от какой-то сырости должны возникать одновременно по обоим фронтам. Можете выбрать один из двух вариантов, или перепрограммировать после каждого из прерываний rising/falling-edge режимы.
GetSmart
Я там опечатался. После записи в EXTPOLAR = 0x0f; нужно писать в VPBDIV = 0x0f; (то же значение) а не 0x00 как я написал. Это если вдруг кто тупо скопирует тот код.
zltigo
Цитата(GetSmart @ Jun 5 2008, 23:32) *
Я там опечатался

Все эти пляски + дополнительные не ератированные были актуальны для чипов до LPC213x Для свежих errata нет. Хотя я без плясок не пробовал smile.gif - привычка и наличие некоторого количества LPC211x/221x для поддержки..
Папа Карло
Цитата(zltigo @ Jun 6 2008, 01:23) *
нафантазировали


Блин, какой облом.
Ну придётся перепрограммировать ...
zltigo
Цитата(Папа Карло @ Jun 6 2008, 18:27) *
Блин, какой облом.

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