Easyelectronics.ru

Электроника для всех
Текущее время: 22 сен 2019, 13:26

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 49 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Работа с кнопками
СообщениеДобавлено: 23 фев 2013, 21:01 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Не могу никак разобраться с переключением светодиодов с помощью кнопок. Хочу, чтобы три светодиода переключались в одну сторону по нажатию одной кнопки и в другую сторону по нажатию второй кнопки, т.е. как бы обычный кнопочный переключатель. Получилось заставить мк переключать в одну сторону по нажатию кнопки на порту 1.4, а вот в другую не получается. Укажите пожалуйста на ошибки в коде и возможные пути их исправления. Ещё есть подозрение, что код слишком замудрён и всё можно сделать гораздо проще :)

Код:
#include <msp430g2553.h>

char key;
char i;

void main(void) {

        WDTCTL = WDTPW + WDTHOLD;   

        P1OUT = 0;
        P1DIR = BIT0+BIT1 + BIT6;
        P1REN |= BIT3+BIT4;
        P1OUT |= BIT3+BIT4;
        P1IES |= BIT3+BIT4;
        P1IFG &= ~BIT3+BIT4;;
        P1IE |= BIT3+BIT4;;   

        _enable_interrupt();


        while (1) {
        switch (key){
                case 1:
                    P1OUT |= BIT0;
                    P1OUT &= ~ BIT1 + BIT6;
                      break;
                case 2:
                      P1OUT |= BIT6;
                      P1OUT &= ~ BIT0;
                         break;
                case 3:

                   P1OUT |= BIT1;
                   P1OUT &= ~ BIT6;
                   break;
                default:
                   key=0;
                  }
        }
}

