Обсуждаем контроллеры компании Atmel.
Сб окт 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
Вс окт 27, 2019 00:30:18
Я мог бы написать на C++ но это должно работать очень быстро, буквально за пару тройку тактов .
Пишите на C++, оптимизатор творит чудеса.
Вс окт 27, 2019 01:32:06
На логике получается так. Входной код - на адресные входы мультиплексора 555КП5(7), а сигнальные входы распаять в соответствии с таблицей...Вроде и не сложно, 3 микросхемы...
Вс окт 27, 2019 01:37:31
ПЗУ 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
Последний раз редактировалось
akl Вс окт 27, 2019 05:34:18, всего редактировалось 1 раз.
Вс окт 27, 2019 01:41:42
С памятью-то любая пройдёт, под которую доступен программатор....))))... (хотя тут можно и ручной самоделкой обойтись, мало адресов писать)...
Вс окт 27, 2019 08:19:09
С памятью-то любая пройдёт, под которую доступен программатор....))))... (хотя тут можно и ручной самоделкой обойтись, мало адресов писать)...
Из программаторов есть только USB ASP. Не подскажите, под них что подходит?
Вс окт 27, 2019 13:06:03
000->110
001->011
010->101
011->111
100->110
101->100
110->010
111->111
Если значение из порта закинуть согласно Вашего условия (таблицы) в другой порт, то у меня получилось 7 тактов.
Добавлено after 3 hours 5 minutes 31 second:Исправил… так как было не совсем корректно… добавился ещё один такт… получилось 8 тактов.
1.png
Последний раз редактировалось Самсусамыч Пн окт 28, 2019 12:28:31, всего редактировалось 1 раз.
Вс окт 27, 2019 14:01:16
Практически совсем не знаю билдера. Что, интересно, выведется на порт D, если на пинах B будет FF? Это к тому, что, по мне, не хватает маскирования.
Вс окт 27, 2019 14:46:35
Верно замечено... ТС ведь не пояснил конкретику, а значит считаю, что пороты ничем кроме этих входов/выходов не задействованы. А рас так, то вот такой рабочий вариант.
Если нельзя трогать остальные пины портов, то дополненный вариант увеличивается до 12 тактов.
tab.png
Последний раз редактировалось Самсусамыч Пн окт 28, 2019 12:24:29, всего редактировалось 2 раз(а).
Вс окт 27, 2019 15:26:53
faraddin писал(а):Ну или может кто придумает, как это организовать на простых логических элементах, без использования микроконтроллера.
Эх программисты...
Спойлер
вроде как 0 тактов
Вс окт 27, 2019 15:40:58
Программисты тут не причём… я вот и близко к ним не отношусь…
тут ведь дело вкуса… кому нравится для такой простой задачи использовать 5 микросхем, тот делает на рассыпухе, кому нравится компактности и гибкость без переделки схемы, тот выбирает соответствующий МК. Как говорится на вкус и цвет…
Вс окт 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
//==================
Пн окт 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
Пн окт 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
Пн окт 28, 2019 07:20:50
faraddin писал(а):как это организовать на простых логических элементах, без использования микроконтроллера
Примерно так
решение, в отличие от
этого, универсальное, т.к. логика подмены задаётся имитацией ПЗУ на диодной матрице, но в отличие от всяких "РЕ", не требует ни программатора, ни специфических микросхем.
Скорость (точнее, задержка) "вычислений" по прикидкам в районе 50 нс при использовании старинной 74-й серии. Микроконтроллер так может?
Собственно, аналогичное решение (в несколько иной компонентной базе) было
предложено ранее, но, почему-то прошло незамеченным...
p.s. Поправил табличку...
Последний раз редактировалось
Slabovik Пн окт 28, 2019 09:12:51, всего редактировалось 3 раз(а).
Пн окт 28, 2019 08:15:18
Неплохой вариант. Тут все зависит от того, как тс захочет решит свою задачу, учитывая, что он получил решение как на МК, так и на логике. Логика дубовая, но нужно все это паять. МК схемотехнически проще, но нужно программировать и уметь накидать программу. В таких случаях лично я выберу МК. Паять меньше.
Пн окт 28, 2019 08:35:09
Осталось D2 и D0 в таблице, Q2 и Q0 в таблице и на выходах поменять местами, чтобы совсем было правильно.
Пн окт 28, 2019 08:57:27
Всем спасибо, вся информация будет подробно изучена.
Пн окт 28, 2019 09:01:09
Табличный кодер/декодер.
Всего-то массив данных с модифицируемым по условию указателем адреса ячейки...
Организация как в ПЗУ так и в ОЗУ (чтение более быстрое, но требует предварительной подготовки данных).
Альтернатива - простая последовательность команд (требует больше места в ПЗУ).
Пн окт 28, 2019 09:09:41
akl писал(а):Осталось D2 и D0 в таблице, Q2 и Q0 в таблице
Верно. Поправил табличку и выход
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.