Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Применение Assembler в среде Bascom(-8051) » Вставки на ASM AVR (ассемблер)


Вставки на ASM AVR (ассемблер)

Сообщений 31 страница 39 из 39

1

Если нужно максимально быстро, можно использовать вставки на ASM AVR (ассемблер)

+1

31

sasha_1973 написал(а):

Двойные ступеньки

Алнесандр, пробовал уже. Не смог разобраться. Там сумбурно описано.

Отредактировано samego0 (2024-05-11 04:27:19)

0

32

samego0 написал(а):

Алнесандр, пробовал уже. Не смог разобраться. Там сумбурно описано.

И чего же там сумбурного ?

Ассемблер ёханый бабай.

+1

33

Bascom для вычислений с плавающей запятой использует определённые регистры (или restore\read).
Тогда в случае несложной программы при наличии неиспользованных компилятором регистров делаем:

byte_var alias R8 ' указываем регистр

do
   incr byte_var
   decr vyte_var
loop

sasha_1973 написал(а):

Если переменная Word > 0 Decr переменная Word

Я делаю так (на 4 байта короче):
Word >= 1 Decr переменная Word

Обычно такты вообще не считаю, ориентируюсь на конечный размер бинанрика. Был случай байт в байт влез в ATTIMY13A  исключительно ухищрениями без ассемблера.

Отредактировано Кот Обормот (2024-06-18 13:19:21)

0

34

Есть массив:
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) изменяет яркость в дин.индикации, а код на асме не работает.

0

35

!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)

+1

36

Спасибо, попробую вечером.

0

37

Я бы лучше декомпилировал рабочий код на чистом bascom, а потом думал где можно сократить. В AVR куча регистров (в отличие от 8051, но 1T8051 перешибают частотой 35 МГц от внутреннего генератора), которые можно вольготно использовать в быстрых процедурах вместо обычных переменных в памяти.

0

38

Тестовый пример для получения элемента массива с помощью 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

0

39

kotik написал(а):

Этот фрагмент должен заменить код:    Tcnt0 = Sun(i)

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

+1


Вы здесь » Программирование ATMEL в BASCOM. » Применение Assembler в среде Bascom(-8051) » Вставки на ASM AVR (ассемблер)