Помогите с написанием программы на asm

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб окт 26, 2019 22:09:18

Сообщение faraddin »

Добрый день. Тысячу лет назад изучал ассемблер, сейчас все позабыл, а тут понадобилась простейшая программа для arduino pro mini, помогите написать если не трудно. Суть такова есть массив чисел 0..7 им соответствуют различные числа 0..7 (3 входа и 3 выхода) и нужно это дело сопоставить. Я мог бы написать на C++ но это должно работать очень быстро, буквально за пару тройку тактов . Как я это вижу, берем число A (порт входа), переходим по адресу A, по адресу А записано значение выходного порта. В принципе это и я мог бы сделать, но тут надо еще как то прописать переход в начало, на это моих знаний не хватает.

Ну или может кто придумает, как это организовать на простых логических элементах, без использования микроконтроллера.
000->110
001->011
010->101
011->111
100->110
101->100
110->010
111->111
Реклама
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="faraddin",url="/forum/viewtopic.php?p=3725487#p3725487"]Я мог бы написать на C++ но это должно работать очень быстро, буквально за пару тройку тактов .[/uquote]
Пишите на C++, оптимизатор творит чудеса.
Реклама
Друг Кота
Сообщения: 7774
Зарегистрирован: Сб янв 29, 2011 00:28:48

Сообщение Enman »

На логике получается так. Входной код - на адресные входы мультиплексора 555КП5(7), а сигнальные входы распаять в соответствии с таблицей...Вроде и не сложно, 3 микросхемы...
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

ПЗУ 155РЕ3
На AVR короче 10 тактов не получилось. :dont_know:

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

	SER	ZL
	OUT	DDRD,ZL         
	CLR	ZH
GO:
	IN	R22,PINB			;PB2 PB1 PB0 входы
	ANDI	R22,0b00000111
	LDI	ZL,LOW(DC*2)
	ADD	ZL,R22
	LPM	R22,Z
	OUT	PORTD,R22			;PD2 PD1 PD0 выходы
	RJMP	GO
DC:
	.DB	0b00000110,0b00000011
	.DB	0b00000101,0b00000111
	.DB	0b00000110,0b00000100
	.DB	0b00000010,0b00000111
Последний раз редактировалось akl Вс окт 27, 2019 05:34:18, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 7774
Зарегистрирован: Сб янв 29, 2011 00:28:48

Сообщение Enman »

С памятью-то любая пройдёт, под которую доступен программатор....))))... (хотя тут можно и ручной самоделкой обойтись, мало адресов писать)...
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб окт 26, 2019 22:09:18

Сообщение faraddin »

[uquote="Enman",url="/forum/viewtopic.php?p=3725536#p3725536"]С памятью-то любая пройдёт, под которую доступен программатор....))))... (хотя тут можно и ручной самоделкой обойтись, мало адресов писать)...[/uquote]
Из программаторов есть только USB ASP. Не подскажите, под них что подходит?
Реклама
Самсусамыч

Сообщение Самсусамыч »

[uquote="faraddin",url="/forum/viewtopic.php?p=3725487#p3725487"]000->110
001->011
010->101
011->111
100->110
101->100
110->010
111->111[/uquote]
Если значение из порта закинуть согласно Вашего условия (таблицы) в другой порт, то у меня получилось 7 тактов. :dont_know:
Изображение

Добавлено after 3 hours 5 minutes 31 second:
Исправил… так как было не совсем корректно… добавился ещё один такт… получилось 8 тактов. :)
1.png
Последний раз редактировалось Самсусамыч Пн окт 28, 2019 12:28:31, всего редактировалось 1 раз.
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Практически совсем не знаю билдера. Что, интересно, выведется на порт D, если на пинах B будет FF? Это к тому, что, по мне, не хватает маскирования.
Самсусамыч

Сообщение Самсусамыч »

Верно замечено... ТС ведь не пояснил конкретику, а значит считаю, что пороты ничем кроме этих входов/выходов не задействованы. А рас так, то вот такой рабочий вариант. :)

Если нельзя трогать остальные пины портов, то дополненный вариант увеличивается до 12 тактов. :)
tab.png
Последний раз редактировалось Самсусамыч Пн окт 28, 2019 12:24:29, всего редактировалось 2 раза.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

faraddin писал(а):Ну или может кто придумает, как это организовать на простых логических элементах, без использования микроконтроллера.
Эх программисты...
СпойлерИзображение
вроде как 0 тактов
Самсусамыч

Сообщение Самсусамыч »

Программисты тут не причём… я вот и близко к ним не отношусь… :) тут ведь дело вкуса… кому нравится для такой простой задачи использовать 5 микросхем, тот делает на рассыпухе, кому нравится компактности и гибкость без переделки схемы, тот выбирает соответствующий МК. Как говорится на вкус и цвет… :)
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Update

[uquote="akl",url="/forum/viewtopic.php?p=3725535#p3725535"]...[/uquote]
Спойлер

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

//==================
   ldi r16,   0b00000111
   out DDRD,  r16
   clr r2


Main:
	wdr

   in   r16,  PINB
   andi r16,  0b00000111
   ldi  ZL,   LOW (Table*2)
   ldi  ZH,   HIGH (Table*2)
   add  ZL,   r16
   adc  ZH,   r2
   lpm r16,   Z
//   in r17,    PORTD
//   andi r17,  0b00000111
//   or r16,    r17
   out PORTD, r16
   rjmp Main

Table:
.db 0b00000110, 0b00000011
.db 0b00000101, 0b00000111
.db 0b00000110, 0b00000100
.db 0b00000010, 0b00000111
//==================
Контактная информация:
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Восемь тактов, при более полном использовании возможностей ядра AVR.
Спойлер

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

.CSEG
.ORG	0x00

	RJMP START

.ORG	0x02
DC:
	.DB	0b00000110,0b00000011
	.DB	0b00000101,0b00000111
	.DB	0b00000110,0b00000100
	.DB	0b00000010,0b00000111
DC_END:

START:   
	LDI	R19,0b00000111
	OUT	DDRD,R19
	LDI	ZL,0b11111000
	OUT	DDRB,ZL

	CLR	ZH
	LDI	ZL,LOW(DC*2)
RAM_TB:
	LPM	R22,Z
	ST	Z+,R22
	CPI	ZL,(DC_END*2)
	BRLO	RAM_TB			; занесение таблицы в регистровый файл R4...R11
GO:
	IN	R22,PINB			;PB2 PB1 PB0 входы
	LDI	ZL,LOW(DC*2)
	ADD	ZL,R22
	LD	R22,Z
	OUT	PORTD,R22			;PD2 PD1 PD0 выходы
	RJMP	GO
.EXIT
:)
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Я давно асм не мучал, но вот так будет 6 тактов, если не ошибся где.
Спойлер

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

	ldi ZL,0xFE
GO:
   IN   ZH,PINB         ;PB2 PB1 PB0 входы
   IJMP


.ORG 0x00FE
	OUT   PORTD,R0         ;PD2 PD1 PD0 выходы
	RJMP   GO
.ORG 0x01FE
	OUT   PORTD,R1         
	RJMP   GO
.ORG 0x02FE
	OUT   PORTD,R2         
	RJMP   GO
.ORG 0x03FE
	OUT   PORTD,R3         
	RJMP   GO
.ORG 0x04FE
	OUT   PORTD,R4         
	RJMP   GO
.ORG 0x05FE
	OUT   PORTD,R5         
	RJMP   GO
.ORG 0x06FE
	OUT   PORTD,R6         
	RJMP   GO
.ORG 0x07FE
	OUT   PORTD,R7         
	RJMP   GO	
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 17234
Зарегистрирован: Чт апр 04, 2013 12:46:59
Откуда: Тюмень

Сообщение Slabovik »

faraddin писал(а):как это организовать на простых логических элементах, без использования микроконтроллера
Примерно так

Изображение

решение, в отличие от этого, универсальное, т.к. логика подмены задаётся имитацией ПЗУ на диодной матрице, но в отличие от всяких "РЕ", не требует ни программатора, ни специфических микросхем.
Скорость (точнее, задержка) "вычислений" по прикидкам в районе 50 нс при использовании старинной 74-й серии. Микроконтроллер так может? :wink:

Собственно, аналогичное решение (в несколько иной компонентной базе) было предложено ранее, но, почему-то прошло незамеченным...
p.s. Поправил табличку...
Последний раз редактировалось Slabovik Пн окт 28, 2019 09:12:51, всего редактировалось 3 раза.
Контактная информация:
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Неплохой вариант. Тут все зависит от того, как тс захочет решит свою задачу, учитывая, что он получил решение как на МК, так и на логике. Логика дубовая, но нужно все это паять. МК схемотехнически проще, но нужно программировать и уметь накидать программу. В таких случаях лично я выберу МК. Паять меньше.
Контактная информация:
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Осталось D2 и D0 в таблице, Q2 и Q0 в таблице и на выходах поменять местами, чтобы совсем было правильно.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб окт 26, 2019 22:09:18

Сообщение faraddin »

Всем спасибо, вся информация будет подробно изучена.
Друг Кота
Аватара пользователя
Сообщения: 15600
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Табличный кодер/декодер.
Всего-то массив данных с модифицируемым по условию указателем адреса ячейки...
Организация как в ПЗУ так и в ОЗУ (чтение более быстрое, но требует предварительной подготовки данных).
Альтернатива - простая последовательность команд (требует больше места в ПЗУ).
8)
Друг Кота
Аватара пользователя
Сообщения: 17234
Зарегистрирован: Чт апр 04, 2013 12:46:59
Откуда: Тюмень

Сообщение Slabovik »

akl писал(а):Осталось D2 и D0 в таблице, Q2 и Q0 в таблице
Верно. Поправил табличку и выход :beer:
Контактная информация:
Ответить

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