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

Программный триггер на ASM

Добавлено: Вт апр 04, 2017 12:16:36
jeka79
Подскажите как можно реализовать аналог этой схемы в программе под контроллер AVR.
По части первых 3х состояний без вопросов, а вот как 4-5 организовать не знаю.

Изображение

Re: Программный триггер на ASM

Добавлено: Вт апр 04, 2017 19:11:49
B@R5uk
У вас не верное количество состояний.

Re: Программный триггер на ASM

Добавлено: Вт апр 04, 2017 20:13:03
dm37

Re: Программный триггер на ASM

Добавлено: Ср апр 05, 2017 02:29:49
jeka79
описал только те состояния которые нужны на выходе.

Re: Программный триггер на ASM

Добавлено: Ср апр 05, 2017 09:59:49
Jack_A
Из 2 бит получить 5 состояний ? .... тянет на Шнобелевскую премию. Переворот в науке. При состояниях Х1=1, Х2=0 на выходе появляется либо 1, либо 0 в зависимости от цены на бананы в Зимбабве.

Re: Программный триггер на ASM

Добавлено: Ср апр 05, 2017 10:24:38
pyzhman
jeka79 писал(а):...аналог этой схемы...
Выкладывайте всю задумку целиком.

Re: Программный триггер на ASM

Добавлено: Ср апр 05, 2017 11:20:43
B@R5uk
jeka79 писал(а):только те состояния которые нужны
Работоспособность устройства определяется не только теми состояниями, которые нужны, но и теми, которые могут возникнуть в процессе работы. Задача программиста заключается в том, чтобы учесть все возможные исключительные ситуации, а не только рабочие. Тем более, что вы, судя по всему, даже понятия не имеете, что в вашей задаче состояний ситуаций почти в два раза больше.

Поведение устройства с памятью (которое вы планируете реализовать) определяется не только состояниями на входе, но и состояниями самого устройства. Вообще, если пунктуально следовать схеме, то у вас два внешних входа и два внутренних входа. На каждые из получающихся 16 комбинаций вы обязаны продумать какие должны быть сигналы на выходе и каким должно стать внутреннее состояние устройства (благо что эти две, вообще говоря, разные вещи в вашем случае дублируют друг друга).

Реально можно ограничиться одним внутренним состоянием и двумя значениями на входе. И рассматривать таблицу истинности из восьми значений.

Re: Программный триггер на ASM

Добавлено: Чт апр 06, 2017 01:54:48
jeka79
Кол-во состояний указано правильно, не знаю к чему весь сарказм в предыдущих сообщениях, все это часть реальной схемы, протестировано и успешно работает. Первые 3 состояния неизменны в данной реализации триггера, можете сами смоделировать в том же proteus и проверить, 4 и 5 на инвертирующем выходе выдает либо 0 либо 1. Какие вы еще можете придумать другие состояния, я не понимаю. Идея в том чтобы аналоговый триггер запихать в микроконтроллер, опыта нет, только учусь.
Готовых примеров реализации тех же RS триггеров не нашел, гуглил, либо чисто теория расписанная на пару страниц, либо темы без ответов.

Добавлено after 8 minutes 32 seconds:
И это в данном случае не совсем RS триггер.
Для понимания где это работает, включения насоса наполнения воды в бочку, по 2м датчикам (нижнего и верхнего уровня).
Насос включается только тогда, когда емкость наполнилась, а потом полностью опустошилась.
При этом выход из строя нижнего датчика не повлияет на набор воды в бак, продолжится его работа по верхнему уровню, без триггирования.

Re: Программный триггер на ASM

Добавлено: Чт апр 06, 2017 03:40:00
Demiurg
Имитировать логические элементы можно с помощью таблиц, другое дело триггеры. Запоминание состояния. Здесь уже напрашивается конечный автомат. Ключевое слово состояние.

Re: Программный триггер на ASM

Добавлено: Чт апр 06, 2017 09:26:57
Jack_A
Триггеры - тоже можно с помощью таблиц, просто вводится еще одна переменная - предыдущее состояние триггера. И получится - конечный автомат. :) И последние 2 строки обсуждаемой таблицы будут выглядеть так :
Изображение
А в предыдущих строках в колонке Qt будет Х - состояние любое.
И если такое объяснение будет понятно ТС, то он станет более внятно формулировать свои вопросы вместо обижаться .
И алгоритмически реализация последних двух состояний будет выглядеть просто: "если Х1=1 и Х2=0 - ничего не менять на выходе" .

Re: Программный триггер на ASM

Добавлено: Чт апр 06, 2017 12:33:02
BOB51
Реализация в ассемблере "в лоб" - табличный метод.
У АВРки или таблица в ОЗУ или таблица в ПЗУ.
Соответственно и набор регистров/команд подбираем.
8)

Re: Программный триггер на ASM

Добавлено: Пт апр 07, 2017 08:58:17
Jack_A
В общем случае - да. Но для такого простейшего случая - чересчур. Пара CPI ... Или даже одна CPI, если биты Х1, Х2 разместить в одном регистре .

