Zodiac21

Автоматические ворота на atmega

6 сообщений в этой теме

Zodiac21    0

Ребята! Делаю я автоматические ворота на базе atmega8, и столкнулся с проблемой в прошивке.....

Алгоритм работы таков:

кратковременно нажимаем на кнопку "открытие/закрытие" -----   начинается открытие до срабатывания концевика открытия.

нажимаем еще-раз, происходит закрытие  до срабатывания  концевика закрытия.

#include <io.h>
#include <mega8.h>
#include <delay.h>

int i=0;


void main(void)
{

PORTD=0x00;
DDRD=0xff;

PORTB=0xff;
DDRB=0x00;

PORTD.0=0;

while (1)
    {
     
    if(PINB.0==0)
    {
    delay_ms(100);
    i++;
    }


\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
if(i==1)
{
PORTD.0=1;
PORTD.1=0;
}

if(PINB.1==0)
{
PORTD.0=0;
PORTD.1=0;
}

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

if(i==3)
{
PORTD.0=0;
PORTD.1=1;
}

if(PINB.2==0)
{
PORTD.0=0;
PORTD.1=0;
}

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

if(i>3)
{
i=0;
}


    }
}

Всё-бы ничего, но есть одно НО... Допустим ворота открылись, концевик открытия нажался и удерживается... При этом не получается закрыть ворота , потому-что выполняется условие :

if(PINB.1==0)
{
PORTD.0=0;
PORTD.1=0;
}

Вот если кратковременно нажать на концевик то всё работает как надо.......

 

Как быть-то???

Снимок1.png

Поделиться сообщением


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
proekt07    11

Может концевик использовать для поднятия флага в программе?

Например,нажали кнопку открыть/закрыть.Ворота открылись,концевик замкнулся.Если концевик замкнулся,поднимаем флаг_открытых_ворот.Если флаг_открытых_ворот поднят,нажатие кнопки открыть/закрыть закрывает ворота.Сбрасываем флаг_открытых_ворот. И наоборот.

Изменено пользователем proekt07

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Zodiac21    0

Огромное СПАСИБО!!! Сделал вот-так , всё заработало.....

#include <io.h>
#include <mega8.h>
#include <delay.h>

bit open=0;
bit close=0;

void main(void)
{

PORTD=0x00;
DDRD=0xff;

PORTB=0xff;
DDRB=0x00;


while (1)
    {
     
    if(PINB.0==0)
    {
    PORTD.0=1;
    PORTD.1=0;
    }
    
    if(PINB.1==0)
    {
    open=1;
    PORTD.0=0;
    }
    
    if(open==1&&PINB.0==0)
    {
    PORTD.0=0;
    PORTD.1=1;
    }
    
    if(PINB.2==0)
    {
    close=1;
    PORTD.1=0;
    }
    

    }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
m*****m8    3

Бит "close" сбрасывается на ноль только при сбросе питания. Для этого алгоритма атмега8 слишком жирно. Не учтено - если понадобится срочно закрыть ворота, только начавшие открываться. Придется ждать пока откроются полностью. И наоборот при закрытии. Нет токового реле. Кого-нибудь зажмет и будет давить пока не сгорит движок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vovka    23

А где датчик тока, если под ворота что-то попало?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Zodiac21    0

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

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас