Деструктивное поведение, конечно.
В бизнесе не должно быть друзей/врагов. Если посмотреть на восточных братьев, они для всех рынок.
На западе же себе в ноги стреляют и норм.
BASCOM 8051
Сообщений 91 страница 102 из 102
Поделиться912025-12-17 08:22:05
Поделиться922025-12-17 17:46:45
Я вообще можно сказать внёс бабки (хотя и символические) за лицензию на устаревший продукт, в котором за год ничего не поменялось. Забронзовел Марк. Но упорные товарищи (почёт и уважение от всех пионеров планеты) уже протоптали дорожку, нужно только DAT-файлы строчить и добавлять.
Поделиться932025-12-17 18:25:17
жаль, не добавил Dword и прочее
ну и редактор кривой, много бяк.
Поделиться942026-02-12 22:02:36
64 бит конечно не дождались.
Поделиться952026-02-14 11:42:06
Я что-то не догоняю или это нормально? В 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
Поделиться962026-02-14 11:56:21
не понял, поясните 
Поделиться972026-02-14 12:02:22
Пишем в EAXFR и эти данные отображаются в XRAM. За границами реальной памяти (1024) конечно.
Поделиться982026-02-14 12:13:28
о как. Но то симулятор, а не реально устройство!
Поделиться992026-02-20 19:17:15
Так single в byte не поместится.
Отредактировано Andrusha (2025-11-04 00:36:42)
Если значение в байт гарантированно помещается (пользователь сам это контролирует), то помещаем
Код:$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)
Поделиться1002026-02-23 18:51:50
Да и я в АВР ни разу не применял - задачи не было ))
Один раз понадобился десятичный логарифм: а АВР есть, а в 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)
Поделиться1012026-03-02 14:45:04
Терминал симулятора можно как-то перенаправить на вывод в файл? Нельзя (но тикет я закинул). А то там только последние ~500 строк держит. Решение
Отредактировано Кот Обормот (2026-03-02 19:24:33)
Поделиться102Вчера 08:36:29
Обзор от ИИ
Для создания виртуальных 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)