Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32

[Am186ES] Копировать данные из ячейки памяти в txt файл постоянно с периодом 2 мс

06.09.2022, 16:35. Показов 3440. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.Есть микроконтроллер Am186ES Microcontroller в память по адресу (сегмент и смещение) 9000:0040 постоянно с периодичностью в 2 мс записываются данные с датчиков положения ротора, мне необходимо эти данные считывать постоянно в файл txt, чтобы потом проанализировать .Подскажите пожалуйста код программы на accembler ?С чего начинать?(Я новичок в программировании.).Происходить обработка прерывания IRQ 7 по линии INT 3 и после этого записываются данные в ячейки памяти.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.09.2022, 16:35
Ответы с готовыми решениями:

Как сохранить данные из dataGridView1 в txt файл и открывать данные из txt в программе без удаления имеющихся
1) Помогите пожалуйста. Мне нужно сохранить данные из dataGridView1 в txt файл так, чтобы при нажатии на кнопку сохранить, автоматически...

Копировать консоль в файл txt
Нужно скопировать вывод консоли в файл, я новичек, камнями не кидайтесь как говорится Собственно код: class mealyaut : public...

Как можно копировать себе на сайт, постоянно обновляемые данные с других сайтов, например с Avito
Всем привет! К примеру, мы хотим автоматически копировать только что появившиеся объявления на авито в разделе дома. Объявления должны...

23
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
10.09.2022, 10:04  [ТС]
Студворк — интернет-сервис помощи студентам
AM186_188_UserManual.PDF Документация на микроконтроллер то что есть в сети.У меня есть документация на блок который работает при помощи Fastwell,это документы с инвентарным номером и я не уверен, что могу ее распространять в сети интернет.
0
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
10.09.2022, 10:17  [ТС]
Задание это на производстве в сфере информации дистанционного зондирования земли.Датчики стоят на антенне(поворотном устройстве).И начальник старается нас "модернизировать" кроме, того как мы должны эксплуатировать оборудование мы еще должны уметь программировать и если случаются какие то неисправности с оборудованием то он дает задачу сотруднику для решения вопроса.Так как договора на техподдержку и обслуживание заключаются на какой то срок и не продлеваются.И все остальные поломки решаем сами.Это оборудование было поставлено очень давно и блок перестал правильно работать.В чем причина как раз выясняем.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8675 / 4512 / 1670
Регистрация: 01.02.2015
Сообщений: 13,949
Записей в блоге: 14
10.09.2022, 17:42
По названию CPU188-5MX ищется
https://studizba.com/files/sho... dstvo.html
Правда, речь в документе о плате CPU188-5 v.3, а не CPU188-5MX
но и на ftp
ftp://ftp.prosoft.ru/pub/Hardw... Px/CPC101/
примерно тот же текст, хотя процессор иной
Работа с прерываниями
Контроллер прерываний процессора Am188ES несовместим с контроллером 8259, используемом во всех AT-совместимых компьютерах, поэтому инициализация и обработка прерывания в модуле CPU188-5 v.3 имеет некоторые отличия. Ниже приведены два примера одной и той же программы на языке C, выполняемой в модуле CPU188-5 v.3 и любом процессоре с 8259–совместимом контроллером для прерываний INT[3:0] (или IRQ[7:4] для шины ISA).

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Пример работы с прерываниями
// в модуле CPU188-5
#define Int 3             // от 0 до 3
#define Vector (0xC  + Int)
#define Msk (0x10 << Int)
#define MskRg 0xFF28
#define EOIRg 0xFF22
 
void interrupt Handler(void);
void interrupt (*oldhandler)();
 
main ()
{
    ...
    // Инициализация нового вектора
    oldhandler = getvect(Vector);
    setvect(Vector, Handler);
    _AX=(inport(MskRg)) & ~Msk;
    outportb(MskRg,_AL);
    ...
    // Восстановление старого вектора
    _AX=(inport(MskRg)) | Msk;
    outportb(MskRg,_AL);
    setvect(Vector, oldhandler);
 
}
 
