Небольшая предыстория - меня попросили сделать простенький коммутатор мощной нагрузки на 8 выходов, каждый из которых управлялся бы свой кнопкой. Эдакий светорежиссёрский пульт управления стробоскопом, диско шаром, гирляндами и прочей атрибутикой.
Что, может быть проще, подумал я и сходу заказал 10 кнопок и 10 реле из Китая.
С реле всё нормально, а вот с кнопками случилась оказия - пришли кнопки без фиксации... Немного самобичевания, матов на невнимательного китайца, и я приступил к написанию программы на ATMega8.
Суть проста: 8 портов ввода и 8 портов вывода, по нажатию кнопки происходит выдача логической единицы на выход присвоенного порта МК, при повторном нажатии его обнуление. Моего скудного опыта хватило на написание нехитрой программы.
Симуляция Proteus не показала каких-либо проблем. А вот на реальной железке выяснилась проблема дребезга кнопки, хотя простой «антидребезг» я написал. Играл с временем задержки срабатывания, но всё тщетно - срабатывание нечёткое.
Проверил осциллографом - дребезг в рамках 3-5 миллисекунд.
Вроде бы задержка, описанная в программе должна исключить этот дефект, но нет.
Пробовал поставить конденсатор - получилась кривая спада в 0, но опять же кнопка продолжает дребезжать.
Я думал внедрить счётчик, по заполнению которого принималось срабатывание кнопки и включение порта, но это для моего уровня уже сложновато.
Помогите в решении этой проблемы.
#include
#include
void main(void){
unsigned char i=1;
unsigned char y=1;
unsigned char x=1;
unsigned char z=1;
unsigned char a=1;
unsigned char b=1;
unsigned char c=1;
unsigned char d=1;
PORTB.0=0x00;
DDRB.0=0xFF;
DDRB.3=0x00;
PORTB.3 = 0xFF ;
PORTB.1=0x00;
DDRB.1=0xFF;
DDRB.2=0x00;
PORTB.2 = 0xFF ;
PORTB.0=0x00;
DDRC.1=0xFF;
DDRC.0=0x00;
PORTC.0 = 0xFF ;
PORTC.3=0x00;
DDRC.3=0xFF;
DDRC.2=0x00;
PORTC.2 = 0xFF ;
PORTC.5=0x00;
DDRC.5=0xFF;
DDRC.4=0x00;
PORTC.4 = 0xFF ;
PORTD.1=0x00;
DDRD.1=0xFF;
DDRD.0=0x00;
PORTD.0 = 0xFF ;
PORTD.3=0x00;
DDRD.3=0xFF;
DDRD.2=0x00;
PORTD.2 = 0xFF ;
PORTD.5=0x00;
DDRD.5=0xFF;
DDRD.4=0x00;
PORTD.4 = 0xFF ;
while (1) {
if (PINB.3==0){
i=i+1;
delay_ms(50);
}
switch(i) {
case 1: {
PORTB.0=0;
break;
}
case 2:{
PORTB.0=1;
break;
}
default:
i=1;
}
if (PINB.2==0){
y=y+1;
delay_ms(50);
}
switch(y) {
case 1: {
PORTB.1=0;
break;
}
case 2:{
PORTB.1=1;
break;
}
default:
y=1;
}
if (PINC.0==0){
x=x+1;
delay_ms(50);
}
switch(x) {
case 1: {
PORTC.1=0;
break;
}
case 2:{
PORTC.1=1;
break;
}
default:
x=1;
}
if (PINC.2==0){
z=z+1;
delay_ms(50);
}
switch(z) {
case 1: {
PORTC.3=0;
break;
}
case 2:{
PORTC.3=1;
break;
}
default:
z=1;
}
if (PINC.4==0){
a=a+1;
delay_ms(50);
}
switch(a) {
case 1: {
PORTC.5=0;
break;
}
case 2:{
PORTC.5=1;
break;
}
default:
a=1;
}
if (PIND.0==0){
b=b+1;
delay_ms(50);
}
switch(b) {
case 1: {
PORTD.1=0;
break;
}
case 2:{
PORTD.1=1;
break;
}
default:
b=1;
}
if (PIND.2==0){
c=c+1;
delay_ms(50);
}
switch(c) {
case 1: {
PORTD.3=0;
break;
}
case 2:{
PORTD.3=1;
break;
}
default:
c=1;
}
if (PIND.4==0){
d=d+1;
delay_ms(50);
}
switch(d) {
case 1: {
PORTD.5=0;
break;
}
case 2:{
PORTD.5=1;
break;
}
default:
d=1;
}
}
}
Спасибо за внимание!
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.