Если нужно максимально быстро, можно использовать вставки на ASM AVR (ассемблер)
Вставки на ASM AVR (ассемблер)
Сообщений 31 страница 39 из 39
Поделиться312024-05-11 04:27:08
Двойные ступеньки
Алнесандр, пробовал уже. Не смог разобраться. Там сумбурно описано.
Отредактировано samego0 (2024-05-11 04:27:19)
Поделиться322024-05-13 00:19:46
Алнесандр, пробовал уже. Не смог разобраться. Там сумбурно описано.
И чего же там сумбурного ?
Ассемблер ёханый бабай.
Поделиться332024-06-18 13:17:32
Bascom для вычислений с плавающей запятой использует определённые регистры (или restore\read).
Тогда в случае несложной программы при наличии неиспользованных компилятором регистров делаем:
byte_var alias R8 ' указываем регистр
do
incr byte_var
decr vyte_var
loop
Если переменная Word > 0 Decr переменная Word
Я делаю так (на 4 байта короче):
Word >= 1 Decr переменная Word
Обычно такты вообще не считаю, ориентируюсь на конечный размер бинанрика. Был случай байт в байт влез в ATTIMY13A исключительно ухищрениями без ассемблера.
Отредактировано Кот Обормот (2024-06-18 13:19:21)
Поделиться342025-12-17 06:36:09
Есть массив:
Dim Sun(8) As Byte
Как получить n-ный элемент массива в регистр на асме для вывода в TCNT0?
Пытаюсь сделать так, но не то...
!lds r26, {i} ; Загружаем индекс элемента массива
!clr r27 ;
!lds r30, {Sun} ; Загружаем младший байт адреса начала массива
!lds r31, {Sun+1} ; Загружаем старший байт адреса начала массива
!add r30, r26 ; Добавляем индекс элемента массива
!adc r31, r27
!lpm r17, Z ; Загружаем значение элемента массива в регистр R17
!out TCNT0, r17
Этот фрагмент должен заменить код: Tcnt0 = Sun(i)
Tcnt0 = Sun(i) изменяет яркость в дин.индикации, а код на асме не работает.
Поделиться352025-12-17 09:02:50
!lds r30, {Sun} ; Загружаем младший байт адреса начала массива
!lds r31, {Sun+1} ; Загружаем старший байт адреса начала массива
Здесь очевидно загружается не адрес, а сами данные из адреса {Sun} и {Sun+1}
Чтобы получить адрес нужно иметь указатель на начало массива:
Dim Sun(8) As Byte
Dim pSun As Word
pSun = Varptr(Sun(0)) ' pSun теперь содержит адрес массива в SRAM (если опция BASE = 0)
Отредактировано Кот Обормот (2025-12-17 09:05:21)
Поделиться362025-12-17 16:35:30
Спасибо, попробую вечером.
Поделиться372025-12-17 17:42:53
Я бы лучше декомпилировал рабочий код на чистом bascom, а потом думал где можно сократить. В AVR куча регистров (в отличие от 8051, но 1T8051 перешибают частотой 35 МГц от внутреннего генератора), которые можно вольготно использовать в быстрых процедурах вместо обычных переменных в памяти.
Поделиться382025-12-17 20:55:28
Тестовый пример для получения элемента массива с помощью ASM. Спасибо Кот Обормот.
Dim Bright(12) As Byte ' Массив из 12 байт
Dim P_br As Word ' Переменная для хранения адреса начала массива в SRAM
P_br = Varptr(bright(1)) ' P_br теперь содержит адрес массива в SRAM (если опция BASE = 1, если BASE = 0, то брать нулевой индекс)
Print "DEC = " ; P_br ; " HEX = " ; Hex(p_br) ' Выводим адрес в терминал
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim M As Byte
'Заполняем массив значениями
For I = 1 To 12
J = I + 50
Bright(i) = J
Next I
'Получаем элементы массива
For I = 1 To 12
!lds r30, {i} ; Загружаем индекс i
!dec r30 ; Декремент индекса
!clr r31 ; Очищаем регистр
!lds r26, {P_br} ; Загружаем младший байт адреса P_br
!lds r27, {P_br + 1} ; Загружаем старший байт адреса P_br
!add r26, r30 ; Добавляем индекс i
!adc r27, r31 ;
!ld r16, X ; Получаем значение из массива
!sts {j} , R30
!sts {k} , R31
!sts {m} , R16
Print I ; " : " ; J ; " : " ; K ; " : " ; M
Next I
Поделиться392025-12-17 21:30:39
Этот фрагмент должен заменить код: Tcnt0 = Sun(i)
Я обычно просматриваю дизассемблированный код в протеусе, а затем причёсываю его, т.к. баском любит придумывать очень много ненужных кодов.