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

Программирование кнопок в ATMEGA8 на С


tifaso

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

Как сделать кнопку с фиксацией программно. То есть есть простая кнопка без фиксации. Но как сделать её с фиксацией программно иногда очень нужно, но пока ещё не разобрался. Пока ещё только начинаю осваивать программирование микросхем поэтому пожалуйста попроще объясните всё это дело. Уроков может кто подкинет буду благодарен.

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

3 часа назад, tifaso сказал:

Как сделать кнопку с фиксацией программно

А как вы делаете без фиксации? Проверяете бит? Ну вот проверяйте и переключайте в другой переменной бит если этот выставлен.

Допустим вы проверяете так 

if (BTN_PIN & BTN) {
  // нажата
}

 просто переделайте так

uint8_t btns;
#define BTN1 0x01

...

if (BTN_PIN & BTN) {
  if (btns & BTN1) {
	btns |= BTN1;
  } else {
	btns &= ~BTN1;
  }
}

если прерывание используете то то же самое.

Ну и естественно антидребезг не забываем программный или хардварный.

А то что нужно делать по нажатию кнопку будет уже 

if (btns & BTN1) {
  // кнопка с фиксацией ВКЛ
} else {
  // ВЫКЛ
}

 

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

@DrobyshevAlex Вот так у меня выполнена кнопка без фиксации

         if (PINB == 0b11111110)
         {
			 PORTD = 0b11111111;
			 _delay_ms(500);
			 PORTD = 0b00000000;
			 _delay_ms(500);
         } 
         else
         {
			 PORTD = 0b00000000;
         }

Попробовал ваши скрипты, но они бьют ошибку. С моей стороны ошибок вроде бы не видно несколько раз проверил.

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

В вашем случае видимо так

if (PINB == 0b11111110)
{
  if (PORTD) {
    PORTD = 0b00000000;
  } else {
  	PORTD = 0b11111111;
  }
} 

только если нет антидребезга я б добавил задержку

if (PINB == 0b11111110)
{
  _delay_ms(1);
  if (PINB == 0b11111110) {
    if (PORTD) {
      PORTD = 0b00000000;
    } else {
      PORTD = 0b11111111;
    }
  }
} 

 

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

5 minutes ago, DrobyshevAlex said:

видимо так

@DrobyshevAlex Кнопка с "фиксацией" означает, что один раз нажали и отпустили - включилось, второй раз нажали и отпустили - выключилось.

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

14 минут назад, Yurkin2015 сказал:

Кнопка с "фиксацией" означает, что один раз нажали и отпустили - включилось, второй раз нажали и отпустили - выключилось.

а я что то не так сделал? я догадался как бы... 

if (PINB == 0b11111110) // кнопка нажата?
{
  _delay_ms(1);// чуть подождем для антидребезга
  if (PINB == 0b11111110) {// кнопка все еще нажата?
    if (PORTD) { // если на порте есть единица хоть одна значит это выключение 
      PORTD = 0b00000000;// выключаем
    } else {// если все нули
      PORTD = 0b11111111; // включаем
    }
  }
} 

единственное что я авр не юзаю, возможно там нужно проверить не if (PORTD) а if (PIND)

и вот это

if (PINB == 0b11111110)

я бы так не делал, тут не проверка одной кнопки, а сразу всего порта... даже если кнопка будет нажата, а другой бит, будь то кнопка или еще что, будет 0 - условие не сработает. я б заменил хотя бы так

if (!(PINB & 0b1))

 

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

3 minutes ago, DrobyshevAlex said:

что то не так сделал?

Опрос кнопки в бесконечном цикле происходит? Если кнопку при нажатии удерживать дольше 1мс, то будет чередование вкл-выкл-вкл-выкл с частотой цикла опроса кнопки.

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

5 минут назад, Yurkin2015 сказал:

Опрос кнопки в бесконечном цикле происходит? Если кнопку при нажатии удерживать дольше 1мс, то будет чередование вкл-выкл-вкл-выкл с частотой цикла опроса кнопки.

согласен

тогда все таки бит как я предлагал изначально 

или же, если не нужно процессорное время, можно так

if (!(PINB & 0b1)) // кнопка нажата?
{
  _delay_ms(1);// чуть подождем для антидребезга
  if (!(PINB & 0b1)) {// кнопка все еще нажата?
	while(!(PINB & 0b1)); // ждем отпускания кнпоки
    if (PORTD) { // если на порте есть единица хоть одна значит это выключение 
      PORTD = 0b00000000;// выключаем
    } else {// если все нули
      PORTD = 0b11111111; // включаем
    }
  }
}
Ссылка на комментарий
Поделиться на другие сайты

7 minutes ago, DrobyshevAlex said:

как я предлагал изначально 

Ну, там я тоже подрихтовал бы.

Вот, в условии проверяем

if (btns & BTN1) {
    btns |= BTN1;

если бит BTN1 установлен в btns, то зачем его опять устанавливать? Видимо надо поменять местами с btns &= ~BTN1;

И, потом, опять же при удержании кнопки, этот бит будет снова скакать в переменной btns с частотой цикла опроса?

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

@DrobyshevAlex

if (PINB == 0b11111101)
{
	_delay_ms(1);
	if (PINB == 0b11111101) {
		if (PORTD) {
			PORTD = 0b00000000;
			} else {
			PORTD = 0b11111111;
		}
	}
}	 

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

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

то что я писал изначально там была просто суть)) я думаю люди пишущие под мк должны хотя бы значит что такое бит) как его поставить и как снять)

я же написал суть что можно бит промежуточный ввести для переключения состояния. я не видел обработчика и не знал где он. я не делаю задержек обычно для чтения кнопок в цикле, а флаги ставлю, а потом по флагу уже что то делается, прсото хотел суть передать что можно юзать битовые флаги для хранения промежуточных значений 

4 минуты назад, tifaso сказал:

Опробовал этот код

ну там же ниже код есть другой, его опробуйте)

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

@DrobyshevAlex Какой другой код. Тот что ниже я пробовал, но он вообще не работает и ошибок не бьет. Так что не понятно где там что искать и какой код вообще должен быть.

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

25 минут назад, tifaso сказал:

Какой другой код.

Ну вот этот

if (!(PINB & 0b1)) // кнопка нажата?
{
  _delay_ms(1);// чуть подождем для антидребезга
  if (!(PINB & 0b1)) {// кнопка все еще нажата?
    while(!(PINB & 0b1)); // ждем отпускания кнпоки
    if (PORTD) { // если на порте есть единица хоть одна значит это выключение 
      PORTD = 0b00000000;// выключаем
    } else {// если все нули
      PORTD = 0b11111111; // включаем
    }
  }
}

если не работает то попробуйте if (PORTD) заменить на if (PIND)

1 час назад, tifaso сказал:

PINB == 0b11111101

а почему у вас изменилась кнопка? вы переставили?

тогда так

if (!(PINB & 0b10)) // кнопка нажата?
{
  _delay_ms(1);// чуть подождем для антидребезга
  if (!(PINB & 0b10)) {// кнопка все еще нажата?
    while(!(PINB & 0b10)); // ждем отпускания кнпоки
    if (PORTD) { // если на порте есть единица хоть одна значит это выключение 
      PORTD = 0b00000000;// выключаем
    } else {// если все нули
      PORTD = 0b11111111; // включаем
    }
  }
}

 

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

1 час назад, tifaso сказал:

но включенное положение должно оставаться до повторного нажатия

Да в чем проблема?

1. Опрашиваете порт на котором висит кнопка

2. Если кнопка нажата... delay для борьбы с дребезгом контактов... Кнопка все еще нажата, тогда выполняем пункт 3

3. Если порт( либо порты) на котором весит светодиод имеет высокий(низкий уровень)  - инвертируем его.

