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

 
 
> CodeVisionAVR помогите по написанию!
ssvd
сообщение Oct 31 2009, 07:07
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 30-10-09
Пользователь №: 53 320



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

Код
    //выводим на LCD "нажмите кнопку _start_"
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("Hello!");
    lcd_gotoxy(0,1);
    lcd_putsf("Press Start!");
    
    while(PINA.0){ } //бесконечный цекл, ждем нажатие кнопки старт!!!
    
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("Temp. beep");
    lcd_gotoxy(0,1);
    lcd_putchar(t_count);
    
    while(PINA.0){ //бесконечный цекл, ждем нажатие кнопки старт!!!
    //    if (PINA.3){ };
        if (PINA.1){ //если нажата кнопка +
            t_count++;
            lcd_gotoxy(0,1);
            lcd_putchar(t_count);
        };
        if (PINA.2){  //если нажата кнопка -
            t_count--;
            lcd_gotoxy(0,1);
            lcd_putchar(t_count);
        };
    }
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DRUID3
сообщение Oct 31 2009, 08:31
Сообщение #2


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Разумно... Но для такого объема программы - самое оно wink.gif ... Кстати, дребезг контактов хорошо давится простейшей интегрирующей RC-цепочкой...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 31 2009, 08:48
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(DRUID3 @ Oct 31 2009, 11:31) *
Разумно... Но для такого объема программы - самое оно wink.gif ...
Согласен. Но лучше привыкать к хорошему тону с малолетства:-)
Цитата
Кстати, дребезг контактов хорошо давится простейшей интегрирующей RC-цепочкой...
Это да. Бывает даже так... Вопрос - а оно надо, если программно всё решается великолепно.
А RC цепочка в динамическом сканировании например не подходит, да и лишние элементы на плате, лишние пайки, деньги...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ssvd
сообщение Oct 31 2009, 09:12
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 30-10-09
Пользователь №: 53 320



Цитата(demiurg_spb @ Oct 31 2009, 12:48) *
Согласен. Но лучше привыкать к хорошему тону с малолетства:-)Это да. Бывает даже так... Вопрос - а оно надо, если программно всё решается великолепно.
А RC цепочка в динамическом сканировании например не подходит, да и лишние элементы на плате, лишние пайки, деньги...


Подскажите как программно это решить?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 31 2009, 13:36
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ssvd @ Oct 31 2009, 12:12) *
Подскажите как программно это решить?
Вот Вам ещё три варианта:
CODE
#define MAX_CHECKS 10 // # checks before a switch is
debounced
uint8_t Debounced_State; // Debounced state of the switches
uint8_t State[MAX_CHECKS]; // Array that maintains bounce status
uint8_t Index; // Pointer into State
// Service routine called by a timer interrupt
void DebounceSwitch3()
{
uint8_t i,j;
State[Index]=RawKeyPressed();
++Index;
j=0xff;
for(i=0; i<MAX_CHECKS-1;i++) j=j & State[i];
Debounced_State= j;
if(Index>=MAX_CHECKS) Index=0;
}

//=================================================================
bool_t DebounceSwitch2()
{
static uint16_t State = 0; // Current debounce status
State=(State<<1) | !RawKeyPressed() | 0xe000;
if(State==0xf000) return TRUE;
return FALSE;
}

//=================================================================
#define CHECK_MSEC 5 // Read hardware every 5 msec
#define PRESS_MSEC 10 // Stable time before registering pressed
#define RELEASE_MSEC 100 // Stable time before registering released
// This function reads the key state from the hardware.
extern bool_t RawKeyPressed();
// This holds the debounced state of the key.
bool_t DebouncedKeyPress = false;
// Service routine called every CHECK_MSEC to
// debounce both edges
void DebounceSwitch1(bool_t *Key_changed, bool_t *Key_pressed)
{
static uint8_t Count = RELEASE_MSEC / CHECK_MSEC;
bool_t RawState;
*Key_changed = false;
*Key_pressed = DebouncedKeyPress;
RawState = RawKeyPressed();
if (RawState == DebouncedKeyPress)
{
// Set the timer which allows a change from current state.
if (DebouncedKeyPress) Count = RELEASE_MSEC / CHECK_MSEC;
else Count = PRESS_MSEC / CHECK_MSEC;
}
else
{
// Key has changed - wait for new state to become stable.
if (--Count == 0)
{
// Timer expired - accept the change.
DebouncedKeyPress = RawState;
*Key_changed=true;
*Key_pressed=DebouncedKeyPress;
// And reset the timer.
if (DebouncedKeyPress) Count = RELEASE_MSEC / CHECK_MSEC;
else Count = PRESS_MSEC / CHECK_MSEC;
}
}
}
P.S. Чтобы понять как оно работает много ума не надо.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ssvd
сообщение Oct 31 2009, 15:43
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 30-10-09
Пользователь №: 53 320



Цитата(demiurg_spb @ Oct 31 2009, 17:36) *
Вот Вам ещё три варианта:


как я уже сказал, что С только начал изучать...
можете построчно описать какой нибудь способ?
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 31 2009, 20:42
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ssvd @ Oct 31 2009, 18:43) *
как я уже сказал, что С только начал изучать...
можете построчно описать какой нибудь способ?
Все когда-то начинали. Читайте книги по си.
Как для первоклассника:

Функция DebounceSwitch2 не получает никаких аргументов и возвращает беззнаковый байт результата 1-истина 0-ложь
Вызывать эту функцию надо с интервалом 5-10мс.
Код
uint8_t DebounceSwitch2(void)
{
// 1. Объявляется локальная статическая переменная и единожды инициализируется нулём при включении контроллера.

static uint16_t State = 0;                                        

// 2. State сдвигается влево на один бит (было 0b 0000 0000 0000 0011 станет 0b 0000 0000 0000 0110)
// 3. далее результат, возвращаемый функцией RawKeyPressed() логически инвертируем (был 0 стал 1 и наоборот)
// 4. далее делаем побитовое ИЛИ результата пункта 2 и пункта 3
// 5. далее делаем побитовое ИЛИ результата пункта 4 с константой 0xe000 = 0b 1110 0000 0000 0000
// 6. присваиваем результат пункта 5 переменной State

State=(State<<1) | !RawKeyPressed() | 0xe000;

// 7. сравниваем State с константой 0xf000 =  = 0b 1111 0000 0000 0000 и ели равны возвращаем 1 если иначе 0

return (State==0xf000);
}
побитовое ИЛИ работает так:
a=0b00000001
b=0b00000010
c=a|b; // c станет равно 0b00000011

RawKeyPressed() возвращает нефильтрованное состояние логического входа (кнопка нажата = 0).
и как только кнопка зажата средний член выражения (State<<1) | !RawKeyPressed() | 0xe000
превращается в 1. Получаем (State<<1) | 1 | 0xe000
CODE
Переменная State начинает меняться:
State = 0xe001
State = 0xe003
State = 0xe007
State = 0xe00f
State = 0xe01f
State = 0xe03f
State = 0xe07f
State = 0xe0ff
State = 0xe1ff
State = 0xe3ff
State = 0xe7ff
State = 0xefff
State = 0xffff
State = 0xffff
State = 0xffff
State = 0xffff

Как только кнопку отпустили: (State<<1) | 0 | 0xe000
State = 0xfffe
State = 0xfffc
State = 0xfff8
State = 0xfff0
State = 0xffe0
State = 0xffc0
State = 0xff80
State = 0xff00
State = 0xfe00
State = 0xfc00
State = 0xf800
State = 0xf000 << бинго
State = 0xe000
State = 0xe000
State = 0xe000
State = 0xe000
Такой вот вариант (я его не использую). Существует масса других...
Надо понимать, что при использовании этого алгоритма необходимо буферировать (очепятка была)smile.gif результат подавления дребезга в некоторой переменной...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ssvd   CodeVisionAVR помогите по написанию!   Oct 31 2009, 07:07
- - demiurg_spb   Вам нужно применить алгоритм подавления дребезга к...   Oct 31 2009, 08:02
- - DRUID3   Нужно просто добавить задержку (насколько помню та...   Oct 31 2009, 08:15
|- - demiurg_spb   Цитата(DRUID3 @ Oct 31 2009, 11:15) Нужно...   Oct 31 2009, 08:27
- - Genadi Zawidowski   Вот в этом архиве есть файл keyboard.c - в нём про...   Oct 31 2009, 11:03
|- - ssvd   Цитата(Genadi Zawidowski @ Oct 31 2009, 15...   Oct 31 2009, 12:20
|- - Genadi Zawidowski   Цитата(ssvd @ Oct 31 2009, 15:20) спасибо...   Oct 31 2009, 22:34
- - Vetal-Soft   Сделай так Код while(PINA.0){ }; //беско...   Nov 2 2009, 07:55
|- - ssvd   вот что написал, проверьте пожалуйста. вызывается ...   Nov 2 2009, 15:40
- - Vetal-Soft   бред... Модератор (rezident). Это сообщение являе...   Nov 3 2009, 08:33
|- - ssvd   Цитата(Vetal-Soft @ Nov 3 2009, 12:3...   Nov 3 2009, 13:51
|- - XVR   Цитата(Vetal-Soft @ Nov 3 2009, 11:3...   Nov 5 2009, 07:36
|- - ssvd   Цитата(XVR @ Nov 5 2009, 11:36) Ну перебо...   Nov 9 2009, 10:09
- - Vetal-Soft   Цитата(ssvd @ Nov 3 2009, 18:51) я вообще...   Nov 4 2009, 08:44


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

 


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


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