Уважаемые Камрады на вас вся надежда....
Проблема в следующем: при вызове прерывания портом P1.4 (подача высокого напр. переключателем), светодиод висящий на порте P1.0 успешно загорается. Возврат кнопки в исходное сотояние и повторный щелчёк этой же кнопокой должен отключить светодиод, но этого не происходит. При этом например прерывание (с аналогичной коммандой) c порта P1.5 вырубает светодиод без проблем (но после этого и P1.5 перестает посылать прерывания). Основная проблема в том что контроллер просто перестает реагировать на последующие прерывания с портов, если они хоть раз вызывали эти самые прерывания (как будто прерывания одноразовые - 1 раз сработало, и дальше полный облом). Моделировал ситуацию в Proteus 7.6 SP4 и на реальном устройстве (MSP430F2013) - результат идентичен.
код программы:
сильно не ругайте... я только учусь
Проблема в следующем: при вызове прерывания портом P1.4 (подача высокого напр. переключателем), светодиод висящий на порте P1.0 успешно загорается. Возврат кнопки в исходное сотояние и повторный щелчёк этой же кнопокой должен отключить светодиод, но этого не происходит. При этом например прерывание (с аналогичной коммандой) c порта P1.5 вырубает светодиод без проблем (но после этого и P1.5 перестает посылать прерывания). Основная проблема в том что контроллер просто перестает реагировать на последующие прерывания с портов, если они хоть раз вызывали эти самые прерывания (как будто прерывания одноразовые - 1 раз сработало, и дальше полный облом). Моделировал ситуацию в Proteus 7.6 SP4 и на реальном устройстве (MSP430F2013) - результат идентичен.
код программы:
Код: Выделить всё
#include <msp430x20x1.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= 0x01; // Set P1.0 to output direction
P1IE |= 0x30; // P1.4/P1.5 interrupt enabled
P1IES &= ~0x30; // P1.4/P1.5 Low/Hi edge
P1IFG &= ~0x30; // P1.4/P1.5 IFG cleared
_BIS_SR(LPM0_bits + GIE);
}
// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)
{
if(P1IFG == 0x10) // If P1.4 Low -> Hi
{
P1OUT ^= 0x01; // Зажечь если не включен/отключить если уже зажжен
P1IFG &= ~0x10;; // P1.4 IFG cleared
}
if(P1IFG == 0x20) //If P1.5 Low -> Hi
{
P1OUT ^= 0x01; // Зажечь если не включен/отключить если уже зажжен
P1IFG &= ~0x20; // P1.5 IFG cleared
}
}