Изображение

Re: Программный триггер на ASM

Добавлено: Пт апр 07, 2017 12:41:36
BOB51
Табличка шустрее - там сразу JMP в указанной ячейке и/или непосредственно обработчик и количество проверок равно одному разу.
При том, что у нас возможны аж четыре комбинации состояний на входе (т.е. до 4 сравнений).
в Z адрес начала таблички/области подпрограмм обработки
гдей-то собственно принятый код
сложим с содержимым Z после предобработки
и затем
IJMP/ICALL
:hunger:

Re: Программный триггер на ASM

Добавлено: Пт апр 07, 2017 13:05:38
Z_h_e
jeka79 писал(а):Насос включается только тогда, когда емкость наполнилась, а потом полностью опустошилась.
Если насос включен, проверяете только датчик по которому должно произойти отключение, если выключен, то другой и все.

Re: Программный триггер на ASM

Добавлено: Пт апр 07, 2017 13:48:05
Jack_A
BOB51 писал(а):Табличка шустрее - там сразу...J
Еще раз : в общем случае - да. Но тут :

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

   .equ   X1 =2
   .equ   X2 =1

   cpi  r16,X2
   breq  nothing
   brlo     off_bit
on_bit:  sbi   PORT_O,our_bit
    rjmp    nothing
off_bit:   cbi   PORT_O,our_bit
nothing: ......
Куда уж проще, 3 команды - и никаких таблиц

Re: Программный триггер на ASM

Добавлено: Сб апр 08, 2017 05:43:38
akl
Логично для битовых операций использовать соответствующие команды. Например

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

TEST:
.equ	X1=1
.equ	X2=2
.equ	OUT_=0

	SBIS	PIND,X1
	CBI	PORTD,OUT_
	SBIS	PIND,X1
	RJMP	TEST_GO
	SBIC	PIND,X2
	SBI	PORTD,OUT_
TEST_GO:
;
;
;
	RJMP	TEST

Re: Программный триггер на ASM

Добавлено: Сб апр 08, 2017 11:59:22
jeka79
спс, буду тестить в сравнение с триггером на 561 серии, скорость выполнения тут не важна, лишь бы работало.

Добавлено after 27 minutes 20 seconds:
Еще вопрос по части реализации, переключение будет происходить сразу при первом импульсе на вход, допустим забрызгивание датчика, еще не полной бочки, выключит насос.
Если датчики связать через резистивный делитель и включить ацп, выигрыш в кол-ве входов + своего рода антидребезг какой никакой получится, т.к ацп вроде как не быстро считает.
или же таймер мудрить как на обработчиках конопок делают?
или аналоговую фильтрацию типа рс цепочек.
хотелось бы минималистически. тинька 13а.

Re: Программный триггер на ASM

Добавлено: Сб апр 08, 2017 12:46:24
akl
jeka79 писал(а):вопрос по части реализации, переключение будет происходить сразу при первом импульсе на вход, допустим забрызгивание датчика, еще не полной бочки, выключит насос.
...хотелось бы минималистически. тинька 13а.
Да, если опросится низкий уровень на X1, на выходе появится или подтвердится 0.
Спойлер

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

.include "tn13def.inc"

.equ   X1=1
.equ   X2=2
.equ   OUT_=0

.org	000
START:
	LDI	R16,$F9
	OUT	DDRB,R16
TEST:
   SBIS   PINB,X1
   CBI   PORTB,OUT_
   SBIS   PINB,X1
   RJMP   TEST_GO
   SBIC   PINB,X2
   SBI   PORTB,OUT_
TEST_GO:
;
;
;
   RJMP   TEST
.EXIT

Re: Программный триггер на ASM

Добавлено: Сб апр 15, 2017 18:45:23
jeka79
Тут вся сложность в установке последних 2х состояний, из описанных примеров идет проверка первых 3х статичных состояний, а то что в функции TEST_GO: и есть проблемой.
Скажем так, заведем переменную флаг, где будем хранить последнее состояние OUT
проверяем X1 = 1 и X2 = 0 и проверяем флаг допустим FLAG = 0
ставим OUT = 1 и FLAG = 1.
Но это приводит к цикличной переустановки флага и выхода в каждом цикле пока по входам установлено X1 = 1 и X2 = 0
Как это организовать по нормальному, как это реальный триггер делает чет ума не приложу.

Добавлено after 41 minute 50 seconds:
Все вроде разобрался, завел еще один флаг FLAG_SET, который соответствует выходу 8 по схеме из 1 поста, он устанавливается в 0 когда X1 и X2 = 1 проверяем его при установке в 0 выхода и скидываем в 0, теперь все вроде корректно работает.

Re: Программный триггер на ASM

Добавлено: Вс апр 16, 2017 07:55:09
BOB51
Флаг статуса положения анализа относительно события.
8)
Или отсев антидребезга в различных состояниях прожки относительно комбинации входных сигналов.
А таковых заметно больше, чем 4 состояния 2х входных линий.
:wink: