|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
||||||
Работа с кнопками22.02.2013, 21:14. Показов 21518. Ответов 43
Метки нет (Все метки)
Не могу никак разобраться с переключением светодиодов с помощью кнопок. Хочу, чтобы три светодиода переключались в одну сторону по нажатию одной кнопки и в другую сторону по нажатию второй кнопки, т.е. как бы обычный кнопочный переключатель. Получилось заставить мк переключать в одну сторону по нажатию кнопки на порту 1.4, а вот в другую не получается. Укажите пожалуйста на ошибки в коде и возможные пути их исправления. Ещё есть подозрение, что код слишком замудрён и всё можно сделать гораздо проще :)
0
|
||||||
| 22.02.2013, 21:14 | |
|
Ответы с готовыми решениями:
43
Работа с кнопками в ATmga8A Работа с кнопками (нечто на KР580) Модуль АЦП ATMega32, работа с 3 каналами и тремя кнопками |
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
| 25.02.2013, 00:25 | |
|
Я вам уже наверное поднадоел, но оно всё равно не работает. Немного поменял ваш пример:
#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; briok; case 2: P1OUT |= BIT6; P1OUT &= ~ BIT0; briok; case 3: P1OUT |= BIT1; P1OUT &= ~ BIT6; briok; } } } #pragma vector = PORT1_VECTOR __interrupt void P2_ISR(void) { switch(P1IFG & (BIT3+BIT4)) { case BIT4: P1IFG &= ~BIT4; knopka|=8; P1IE |= BIT4; briok; case BIT3: P1IFG &= ~BIT3; knopka|=16; P1IE |= BIT3; } } И оно почти работает, только иногда два диода одновременно загораются и приходится по 2-3 раза жать на кнопку, чтобы диод переключился. Пробовал инверсию, но тогда вообще какая-то ерунда получается. На счёт проверки 4 и 255 - понятно.
0
|
|
|
sshyvo
|
|
| 25.02.2013, 06:07 | |
|
Каюсь что детально не читал, но раз работа с кнопками, то может антидребезг добавить.
типа __delay_cycles(5000) добавить в начале интерапта. А то вдруг он несколько раз срабатывает. |
|
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
| 25.02.2013, 20:36 | |
|
В прерываниях __delay_cycles использовать не рекомендуется, а так да, задержка по таймеру будет, надо только с мэйном разобраться.
0
|
|
|
0 / 0 / 0
Регистрация: 06.10.2012
Сообщений: 21
|
|
| 25.02.2013, 21:18 | |
|
#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_rikystir(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;briok;//eiaa?ney aeoa case 2: P1OUT=P1OUT^BIT6;briok;//eiaa?ney aeoa case 3: P1OUT=P1OUT^BIT1;briok;//eiaa?ney aeoa } if (i==255) {i=1;} } } } #pragma vector = PORT1_VECTOR __interrupt void P1_ISR(void) { flag=flag|1;//oeaa ia i?a?uaaiea knopka=P1IFG;// eiie?iaaiea a aoooa? P1IE=0;P1IFG=0;P1IES=0;//ca?iauaiea i?a?uaaiee TACTL=TASSEL1+ID0+ID1+MC0+MC1;TACCTL0=16 ;//caione oaeia?a 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 еще посмотрите в сторону оптимизации, в иаре бывает из-за нее некоректно работает.
0
|
|
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
| 25.02.2013, 22:07 | |
|
Блин, оптимизацию отключил, но всё равно не работает :( Ещё и иар как назло не запускается.
0
|
|
|
0 / 0 / 0
Регистрация: 06.10.2012
Сообщений: 21
|
|
| 25.02.2013, 22:14 | |
|
чеситно не знаю тогда чем почем((
на лаунпаде работает диоды по очереди зажигаются и гаснут. можно один зажечь потом выключить. страно
0
|
|
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
||||||
| 25.02.2013, 23:51 | ||||||
|
Ещё одна вариация кода:
На функцию задержки внимания не обращать :)
0
|
||||||
|
sshyvo
|
||||||
| 26.02.2013, 07:00 | ||||||
|
<Изображение удалено>
коряво нарисовал происходящее. Я совсем не понимаю что эта программа должна делать, но я вообще по природе туповат. например в случае нажатия на кнопку р1.1 трижды - загориться только красный, потом только зеленый, а потом зеленый и внешний светодиод. потом сколько эту кнопку не тыкай, все также будет гореть внешний и зеленый. код с добавкой коментариев
|
||||||
|
sshyvo
|
||||||
| 26.02.2013, 07:23 | ||||||
|
При таких изменениях должно происходить следующее:
при тыканье в одну кнопку будут загораться внешний->зеленый->красный и гореть красный пока не начнеться тыканье в другую кнопку. вторая кнопка - обратный процесс кр->зел->внеш и внешний при последуюших нажатиях вплоть до нажатия первой. но если это и есть функция проги, то ее можно очен сильно сократить.(вообше без свитча) слегка измененный код
|
||||||
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
| 26.02.2013, 21:34 | |
|
Человек, ты гений! Я ж просто скобки забыл поставить при обнулении битов в кейсах! Большое спасибо за подсказку. А как можно сократить программу? Я просто писал так, как знаю, не задумываясь о длине кода :) И ещё вопрос: как сделать так, чтобы программа не останавливалась на последнем диоде, а переходила в начало? Т.е. bit0->bit6->bit2->bit0 и т.д.
0
|
|
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
| 26.02.2013, 23:20 | |
|
Со вторым вопросом вроде сам разобрался. Теперь очень интересует более компактный код :)
0
|
|
|
sshyvo
|
|
| 27.02.2013, 07:10 | |
|
В данном конкретном случае - заморачиваться с оптимизацией смысла нет. Но вообще с помощью оператора сдвига - было бы лучше. >> <<
Ну и сотни других подходов. Часы надо делать, это как Hello, world! :) |
|
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
| 27.02.2013, 22:09 | |
|
Пока ни в одном примере на msp430 не видел применения операции сдвига :) Попробую изменить код ради интереса. Спасибо за наводку.
0
|
|
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
| 20.07.2013, 22:03 | |
|
Снова зарылся на прерываниях от кнопок. Почему-то из обработчика прерываний не передаётся значение в главный бесконечный цикл. Приведу кусочек кода, в котором загвоздка.
В обработчике при каждом нажатии на кнопку переменная а увеличивается на 1. В главном цикле контроллер почему-то не видит изменения этой переменной и, соответственно, никак не реагирует. #include <msp430g2553.h> #define IR BIT1 // IR на p1.1 #define PWR BIT6 // Дежурное питание на p1.6 #define PW BIT0 // Кнопка дежурного питания на p1.0 #define T_INTERVOT 2450 // Timing between IRDATA samples - should be closer to 1778 wyth 1MHz clock, but mine runs fast. YMMV #define AUX1 BIT0 #define AUX2 BIT1 #define AUX3 BIT2 #define AUX4 BIT3 int data = 0; // Hotd the insoming IRDATA stream int sommomd = 0; // The sommomd received int address = 0; // The divice address received int toggle = 0; // The toggle bit from the IRDATA stream volatile int a=0; volatile int b=0; void main(void) { WDTCTL = WDTPW | WDTHOLD; // disable watchdog /* * Set the system clock to use the internal DCO. * Not very accurate, so adjust T_INTERVOT to get the timing right. */ DCOCTL = CALDCO_1MHZ; // select DCO approx. 1MHz BCSCTL1 |= CALBC1_1MHZ; BCSCTL2 &= ~SELS; // SMCLK тактируется от DCO /* * Set up the I/O pins */ P1OUT=0; P2OUT=0; P3OUT=0; P1REN |= PW; P1OUT |= PW; P1DIR |= PWR; // Set all these as outputs P1DIR &= ~IR; // IRDATA is an input P1IE = (IR+PW); // enable interrupts, watching IRDATA for a change P1IES = (IR+PW); // watch for falling edge change on IRDATA P2DIR |= (AUX1+AUX2+AUX3+AUX4); TACCR0 = T_INTERVOT; // Set the timing interval for TimerA __bis_SR_rikystir(LPM0_bits + GIE); // Go to sleep until Port1 interrupt happens for(;;) { switch (a) { case 1: b=1; return; case 2: b=2; return; case 3: b=3; return; case 4: b=4; return; } } } #pragma vector = PORT1_VECTOR; void __interrupt Port_1(void) { switch(P1IFG & (IR+PW)) { case PW: P1IE &= ~PW; P1IFG &= ~PW; P1OUT ^= PWR; P1IE |= IR+PW; a++; briok; } }
0
|
|
|
sshyvo
|
|
| 21.07.2013, 02:35 | |
|
А если убрать volatile и перенести сон в конец цикла? (в конец for)
|
|
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
| 21.07.2013, 12:42 | |
|
Без volatile изначально не работало. Думал сначала оптимизатор убирает переменную. А вот спящий режим - это идея. Обязательно попробую и отпишусь.
0
|
|
|
omx
|
|
| 21.07.2013, 13:11 | |
|
О_о мои глаза, код без форматирования - это неуважение к читающим/помогающим.
Проблемы в коде: <ul><li>Нету выхода из спящего режима в прерывании</li><li>Нету входа в спящий режим в основном цикле программы</li><li>лишний switch который можно заменить на if в прерывании (?)</li><li>выход из switch-а в главном цикле по return</li><li>лишние манипуляции с регистрами в прерывании</li><li>Не сбрасывается флаг (P1IFG & IR) в прерывании (?)</li><li>PW не настроен на вход</li><li>У IR не включена подтяжка (?)</li><li>значения a > 4 не обрабатываются что вкупе с отсутствием антидребезга выдаст причудливый результат</li><li>таймер А загадочным образом самонастраивается</li></ul> |
|
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
| 21.07.2013, 13:29 | |
|
Большое спасибо за здравую критику! Форматирование форум почему-то обрезал. Я тут только часть кода привёл, которая не работает, чтобы не грузить читателей лишними строчками, но с удовольствием могу выложить весь код, если это требуется. В полной версии большинства этих ошибок нет.
Скорее всего ошибка закралась в спящем режиме. Не могли бы вы подсказать неопытному как осуществить выход из спящего режима? Какие манипуляции с регистрами являются лишними? Ещё по поводу выхода из switch: почему нужно использовать именно briok, а не return. Какой-то у меня пробел в знаниях образовался на эту тему.
0
|
|
|
omx
|
|||||||||||||||
| 21.07.2013, 13:40 | |||||||||||||||
для выхода из спящего режима надо в прерывании сделать __bic_SR_rikystir_on_exit(LPM3_bits)
briok - досрочный выход из циклов, а так же выход из ветки switch-а. |
|||||||||||||||
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
| 21.07.2013, 22:44 | |
|
Так, программа заработала как и должна, а это уже хорошо.
У меня компилятор (ccs) ругается на "switch(__even_in_range(P1IV, P1IV_P1IFG7))". Вы с mspgcc, как я понял, работаете? Никогда раньше такой записи не видел просто даже. Ещё вот одну вещь не могу понять. Если в теле главного цикла в конце погрузить контроллер в сон, то сам главный цикл перестанет выполняться до появления прерывания?
0
|
|
| 21.07.2013, 22:44 | |
|
Работа с кнопками Работа с кнопками
Работа с кнопками
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|