Перейти к содержанию

Непонятная Работа Программы


Рекомендуемые сообщения

В общем суть такова:

Есть написанная программа, должна она работать так:

Есть 3 кнопки (1 - PB3, 2 - PB4, 3 - PB2), и выход (PB1)

На выходе постоянно 1. Но! Если последовательно нажимать по 5 секунд сначала 1 кнопку, потом 2, потом 3 - то на выходе появится 0!

Но есть еще небольшой нюанс. Между нажатиями вам дают 5 секунд, чтобы нажать следующую кнопку, в противном случе программа уйдёт в сброс. А так же если нарушить комбинацию - программа тоже должна уйти в сброс!

В чем проблема?

Проблема в том, что программа работает некорректно. Тоесть если допустим нажимать так: 1, 2, 1, 3, 1, 2 ( пример ), то она всё равно сработает и на выходе будет 0! А она не должна срабатывать! Она должна срабатывать только при одном условии!! Если комбинация будет 1, 2, 3!

Что делать?

Вот код:


/*
* B_R_A.cpp
*
* Created: 28.01.2016 21:22:55
* Author: Conrad
*/

//подключаем необходимые библиотеки
#include <avr/io.h> // Библиотека ввода-вывода "io.h"
#define F_CPU 9600000UL //частота работы процессора для рассчета временных задержек "delay.h"
#include <util/delay.h> // Библиотека задержек "delay.h"
#include <avr/interrupt.h> //прерывания

// Аппаратную частоту выставлять ФЬЮЗАМИ 9600000 врываниянутренний генератор
// Объявляем глобальные переменные

int knopka_1=0; //переменная для управления кнопкой #1
int knopka_2=0; //переменная для управления кнопкой #2
int knopka_3=0; //переменная для управления кнопкой #3
int regim=0; //переменная для смены режимов
int past_regim=0;
int reset=0;

//определяем макросы для удобства написания кода
//-----------------------------------------
// два варианта смены состояния порта
#define VD_ON PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0) // Выключение нагрузки
#define VD_OFF PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (1<<PORTB1) | (0<<PORTB0) // Включение нагрузки
//#define VD_OFF PORTB |= _BV(PB1); // установить "1" на линии PB1 порта B (Выключение нагрузки)
//#define VD_ON PORTB &= ~_BV(PB1); // установить "0" на линии PB1 порта B (Включение нагрузки)
//-----------------------------------------
#define KNOPKA_1 (PINB & (1 << PB3)) == 0 // сопоставляем порт входа с номером кнопки для удобства PORTB3
#define KNOPKA_2 (PINB & (1 << PB4)) == 0 // сопоставляем порт входа с номером кнопки для удобства PORTB4
#define KNOPKA_3 (PINB & (1 << PB2)) == 0 // сопоставляем порт входа с номером кнопки для удобства PORTB0
//-----------------------------------------
#define DREBEZG _delay_ms(30) // Задержка 30 миллисекунд для устранения дребезга контактов
//-----------------------------------------
void KNOPKA(void)
{
if (KNOPKA_1) //Проверяем предварительное нажатие
{
DREBEZG; //Устранение "дребезга контактов"
if (KNOPKA_1) //Подтверждаем нажатие
{
knopka_1 = 1; // кнопка нажата
} else{knopka_1 = 0;} // кнопка отключена
}
if (KNOPKA_2) //Проверяем предварительное нажатие
{
DREBEZG; //Устранение "дребезга контактов"
if (KNOPKA_2) //Подтверждаем нажатие
{
knopka_2 = 1; // кнопка нажата
} else{knopka_2 = 0;} // кнопка отключена
}
if (KNOPKA_3) //Проверяем предварительное нажатие
{
DREBEZG; //Устранение "дребезга контактов"
if (KNOPKA_3) //Подтверждаем нажатие
{
knopka_3 = 1; // кнопка нажата
} else{knopka_3 = 0;} // кнопка отключена
}
}


void (*funcptr)( void ) = 0x0000;//Программный RESET

int PushButton(int KN,int TM)
{
for (int x=0;KN==1 && x<TM;x++)
{
_delay_ms(50);
}
if (KN==1)
{
return 1;
} else {return 0;}

}

void TEST()
{

}

void TEST2()
{


}

int main(void)
{
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
// Инициализируем порты на ввод и вывод: Bit5=In Bit4=In Bit3=In Bit2=In (Bit1=Out устанавливаем как выход) Bit0=In
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (0<<DDB0);
// Состояние портов: Bit5=T Bit4=T Bit3=T Bit2=T (Bit1=1 установлен высокий уровень на выходе) Bit0=T T=1 все входы подтянуты к +
PORTB=(1<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (1<<PORTB0);
//--------------------------------------
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);// 9 Mgz
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00);//без предделителя


while (1)
{
KNOPKA();

if (regim==0 && knopka_1==1)
{
if (PushButton(knopka_1,100)==1)
{
regim=1;TEST();reset=0;
}
}
if (regim==1 && knopka_2==1)
{
if (PushButton(knopka_2,100)==1)
{
regim=2;TEST();reset=0;
}
}
if (regim==2 && knopka_3==1)
{
if (PushButton(knopka_3,100)==1)
{
regim=3;TEST();reset=0;
}
}


if(regim==3)
{
regim=4;reset=0; VD_ON;//логический ноль
}

if (regim != 4)
{
if (past_regim==regim)
{

_delay_ms(50);
reset++;
if (reset==50)
{

TEST2();
funcptr();
}

}else{past_regim=regim;reset=0;}
}

}
}

Исходники прикрепил (AVR Studio 6)

bra.rar

Изменено пользователем Conradk10
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Если последовательно нажимать по 5 секунд сначала 1 кнопку, потом 2, потом 3 - то на выходе появится 0!

так и не понял, а где в коде отсчет в 5сек??? где учет погрешности нажатия кнопки?
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Для начала составить толковый алгоритм.

...где в коде отсчет в 5сек...

for (int x=0;KN==1 && x<TM;x++)
{
_delay_ms(50);
}

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...