BASCOM 8051
Сообщений 61 страница 73 из 73
Поделиться622025-11-03 17:13:33
Удивлён отсутствием "никому не нужных" синусов и косинусов в 8051... Ладно, накидаем таблично.
Поделиться632025-11-03 18:13:11
А может и хорошо, что их нет ?
Они такие тормозные ... 
Скорость работы операторов Bascom
Пост #41
Поделиться642025-11-03 18:44:51
Пост #41
Ссылка на него чтобы долго не искать Скорость работы операторов Bascom
Функции тормозные потому что программная плавающая точка. Простая математика (сложение, вычитание, деление, умножение) выполняется тоже медленно.
Поделиться652025-11-03 21:24:56
Ещё и округления до целого нет. Тригонометрия и векторные преобразования в васике становятся всё интереснее.
Округляем пока так (для положительных чисел):
dim vs as single
dim vl as long
dim vb as byte
vs = 15.87'ДОПУСТИМ
vs = vs + 0.5
vl = vs
vb = vs
'"vb = vs" вызывает ошибку компилятора
' передача через переменную word тоже работает; разница по бинарнику 6 байт
Отредактировано Кот Обормот (2025-11-03 21:57:00)
Поделиться662025-11-03 22:11:56
'"vb = vs" вызывает ошибку компилятора
Так single в byte не поместится.
Округлять можно попробовать через Mod.
vs = 15.87'ДОПУСТИМ
vb = vs Mod 100
If vb > 50 Then
vs = vs + 0.5
End if
Ну как то так.
Отредактировано Andrusha (2025-11-04 00:36:42)
Поделиться672025-11-03 22:28:57
Удивлён отсутствием "никому не нужных" синусов и косинусов в 8051.
Да и я в АВР ни разу не применял - задачи не было ))
Один раз понадобился десятичный логарифм: а АВР есть, а в 8051 - нет, напрёгся.
Потом поменял алгоритм и сделал прямое преобразование значения АЦП в температуру по таблице.
Поделиться682025-11-04 12:09:27
Если 256 значений (может и больше, зависит от случая), то табличное значение удобнее и быстрее. А для других случаев (если в коде операции для работы с плавающей точкой уже используются) разложить на полиномы.
Отредактировано Кот Обормот (2025-11-04 12:09:53)
Поделиться692025-11-04 12:42:02
Какие-то слова неизвестные - полином, логарифм да еще и десятичный...
Еще со школы про них забыл... 
Поделиться702025-11-04 13:50:35
Так single в byte не поместится.
Для этого и нужно наложение переменных чтобы сразу в байтовую загонять при передаче в word\long.
Какие-то слова неизвестные - полином, логарифм да еще и десятичный...
Если полиномы пугают, то можно попробовать многочлены.
Отредактировано Кот Обормот (2025-11-04 14:03:32)
Поделиться712025-11-04 14:13:23
... то можно попробовать многочлены.
Ух ты ! 
Новые слова ! 
Не, это не ко мне...
Я "высшую арифметику" забыл сразу после получения аттестата и ни разу в жизни не пришлось применить. 
Поделиться722025-11-04 22:21:35
можно попробовать многочлены.
На ночь лучше не представлять чтобы кошмары не снились!

Поделиться732025-11-16 17:52:10
Опции BASE = 0 нет, поэтому допиливаем:
$regfile = "8H1K28.DAT"
$crystal = 35000000$romstart = &H0
$ramsize = 1024
$map
$largeDim Tst As Xram Byte
Dim Tst2 As Xram Byte
Dim Blnk_idx(8) As Xram Byte
Dim Pix_idx As Byte
Dim Arrp As Word
Dim Byte_val As Byte
Arrp = Varptr(blnk_idx(1))
Pix_idx = 0Do
$asm
mov r0, #{Pix_idx} ; Адрес переменной Pix_idx
mov a, @r0 ; Значение Pix_idx
mov r1, a ; Сохранить в r1
mov r0, #{ARRP} ; Адрес переменной Arrp
mov dpl, @r0 ; Младший байт адреса массива
inc r0
mov dph, @r0 ; Старший байт адреса массива
add a, dpl ; Индекс + базовый адрес
mov dpl, a
clr a
addc a, dph ; Учесть перенос
mov dph, a
mov a, r1 ; Значение для записи
movx @dptr, a
$end AsmIncr Pix_idx
Loop Until Pix_idx = 8
Pix_idx = 0
Do
$asm
mov r0, #{Pix_idx} ; адрес PIX_IDX
mov a, @r0 ; значение PIX_IDX
mov r1, a ; сохранили в r1
mov r0, #{ARRP} ; адрес ARRP (младший)
mov dpl, @r0 ; младший байт адреса массива
inc r0
mov dph, @r0 ; старший байт адреса массива
mov a, r1 ; индекс
add a, dpl ; индекс + база
mov dpl, a
clr a
addc a, dph
mov dph, a
movx a, @dptr ; прочитали из массива (в XRAM)
mov dptr, #{TST} ; загрузили адрес переменной TST
movx @dptr, a ; записали в TST (в XRAM)
$end Asm
Tst2 = Tst
Incr Pix_idx
Loop Until Pix_idx = 8Do
Loop
Первая вставка загоняет в массив (аналог blnk_idx(Pix_idx)=Pix_idx) значения [0...7]
Вторая читает (аналог Tst = blnk_idx(Pix_idx))
tst2 = tst' Контроль чтения
PIX_IDX Byte 0021 33
BYTE_VAL Byte 0024 36
ARRP Word 0022 34
TST Ext. Byte 0000 0
TST2 Ext. Byte 0001 1
BLNK_IDX Ext. Byte (8) 0002 2
Отредактировано Кот Обормот (2025-11-16 17:54:11)
