реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> 4 нажатия - 4 действия. STM32F1. CMSIS.
EpoLLIa
сообщение Apr 22 2015, 13:19
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 22-04-15
Пользователь №: 86 341



Здравствуйте. Помогите решить проблему, есть задание, по каждому нажатию кнопки выполнять разную комбинацию миганий светодиодами.
1 нажатие - горит первый светодиод
2 нажатие - гаснет первый, загорается второй
3 нажатие - горят оба
4 нажатие - гаснут оба

В голове вроде понимаю как, но реализовать не могу. В этом деле совсем новичок.
Вот что у меня получилось.
CODE
#include "stm32F10x.h"

uint8_t n=0;
uint8_t bc=0;
uint8_t bs=0;

void InitAll(void){

RCC ->APB2ENR |= RCC_APB2ENR_IOPCEN;
RCC ->APB2ENR |= RCC_APB2ENR_IOPAEN;

GPIOC ->CRH &= ~GPIO_CRH_MODE8;
GPIOC ->CRH |= GPIO_CRH_MODE8_1;
GPIOC ->CRH &= ~GPIO_CRH_CNF8;

GPIOC ->CRH &= ~GPIO_CRH_MODE9;
GPIOC ->CRH |= GPIO_CRH_MODE9_1;
GPIOC ->CRH &= ~GPIO_CRH_CNF9;

GPIOA ->CRL &= ~GPIO_CRL_CNF0;
GPIOA ->CRL |= GPIO_CRL_CNF0_0;
GPIOA ->CRL &= ~GPIO_CRL_MODE0;

return;
}
void sys(void) // Вроде от дребезга
{
if ((GPIOA->IDR&0x01)==1)
{
if (bc <5)
{
bc++;
}
else
{
bs=1;
}
}
else {
if (bc > 0)
{
bc--;
}
else
{
bs=0;
}
}
}

int main(void){
sys();
InitAll();
while(1)
{
if (bs==1)
{
n++;
}
switch (n) {
case 1:
GPIOC->BSRR = GPIO_BSRR_BR9;
GPIOC->BSRR = GPIO_BSRR_BS8;
break;
case 2:
GPIOC->BSRR = GPIO_BSRR_BR8;
GPIOC->BSRR = GPIO_BSRR_BS9;
break;
case 3:
GPIOC->BSRR = GPIO_BSRR_BS8;
GPIOC->BSRR = GPIO_BSRR_BS9;
break;
case 4:
GPIOC->BSRR = GPIO_BSRR_BR8;
GPIOC->BSRR = GPIO_BSRR_BR9;
break;
default:
n=0;
break;
}
}
}

Выручите пожалуйста.
Повторюсь, до этого ни разу не сталкивался с программированием, тем более с программированием микроконтроллеров, сильно не ругайте, лучше помогите. Заранее спасибо.

Сообщение отредактировал IgorKossak - Apr 22 2015, 14:06
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
mcheb
сообщение Apr 22 2015, 13:48
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Общий смысл такой -азбука Морзе. Выбираете конкректный временной интервал, короткое нажатие- 0 длинное - 1 (или наоборот) Если ничего не нажималось очень долго - это окончание нажатий и анализ 0 и 1.
Go to the top of the page
 
+Quote Post
EpoLLIa
сообщение Apr 22 2015, 15:04
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 22-04-15
Пользователь №: 86 341



Общий смысл я примерно понимаю. Реализовать не получается никак, один раз получилось, но уже не помню как там делал, но работало только раза с десятого, постоянно дребезг, никак не получается от него избавится.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Apr 23 2015, 06:35
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(EpoLLIa @ Apr 22 2015, 14:19) *
Здравствуйте. Помогите решить проблему, есть задание, по каждому нажатию кнопки выполнять разную комбинацию миганий светодиодами.
1 нажатие - горит первый светодиод
2 нажатие - гаснет первый, загорается второй
3 нажатие - горят оба
4 нажатие - гаснут оба

Имеется ввиду ПЕРВОЕ нажатие, потом последующее (ВТОРОЕ) нажатиЕ или ОДНОКРАТНОЕ нажатие, ДВУХКРАТНОЕ (тип-тип) нажатие, ТРОЙНОЕ и т.д.?
Go to the top of the page
 
+Quote Post
EpoLLIa
сообщение Apr 23 2015, 08:17
Сообщение #5





Группа: Новичок
Сообщений: 4
Регистрация: 22-04-15
Пользователь №: 86 341



Цитата(KnightIgor @ Apr 23 2015, 00:35) *
Имеется ввиду ПЕРВОЕ нажатие, потом последующее (ВТОРОЕ) нажатиЕ или ОДНОКРАТНОЕ нажатие, ДВУХКРАТНОЕ (тип-тип) нажатие, ТРОЙНОЕ и т.д.?

Первое, последующее (второе), и т.д. С этой задачей я уже справился, всё работает. Теперь хочу мигание светодиода сделать через SysTick.
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 23 2015, 08:20
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(EpoLLIa @ Apr 23 2015, 12:17) *
Первое, последующее (второе), и т.д. С этой задачей я уже справился, всё работает. Теперь хочу мигание светодиода сделать через SysTick.


Так расскажите сообществу как побороли дребезг


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
EpoLLIa
сообщение Apr 23 2015, 11:01
Сообщение #7





Группа: Новичок
Сообщений: 4
Регистрация: 22-04-15
Пользователь №: 86 341



Цитата(Obam @ Apr 23 2015, 02:20) *
Так расскажите сообществу как побороли дребезг

Только вот, чтобы всё заработало как надо, методом тыка (т.к. не знаю особенностей case+swtich) сделал case 5, который точно повторяет case 4 (тут гаснут оба светодиода), и в default n приравниваю к нулю. Иначе если делать без case 5, после 4ого нажатия он почему-то гасил оба и тут же зажигал первый светодиод и так по кругу.
CODE

#include "stm32F10x.h"

uint8_t MAXCNT=50, n=0, cntr=0;
char pressed=0;

void delay (volatile uint32_t nCount){

for (; nCount !=0; nCount--);
}
void InitAll(void){

RCC ->APB2ENR |= RCC_APB2ENR_IOPCEN;
RCC ->APB2ENR |= RCC_APB2ENR_IOPAEN;

GPIOC ->CRH &= ~GPIO_CRH_MODE8;
GPIOC ->CRH |= GPIO_CRH_MODE8_1;
GPIOC ->CRH &= ~GPIO_CRH_CNF8;

GPIOC ->CRH &= ~GPIO_CRH_MODE9;
GPIOC ->CRH |= GPIO_CRH_MODE9_1;
GPIOC ->CRH &= ~GPIO_CRH_CNF9;

GPIOA ->CRL &= ~GPIO_CRL_CNF0;
GPIOA ->CRL |= GPIO_CRL_CNF0_0;
GPIOA ->CRL &= ~GPIO_CRL_MODE0;

return;

}

int main(void){
InitAll();
while(1) {
if((GPIOA->IDR&0x01)==0) { // Здесь от дребезга
pressed=0;
cntr=0;
}
else if(!pressed) {
cntr++;
if(cntr>MAXCNT)
{n++;

switch (n) {
case 1:
GPIOC->BSRR = GPIO_BSRR_BR9;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BS8;
break;
case 2:
GPIOC->BSRR = GPIO_BSRR_BR8;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BS9;
break;
case 3:
GPIOC->BSRR = GPIO_BSRR_BR9;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BS8;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BR8;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BS8;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BR8;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BS9;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BR9;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BS9;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BR9;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BS8;
GPIOC->BSRR = GPIO_BSRR_BS9;
break;
case 4:
GPIOC->BSRR = GPIO_BSRR_BR8;
GPIOC->BSRR = GPIO_BSRR_BR9;
break;
case 5:
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BR9;
delay(0xFFFFF);
GPIOC->BSRR = GPIO_BSRR_BR8;
break;
default:
n=0;
break;
}
}
}
}
}



Сообщение отредактировал EpoLLIa - Apr 23 2015, 11:06
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 23 2015, 14:12
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



как-то так
Код
uint8_t n;
// подразумевается, что светодиоды соответствуют младшим разрядам n


n = 0;

while(1)
{
    set_LED(n & 0x03); // включаем светодиоды, значимые только последние 2 бита
    wait_key(); // ждем нажатия кномки, устранение дребезга там же
    n++;
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01441 секунд с 7
ELECTRONIX ©2004-2016