Easyelectronics.ru

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

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



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

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

Зарегистрирован: 04 апр 2012, 00:42
Сообщения: 21
чеситно не знаю тогда чем почем((
на лаунпаде работает диоды по очереди зажигаются и гаснут. можно один зажечь потом выключить.
страно


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

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


int j=0;
int i;

void delay_ms(unsigned int ms )
{
    unsigned int k;
    for (k = 0; k<= ms; k++)
       __delay_cycles(500);

}


void main(void) {

        WDTCTL = WDTPW + WDTHOLD;
P1OUT=0;
        P1DIR = BIT0 + BIT6 +BIT2;
        P1REN |= BIT3+BIT1;
        P1OUT |= BIT3+BIT1;
        P1IES |= BIT3+BIT1;
        P1IFG &= ~BIT3+BIT1;
        P1IE |= BIT3+BIT1;

        _enable_interrupt();



        for(;;) {

           switch (j){


           case 1:
              delay_ms(500);
              P1OUT |= BIT0;


                                 break;
                           case 2:
                              P1OUT&= ~BIT0 + BIT2;
                              delay_ms(500);
                               P1OUT |= BIT6;


                                    break;
                           case 3:
                             delay_ms(500);
                             P1OUT |= BIT2;


                              break;
     }
        }


        }






#pragma vector = PORT1_VECTOR
__interrupt void P2_ISR(void) {
        switch(P1IFG & (BIT1+BIT3)) {
                case BIT1:
                        P1IFG &= ~BIT1;

                        j+=1;
                              if(j >= 3)
                              j=3;


                        break;
                case BIT3:
                         P1IFG &= ~BIT3;

                         j-=1;
                              if(j <= 0)
                              j=0;

                         break;
}
}


Почти работает. Программа правильно выбирает кейсы по нажатию, но не получается в главном цикле правильно задать P1OUT. Почему-то диоды начинает глючить. Пробовал разные вариации. Может вы чего-нибудь посоветуете?
На функцию задержки внимания не обращать :)


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

Зарегистрирован: 21 сен 2011, 03:02
Сообщения: 16
Откуда: Israel
Изображение
коряво нарисовал происходящее. Я совсем не понимаю что эта программа должна делать, но я вообще по природе туповат.
например в случае нажатия на кнопку р1.1 трижды - загориться только красный, потом только зеленый, а потом зеленый и внешний светодиод. потом сколько эту кнопку не тыкай, все также будет гореть внешний и зеленый.
Show код с добавкой коментариев


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

Зарегистрирован: 21 сен 2011, 03:02
Сообщения: 16
Откуда: Israel
При таких изменениях должно происходить следующее:
при тыканье в одну кнопку будут загораться внешний->зеленый->красный и гореть красный пока не начнеться тыканье в другую кнопку.
вторая кнопка - обратный процесс кр->зел->внеш и внешний при последуюших нажатиях вплоть до нажатия первой.
но если это и есть функция проги, то ее можно очен сильно сократить.(вообше без свитча)
Show слегка измененный код


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

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Человек, ты гений! Я ж просто скобки забыл поставить при обнулении битов в кейсах! Большое спасибо за подсказку. А как можно сократить программу? Я просто писал так, как знаю, не задумываясь о длине кода :) И ещё вопрос: как сделать так, чтобы программа не останавливалась на последнем диоде, а переходила в начало? Т.е. bit0->bit6->bit2->bit0 и т.д.


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

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


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

Зарегистрирован: 21 сен 2011, 03:02
Сообщения: 16
Откуда: Israel
В данном конкретном случае - заморачиваться с оптимизацией смысла нет. Но вообще с помощью оператора сдвига - было бы лучше. >> <<
Ну и сотни других подходов.

Часы надо делать, это как Hello, world! :)


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

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Пока ни в одном примере на msp430 не видел применения операции сдвига :) Попробую изменить код ради интереса. Спасибо за наводку.


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

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

В обработчике при каждом нажатии на кнопку переменная а увеличивается на 1. В главном цикле контроллер почему-то не видит изменения этой переменной и, соответственно, никак не реагирует.
Show


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

Зарегистрирован: 21 сен 2011, 03:02
Сообщения: 16
Откуда: Israel
А если убрать volatile и перенести сон в конец цикла? (в конец for)


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

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Без volatile изначально не работало. Думал сначала оптимизатор убирает переменную. А вот спящий режим - это идея. Обязательно попробую и отпишусь.


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

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
О_о мои глаза, код без форматирования - это неуважение к читающим/помогающим.

Проблемы в коде:
  • Нету выхода из спящего режима в прерывании
  • Нету входа в спящий режим в основном цикле программы
  • лишний switch который можно заменить на if в прерывании (?)
  • выход из switch-а в главном цикле по return
  • лишние манипуляции с регистрами в прерывании
  • Не сбрасывается флаг (P1IFG & IR) в прерывании (?)
  • PW не настроен на вход
  • У IR не включена подтяжка (?)
  • значения a > 4 не обрабатываются что вкупе с отсутствием антидребезга выдаст причудливый результат
  • таймер А загадочным образом самонастраивается


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

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Большое спасибо за здравую критику! Форматирование форум почему-то обрезал. Я тут только часть кода привёл, которая не работает, чтобы не грузить читателей лишними строчками, но с удовольствием могу выложить весь код, если это требуется. В полной версии большинства этих ошибок нет.
Скорее всего ошибка закралась в спящем режиме. Не могли бы вы подсказать неопытному как осуществить выход из спящего режима? Какие манипуляции с регистрами являются лишними? Ещё по поводу выхода из switch: почему нужно использовать именно break, а не return. Какой-то у меня пробел в знаниях образовался на эту тему.


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

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
dr_wap писал(а):
Форматирование форум почему-то обрезал
Надо использовать тег не "quote" а "code"

