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

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

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

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



BASCOM 8051

Сообщений 91 страница 102 из 102

91

Деструктивное поведение, конечно.
В бизнесе не должно быть друзей/врагов. Если посмотреть на восточных братьев, они для всех рынок.
На западе же себе в ноги стреляют и норм.

0

92

Я вообще можно сказать внёс бабки (хотя и символические) за лицензию на устаревший продукт, в котором за год ничего не поменялось. Забронзовел Марк. Но упорные товарищи (почёт и уважение от всех пионеров планеты) уже протоптали дорожку, нужно только DAT-файлы строчить и добавлять.

0

93

жаль, не добавил Dword и прочее
ну и редактор кривой, много бяк.

0

94

64 бит конечно не дождались.

Можно самостоятельно напилить. И даже квадратный корень вычислить с округлением, а не отбрасыванием.

0

95

Я что-то не догоняю или это нормально? В XRAM можно смотреть запись в EAXFR.

Код
Код:
$regfile = "8H1K08.DAT"
$crystal = 35000000
$ramsize = 1024
$map
$large
Rstcfg = &B0100_0011
Stop Timer1
Auxr.6 = 0
P1 = 0 : P3 = 0 : P5 = 0
P1dr = &B0000_0000 : P3dr = &B1100_1111 : P5dr = &B1110_1111
P_sw2.7 = 1
'EAXFR
'*******************************************************************************
   P1ie = &B1111_1111 : P3ie = &B0011_0100 : P5ie = &B0001_0000
   P3m0.3 = 1 : P3m1.5 = 0
   P5m0.4 = 1 : P5m1.4 = 0
   Btn Alias P3.2
   'P3ie.2 = 1
   P3m1.2 = 1
   P3m0.2 = 0
   P3pu.2 = 1
   P3m0.4 = 1 : P3m1.4 = 0
'*******************************************************************************
P_sw2.7 = 0

Stop
Картинка

0

96

не понял, поясните  :dontknow:

0

97

Пишем в EAXFR и эти данные отображаются в XRAM. За границами реальной памяти (1024) конечно.

0

98

о как. Но то симулятор, а не реально устройство!

0

99

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

Так single в byte не поместится.  
Отредактировано Andrusha (2025-11-04 00:36:42)

Если значение в байт гарантированно помещается (пользователь сам это контролирует), то помещаем

SINGLE > BYTE
Код:
$regfile = "8H1K28.DAT"
$crystal = 35000000
$romstart = &H0
$ramsize = 1024
$map
$large
Dim Vs As Single
Dim Vb As Byte
Dim Tmp_a As Byte : Dim Tmp_b As Byte
Start Timer1

Do

   Tmp_a = Th1 : Tmp_b = Tmp_b + Th1 : Rotate Tmp_b , Right : If Tmp_b < 1 Then Tmp_b = 2
   Vs = Tmp_a / Tmp_b

$asm
       mov a, {Vs+3}
       mov r7, a
       mov a, {Vs+2}
       mov r6, a
       mov a, r7
       rl a
       mov a, r6
       jb acc.7, S_to_b_set_low_bit_1
       mov a, r7
       rl a
       anl a, #254
       sjmp S_to_b_exp_done
   S_to_b_set_low_bit_1:
       mov a, r7
       rl a
       orl a, #1
   S_to_b_exp_done:
       clr c
       subb a, #127
       jc S_to_b_val_too_small
       mov r2, a
       clr c
       subb a, #8
       jnc S_to_b_val_too_big
       mov a, r6
       anl a, #127
       orl a, #128
       mov r1, a
       mov a, #7
       clr c
       subb a, r2
       jz S_to_b_round_check_e7
       mov r0, a
   S_to_b_shift_final:
       clr c
       mov a, r1
       rrc a
       mov r1, a
       djnz r0, S_to_b_shift_final
       jnc S_to_b_store_result
       inc r1
       jz S_to_b_val_too_big
       sjmp S_to_b_store_result
   S_to_b_round_check_e7:
       mov a, {Vs+1}
       jnb acc.7, S_to_b_store_result
       inc r1
       jz S_to_b_val_too_big
       sjmp S_to_b_store_result
   S_to_b_val_too_small:
       cjne a, #255, S_to_b_set_zero
       mov a, {Vs+2}
       anl a, #127
       orl a, #128
       jnb acc.7, S_to_b_set_zero
       mov r1, #1
       sjmp S_to_b_store_result
   S_to_b_set_zero:
       mov r1, #0
       sjmp S_to_b_store_result
   S_to_b_val_too_big:
       mov r1, #255
   S_to_b_store_result:
       mov a, r1
       mov {Vb}, a
