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

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Сб янв 07, 2017 10:14:29
Откуда: Н-Новгород

Сообщение jeka79 »

Подскажите как можно реализовать аналог этой схемы в программе под контроллер AVR.
По части первых 3х состояний без вопросов, а вот как 4-5 организовать не знаю.

Изображение
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

У вас не верное количество состояний.
Реклама
Родился
Сообщения: 10
Зарегистрирован: Вс апр 02, 2017 18:20:34

Сообщение dm37 »

Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Сб янв 07, 2017 10:14:29
Откуда: Н-Новгород

Сообщение jeka79 »

описал только те состояния которые нужны на выходе.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Из 2 бит получить 5 состояний ? .... тянет на Шнобелевскую премию. Переворот в науке. При состояниях Х1=1, Х2=0 на выходе появляется либо 1, либо 0 в зависимости от цены на бананы в Зимбабве.
Изображение
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

jeka79 писал(а):...аналог этой схемы...
Выкладывайте всю задумку целиком.
Docendo discimus
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

jeka79 писал(а):только те состояния которые нужны
Работоспособность устройства определяется не только теми состояниями, которые нужны, но и теми, которые могут возникнуть в процессе работы. Задача программиста заключается в том, чтобы учесть все возможные исключительные ситуации, а не только рабочие. Тем более, что вы, судя по всему, даже понятия не имеете, что в вашей задаче состояний ситуаций почти в два раза больше.

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

Реально можно ограничиться одним внутренним состоянием и двумя значениями на входе. И рассматривать таблицу истинности из восьми значений.
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Сб янв 07, 2017 10:14:29
Откуда: Н-Новгород

Сообщение jeka79 »

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

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

Сообщение Demiurg »

Имитировать логические элементы можно с помощью таблиц, другое дело триггеры. Запоминание состояния. Здесь уже напрашивается конечный автомат. Ключевое слово состояние.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Триггеры - тоже можно с помощью таблиц, просто вводится еще одна переменная - предыдущее состояние триггера. И получится - конечный автомат. :) И последние 2 строки обсуждаемой таблицы будут выглядеть так :
Изображение
А в предыдущих строках в колонке Qt будет Х - состояние любое.
И если такое объяснение будет понятно ТС, то он станет более внятно формулировать свои вопросы вместо обижаться .
И алгоритмически реализация последних двух состояний будет выглядеть просто: "если Х1=1 и Х2=0 - ничего не менять на выходе" .
Вложения
Qt.JPG
(2.67 КБ) 1387 скачиваний
Изображение
Друг Кота
Аватара пользователя
Сообщения: 15694
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Реализация в ассемблере "в лоб" - табличный метод.
У АВРки или таблица в ОЗУ или таблица в ПЗУ.
Соответственно и набор регистров/команд подбираем.
8)
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

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

Изображение
Вложения
XY.JPG
(11.15 КБ) 1461 скачивание
Изображение
Друг Кота
Аватара пользователя
Сообщения: 15694
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Табличка шустрее - там сразу JMP в указанной ячейке и/или непосредственно обработчик и количество проверок равно одному разу.
При том, что у нас возможны аж четыре комбинации состояний на входе (т.е. до 4 сравнений).
в Z адрес начала таблички/области подпрограмм обработки
гдей-то собственно принятый код
сложим с содержимым Z после предобработки
и затем
IJMP/ICALL
:hunger:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

jeka79 писал(а):Насос включается только тогда, когда емкость наполнилась, а потом полностью опустошилась.
Если насос включен, проверяете только датчик по которому должно произойти отключение, если выключен, то другой и все.
Последний раз редактировалось Z_h_e Пт апр 07, 2017 15:06:00, всего редактировалось 1 раз.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение 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 команды - и никаких таблиц
Изображение
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение 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
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Сб янв 07, 2017 10:14:29
Откуда: Н-Новгород

Сообщение jeka79 »

спс, буду тестить в сравнение с триггером на 561 серии, скорость выполнения тут не важна, лишь бы работало.

Добавлено after 27 minutes 20 seconds:
Еще вопрос по части реализации, переключение будет происходить сразу при первом импульсе на вход, допустим забрызгивание датчика, еще не полной бочки, выключит насос.
Если датчики связать через резистивный делитель и включить ацп, выигрыш в кол-ве входов + своего рода антидребезг какой никакой получится, т.к ацп вроде как не быстро считает.
или же таймер мудрить как на обработчиках конопок делают?
или аналоговую фильтрацию типа рс цепочек.
хотелось бы минималистически. тинька 13а.
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение 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
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Сб янв 07, 2017 10:14:29
Откуда: Н-Новгород

Сообщение 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, теперь все вроде корректно работает.
Друг Кота
Аватара пользователя
Сообщения: 15694
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

Вернуться в «AVR»