Вот пример кода... должен работать:

DDRB = 0b00000001;  // 1-й пин порта В на выход - на этом порте висит светодиод
   PORTB = 0b0000000; // устанавливаем низкий уровень
   DDRD = 0b00000000; // 1-й пин порта D на вход - на этом порте висит кнопка
   PORTD = 0b00000001; // устанавливаем высокий уровень
    
   while (1){
   if (PIND == 0x00){ // если 1-й пин порта D в низком уровне
      _delay_ms(100); // защита от дребезга
      if (PIND == 0x00){ // если 1-й пин порта D ВСЕ еще в низком уровне
	 PORTB = ~PORTB; // инвертируем состояние порта В
	 }
   }
   }

 

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

ну или можете, если вам так понятней, написать как  у вас было)

if (PINB == 0b11111101) // кнопка нажата?
{
  _delay_ms(1);// чуть подождем для антидребезга
  if (PINB == 0b11111101) {// кнопка все еще нажата?
    while(PINB == 0b11111101); // ждем отпускания кнпоки
    if (PORTD) { // если на порте есть единица хоть одна значит это выключение 
      PORTD = 0b00000000;// выключаем
    } else {// если все нули
      PORTD = 0b11111111; // включаем
    }
  }
}

Этой строкой

if (PINB == 0b11111101)

вы проверяете на PB2 чтобы был 0. Но вы проверяете еще что бы на остальных PB была 1. Я думаю это не верное и переписал вам на PINB & 0b10 - будет истина если там единица, вам нужен ноль, знаичт добавим !

получилось if (!(PINB & 0b10)) если кнопку меняете бит тоже меняйте

3 минуты назад, MadLor сказал:

if (PIND == 0x00)

не будет это работать 

судя по коду TC у него все ноги подтянуты к 1

Ну и кнопка не на D а на B

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

@DrobyshevAlex, я ему уже пошагово все расписал. Если он не способен поменять порты / кнопки / светодиоды местами... то тогда как говорится - "Медицина бессильна". И видимо тогда надо все таки просмотреть видео уроки... Тем более ссылку я давал. 

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

@MadLor Эти видеоуроки я пересмотрел уже раза три там подобного я не нашёл. Потому собственно я и здесь решаю этот вопрос. Брал твой код пробовал, но результат совсем не тот что мне нужен. При нажатии заметно слабое еле заметное свечение светодиода, а при отпускании всё гаснет. Всё проверяю и тестирую на реальной ATMEGA8. Собран специальный тестовый стенд для отладки.

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

Фьюзы? Частота контроллера?... Я эту программку за 3-и минуты накидал в протеусе и она там работала. Т.е. я нажимаю на кнопку  и диод загорается... нажимаю повторно - гаснет. + в этом коде нет защиты от того что кнопка постоянно зажата. Попробуй программы симулировать в Proteus - если первый раз шьеш МК, то возможны различные сюрпризы.

P.S. Надеюсь ты диод к порту МК подключал через резистор? ;)

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

57 минут назад, MadLor сказал:

я ему уже пошагово все расписал.

то есть выше пошагово не расписано было? но что то не помогло, даже с расписыванием антидребезга и защитой от удержания)

24 минуты назад, tifaso сказал:

Брал твой код пробовал

мой вам совет, не просто брать код, а думать что происходит, и писать под себя :) ибо когда нужно будет перенести кнопку или led вы пойдете опять на форум...

тут 5 строк кода, и нет ничего сложно. даже убрал вам работу с битами лишнюю максимально под ваш код переделав.

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

2 минуты назад, DrobyshevAlex сказал:

не расписано было

@DrobyshevAlex, извиняюсь, но сильно в код не вчитывался. 

3 минуты назад, DrobyshevAlex сказал:

то то не помогло

время покажет :)

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

@MadLor Фьюзы не трогал всё по умолчанию. Частота указана ниже

#define F_CPU 1000000UL

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

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...