КР1816ВЕ35, К1816ВЕ48 и внедрение

8-битные микроконтроллеры и микропроцессоры от Intel и их клоны, а также компьютеры на них построенные

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24636
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: КР1816ВЕ35, К1816ВЕ48 и внедрение

Post by Shaos »

Уменьшил гигантскую картинку дисковода в начале предыдущей страницы...
User avatar
askfind
Devil
Posts: 866
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

Re: КР1816ВЕ35, К1816ВЕ48 и внедрение

Post by askfind »

Активный фильтры на операционных для модема

В архиве обнаружил аналоговую плату ретро-проекта модема V23.

Прямой канал передачи данных 1200 бит/сек и обратный канал передачи данных 75 бит/сек.
Необходимо было разработать фильтры высоких порядкой, чтобы уметь по телефонной линии обеспечить дуплексный режим работы.

Это была первый проект (в 1992 году) по созданию аналоговых фильтров для модема.

Спаяю и исследую характеристики из будущего в прошлом, когда на многие вопросы трудно было найти ответы и решения.
You do not have the required permissions to view the files attached to this post.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
askfind
Devil
Posts: 866
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

Re: КР1816ВЕ35, К1816ВЕ48 и внедрение

Post by askfind »

В проекте разработки модема стандарта V.23 была задача создания фильтров для прямого канала обмена данными 1200 бит/сек и обратного канала 75 бит/сек.

Для частотной модуляции FSK необходимо было разделить каналы.

Одно из требований к активному фильтру было его настройка фильтра 8-порядка при производстве. Обычные резисторы использовалсь как подстроечные. Напильником стачивался слой графита, и после этой операции, покрывался лаком. Необходимо было внедрить методику настройки с использованием измерителя фазы сигналов на входе и выходе фильтров 2-порядка.

Ддя создания полосового активного фильтра была настольной книга:
Мошиц Г., Хорн П.
Проектирование активных фильтров: Пер. с англ.— М.: Мир, 1984. — 320 с, ил.

Книга специалистов из Швейцарии представляет собой справочное пособие по методам практического проектирования и настройки активных фильтров, находящих широкое применение в современной радиоаппаратуре Для выбора параметров фильтров предусмотрено использование разнообразных вычислительных устройств — от программируемых карманных калькуляторов до мини-ЭВМ с программированием на языках Фортран или Бейсик. Приведены соответствующие программы. Для разработчиков, радиолюбителей, аспирантов и студентов соответствующих специальностей вузов.

Редакция литературы по новой технике
Copyright 1981 by John Wiley & Sons, Inc. All rights reserved. Autorized translation from English language edition published by John Wiley & Sons, Inc.
© Перевод на русский язык с дополнением, «Мир», 1984
В книге была распечатка на языке Basic расчёта фильтра 2-порядка. Самое важное - рассмотрена методика проектирования фильтров высокопорядка и приведены таблицы различных типов фильтров: Баттеворта-Томсона Чебышева, Бесселя,

Оставалось много вопрос по синтезу электронной схемы фильтра для модема частотно-модулированными сигналами.

Решил вернуться к проекту из 1992 года. Осталась плата аналоговой части модема.

Исследовать в программе моделиования LTSpice характеристики полосовых фильтров.

Список литературы:
1) Знаменский А. Е., Теплюк И. Н., Активные RC-фильтры — М.: Связь, 1970. — 280 с, ил.
2) Мошиц Г., Хорн П., Проектирование активных фильтров: Пер. с англ.— М.: Мир, 1984. — 320 с, ил.
3) Яшкардин В., Bell 202. Спецификация интерфейса для передачи двоичных данных методом частотной манипуляции FSK. - http://softelectro.ru/bell202.html
4) ГОСТ 20855-83 (1983г.), Издатель: СССР. Государственный комитет по стандартам.
Название:Устройства преобразования сигналов аппаратуры передачи данных для коммутируемых и некоммутируемых каналов тональной частоты
You do not have the required permissions to view the files attached to this post.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
dk1spb
Novelist
Posts: 41
Joined: 13 Jan 2016 11:07