dr_wap писал(а):
Не могли бы вы подсказать неопытному как осуществить выход из спящего режима?
После обработки прерывания процессор возвращается в тот режим, который был до прерывания.
для выхода из спящего режима надо в прерывании сделать __bic_SR_register_on_exit(LPM3_bits)

dr_wap писал(а):
Какие манипуляции с регистрами являются лишними?
Код:
P1IE &= ~PW; //*
P1IFG &= ~PW;
P1OUT ^= PWR;
P1IE |= IR+PW; //*
А ещё проще сделать всё прерывание вот так:
Код:
#pragma vector = PORT1_VECTOR;
void __interrupt Port_1(void)
{
  switch(__even_in_range(P1IV, P1IV_P1IFG7)) {
  case P1IV_P1IFG0:
    P1OUT ^= PWR;
    a++;
    break;
  }
  __bic_SR_register_on_exit(LPM3_bits);
}
В таков случае переход на нужную ветку будет быстрее, а флаг обработанного пина сбросится автоматически.

dr_wap писал(а):
Ещё по поводу выхода из switch: почему нужно использовать именно break, а не return.
return - выход из функции (в вашем случае - выход из main)
break - досрочный выход из циклов, а так же выход из ветки switch-а.


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

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Так, программа заработала как и должна, а это уже хорошо.
У меня компилятор (ccs) ругается на "switch(__even_in_range(P1IV, P1IV_P1IFG7))". Вы с mspgcc, как я понял, работаете? Никогда раньше такой записи не видел просто даже.
Ещё вот одну вещь не могу понять. Если в теле главного цикла в конце погрузить контроллер в сон, то сам главный цикл перестанет выполняться до появления прерывания?


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

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
dr_wap писал(а):
У меня компилятор (ccs) ругается на "switch(__even_in_range(P1IV, P1IV_P1IFG7))". Вы с mspgcc, как я понял, работаете? Никогда раньше такой записи не видел просто даже.

Это из IAR-а. В mspgcc такого нет, увы. Попробуйте подлючить intrinsics.h
Код:
#include <intrinsics.h>

dr_wap писал(а):
Ещё вот одну вещь не могу понять. Если в теле главного цикла в конце погрузить контроллер в сон, то сам главный цикл перестанет выполняться до появления прерывания?
Если в прерывании делается отмена спящего режима - то да.


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

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Компилятор всё равно не знает что такое P1IV, P1IV_P1IFG7 и P1IV_P1IFG0. К сожалению нет под рукой файлика с дефайнами иара. Не могли бы вы объяснить что означают эти сокращения? Уверен, что мне удастся найти такие же в cсs. Довольно интересную запись обработчика вы привели. Никогда раньше такого даже в примерах не видел. Хотелось бы разобраться что здесь есть что.


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

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
dr_wap писал(а):
Компилятор всё равно не знает что такое P1IV, P1IV_P1IFG7 и P1IV_P1IFG0. К сожалению нет под рукой файлика с дефайнами иара. Не могли бы вы объяснить что означают эти сокращения? Уверен, что мне удастся найти такие же в cсs. Довольно интересную запись обработчика вы привели. Никогда раньше такого даже в примерах не видел. Хотелось бы разобраться что здесь есть что.

Прошу прощение за введение в заблуждение. Видимо, у вашего процессора такого регистра нету. Такого типа регистры (заканчиваются на IV) предназначены для формирования быстрых таблиц перехода для векторов прерываний, которые могут вызываться разными событиями. Например TA1IV - для таймера А. В руководстве есть описание. А P1IV есть в более старших семействах (5xx, 6xx).


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

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


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

Зарегистрирован: 21 фев 2013, 22:22
Сообщения: 5
Доброго времени суток.
Не считайте меня некрофилом :) , просто не вижу смысла начинать новую тему по старому вопросу.
Для начала, устройство будет работать от батареек, поэтому хочется использовать просыпание при изменении фронта, увеличение счетчика, и опять в сон. (это будут 2 геркона от счетчиков воды.
Входа требуется 2.
Казалось бы, что в этой теме на первой странице ( viewtopic.php?p=250725#p250725 ) уже была разобрана работа 2х кнопок, но вся проблема в том, что алгоритм, использованный там, не позволяет нажать 2 кнопки одновременно.


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

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6157
Добавьте 564ЛП2 для просывания.


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

Зарегистрирован: 21 фев 2013, 22:22
Сообщения: 5
u37 писал(а):
Добавьте 564ЛП2 для просывания.

И как мне это может помочь? объеденить ноги и завести на еще один пин?


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

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6157
Ага. Этот сигнал будет активен по любому изменению кнопок/датчиков, вне зависимости от их состояния. А уж определить, какой датчик из двух вызвал просыпание ... не проблема.


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3619
Диоды от каждой кнопки на общий вход wakeup


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

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


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

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


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

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

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