Страница 1 из 1

Переключение двумя кнопками

Добавлено: Чт апр 23, 2020 16:15:59
RishatPF
Здравствуйте. Надеюсь на вашу помощь новичку. Написал код для переключения светодиодов с помощью двух кнопок. Но почему то ничего не происходит. Если не трудно ткните пожалуйста носом:(

Код: Выделить всё

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>

int count=0; 
int n = 0;

int main(void) {         
DDRD = 0xFF; 
   PORTD = 0x00;
   
DDRB = 0x00; 
   PORTB=0x03;  

   
while(1) {  // главный цикл
   
if (PINB==0b00000000) {    
  _delay_ms(20);
   n++;   
  if(n>1){
     count++;
     }
  } 
 
 if (PINB==0b00000001) {    
  _delay_ms(20);
   n++;   
  if(n>9){
     count--;
     }
  } 
  
  _delay_ms(20); // доп. задержка антидребезга при отпускании кнопки
if(count==5){PORTD=  0b00000001;}
if(count==10){PORTD=0b00000010;}
if(count==15){PORTD=0b00000100;}
if(count==20){PORTD=0b00001000;}
if(count==25){PORTD=0b00010000;}
if(count==30){PORTD=0b00100000;}
if(count==35){PORTD=0b01000000;}
if(count==40){PORTD=0b10000000;}
} 
} 

Re: Переключение двумя кнопками

Добавлено: Чт апр 23, 2020 17:19:12
ARV
RishatPF писал(а):PORTB=0x03; 
это значит, два младших бита установлены в 1, т.е. 0b00000011
RishatPF писал(а):if (PINB==0b00000000)
только при нажатии двух кнопок, которые перетянут обе единички в ноль, вы сможете получить это условие. вы обе кнопки нажимаете?
RishatPF писал(а):if (PINB==0b00000001)
это сработает только для кнопки "уменьшения" вашего счетчика.
то есть ваш код либо может уменьшить счетчик при нажатии второй кнопки, либо увеличить, но при нажатии обоих. поскольку до нажатия обоих кнопок вы, вероятно, не дошли, ваш счетчик только уменьшается, никакого контроля его переполнения в коде нет... поэтому чтобы увидеть, как сработает одно из ваих условий, вам придется ждать примерно 1300 секунд, т.е. примерно 22 минуты, непрерывно удерживая кнопку уменьшения счетчика нажатой...
RishatPF писал(а):_delay_ms(20);
расскажите, как это позволяет бороться с дребезгом? особенно "при отпускании"?
если вы нажмете нужную комбинацию кнопок и будете их удерживать, ваша переменная count стане меняться со скоростью 25 раз в секунду, при этом нижеследующий участок кода для включения светодиодов будет засвечивать на 0,04 секунды один из светодиодов, все остальное время все светодиод будут погашены.
визуально это будет выглядеть, как непрерывное мерцание всех светодиодов.

вы на самом деле всего этого хотели?

Re: Переключение двумя кнопками

Добавлено: Пт апр 24, 2020 03:12:36
RishatPF
Здравствуйте. Спасибо что откликнулись и так подробно объяснили.
[uquote="ARV",url="/forum/viewtopic.php?p=3832188#p3832188"]вы на самом деле всего этого хотели?[/uquote]
Нет конечно. По моей задумке, при каждом нажатии на первую кнопку должны были переключатся выходы на PORTD в одну сторону а при нажатии на вторую кнопку они должны были переключатся в другую сторону. Как я понял, для начало мне вообще не надо указывать состояние по умолчанию порта В.
Затем нужно сделать программный антидребезг.
Затем уже сделать что б одно нажатие соответствовало одному импульсу. (на счет этого теперь совсем без понятия)

Re: Переключение двумя кнопками

Добавлено: Пт апр 24, 2020 03:40:22
ARV
вот здесь https://radiokot.ru/forum/viewtopic.php ... 9#p3830769 я рассказывал вашему коллеге, как стоит браться за решение задач. в том числе, с любым количеством кнопок.

Re: Переключение двумя кнопками

Добавлено: Пт апр 24, 2020 12:33:14
RishatPF
[uquote="ARV",url="/forum/viewtopic.php?p=3832320#p3832320"]вот здесь https://radiokot.ru/forum/viewtopic.php ... 9#p3830769 я рассказывал вашему коллеге, как стоит браться за решение задач. в том числе, с любым количеством кнопок.[/uquote]
Спасибо, читаю.