$end Asm

   Print "Vs=" ; Vs ; " Vb=" ; Vb
Loop
Stop

Отредактировано Кот Обормот (2026-02-20 20:31:42)

0

100

Александр Д. написал(а):

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

Теперь немножко есть
Код:
$regfile = "8H1K08.DAT"
$crystal = 35000000
$ramsize = 1024
$map
$large

Dim Log_in As Single
Dim Log_out As Integer

Log_in = 0.0005
Do
   Gosub L10
   Print "in=" ; Log_in ; " out=" ; Log_out
   Log_in = Log_in * 1.25
Loop

L10:

   $asm
      lcall log10_unpack
      jc log10_set_zero
      lcall log10_calc_full_opt
      lcall log10_write_long
      ret
   Log10_set_zero:
      mov {Log_out+0}, #0
      mov {Log_out+1}, #0
      ret
   Log10_unpack:
      mov a, {Log_in+3}
      jb acc.7, log10_unpack_err
      mov r4, a
      mov a, {Log_in+2}
      mov r6, a
      rlc a
      mov a, r4
      rlc a
      jz log10_unpack_err
      clr c
      subb a, #127
      mov r5, a
      mov a, r6
      anl a, #127
      mov r3, a
      mov a, {Log_in+1}
      mov r2, a
      clr c
      ret
   Log10_unpack_err:
      setb c
      ret
   Log10_calc_full_opt:
      mov dptr, #log10_tab
      mov a, r3
      rl a
      add a, dpl
      mov dpl, a
      mov a, dph
      addc a, #0
      mov dph, a
      clr a
      movc a, @a+dptr
      mov r4, a
      inc dptr
      clr a
      movc a, @a+dptr
      mov r6, a
      inc dptr
      clr a
      movc a, @a+dptr
      mov r7, a
      inc dptr
      clr a
      movc a, @a+dptr
      mov r0, a
      clr c
      mov a, r7
      subb a, r4
      mov r7, a
      mov a, r0
      subb a, r6
      mov r0, a
      mov a, r2
      mov b, r7
      mul ab
      mov a, r2
      mov b, r7
      mul ab
      jnb acc.7, log10_noround
      inc b
   Log10_noround:
      mov r1, b
      mov a, r4
      add a, r1
      mov r4, a
      mov a, r6
      addc a, #0
      mov r6, a
      mov a, r5
      jnb acc.7, log10_pos_exp
      push r4
      push r6
      cpl a
      inc a
      mov b, #194
      mul ab
      mov r1, a
      mov a, b
      mov r2, #0
      xch a, r0
      mov a, r5
      cpl a
      inc a
      mov b, #11
      mul ab
      add a, r0
      mov r2, a
      mov a, r5
      cpl a
      inc a
      mov b, #3
      div ab
      mov r0, a
      clr c
      mov a, r1
      subb a, r0
      mov r1, a
      mov a, r2
      subb a, #0
      mov r2, a
      clr c
      mov a, r1
      cpl a
      add a, #1
      mov r1, a
      mov a, r2
      cpl a
      addc a, #0
      mov r2, a
      pop r6
      pop r4
      sjmp log10_sum
   Log10_pos_exp:
      mov b, #194
      mul ab
      mov r1, a
      mov a, b
      mov r2, #0
      xch a, r0
      mov a, r5
      mov b, #11
      mul ab
      add a, r0
      mov r2, a
      mov a, r5
      mov b, #3
      div ab
      add a, r1
      mov r1, a
      mov a, r2
      addc a, #0
      mov r2, a
   Log10_sum:
      mov a, r4
      add a, r1
      mov r1, a
      mov a, r6
      addc a, r2
      mov r2, a
      mov a, r5
      jb acc.7, log10_chk_neg
      mov a, r2
      jb acc.7, log10_calc_zero
      sjmp log10_calc_exit
   Log10_chk_neg:
      mov a, r2
      jnb acc.7, log10_calc_zero
      sjmp log10_calc_exit
   Log10_calc_zero:
      mov r1, #0
      mov r2, #0
   Log10_calc_exit:
      ret
   Log10_write_long:
      mov {Log_out+0}, r1
      mov {Log_out+1}, r2
      ret
   Log10_tab:
      db   0,0,  34,0,  67,0, 101,0, 134,0, 166,0, 199,0, 231,0
      db   7,1,  39,1,  71,1, 102,1, 133,1, 164,1, 195,1, 225,1
      db   0,2,  30,2,  59,2,  89,2, 119,2, 148,2, 177,2, 206,2
      db 234,2,   7,3,  35,3,  63,3,  91,3, 119,3, 146,3, 174,3
      db 201,3, 228,3, 255,3,  26,4,  52,4,  79,4, 105,4, 131,4
      db 157,4, 183,4, 208,4, 234,4,   3,5,  28,5,  53,5,  78,5
      db 103,5, 128,5, 152,5, 176,5, 201,5, 225,5, 249,5,  16,6
      db  40,6,  64,6,  87,6, 110,6, 133,6, 157,6, 179,6, 202,6
      db 225,6, 247,6,  14,7,  36,7,  58,7,  81,7, 103,7, 124,7
      db 146,7, 168,7, 189,7, 211,7, 232,7, 253,7,  19,8,  40,8
      db  61,8,  81,8, 102,8, 123,8, 143,8, 164,8, 184,8, 204,8
      db 224,8, 244,8,   8,9,  28,9,  48,9,  68,9,  87,9, 107,9
      db 126,9, 146,9, 165,9, 184,9, 203,9, 222,9, 241,9,   4,10
      db  23,10, 41,10, 60,10, 79,10, 97,10,115,10,134,10,152,10
      db 170,10,188,10,206,10,224,10,242,10,  4,11, 21,11, 39,11
      db  56,11, 74,11, 91,11,109,11,126,11,143,11,160,11,177,11
      db 194,11
   $end Asm