Re: КР1816ВЕ35, К1816ВЕ48 и внедрение

Post by dk1spb »

askfind wrote: 14 Nov 2024 03:02 С дисков 720 КБайт CP/M 2.2 частично удаётся прочитать дорожки. Вот и необходимо убедиться, что дисковод исправен.
А зачем?
Не проще сразу прочитать на заведомо исправном дисководе?
Если что - обращайтесь.
User avatar
askfind
Devil
Posts: 866
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

Re: КР1816ВЕ35, К1816ВЕ48 и внедрение

Post by askfind »

ИИ (AI) пишет программный код для ретро микроконтроллеров в CP/M-80

Девиз простой: “Мы отдыхаем - компьютер работает!” (C)

Двадцать лет назад замахивался на создание робота-программиста https://www.islife.ru/post/pub00062

Пару недель исследую применение ИИ чатов для создания программных проектов. В помощники призвал deepseek.com

За два вечера удалось создать полностью работающее приложение на языке программирования С++. Arduino проект размером 2629 строк!

Конечно же, хотелось дать задание на чистом ассемблере в операционной системе CP/M-80. Получить радость и "ощупывание" наступившего будущего программиста микроконтроллеров.

Чат с AI:
Напиши мне программу для ассемблера AVOCET SYSTEMS 8048 CROSS-ASSEMBLER, VERSION 1.64, операционная система CP/M-80.

- Микроконтроллер i8035
- Чтение матричной клавиатуры 4x4, вывод на 7-сегментные индикаторы
- Сложение чисел с плавающей точкой: c = a + b
было несколько попытокю AI использовал в метках символ подчёркивания '_' . Ретро компилятор не смог понять 'CALL LABEL_01' . Пришлось разобраться и предложить в чате исправить все метки.

Для компиляции запуска компиляра XASM48.COM использовал эмулятор 'cpm' - https://github.com/jhallen/cpm.git
$ cpm --help
cpm [options] [CP/M command]

Options:

--help Show this help
--nobdos Do not emulate BDOS: only emulate BIOS
Real disk images will be used.
--trace_bdos Trace BDOS calls
Компиляция:

```
>$ cpm XASM48 EDU_AI.ASM

VOCET SYSTEMS 8048 CROSS-ASSEMBLER, VERSION 1.64

END STATEMENT MISSING

LAST ADDRESS USED IN THIS ASSEMBLY IS: 0163
NEXT SYMBOL ADDRESS IS: 334E
*****180 LINES CONTAINED ERRORS *****


8048 ASSEMBLY COMPLETE
```

Ошибки есть. Нужно потрениовать AI, чтобы справился без ошибок.

Кстати, необходимо использовать кодироваку KOI-8.

bash script:

Code: Select all

#!/bin/bash

# Проверяем наличие аргументов
if [[ "$#" -ne 2 ]]; then
    echo "Использование: $0 input_file output_file"
    exit 1
fi

INPUT_FILE="$1"
OUTPUT_FILE="$2"

# Конвертируем файл из UTF-8 в KOI-7
#iconv -f UTF-8 -t KOI-7 "$INPUT_FILE" > "$OUTPUT_FILE"
#iconv -f UTF-8 -t CP866//IGNORE "$INPUT_FILE" > "$OUTPUT_FILE"
iconv -f UTF-8 -t KOI-8//IGNORE "$INPUT_FILE" > "$OUTPUT_FILE"

echo "Файл успешно преобразован."

Code: Select all

; Программа для i8035
; Чтение матричной клавиатуры 4x4, вывод на 7-сегментные индикаторы
; Сложение чисел с плавающей точкой: c = a + b

