Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP430F2132. Нежелательное срабатывание прерывания от порта P1
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Зураб
Снова здравствуйте!
Сразу по сути. Имеется ножка P1.0, сконфигурированная как вход и включен внутренний резистор pullup на ней. На эту ногу поступает сигнал с другого девайса, который выдает при включении лог.0. Необходимо произвести прерывание при перепаде на P1.0 из лог.1 в лог.0, при выполнении которого (для примера) выставляет на ноге P2.0 лог.1, при этом P2.0 сконфигурирован как выход со значением лог.0 при включении. Проблема в том, что при включении P2.0 выдаёт лог.1. Видимо сразу при включении срабатывает прерывание от порта P1. Как этого избежать? Может я что-то не так конфигурирую? Код ниже:
Код
void main(void){
  WDTCTL = WDTPW+WDTHOLD; //отключение watchdog
  P1DIR = 0xFE;
  P1OUT = 0x00;
  P1REN = 0x01;
  P2DIR = 0x03;                            
  P2OUT = 0x02;
  P2REN = 0x20;
  IE1 |= OFIE + WDTIE;  // разрешить прерывание от детектора ошибки резонатора
  IFG1 |= OFIFG;
  uart_init();
  P1IES = 0x01;
  P1IE = 0x01;
  P1IFG = 0;  
  __bis_SR_register(GIE);
  while(1){
  .................
}
}

#pragma vector=PORT1_VECTOR
__interrupt void DISCONNECTED(void)
{
  P1IFG=0;
  P2OUT|=BIT0;
}
_3m
Цитата(Зураб @ Aug 15 2010, 23:41) *
Снова здравствуйте!
Сразу по сути. Имеется ножка P1.0, сконфигурированная как вход и включен внутренний резистор pullup на ней. На эту ногу поступает сигнал с другого девайса, который выдает при включении лог.0. Необходимо произвести прерывание при перепаде на P1.0 из лог.1 в лог.0, при выполнении которого (для примера) выставляет на ноге P2.0 лог.1, при этом P2.0 сконфигурирован как выход со значением лог.0 при включении. Проблема в том, что при включении P2.0 выдаёт лог.1. Видимо сразу при включении срабатывает прерывание от порта P1. Как этого избежать? Может я что-то не так конфигурирую? Код ниже:

Мне кажется так будет лучше:
Код
void main(void){
  WDTCTL = WDTPW+WDTHOLD; //отключение watchdog
  P1DIR = 0xFE;
  P1REN = 0x01;
  P1OUT = 0x01;
/*
If the pin’s pull up/down resistor is enabled, the corresponding bit in the
PxOUT register selects pull-up or pull-down.
Bit = 0: The pin is pulled down
Bit = 1: The pin is pulled up
*/
  P2DIR = 0x03;                            
  P2OUT = 0x02;
  P2REN = 0x20;
  IE1 |= OFIE + WDTIE;  // разрешить прерывание от детектора ошибки резонатора
  IFG1 |= OFIFG;
  uart_init();
  P1IES = 0x01;
  P1IE = 0x01;

  // делаем задержку для нарастания напряжения на p1
  for (unsigned char delay=255; delay!=0; delay--)
     __no_operation();
  // если после старта непрерывно ноль - инициируем прерывание  
  P1IFG = ~(P1IN & 0x01);
  __bis_SR_register(GIE);

  while(1){
  .................
}
}
Ko4egap
Во первых, в прерывании непомешает проверить действительно ли на нужной ноге нужный уровень.
Во вторых, скорее всего вам нет смысла использовать здесь прерывания, я думаю достаточно банального опроса. Прерывание нужно чтобы вернуть из энергосберегающего режима, или когда нужна быстрая реакция.
Соглашусь с _3m, задержка здесь нужна
Зураб
_3m, Ko4egap, спасибо за помощь! Я подумывал о задержке, попробую.
Цитата
скорее всего вам нет смысла использовать здесь прерывания, я думаю достаточно банального опроса

А как в этом случае организовать срабатывание по перепаду из лог.1 в лог.0? Можно, конечно, ввести дополнительную переменную, но не хочется.
Ko4egap
Цитата(Зураб @ Aug 16 2010, 15:25) *
А как в этом случае организовать срабатывание по перепаду из лог.1 в лог.0? Можно, конечно, ввести дополнительную переменную, но не хочется.

Такие вещи делаются с помощью конечных автоматов (машина состояний). Выглядит примерно так:
Код
static int state = 0;

switch(state)
{
    case(0):
        if(state1_cond)
        {
            state=1;
            /* Kакие-либо действия, корторые необходимо выполнять при переходе
             * из нулевого состояния в первое
             */
        }
        break;
    case(1):
        if(state0_cond)
        {
            state=0;
        }
        break;
    default:
        /* Что-то пошло не так, надо сбросить всю машину */
        state=0;
        break;
}

И вообще нечего жалеть память. Чем меньше кода, тем меньше мест где могут появиться ошибки. Чем проще решение тем меньше вероятность ошибиться в его реализации, и меньше сил затрачивается на отладку и дальнейшее сопровождение, и стабильнее результирующий продукт.

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