Коллеги, приветствую !
Имеем: MSP430F1232, который совершенно нормально переводится в слип и находится там постоянно.
Есть надобность при этом из слипа его выдергивать через прерывание по изменению состояния в одной из ног порта 1 (это кнопка с активным НИЗКИМ уровнем). Не получается. Кнопка сидит на линии TCK, поэтому в JTAG-отладчике отследить попадание в подпрограмму прерывания не получается, т.к. он ругается на неожиданное изменение уровня в линии ТСК.
Буду признателен за сооображения.
АППАРАТНО: Линия ТСК имеет внешнюю подтяжку резистором 100 кОм.
ПРОГРАММНО :
Как все описано в программе:
************* описание ноги процессора Р1.4, на которой висит кнопка
P1DIR &= ~0x10; P1OUT |= 0x10; // настраиваем вход клавиатуры
****************** так уходим в слип из основной программы
prepare_to_sleep:
// *********** готовимся к режиму минимального потребления
ADC10CTL0 = 0;// выключить АЦП
ADC10CTL0 = 0;// выключить АЦП
ADC10AE = 0; // выключить АЦП
word_595_low = 0; // гасим все регистры с выходом наружу
word_595_medium = 0; // гасим все регистры с выходом наружу
word_595_high = 0; // гасим все регистры с выходом наружу
Set_595(); //зафиксировать изменения в регистрах наружу
clr_595_SI ; // гасим линии управления НС595
clr_595_SCK ; // гасим линии управления НС595
clr_595_LTCH ;// гасим линии управления НС595
P1DIR = 0xef; P1OUT = 0; // port 1 - на выход, уровень - низкий, кроме Р1.4 - это кнопка
P2DIR = 0xff; P2OUT = 0; // port 2 - на выход, уровень - низкий
P3DIR = 0xff; P3OUT = 0; // port 3 - на выход, уровень - низкий
// *********** готовы к режиму минимального потребления
IE1 &= ~WDTIE; // Disable WDT interrupt
// **********8 конфигурируем прерывание по низкому уровню в порту Р1.4
P1IES |= 0x10 ; /// отрицательный фронт для прерываний
P1IE |= 0x10 ; // разрешить прерывание от кнопки
// *********** пошли спать
_BIS_SR(LPM3_bits+GIE); //(LowPowerMode 3, interrupt on) уснули - реагируем на прерывания только от PORT1.4
// *********** а здесь - проснулись
timeout = 0 ;
goto start; // и отправились в самое начало программы для инициализации всего устройства
************************** так описана подпрограмма прерывания
#pragma vector=PORT1_VECTOR
__interrupt void port1_change(void)
{
set_VCC_LCD; // оживляем внешние линии питания LCD
Set_595 () ; // выводим их наружу
_BIC_SR_IRQ(CPUOFF); // просыпаемся
P1IE &= ~0x10 ; // запрещаем прерывания от разбудившего нас порта
// и выходим отсюдова
}