проект и схему прилогаю
может что fuse'ах напутал?
Код: Выделить всё
st1:
sbis PinD,0 ; Проверяем кнопку "открыть"
rjmp open ; если нажата переходим к процедуре открывания
rjmp st2
Код: Выделить всё
st2:
sbis PinD,1 ; Проверяем кнопку "закрыть"
rcall close ; если нажата переходим к процедуре закрывания
rjmp st1 ; Возвращаемся в процедуру проверки кнопок
Код: Выделить всё
sbic PinD,2 ; Проверяем концевик закрытия
rjmp cl1 ; если не сработал продолжаем закрывать
Axon писал(а):Код: Выделить всё
st1:
sbis PinD,0 ; Проверяем кнопку "открыть"
rjmp open ; если нажата переходим к процедуре открывания
rjmp st2
sbis вместо sbicКод: Выделить всё
st2:
sbis PinD,1 ; Проверяем кнопку "закрыть"
rcall close ; если нажата переходим к процедуре закрывания
rjmp st1 ; Возвращаемся в процедуру проверки кнопок
sbis вместо sbicКод: Выделить всё
sbic PinD,2 ; Проверяем концевик закрытия
rjmp cl1 ; если не сработал продолжаем закрывать
sbic вместо sbis
Проверяйте, работает как нужно или нет?
, совсем запутался в командах, такие мелочи пропустил, в протеусе все заработало, теперь буду шить МК, как проверю отпишусь! nem-victor писал(а):Да с помошью теймера! только как зделать что бы задержку можно было изменять?
и можно ли отправить avr в powe_doun после выполнения функции, и чтобы он запускался от поступления команд на порта PD0 и PD1, может через прерывания?

nem-victor писал(а):кто подскажет как зделать регулируемую задержку?
Axon писал(а):nem-victor писал(а):Да с помошью теймера! только как зделать что бы задержку можно было изменять?
Конечно можно. Можно изменением делителя частоты, можно изменением значение в регистре сравнения.и можно ли отправить avr в powe_doun после выполнения функции, и чтобы он запускался от поступления команд на порта PD0 и PD1, может через прерывания?
Зачем его отправлять, если он микроамперы потребляет? Но если так прям обязательно - нужно даташит читать.
nictrace писал(а):nem-victor писал(а):кто подскажет как зделать регулируемую задержку?
что-то я там никаких средств регулировки, кроме 2-х кнопок не нашел.
но можно обойтись и кнопками. Например, длительное, в пару секунд нажатие будет переводить в режим настройки времени, а лампа будет мигать столько раз, сколько выбрано секунд...
nem-victor писал(а):спасибо Axon я уже прочитал об этом т.е. о внешних прерываниях, вот теперь про задержку, есть ли какиенибудь шаблоны задержек, а то в примерах из книг трудно определить, вот у меня задержка в программе тоже взята из книги Белова, но мне нужно управлять временем задержки, т.е. 200 мкс для борьбы с дребезгом контактов, 500 мкс для последовательного выполнения команд, ну и гдето 1 с для отключения замка, после открывания ворот, на Си там то понятно можно написать просто время задержки и все, а на асемблере все по тругому, приходиться писать подпрограммы задержки, так что мне придется писать 3 подпрограммы задержки для каждого времени?
Axon писал(а):nem-victor писал(а):спасибо Axon я уже прочитал об этом т.е. о внешних прерываниях, вот теперь про задержку, есть ли какиенибудь шаблоны задержек, а то в примерах из книг трудно определить, вот у меня задержка в программе тоже взята из книги Белова, но мне нужно управлять временем задержки, т.е. 200 мкс для борьбы с дребезгом контактов, 500 мкс для последовательного выполнения команд, ну и гдето 1 с для отключения замка, после открывания ворот, на Си там то понятно можно написать просто время задержки и все, а на асемблере все по тругому, приходиться писать подпрограммы задержки, так что мне придется писать 3 подпрограммы задержки для каждого времени?
200 и 500мкс мало, если мс - то нормально
В простеньких программах я задержку обычно делаю так:
Берется минимальный делитель времени для всех задержек, у вас это 100мс т.е. 200,500,1000 делится на 100.
Создается отдельная подпрограмма задержки, которая будет вызываться через rcall.
Собственно в подпрограмме в начале происходит сброс таймера, его инициализация(занести значения в регистры, настроить делитель, локальное прерывание и т.д.). Далее даём МК команду sei и запускаем таймер. Сразу после запуска таймера ставим хитрую команду
brtc PC-0x01
Собсно эта команда значит, что МК будет всё время проверять флаг T(зациклится на одной команде) пока он не установлен, когда Т установится - пойдут следующие команды. А в векторе прерываний(куда МК пойдет после прерывания таймера) просто ставим set(установка Т флага) а из обработчика он вернется retом от следующего вектора(естессно нужно убедиться что там нету обработчика и стоит просто ret). После brtc PC-0x01 обязательно останавливаем таймер, потом очищаем флаг Т командой clt и теперь можно выйти из нашей подпрограммы задержки. Как сделать 200,500,1000мс - тупо ставим несколько вызовов этой подпрограммы и всё.
nem-victor писал(а):зашил прошивку в tiny2313, внутресхемно, фузы выставил с помощью калькулятора фузов, тока как то странно, контролер постоянно в состоянии "закрыть", и сбрасываеться только кнопкой закрыть, хотя по программе обе кнопки должны сбрасывать контролер в начальное положение, и выход подсветки не пашет, что ж буду дальше копаться в програме
Axon писал(а):nem-victor писал(а):зашил прошивку в tiny2313, внутресхемно, фузы выставил с помощью калькулятора фузов, тока как то странно, контролер постоянно в состоянии "закрыть", и сбрасываеться только кнопкой закрыть, хотя по программе обе кнопки должны сбрасывать контролер в начальное положение, и выход подсветки не пашет, что ж буду дальше копаться в програме
Если что-то совсем не получиться - сюда кидайте.