; Регистры и порты
PORT1   EQU 01H     ; Порт 1 для строк клавиатуры и индикаторов
PORT2   EQU 02H     ; Порт 2 для столбцов клавиатуры
BUS     EQU 00H     ; Шина для 7-сегментных индикаторов
TEMP    EQU 08H     ; Временный регистр
KEYCODE EQU 09H     ; Код нажатой клавиши
DIGIT1  EQU 0AH     ; Первая цифра для отображения
DIGIT2  EQU 0BH     ; Вторая цифра для отображения

; Память данных для чисел с плавающей точкой
ASIGN   EQU 20H     ; Знак числа a
AEXP    EQU 21H     ; Экспонента числа a
AMANTH  EQU 22H     ; Старший байт мантиссы a
AMANTL  EQU 23H     ; Младший байт мантиссы a

BSIGN   EQU 24H     ; Знак числа b
BEXP    EQU 25H     ; Экспонента числа b
BMANTH  EQU 26H     ; Старший байт мантиссы b
BMANTL  EQU 27H     ; Младший байт мантиссы b

CSIGN   EQU 28H     ; Знак результата c
CEXP    EQU 29H     ; Экспонента результата c
CMANTH  EQU 2AH     ; Старший байт мантиссы c
CMANTL  EQU 2BH     ; Младший байт мантиссы c

; Константы
MASKH   EQU 0F0H    ; Маска для старшего полубайта
MASKL   EQU 0FH     ; Маска для младшего полубайта

        ORG 0000H   ; Начало программы

START:
        MOV SP, #60H ; Инициализация указателя стека

        ; Инициализация переменных
        CALL INITVARS

MAINLOOP:
        ; Чтение клавиатуры
        CALL READKEYBOARD
        MOV A, KEYCODE
        JZ NOKEY     ; Если ключ = 0, клавиша не нажата

        ; Преобразование кода клавиши в две шестнадцатеричные цифры
        CALL KEYTOHEX

        ; Отображение цифр на индикаторах
        CALL DISPLAYDIGITS

NOKEY:
        ; Выполнение сложения чисел с плавающей точкой
        CALL FLOATADD

        ; Задержка для антидребезга
        CALL DELAY

        JMP MAINLOOP

; Инициализация переменных
INITVARS:
        ; Инициализация числа a (пример: 2.5)
        MOV A, #00H   ; Положительное число
        MOV ASIGN, A
        MOV A, #82H   ; Экспонента для 2.5
        MOV AEXP, A
        MOV A, #20H   ; Мантисса 2.5
        MOV AMANTH, A
        MOV A, #00H
        MOV AMANTL, A

        ; Инициализация числа b (пример: 1.25)
        MOV A, #00H   ; Положительное число
        MOV BSIGN, A
        MOV A, #81H   ; Экспонента для 1.25
        MOV BEXP, A
        MOV A, #0A0H  ; Мантисса 1.25
        MOV BMANTH, A
        MOV A, #00H
        MOV BMANTL, A

        RET

; Чтение матричной клавиатуры 4x4
READKEYBOARD:
        MOV KEYCODE, #0 ; Сброс кода клавиши
        MOV R0, #4      ; Счетчик столбцов

        ; Цикл по столбцам
COLLOOP:
        ; Сброс всех столбцов
        MOV A, #0FFH
        OUTL P2, A      ; Используем OUTL для порта 2

        ; Активация текущего столбца
        MOV A, R0
        DEC A
        ORL A, #0F0H    ; Сохраняем строки в 1
        OUTL P2, A      ; Активируем текущий столбец

        ; Чтение строк с порта 1
        IN A, P1
        ANL A, #0FH     ; Маска для строк

        ; Проверка нажатых клавиш в текущем столбце
        MOV R1, #4      ; Счетчик строк
ROWLOOP:
        RRC A           ; Проверка бита строки
        JNC KEYFOUND    ; Если бит = 0, клавиша нажата

        ; Переход к следующей строке
        INC KEYCODE
        DJNZ R1, ROWLOOP

        ; Следующий столбец
        DJNZ R0, COLLOOP
        RET

KEYFOUND:
        ; Код клавиши уже в KEYCODE
        RET

; Преобразование кода клавиши (0-15) в две шестнадцатеричные цифры
KEYTOHEX:
        MOV A, KEYCODE
        ANL A, #0FH     ; Только младшие 4 бита

        ; Сохранение для первой цифры
        MOV DIGIT1, A

        ; Для второй цифры используем код + 1 (пример)
        INC A
        ANL A, #0FH
        MOV DIGIT2, A

        RET

; Отображение двух цифр на 7-сегментных индикаторах
DISPLAYDIGITS:
        ; Отображение первой цифры
        MOV A, DIGIT1
        CALL HEXTO7SEG
        OUTL BUS, A     ; Вывод на шину индикаторов
        MOV A, #01H     ; Выбор индикатора 1
        OUTL P1, A      ; Активация через порт 1
        CALL DELAYSHORT

        ; Отображение второй цифры
        MOV A, DIGIT2
        CALL HEXTO7SEG
        OUTL BUS, A     ; Вывод на шину индикаторов
        MOV A, #02H     ; Выбор индикатора 2
        OUTL P1, A      ; Активация через порт 1
        CALL DELAYSHORT

        RET

; Преобразование шестнадцатеричной цифры (0-F) в 7-сегментный код
HEXTO7SEG:
        INC A           ; Увеличиваем для корректного смещения
        MOVP A, @A      ; Чтение из таблицы по адресу (PC+A)
        RET

        ; Таблица кодов 7-сегментного индикатора
        DB 3FH         ; 0
        DB 06H         ; 1
        DB 5BH         ; 2
        DB 4FH         ; 3
        DB 66H         ; 4
        DB 6DH         ; 5
        DB 7DH         ; 6
        DB 07H         ; 7
        DB 7FH         ; 8
        DB 6FH         ; 9
        DB 77H         ; A
        DB 7CH         ; B
        DB 39H         ; C
        DB 5EH         ; D
        DB 79H         ; E
        DB 71H         ; F

; Сложение чисел с плавающей точкой: c = a + b
FLOATADD:
        ; Проверка на ноль числа a
        MOV A, AEXP
        JZ AZERO

        ; Проверка на ноль числа b
        MOV A, BEXP
        JZ BZERO

        ; Выравнивание экспонент
        CALL ALIGNEXP

        ; Сложение мантисс с учетом знаков
        CALL ADDMANTIS

        ; Нормализация результата
        CALL NORMALIZE

        RET

AZERO:
        ; Если a = 0, результат = b
        MOV A, BSIGN
        MOV CSIGN, A
        MOV A, BEXP
        MOV CEXP, A
        MOV A, BMANTH
        MOV CMANTH, A
        MOV A, BMANTL
        MOV CMANTL, A
        RET

BZERO:
        ; Если b = 0, результат = a
        MOV A, ASIGN
        MOV CSIGN, A
        MOV A, AEXP
        MOV CEXP, A
        MOV A, AMANTH
        MOV CMANTH, A
        MOV A, AMANTL
        MOV CMANTL, A
        RET

; Выравнивание экспонент
ALIGNEXP:
        MOV A, AEXP
        CLR C
        SUBB A, BEXP
        JZ EXPEQUAL     ; Экспоненты уже равны
        JC BGREATER     ; Экспонента b больше

        ; Экспонента a больше, сдвигаем мантиссу b
        MOV R0, A       ; Разница экспонент
SHIFTB:
        MOV A, BMANTH
        RRC A           ; Сдвиг вправо через перенос
        MOV BMANTH, A
        MOV A, BMANTL
        RRC A
        MOV BMANTL, A
        DJNZ R0, SHIFTB

        ; Установка экспоненты b равной a
        MOV A, AEXP
        MOV BEXP, A
        RET

BGREATER:
        ; Экспонента b больше, сдвигаем мантиссу a
        CPL A
        INC A           ; Получаем положительную разницу
        MOV R0, A
SHIFTA:
        MOV A, AMANTH
        RRC A           ; Сдвиг вправо через перенос
        MOV AMANTH, A
        MOV A, AMANTL
        RRC A
        MOV AMANTL, A
        DJNZ R0, SHIFTA

        ; Установка экспоненты a равной b
        MOV A, BEXP
        MOV AEXP, A

EXPEQUAL:
        RET

; Сложение мантисс
ADDMANTIS:
        MOV A, ASIGN
        XRL A, BSIGN
        JZ SAMESIGN     ; Знаки одинаковые

        ; Знаки разные, выполняем вычитание
        CALL SUBMANTIS
        RET

SAMESIGN:
        ; Знаки одинаковые, выполняем сложение
        MOV A, AMANTL
        ADD A, BMANTL
        MOV CMANTL, A

        MOV A, AMANTH
        ADDC A, BMANTH
        MOV CMANTH, A

        ; Проверка на переполнение
        JNC NOOVERFLOW

        ; Сдвиг вправо и увеличение экспоненты
        MOV A, CMANTH
        RRC A
        MOV CMANTH, A
        MOV A, CMANTL
        RRC A
        MOV CMANTL, A

        MOV A, AEXP
        INC A
        MOV CEXP, A

NOOVERFLOW:
        MOV A, ASIGN
        MOV CSIGN, A
        RET

; Вычитание мантисс (когда знаки разные)
SUBMANTIS:
        ; Сравнение мантисс
        MOV A, AMANTH
        CLR C
        SUBB A, BMANTH
        JC BGMANT

        ; Мантисса a больше или равна
        MOV A, AMANTL
        CLR C
        SUBB A, BMANTL
        MOV CMANTL, A

        MOV A, AMANTH
        SUBB A, BMANTH
        MOV CMANTH, A

        MOV A, ASIGN
        MOV CSIGN, A
        JMP SUBDONE

BGMANT:
        ; Мантисса b больше
        MOV A, BMANTL
        CLR C
        SUBB A, AMANTL
        MOV CMANTL, A

        MOV A, BMANTH
        SUBB A, AMANTH
        MOV CMANTH, A

        MOV A, BSIGN
        MOV CSIGN, A

SUBDONE:
        RET

; Нормализация результата
NORMALIZE:
        MOV A, CMANTH
        JNZ CHECKNORM

        ; Если старший байт мантиссы = 0, результат = 0
        MOV CEXP, #00H
        MOV CSIGN, #00H
        RET

CHECKNORM:
        ANL A, #80H     ; Проверка старшего бита
        JNZ NORMALIZED  ; Уже нормализовано

        ; Сдвиг влево до нормализации
        MOV R0, #0      ; Счетчик сдвигов

NORMLOOP:
        MOV A, CMANTH
        RLC A
        MOV CMANTH, A
        MOV A, CMANTL
        RLC A
        MOV CMANTL, A

        INC R0
        MOV A, CMANTH
        ANL A, #80H
        JZ NORMLOOP     ; Продолжаем пока не нормализуется

        ; Коррекция экспоненты
        MOV A, CEXP
        CLR C
        SUBB A, R0
        MOV CEXP, A

NORMALIZED:
        RET

; Задержка для антидребезга
DELAY:
        MOV R2, #100
DELAYLOOP1:
        MOV R3, #200
DELAYLOOP2:
        DJNZ R3, DELAYLOOP2
        DJNZ R2, DELAYLOOP1
        RET

; Короткая задержка для динамической индикации
DELAYSHORT:
        MOV R4, #50
DELAYSHORTLOOP:
        DJNZ R4, DELAYSHORTLOOP
        RET

        END 
You do not have the required permissions to view the files attached to this post.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)