роботы робототехника микроконтроллеры


 Страниц (3): [1] 2 3 »   

> Описание: Управление светодиодом одной кнопкой
segey Post Id


Рядовой


Сообщений всего: 15
Дата рег-ции: Июнь 2012  



Запрограммировал микроконтроллер Atmega8 программой:
#include <mega8.h>
void main(void)
{
while (1)
{
while (PIND.0==1) {}
if (PINB.0==1)
{ PORTB.0=0; }
else
{ PORTB.0=1; }
while (PIND.0==0) {}
};
}
При первом нажатии на кнопку диод должен загораться при втором – гаснуть и т.д.
Программа как бы работает, но иногда проскакивают ложные срабатывания светодиода, то включается и при отпускании кнопки гаснет, то не включается.
Если просто касаться пинцетом вывода 2 светодиод может включится, а может выключиться.
Программу запускал в Proteus –работает.
Помогите разобраться?
 
 Top
Роботов Post Id



Гуру


Сообщений всего: 1350
Дата рег-ции: Июнь 2011  



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

Обыкновенный дребезг контактов и наводка. Лечится двумя способами:
1. Программно. Делается небольшая задержка на срабатывание.
2. Аппаратно. Ставится подтягивающий резистор и емкость против дребезга контактов.
IMHO первый лучше.
 
 Top
segey Post Id


Рядовой


Сообщений всего: 15
Дата рег-ции: Июнь 2012  



Попробовал вот такой вариант:
#include <mega8.h>
#include <delay.h>
while (1)
{
while (PIND.0==1) {}
delay_us(203);
if (PINB.0==1)
{ PORTB.0=0; }
else
{ PORTB.0=1; }
while (PIND.0==0) {}
delay_us(203);
};
}

Тоже самое.
 
 Top
Гость Post Id


УДАЛЁН







обнаружить нажатие кнопки
задержку порядка 50 мс,
проверить, что кнопка еще нажата
зажигать/тушить светодиод.
 
 Top
segey Post Id


Рядовой


Сообщений всего: 15
Дата рег-ции: Июнь 2012  



В программировании я новичок.
Из этого:

обнаружить нажатие кнопки
задержку порядка 50 мс,
проверить, что кнопка еще нажата
зажигать/тушить светодиод.

я ничего не понял.
Без нажатия кнопки, уже при касании только вывода2 пинцетом происходит срабатывания диода.
По питанию стоит конденсатор 470мкф.
Плюс питания подал на вывод 1 (RESET) через 10ком.
Ничего не поменялось.
 
 Top
Гость Post Id


УДАЛЁН







это не програмирование это алгоритм.
крутится цикл, ждет на ноге 0 или 1 (зависит от вашей схемы)
дождалось-вылетело из цикла
задержка на 50мс
проверить, что кнопка еще нажата - весь дребезг уже ушел.
действовать согласно затее.
примерно так (предполагается, что пинД0 подтянут к питанию и кнопкой сажается на землю):

while (1) //открытие бесконечного цикла
{
while (PIND.0==1) {} //ждем 0 на ноге D.0
delay_ms(50); //задержка
if (PIND.0==0) // проверка после окончания дребезга
{ // действия согласно затее
if (PINB.0==1)
{ PORTB.0=0; }
else
{ PORTB.0=1; }
}
while (PIND.0==0) {} // ожидание, когда юзер кнопку отпустит
};
}

при отпускании кнопки благодаря дребезгу мы снова попадем в проверку, но после ожидания 50 мс на ноге не будет 0.

теперь о аппаратном методе: нужно к ноге с кнопкой подключить конденсатор и резистор, практически всё равно дребезг будет проскакивать.
 
 Top
Роботов Post Id



Гуру


Сообщений всего: 1350
Дата рег-ции: Июнь 2011  



Я например в таких случаях делаю так:
1. Проверяю нажата ли кнопка.
2. Если нажата, запускаю аппаратный таймер, блокирующий кнопку на некоторое время(определяется опытным путем, обычно 60-100mS) и произвожу задуманное действо. в данном случае переключаю светодиод. (можно просто инвертировать выход: PORTB.0 = ~ PORTB.0)
3. перехожу к пункту 1.

З.Ы. А ещё хорошо подключить кнопку к выводу внешнего прерывания, настроив прерывание на срабатывание по переднему фронту импульса.
 
 Top
segey Post Id


Рядовой


Сообщений всего: 15
Дата рег-ции: Июнь 2012  



Спасибо за помощь!
Запрограммировал вот так:
while (1) //открытие бесконечного цикла
{
while (PIND.0==1) {} //ждем 0 на ноге D.0
delay_ms(50); //задержка
if (PIND.0==0) // проверка после окончания дребезга
{ // действия согласно затее
if (PINB.0==1)
{ PORTB.0=0; }
else
{ PORTB.0=1; }
}
while (PIND.0==0) {} // ожидание, когда юзер кнопку отпустит
};
}

Уже стало лучше, но иногда проскакивает дребезг.
Какой конденсаторт и резистор подключить к ноге с кнопкой?
(Добавление)
Predator пишет:
теперь о аппаратном методе: нужно к ноге с кнопкой подключить конденсатор и резистор

Какой номинал резистора и конденсатора?
Predator пишет:
практически всё равно дребезг будет проскакивать

Меня это не устривает.
Роль кнопки будет выполниять реле, управляемое датчиком. Вместо сведодиода я хочу поставить реле.
Подскажите, пожалуйста, что можно сделать, чтобы схема работала надежно без збоев?
 
 Top
Гость Post Id


УДАЛЁН







больше таймер поставить 100 мс например.
а вообще в хорошей документации на реле, кнопки ... есть упоминание на эту тему.
тут так: чем мощнее контакты, тем дольше они дребезжат.
 
 Top
Роботов Post Id



Гуру


Сообщений всего: 1350
Дата рег-ции: Июнь 2011  



Как часто будет нажиматься кнопка? Если не чаще 1 раза в секунду, то и задержку соизмеримую надо ставить. Например 500mS, и никакой дребезг не страшен будет Подмигивающий
З.Ы. А вообще задержка это зло. Во время задержки МК ничего делать не может, и тупо ждёт. Юзайте таймер. Таймером можно измерять длинну импульса, и тем самым отсеивать дребезг.
 
 Top
segey Post Id


Рядовой


Сообщений всего: 15
Дата рег-ции: Июнь 2012  



Роботов пишет:
Как часто будет нажиматься кнопка?

Задача одна: после каждого нажатия кнопки выход поменять на противоположное значение.
Индуктивный датчик дает команду на реле. Реле выполняет роль кнопки и будет включаться примерно 0.5сек и выключаться 3сек. На выходе я хочу поставить реле, которое будет управлять катушкой пневмораспределителя. Главное все сделать правильно, чтобы не было сбоев.
 
 Top
Гость Post Id


УДАЛЁН







а у реле на входе есть нормально замкнутый контакт (который размыкается при срабатывании)?
если есть, то ставьте микросхемку 74АС74 или любой аналог (отечественные *ТМ2)
и будет очень надежно работать.
 
 Top
segey Post Id


Рядовой


Сообщений всего: 15
Дата рег-ции: Июнь 2012  



Реле я могу поставить любое на 24в.
Это я хочу разобраться с программированием микроконтроллеров, а за одно помочь родному производству.
А если на микросхеме собирать, так это надо схему. Сам я не нарисую.
 
 Top
Гость Post Id


УДАЛЁН







ну если само устройство - побочный эффект от изучения контроллеров, то приближайте антидребезговую задержку к времени удержания реле в замкнутом состоянии.
обратите внимание на ток потребления выходного реле и не забудьте поставить параллельно катушке выходного реле диод.
 
 Top
segey Post Id


Рядовой


Сообщений всего: 15
Дата рег-ции: Июнь 2012  



Если я правильно понял выходной ток одного вывода у Atmega8 20ma. А как можно его увеличить или например обьединить два выхода в параллель?
 
 Top
Страниц (3): [1] 2 3 »
« С чего начать? »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru