Обсуждаем контроллеры компании Atmel.
Ответить

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

Сб окт 26, 2019 22:28:16

Добрый день. Тысячу лет назад изучал ассемблер, сейчас все позабыл, а тут понадобилась простейшая программа для 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

Я мог бы написать на C++ но это должно работать очень быстро, буквально за пару тройку тактов .

Пишите на C++, оптимизатор творит чудеса.

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

Вс окт 27, 2019 01:32:06

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

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

Вс окт 27, 2019 01:37:31

ПЗУ 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 раз.

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

Вс окт 27, 2019 01:41:42

С памятью-то любая пройдёт, под которую доступен программатор....))))... (хотя тут можно и ручной самоделкой обойтись, мало адресов писать)...

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

Вс окт 27, 2019 08:19:09

С памятью-то любая пройдёт, под которую доступен программатор....))))... (хотя тут можно и ручной самоделкой обойтись, мало адресов писать)...

Из программаторов есть только USB ASP. Не подскажите, под них что подходит?

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

Вс окт 27, 2019 13:06:03

000->110
001->011
010->101
011->111
100->110
101->100
110->010
111->111

Если значение из порта закинуть согласно Вашего условия (таблицы) в другой порт, то у меня получилось 7 тактов. :dont_know:
Изображение

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

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

Вс окт 27, 2019 14:01:16

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

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

Вс окт 27, 2019 14:46:35

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

Если нельзя трогать остальные пины портов, то дополненный вариант увеличивается до 12 тактов. :)
tab.png
Последний раз редактировалось Самсусамыч Пн окт 28, 2019 12:24:29, всего редактировалось 2 раз(а).

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

Вс окт 27, 2019 15:26:53

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

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

Вс окт 27, 2019 15:40:58

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

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

Вс окт 27, 2019 17:17:39

Update

...

Спойлер
Код:
//==================
   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

Восемь тактов, при более полном использовании возможностей ядра 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

Я давно асм не мучал, но вот так будет 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

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

Изображение

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

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

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

Пн окт 28, 2019 08:15:18

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

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

Пн окт 28, 2019 08:35:09

Осталось D2 и D0 в таблице, Q2 и Q0 в таблице и на выходах поменять местами, чтобы совсем было правильно.

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

Пн окт 28, 2019 08:57:27

Всем спасибо, вся информация будет подробно изучена.

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

Пн окт 28, 2019 09:01:09

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

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

Пн окт 28, 2019 09:09:41

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