Return

На входе данные в Single, на выходе Integer.
Результат является домноженным на 10000.
Либо использовать как есть целочисленное, либо соответствующим образом изменить формулы с поправкой на множитель.
Если результат выходит за границы Integer, то выдаёт ноль (признак ошибки).
Расхождение с gnumeric в сотых долях процента. Вырастает до десятых при переходе функции через ноль.
Размер процедуры по бинарнику ~500 байт
Игрался с безтабличными методами - проиграл.
Если диапазон входного значения достаточно узкий (например от 2 до 8), то точность можно увеличить.

Графики абсолютных погрешностей

Если применить более сложный метод, то ожидаемые погрешности умеьшатся на порядки. В районе пересечения нуля относительная погрешность до ~7E-5 (при росте входного значения ошибка уменьшается)

Отредактировано Кот Обормот (Вчера 07:55:15)

+1

101

Терминал симулятора можно как-то перенаправить на вывод в файл? Нельзя (но тикет я закинул). А то там только последние ~500 строк держит. Решение

Отредактировано Кот Обормот (2026-03-02 19:24:33)

0

102

Обзор от ИИ
Для создания виртуальных COM-портов в Windows с возможностью логирования (сохранения) данных в файл используются эмуляторы, такие как
Eltima Virtual Serial Port Driver, SerialTool или TCP/COM-port splitter. Они создают пару портов (например, COM1-COM2), где данные, отправленные в один порт, можно прочитать и сохранить из другого, используя монитор порта.
Популярные решения:

    SerialTool: Позволяет создавать виртуальные порты и обеспечивает удобный интерфейс для отправки/получения данных и сохранения их в файл.
    Eltima Virtual Serial Port Driver: Надежный инструмент для создания пар виртуальных COM-портов.
    COM Port Data Emulator: Позволяет генерировать поток данных и тестировать COM-порты.

Как использовать:

    Создание: Установите программу (например, Eltima VSPD) и создайте пару виртуальных портов.
    Настройка: В вашей программе, которая работает с COM-портом, выберите один из созданных портов (например, COM1).
    Логирование: В эмуляторе (например, SerialTool) откройте второй порт (COM2) и включите функцию логирования/записи данных в файл.

Для перенаправления данных также можно использовать сетевые утилиты, превращающие COM-трафик в сетевой.

Из личного: Очень давно что-то подобное делал, но названия софта уже не помню.
А Симуляторами я не пользуюсь...

Отредактировано Александр Д. (Вчера 08:37:26)

0