#pragma vector = PORT1_VECTOR
__interrupt void P2_ISR(void) {
        switch(P1IFG & (BIT3 + BIT4)) {
                case BIT4:
                        P1IFG &= ~BIT4;
                        key = i+1;
                        if (++i == 3)
                        i = 0;
                        P1IE |= BIT4;
                        break;
                case BIT3:
                         P1IFG &= ~BIT3; 
                         key = i-1;
                         if (--i == 3)
                         i = 0;
                         P1IE |= BIT3;
                         break;
}
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 23 фев 2013, 22:03 
Только пришел

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
я обычно копирую в буффер состояние флага прерывания, запрещаю прерывание, запускаю таймер, для избежание дребезга контактов, выставляю флаг, что было прерывание.примерно вот так
#pragma vector=PORT2_VECTOR
__interrupt void port(void)
{
flag=flag|1;//флаг на прерывание
knopka=P2IFG;// копирование в буффер
P2IE=0;P2IFG=0;P2IES=7;//зарпещение прерываний
TA1CTL=TASSEL1+ID0+ID1+MC0+MC1;TA1CCTL0=16;//запуск таймера
TA1CCR0=65000;
};
внутри основной уже обрабатываю. можно наверно так
if (flag==1) {
if (knopka==4){i++;}
if (knopka==8){i--;}
switch (i){
case 1: P1OUT=P1OUT^BIT0;break;//инверсия бита
case 2: P1OUT=P1OUT^BIT6;break;//инверсия бита
case 3: P1OUT=P1OUT^BIT1;break;//инверсия бита
}
}
в принципе должно работать


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 23 фев 2013, 22:14 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Хм, интересно. А откуда берётся значение knopka? 4 и 8.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 23 фев 2013, 22:31 
Только пришел

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
knopka берется из прерывания
knopka=P2IFG;// копирование в буффер
пост выше посмотрите самый первый кусок кода
4 и 8 это значения битов, 2в3 степени P1.3 2в4 Р1.4.забыл еще надо обнулить knopka.
вот здесь надо подправить if (knopka==8){i--;} вот так
if (knopka==8){if (i>2){if(a==0) {i=4;a++;}};i--;}//иначе case начнется со второго номера.
а здесь дописать case 1: P1OUT=P1OUT^BIT0;a=0;break;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 23 фев 2013, 23:53 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Следуя всем рекомендациям, получился вот такой код. Но почему-то ничего не работает. При нажатии на кнопку 1.3 загораются все диоды. Сам, к сожалению, не могу разобраться. Не могу понять конструкцию if (knopka==8){if (i>2){if(a==0) {i=4;a++;}};i--;}
Код:
#include <msp430g2553.h>

char flag;
char i;
char knopka=0;
char a;

void main(void) {

        WDTCTL = WDTPW + WDTHOLD;   

        P1OUT = 0;
        P1DIR = BIT0+BIT6 + BIT1;
      P1REN |= BIT3+BIT4;
      P1OUT |= BIT3+BIT4;
        P1IES |= BIT3+BIT4;
        P1IFG &= ~BIT3+BIT4;
        P1IE |= BIT3+BIT4; 

        _enable_interrupt();


        while (1) {
           if (flag==1) {
           if (knopka==4){i++;}
           if (knopka==8){if (i>2){if(a==0) {i=4;a++;}};i--;}
           switch (i){
           case 1: P1OUT=P1OUT^BIT0;a=0;break;//инверсия бита
           case 2: P1OUT=P1OUT^BIT6;break;//инверсия бита
           case 3: P1OUT=P1OUT^BIT1;break;//инверсия бита
           }
           }
}
}

#pragma vector = PORT1_VECTOR
__interrupt void P1_ISR(void)
{

   flag=flag|1;//флаг на прерывание
   knopka=P1IFG;// копирование в буффер
   P1IE=0;P1IFG=0;P1IES=7;//зарпещение прерываний
   TA1CTL=TASSEL1+ID0+ID1+MC0+MC1;TA1CCTL0=16;//запуск таймера
   TA1CCR0=65000;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 00:53 
Только пришел

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
я же писал что надо обнулить knopka.чуть ошибся при описании битов.
if (knopka==8){i++;knopka=0;}
if (knopka==16){if (i>2){if(a==0) {i=4;a++;}};i--;knopka=0;}
конструкция делает следующие, если напрямую использовать case, то один диод гаснуть не будет который на Р1.1, для того чтобы все работало вводиться такая конструкция при первом заходе а=0, при этом i становится 4, и при убавлении 3, отрабатывает case при 3 и так далее. можно чуть оптимизировать.
if (knopka==8){i++;knopka=0;a=0;}
if (knopka==16) {if(a==0) {i++;};i--;a++;knopka=0;}
switch (i){
case 1: P1OUT=P1OUT^BIT0;break;//инверсия бита
case 2: P1OUT=P1OUT^BIT6;break;//инверсия бита
case 3: P1OUT=P1OUT^BIT1;break;//инверсия бита
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 01:18 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Всё равно программа работает некорректно. При нажатии на кнопку 1.4 отрабатывается только case 1 и диод гаснет. При двойном нажатии на 1.3 также отрабатывается case 1. А тип переменных я верно задал? Или не в этом дело.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 01:47 
Только пришел

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
#include <msp430g2553.h>

char flag;
char i;
char knopka=0;
char a;

void main(void) {

WDTCTL = WDTPW + WDTHOLD;

P1OUT = 0;
P1DIR = BIT0+BIT6;
P1REN |= BIT3+BIT4;
P1OUT |= BIT3+BIT4;
P1IES |= BIT3+BIT4;
P1IFG &= ~BIT3+BIT4;
P1IE |= BIT3+BIT4;
TA0CCR0=4;
__bis_SR_register(GIE);


while (1) {
if (flag==1) {
if (knopka==8){if (a>0){a=0;i--;}i++;knopka=0;}
if (knopka==16){if (i>2){if(a==0) {i=4;a++;}};i--;knopka=0;}
flag=0;
switch (i){
case 1: P1OUT=P1OUT^BIT0;a=0;break;//инверсия бита
case 2: P1OUT=P1OUT^BIT6;break;//инверсия бита
case 3: P1OUT=P1OUT^BIT1;break;//инверсия бита

}
}
}
}

#pragma vector = PORT1_VECTOR
__interrupt void P1_ISR(void)
{

flag=flag|1;//флаг на прерывание
knopka=P1IFG;// копирование в буффер
P1IE=0;P1IFG=0;P1IES=0;//зарпещение прерываний
TA1CTL=TASSEL1+ID0+ID1+MC0+MC1;TA1CCTL0=16;//запуск таймера
TA1CCR0=65000;
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void time(void)
{
P1IE |= BIT3+BIT4;TA1CTL=0;a++;P1IES |= BIT3+BIT4;P1IFG=0;
}
рабочий пример для iar. просто вы не инициализировали прерывания от таймера. я их определил в прерываниях порта, для избежания дребезга контактов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 14:42 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Странно, что в cсs не работает. Буду разбираться. Спасибо за помощь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 14:56 
Только пришел

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
посмотрите как в css точно назыается вектор прерывания от таймера, скорей всего затыка в этом


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 15:39 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Я вот тоже первым делом подумал на это. Привёл к такому виду:
Код:
#include <msp430g2553.h>

char flag;
char i;
char knopka=0;
char a;

void main(void) {

WDTCTL = WDTPW + WDTHOLD;

P1OUT = 0;
P1DIR = BIT0+BIT6;
P1REN |= BIT3+BIT4;
P1OUT |= BIT3+BIT4;
P1IES |= BIT3+BIT4;
P1IFG &= ~BIT3+BIT4;
P1IE |= BIT3+BIT4;
TACCR0=4;
__bis_SR_register(GIE);


while (1) {
if (flag==1) {
if (knopka==8){if (a>0){a=0;i--;}i++;knopka=0;}
if (knopka==16){if (i>2){if(a==0) {i=4;a++;}};i--;knopka=0;}
flag=0;
switch (i){
case 1: P1OUT=P1OUT^BIT0;a=0;break;//инверсия бита
case 2: P1OUT=P1OUT^BIT6;break;//инверсия бита
case 3: P1OUT=P1OUT^BIT1;break;//инверсия бита

}
}
}
}

#pragma vector = PORT1_VECTOR
__interrupt void P1_ISR(void)
{

flag=flag|1;//флаг на прерывание
knopka=P1IFG;// копирование в буффер
P1IE=0;P1IFG=0;P1IES=0;//зарпещение прерываний
TACTL=TASSEL1+ID0+ID1+MC0+MC1;TACCTL0=16;//запуск таймера
TACCR0=65000;
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void time(void)
{
P1IE |= BIT3+BIT4;TACTL=0;a++;P1IES |= BIT3+BIT4;P1IFG=0;
}


Однако всё равно отрабатывается только case1 и то только при нажатии 1.3. А вот при настройке таймера для чего прописываются регистры ID0 и ID1? Никогда в одной строчке не видел этих двух регистров. Это получается сначала один делитель задаётся, а потом другой? Ещё то же самое про MC0 и MC1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 16:20 
Только пришел

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
mc1 и mc0 задают что деление частоты на 8, idx вместе задают реверсивный счет.
if (flag==1) {
if (knopka==8){if (a>0){a=0;i--;}i++;knopka=0;}
if (knopka==16){{if(a==0) {i=i+1;a++;}};i--;knopka=0;}
flag=0;
switch (i){
case 1: P1OUT=P1OUT^BIT0;a=0;break;
case 2: P1OUT=P1OUT^BIT6;break;
case 3: P1OUT=P1OUT^BIT1;knopka=16;break;
#pragma vector=TIMER0_A0_VECTOR
__interrupt void time(void)
{
P1IE |= BIT3+BIT4;TACTL=0;P1IES |= BIT3+BIT4;P1IFG=0;
}
и вначале обнулите а и i
и запустите отладку посмотрите что твориться при нажатие на кнопку 1.4


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 17:18 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Вот что говорит список дефайнов на счёт этих регистров:
Код:
#define ID1                    (0x0080)       /* Timer A clock input divider 1 */
#define ID0                    (0x0040)       /* Timer A clock input divider 0 */
#define MC1                    (0x0020)       /* Timer A mode control 1 */
#define MC0                    (0x0010)       /* Timer A mode control 0 */

Код:
#define MC_0                   (0*0x10u)      /* Timer A mode control: 0 - Stop */
#define MC_1                   (1*0x10u)      /* Timer A mode control: 1 - Up to CCR0 */
#define MC_2                   (2*0x10u)      /* Timer A mode control: 2 - Continous up */
#define MC_3                   (3*0x10u)      /* Timer A mode control: 3 - Up/Down */
#define ID_0                   (0*0x40u)      /* Timer A input divider: 0 - /1 */
#define ID_1                   (1*0x40u)      /* Timer A input divider: 1 - /2 */
#define ID_2                   (2*0x40u)      /* Timer A input divider: 2 - /4 */
#define ID_3                   (3*0x40u)      /* Timer A input divider: 3 - /8 */
#define TASSEL_0               (0*0x100u)     /* Timer A clock source select: 0 - TACLK */
#define TASSEL_1               (1*0x100u)     /* Timer A clock source select: 1 - ACLK  */
#define TASSEL_2               (2*0x100u)     /* Timer A clock source select: 2 - SMCLK */
#define TASSEL_3               (3*0x100u)     /* Timer A clock source select: 3 - INCLK */


Поменял обработчик прерываний на такой:
Код:
#pragma vector = PORT1_VECTOR
__interrupt void P1_ISR(void)
{

flag=flag|1;//флаг на прерывание
knopka=P1IFG;// копирование в буффер
P1IE=0;P1IFG=0;P1IES=0;//зарпещение прерываний
TACTL=TASSEL_2+ID_0+ID_1+MC_0+MC_1;TACCTL0=16;//запуск таймера
TACCR0=65000;


И добавил ваш код. Значения i и a обнулил при объявлении переменных. Теперь ситуация такая: при нажатии 1.3 загорается BIT0, ещё нажатие - тухнет, ещё нажатие - загорается BIT6, далее на нажатия 1.3 не реагирует. Далее при нажатии 1.4 тухнет BIT6, ещё нажатие - загорается BIT0, потом идёт просто инверсия BIT0. До BIT1 дело так и не доходит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 17:20 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Хотя если нужен делитель на 8 и реверсивный счёт, то TACTL=TASSEL_2+ID_3+MC_3;
Попробовал: при нажатии 1.3 загорается BIT0, потом BIT6. Оба горят. Двойное нажатие 1.4 BIT6 тухнет. Ещё двойное нажатие и тухнет BIT0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 17:32 
Только пришел

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
в иар задается имено так id3 бита нет в спецификации, мс3 тоже. даташит поитайте,там определяется имено так. да и забыл из строчки case 3: P1OUT=P1OUT^BIT1;knopka=16;break;
knopka=16; выкиньте


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 17:56 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Всё равно что-то идёт не так. Странно, что если вообще выпилить таймер, то срабатывает только case 1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 17:59 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
А можно ли как-нибудь прикрутить main вашей программы к моему первоначальному варианту? То есть у меня в одну сторону отрабатывает программа, а при нажатии 1.4 ерунда какая-то получается. Задержки пока можно и опустить. Разобраться бы как без них заставить это всё работать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 18:48 
Только пришел

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
а++ из таймера уберите и все заработает. при выпиливании таймера запрещены прерывания на кнопки, их тогда надо разрешать в другом месте, или не запрещать в обработке прерывания порта. и запустите отладку и посмотрите где глючит, только вот запишите TACCR0=8 а то замучаетесь ждать)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 24 фев 2013, 20:50 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Не работает :(
Код:
#include <msp430g2553.h>

char flag;
char i=0;
char knopka=0;
char a=0;

void main(void) {

WDTCTL = WDTPW + WDTHOLD;

P1OUT = 0;
P1DIR = BIT0+BIT6;
P1REN |= BIT3+BIT4;
P1OUT |= BIT3+BIT4;
P1IES |= BIT3+BIT4;
P1IFG &= ~BIT3+BIT4;
P1IE |= BIT3+BIT4;
TACCR0=4;
__bis_SR_register(GIE);


while (1) {
   if (flag==1) {
   if (knopka==8){if (a>0){a=0;i--;}i++;knopka=0;}
   if (knopka==16){{if(a==0) {i=i+1;a++;}};i--;knopka=0;}
   flag=0;
switch (i){
case 1: P1OUT=P1OUT^BIT0;a=0;break;//инверсия бита
case 2: P1OUT=P1OUT^BIT6;break;//инверсия бита
case 3: P1OUT=P1OUT^BIT1;break;//инверсия бита

}
}
}
}

#pragma vector = PORT1_VECTOR
__interrupt void P1_ISR(void)
{

flag=flag|1;//флаг на прерывание
knopka=P1IFG;// копирование в буффер
P1IE=0;P1IFG=0;P1IES=0;//зарпещение прерываний
TACTL=TASSEL_2+ID_3+MC_3;TACCTL0=16;//запуск таймера
TACCR0=8;
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void time(void)
{
P1IE |= BIT3+BIT4;TACTL=0;P1IES |= BIT3+BIT4;P1IFG=0;
}


Ещё с отладчиком разобраться не получается. Не работал я с ним ещё так вплотную :)
Такое ощущение, что проблема в main.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 25 фев 2013, 21:54 
Только пришел

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
if (knopka==8){if (a>0){a=0;i--;}i++;knopka=0;} a=0 убираем все остальное убираем. можно есче вести строчки проверку на 255
if (i==255) {i=1;}
и строчку проверку на 4
if (i==4) {i=3;}
надеюсь понятно зачем это надо?и почему так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 26 фев 2013, 00:12 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Я вам уже наверное поднадоел, но оно всё равно не работает. Немного поменял ваш пример:
#include <msp430g2553.h>

char i;
char knopka=0;
char a=0;

void main(void) {

WDTCTL = WDTPW + WDTHOLD;

P1OUT = 0;
P1DIR = BIT0+BIT1 + BIT6;
P1REN |= BIT3+BIT4;
P1OUT |= BIT3+BIT4;
P1IES |= BIT3+BIT4;
P1IFG &= ~BIT3+BIT4;;
P1IE |= BIT3+BIT4;;

_enable_interrupt();


while (1) {
if (knopka==8){if (a>0){a=0;i--;}i++;knopka=0;}
if (knopka==16){if (i>2){if(a==0) {i=4;a++;}};i--;knopka=0;}
switch (i){
case 1:
P1OUT |= BIT0;
P1OUT &= ~ BIT1 + BIT6;
break;
case 2:
P1OUT |= BIT6;
P1OUT &= ~ BIT0;
break;
case 3:

P1OUT |= BIT1;
P1OUT &= ~ BIT6;
break;


}
}
}

#pragma vector = PORT1_VECTOR
__interrupt void P2_ISR(void) {
switch(P1IFG & (BIT3+BIT4)) {
case BIT4:
P1IFG &= ~BIT4;
knopka|=8;
P1IE |= BIT4;
break;
case BIT3:
P1IFG &= ~BIT3;
knopka|=16;
P1IE |= BIT3;
}
}
И оно почти работает, только иногда два диода одновременно загораются и приходится по 2-3 раза жать на кнопку, чтобы диод переключился. Пробовал инверсию, но тогда вообще какая-то ерунда получается. На счёт проверки 4 и 255 - понятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 26 фев 2013, 05:54 
Только пришел

Зарегистрирован: 21 сен 2011, 03:02
Сообщения: 16
Откуда: Israel
Каюсь что детально не читал, но раз работа с кнопками, то может антидребезг добавить.
типа __delay_cycles(5000) добавить в начале интерапта. А то вдруг он несколько раз срабатывает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 26 фев 2013, 20:23 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
В прерываниях __delay_cycles использовать не рекомендуется, а так да, задержка по таймеру будет, надо только с мэйном разобраться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 26 фев 2013, 21:05 
Только пришел

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
#include <msp430g2553.h>

char flag;
char i;
char knopka=0;
char a;

void main(void) {

WDTCTL = WDTPW + WDTHOLD;

P1OUT = 0;
P1DIR = BIT0+BIT6;
P1REN |= BIT3+BIT4;
P1OUT |= BIT3+BIT4;
P1IES |= BIT3+BIT4;
P1IFG &= ~BIT3+BIT4;
P1IE |= BIT3+BIT4;

__bis_SR_register(GIE);
i=0;a=0;
while (1) {
if (flag==1) {
if (knopka==8){if (a>0){a=0;i--;};i++;}
if (knopka==16){{if(a==0) {i=i+1;a++;}};i--;}
flag=0;
switch (i){
case 1: P1OUT=P1OUT^BIT0;break;//èíâåðñèÿ áèòà
case 2: P1OUT=P1OUT^BIT6;break;//èíâåðñèÿ áèòà
case 3: P1OUT=P1OUT^BIT1;break;//èíâåðñèÿ áèòà

}
if (i==255) {i=1;}
}
}
}

#pragma vector = PORT1_VECTOR
__interrupt void P1_ISR(void)
{

flag=flag|1;//ôëàã íà ïðåðûâàíèå
knopka=P1IFG;// êîïèðîâàíèå â áóôôåð
P1IE=0;P1IFG=0;P1IES=0;//çàðïåùåíèå ïðåðûâàíèé
TACTL=TASSEL1+ID0+ID1+MC0+MC1;TACCTL0=16;//çàïóñê òàéìåðà
TACCR0=65000;
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void time(void)
{
P1IE |= BIT3+BIT4;TACTL=0;P1IES |= BIT3+BIT4;P1IFG=0;
}
вот мой рабочий пример из иара.все работает спциально припаял вторую кнопку на 1.4. единственное нет 3 диода))
в css еще посмотрите в сторону оптимизации, в иаре бывает из-за нее некоректно работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с кнопками
СообщениеДобавлено: 26 фев 2013, 21:54 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Блин, оптимизацию отключил, но всё равно не работает :( Ещё и иар как назло не запускается.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 49 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB