Страница 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 тактов не получилось.
Код: Выделить всё
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 тактов.
Добавлено 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-й серии. Микроконтроллер так может?
Собственно, аналогичное решение (в несколько иной компонентной базе) было
предложено ранее, но, почему-то прошло незамеченным...
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
Табличный кодер/декодер.
Всего-то массив данных с модифицируемым по условию указателем адреса ячейки...
Организация как в ПЗУ так и в ОЗУ (чтение более быстрое, но требует предварительной подготовки данных).
Альтернатива - простая последовательность команд (требует больше места в ПЗУ).

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