HarryStar писал(а):что-то сомневаюсь, что условие и ветвление быстрее, чем присваивание
У вас там не присваивание, а маска и сдвиг.
А условие и ветвление возможно будут такими (от оптимизатора зависит)
- Код: Выделить всё • Развернуть
lds in, (in_array+2) - один раз для каждого входного байта
ldi out,0x00
sbrs in,5
ldi out,0x80
sts (out_array+18), out
HarryStar писал(а):Вывод видео специфическая задача. Во время прохода строки времени очень мало
Далаадна... С вашими-то разрешениями да современными процами
Flexz писал(а):У вас же SPI по сути, почему его не использовать?
+1. Если между знакоместами допустимы промежутки, то удобно использовать SPI
У вас какой процессор и кварц?
Добавлено спустя 1 час 7 минут 49 секунд:Сейчас попробовал написать. (Вслепую. Не отлаживал и не собираюсь
)
Использует знакогенератор символов из флэш. Частота вывода пикселей - 5Мгц (при кварце 20). 32 символа в строке (256 пикселей). Это примерно 51 с чем-то микросекунды. В начале строки выводится один лишний пиксель (черный).
Недостаток - занимает весь порт, но использует только младшую ногу порта (так проще).
- Код: Выделить всё • Развернуть
init:
; Тут сохраняем регистры, если надо, выравниваем времена и т.п.
; в ZH кладем адрес нужной строки знакогенератора
; в Y кладем адрес экранного буфера
ldi cnt,32 ; в cnt кладем число символов в строке
ldi sh1,0 ; в sh1 кладем нолик, это "лишний" бит - он будет черный.
rjmp entry ; Поехали
loop: out sh1 ;1=== Седьмой
lsr sh1 ;1
entry: ld ZL,Y+ ;2 Берем код символа из экранного буфера
out sh1 ;1=== Выводим последний бит (сразу после входа - черный)
lpm tmp,Z ;3 Берем нужный байт из знакогенератора
out tmp ;1=== Сразу выводим первый бит
mov sh1,tmp ;1 Перекидываем в "сдвиговый регистр"...
lsr sh1 ;1 ...и сдвигаем
nop ;1
out sh1 ;1=== Выводим второй бит
lsr sh1 ;1 ...и сдвигаем
nop ;1
nop ;1
out sh1 ;1=== Третий
lsr sh1 ;1
nop ;1
nop ;1
out sh1 ;1=== Четвертый
lsr sh1 ;1
nop ;1
nop ;1
out sh1 ;1=== Пятый бит
lsr sh1 ;1 сдвигаем
mov tmp,sh1 ;1 запоминаем результат в tmp
lsr sh1 ;1 и сразу сдвигаем еще раз, чтобы потом быстро вывести
out tmp ;1=== Шестой бит из tmp
dec cnt ;1 Есть еще байты?
brne loop ;2 Если да, зацикливаемся
nop ;1
out sh1 ;1=== Седьмой бит последнего символа в строке
lsr sh1 ;1
nop ;1
nop ;1
out sh1 ;1=== Последний бит последнего символа в строке
; Можно добавить инкремент строки знакогенератора, экранного буфера, подсчет строк, времени и т.п.
; Тут восстанавливаем регистры, если надо
Кучу нопов... можно занять чем-нибудь "полезным"