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

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

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

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



BASCOM 8051

Сообщений 61 страница 73 из 73

61

в bascom-51 работает только Lucida console
в bascom-avr ставлю Verdana

https://upforme.ru/uploads/0000/25/b8/439/t625466.jpg

0

62

Удивлён отсутствием "никому не нужных" синусов и косинусов в 8051... Ладно, накидаем таблично.

0

63

А может и хорошо, что их нет ?
Они такие тормозные ... ;)
Скорость работы операторов Bascom
Пост #41

0

64

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

Пост #41

Ссылка на него чтобы долго не искать Скорость работы операторов Bascom
Функции тормозные потому что программная плавающая точка. Простая математика (сложение, вычитание, деление, умножение) выполняется тоже медленно.

0

65

Ещё и округления до целого нет. Тригонометрия и векторные преобразования в васике становятся всё интереснее.
Округляем пока так (для положительных чисел):
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)

0

66

Кот Обормот написал(а):

'"vb = vs" вызывает ошибку компилятора

Так single в byte не поместится.  :crazyfun:
Округлять можно попробовать через 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)

0

67

Кот Обормот написал(а):

Удивлён отсутствием "никому не нужных" синусов и косинусов в 8051.

Да и я в АВР ни разу не применял - задачи не было ))
Один раз понадобился десятичный логарифм: а АВР есть, а в 8051 - нет, напрёгся.
Потом поменял алгоритм и сделал прямое преобразование значения АЦП в температуру по таблице.

0

68

Если 256 значений (может и больше, зависит от случая), то табличное значение удобнее и быстрее. А для других случаев (если в коде операции для работы с плавающей точкой уже используются) разложить на полиномы.

Отредактировано Кот Обормот (2025-11-04 12:09:53)

0

69

Какие-то слова неизвестные - полином, логарифм да еще и десятичный...
Еще со школы про них забыл... ;)

0

70

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

Так single в byte не поместится.

Для этого и нужно наложение переменных чтобы сразу в байтовую загонять при передаче в word\long.

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

Какие-то слова неизвестные - полином, логарифм да еще и десятичный...

Если полиномы пугают, то можно попробовать многочлены.

Отредактировано Кот Обормот (2025-11-04 14:03:32)

0

71

Кот Обормот написал(а):

... то можно попробовать многочлены.

Ух ты ! ;)
Новые слова ! ;)

Не, это не ко мне...
Я "высшую арифметику" забыл сразу после получения аттестата и ни разу в жизни не пришлось применить. ;)

0

72

Кот Обормот написал(а):

можно попробовать многочлены.

На ночь лучше не представлять чтобы кошмары не снились! :D  :)

+1

73

Опции BASE = 0 нет, поэтому допиливаем:

тык

$regfile = "8H1K28.DAT"
$crystal = 35000000

$romstart = &H0
$ramsize = 1024
$map
$large

Dim 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 = 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            ; Старший байт адреса массива
      add a, dpl              ; Индекс + базовый адрес
      mov dpl, a
      clr a
      addc a, dph             ; Учесть перенос
      mov dph, a
      mov a, r1               ; Значение для записи
      movx @dptr, a
   $end Asm

   Incr 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 = 8

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

0