void interrupt Handler()
{
    ...
    // End of interrupt
    _AX=Vector;
    outportb (EOIRg,_AL);
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Пример работы с прерываниями
// в контроллере 8259
#define Int 3             // от 0 до 3
#define Vector (0xC  + Int)
#define Msk (0x10<< Int)
#define MskRg 0x21
#define EOIRg 0x20
 
void interrupt Handler(void);
void interrupt (*oldhandler)();
 
main ()
{
    ...
    // Инициализация нового вектора
    oldhandler = getvect(Vector);
    setvect(Vector, Handler);
    outportb(MskRg,inportb(MskRg) & ~Msk);
    ...
    // Восстановление старого вектора
    outportb (MskRg,inport(MskRg) | Msk);
    setvect(Vector, oldhandler);
}
void interrupt Handler()
{
    ...
    // End of interrupt
    outportb (EOIRg,0x20);
}
Поэтому сомневаюсь, что работа под настоящим MS DOS
И поэтому утверждаю, что проверить в DOSBox невозможно - только на ПЛК.

Попробуйте самостоятельно изучить материалы по программированию в DOS. При всём желании помочь проблематично.

Добавлено через 25 минут
Читаю IRQ7.docx - он содержит какое-то описание алгоритма с привязкой к оборудованию.
У Вас есть этот готовый файл для модификации? Или это начальник в таком виде выдал задание на программирование?

Добавлено через 15 минут
Смотрите - у вас где-то есть программа на "C", которая запускает обработчик IRQ7.
Как она работает - запускаете её и она полностью захватывает управление или она запускает свой резидентный обработчик прерывания и возвращает управление в DOS?

Если возвращает, то можно перехватить прерывание и добавить свои действия после обработки основного обработчика.
А действия будут простыми - считать из ячейки памяти значение и сохранить в буфер. По готовности буфера - перейти на другой буфер, а этот записать в файл.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8675 / 4512 / 1670
Регистрация: 01.02.2015
Сообщений: 13,949
Записей в блоге: 14
11.09.2022, 21:00
Повторюсь - у меня нет возможности проверить программу на Fastwel.

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

Вот пример похожей программы.
Есть системная резидентная программа, которая каждые 55 мс по прерыванию Int 08h изменяет содержимое ячейки памяти 0000:006C (увеличивает на 1).
Раз источник данных позволяет запускать параллельно свою программу, то делаю такую программу для TASM.
Она перехватывает прерывание Int 08h, передаёт управление исходному обработчику прерывания, затем делает собственную обработку данных - сохраняет содержимое ячейки в буфер. А основная программа ожидает заполнения буфера и по готовности записывает его в файл.
Т.к. файловые операции очень длительные и реально работают с минимальными порциями размером с кластер, то и запись происходит не по одному числу, а порциями - размером с буфер.
Т.к. это пример, то показан перехват прерывания таймера. Чтобы не ждать долго, сделал буфер 256 байт и в файл сохранил 4 буфера - т.е. (128*4 отсчётов по 2 байта)*(55 мс на один отсчёт)=28 секунд.

Для ПЛК Fastwel с 2 мс на отсчёт нужно будет увеличить буфер до нескольких кБайт, иначе запись в файл может не успевать освободить буфер.
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
.model small
 
.stack 200h
 
.data
        szFileName              db      "data.dat", 0
        ;номер прерывания, изменяющего значение в ячейке - источнике данных
        IntN                    =       8
        ;размер буфера
        BufSize                 =       256;1 shl 12
        ;количество сохраняемых в файл буферов
        BufferCountMax          =       4
        ;адрес ячейки памяти - источника данных
        SrcSeg                  =       0040h
        SrcOffs                 =       006Ch
.data?
        Buffer1                 db      BufSize dup (?)
        Buffer2                 db      BufSize dup (?)
        BufPos                  dw      ?
        BufferToRead            dw      ?
        BufferMode1             dw      ?
        BufferMode2             dw      ?
        BuffersCount            dw      ?
        hFile                   dw      ?
.code
 
NewIntHandler   proc
        PUBLIC  old_int
        ;вызов исходного прерывания
        pushf
        call    dword ptr cs:[old_int]
        ;обработка результатов исходного прерывания:
        push    ax
        push    si
        push    ds
        mov     ax,     SrcSeg
        mov     ds,     ax
        mov     ax,     ds:[SrcOffs]
        mov     si,     @data
        mov     ds,     si
        ; - если активный буфер для данных готов для чтения, то взять его адрес
        cmp     [BufferToRead], 0
        jnz     @@buffer2
                cmp     [BufferMode1],  'R'
                jne     @@exit
                lea     si,     [Buffer1]
                jmp     @@end_if
        @@buffer2:
                cmp     [BufferMode2],  'R'
                jne     @@exit
                lea     si,     [Buffer2]
        @@end_if:
        ; - для активного готового буфера сохранить в текущую позицию
        ;считанные данные
        add     si,     [BufPos]
        mov     [si],   ax
        ; - если буфер заполнен, то пометить его готовым к записи в файл
        ;и сделать активным другой буфер
        mov     si,     [BufPos]
        add     si,     2
        cmp     si,     BufSize
        jb      @@upd_indx
                xor     si,     si
                cmp     [BufferToRead], 0
                jnz     @@upd_state_buf2
                        mov     [BufferMode1],  'W'
                        mov     [BufferToRead], 1
                        jmp     @@upd_indx
                @@upd_state_buf2:
                        mov     [BufferMode2],  'W'
                        mov     [BufferToRead], 0
        @@upd_indx:
        ; - обновить текущую позицию в буфере
        mov     [BufPos],       si
@@exit:
        pop     ds
        pop     si
        pop     ax
 
        iret
 
old_int dd      0               ; адрес старого обработчика
 
NewIntHandler   endp
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
        ;инициализация переменных:
        mov     [BufferMode1],  'R'     ;буфер 1 готов к записи данных от внешнего источника
        mov     [BufferMode2],  'R'     ;буфер 2 готов к записи данных от внешнего источника
        mov     [BufferToRead], 0       ;активен для записи буфер 1
        mov     [BufPos],       0
        mov     [BuffersCount], 0       ;записано в файл 0 буферов
        ;открытие файла для записи
        mov     ah,     3Ch
        mov     cx,     0       ;FileAttr
        lea     dx,     [szFileName]
        int     21h
        mov     [hFile],        ax
 
        ;установка нового прерывания
        mov     ax,     0
        mov     es,     ax
        mov     ax,     es:[IntN*4]
        mov     word ptr cs:[old_int],  ax
        mov     ax,     es:[IntN*4+2]
        mov     word ptr cs:[old_int+2],ax
        cli
        mov     word ptr es:[IntN*4],   offset NewIntHandler
        mov     word ptr es:[IntN*4+2], cs
        sti
        ;рабочий цикл:
        @@repeat:
                ; - если буфер готов для записи в файл
                cmp     [BufferMode1],  'W'
                jnz     @@test_buffer2
                lea     dx,     [Buffer1]
                mov     ax,     0
                jmp     @@store_buffer_to_file
        @@test_buffer2:
                cmp     [BufferMode2],  'W'
                jnz     @@until
                lea     dx,     [Buffer2]
                mov     ax,     1
        @@store_buffer_to_file:
                ; - то записать его в файл
                push    ax
                mov     ah,     40h
                mov     bx,     [hFile]
                mov     cx,     BufSize
                ;lea    dx,     [Buffer]
                int     21h
                inc     [BuffersCount]
                ; - пометить буфер готовым к приёму данных
                pop     ax
                cmp     ax,     0
                jnz     @@2
                        mov     [BufferMode1],  'R'     ;буфер 1 не готов к записи в файл
                        jmp     @@until
                @@2:
                        mov     [BufferMode2],  'R'     ;буфер 2 не готов к записи в файл
        @@until:
                cmp     [BuffersCount], BufferCountMax
        jb      @@repeat
        ;восстановление исходного прерывания
        push    ds
        lds     dx,     dword ptr cs:[old_int]  ; DS:DX = адрес обработчика
        mov     ax,     0
        mov     es,     ax
        cli
        mov     word ptr es:[IntN*4],    dx
        mov     word ptr es:[IntN*4+2],  ds
        sti
        pop     ds
        ;закрытие файла
        mov     ah,     3Eh
        mov     bx,     [hFile]
        int     21h
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main
Надеюсь, тут понятно.
В конце концов - это производственное задание мотивированному работнику, который соизволил начать чтение литературы и уже получил представление о работе процессора и операционной системы DOS.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.09.2022, 21:00

Копировать файл и сохранить содержимое файла в .txt
Добрый день форумчане. у меня возникла проблема. Мне надо написать программу которая: 1. копирует из определенной папки в указанную папку...

Данные в памяти программы постоянно меняются
Изучаю работу AVR МК. Пока ещё ничего не работает, но заметил, что после того, как программа зальётся в МК она там каким-то образом...

Переписать данные файла input.txt в файл output.txt, отсортировав их:
Переписать данные файла input.txt в файл output.txt, отсортировав их: в алфавитном порядке по фамилии, а затем по возрастанию года рождения...

Записать в выходной файл (txt) данные из исходного (txt)
записать в выходной файл данные из исходного(txt). Данные выходного файла(txt) должны располагаться в следующем порядке: сначала все цифры,...

Переписать данные файла input.txt в файл output.txt, отсортировать их в алфавитном порядке по фамилии
Народ меня тут 11 задач мне нужно их подробно прокомментировать какая строчка что делает(пример первая задача) помогите плиз кому не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru