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

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

Добавлено: Сб окт 26, 2019 22:28:16
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

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

Добавлено: Вс окт 27, 2019 00:30:18
viiv
[uquote="faraddin",url="/forum/viewtopic.php?p=3725487#p3725487"]Я мог бы написать на C++ но это должно работать очень быстро, буквально за пару тройку тактов .[/uquote]
Пишите на C++, оптимизатор творит чудеса.

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

Добавлено: Вс окт 27, 2019 01:32:06
Enman
На логике получается так. Входной код - на адресные входы мультиплексора 555КП5(7), а сигнальные входы распаять в соответствии с таблицей...Вроде и не сложно, 3 микросхемы...

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

Добавлено: Вс окт 27, 2019 01:37:31
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

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

Добавлено: Вс окт 27, 2019 01:41:42
Enman
С памятью-то любая пройдёт, под которую доступен программатор....))))... (хотя тут можно и ручной самоделкой обойтись, мало адресов писать)...

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

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

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

Добавлено: Вс окт 27, 2019 13:06:03
Самсусамыч
[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

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

Добавлено: Вс окт 27, 2019 14:01:16
akl
Практически совсем не знаю билдера. Что, интересно, выведется на порт D, если на пинах B будет FF? Это к тому, что, по мне, не хватает маскирования.

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

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

Если нельзя трогать остальные пины портов, то дополненный вариант увеличивается до 12 тактов. :)
tab.png

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

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

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

Добавлено: Вс окт 27, 2019 15:40:58
Самсусамыч
Программисты тут не причём… я вот и близко к ним не отношусь… :) тут ведь дело вкуса… кому нравится для такой простой задачи использовать 5 микросхем, тот делает на рассыпухе, кому нравится компактности и гибкость без переделки схемы, тот выбирает соответствующий МК. Как говорится на вкус и цвет… :)

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

Добавлено: Вс окт 27, 2019 17:17:39
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
//==================

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

Добавлено: Пн окт 28, 2019 05:16:46
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
:)

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

Добавлено: Пн окт 28, 2019 07:16:10
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	

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

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

Изображение

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

Собственно, аналогичное решение (в несколько иной компонентной базе) было предложено ранее, но, почему-то прошло незамеченным...
p.s. Поправил табличку...

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

Добавлено: Пн окт 28, 2019 08:15:18
Demiurg
Неплохой вариант. Тут все зависит от того, как тс захочет решит свою задачу, учитывая, что он получил решение как на МК, так и на логике. Логика дубовая, но нужно все это паять. МК схемотехнически проще, но нужно программировать и уметь накидать программу. В таких случаях лично я выберу МК. Паять меньше.

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

Добавлено: Пн окт 28, 2019 08:35:09
akl
Осталось D2 и D0 в таблице, Q2 и Q0 в таблице и на выходах поменять местами, чтобы совсем было правильно.

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

Добавлено: Пн окт 28, 2019 08:57:27
faraddin
Всем спасибо, вся информация будет подробно изучена.

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

Добавлено: Пн окт 28, 2019 09:01:09
BOB51
Табличный кодер/декодер.
Всего-то массив данных с модифицируемым по условию указателем адреса ячейки...
Организация как в ПЗУ так и в ОЗУ (чтение более быстрое, но требует предварительной подготовки данных).
Альтернатива - простая последовательность команд (требует больше места в ПЗУ).
8)

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

Добавлено: Пн окт 28, 2019 09:09:41
Slabovik
akl писал(а):Осталось D2 и D0 в таблице, Q2 и Q0 в таблице
Верно. Поправил табличку и выход :beer: