Сб дек 23, 2023 20:37:52
Вс янв 14, 2024 13:31:45
Вс янв 14, 2024 14:28:10
.Dseg
.org 0x100
;До 100H использовать нельзя - там РОН и порты ввода-вывода, отраженные на ОЗУ
;Переменные разной размерности
; byte N
EndCoreDseg: ;Адрес конца сегмента данных в файле UNIT
.CSEG
.org 0x00
; interrupt
; и прочее
;Основной LOOP
;и прочие подпрограммы
EndCoreCSeg: ;Адрес конца кодового сегмента в файле UNIT
;Определение контроллера
.include "m328pdef.inc"
;секция всяких define и org
;#define
.include "unit.inc"
;Сегмент данных MAIN. Продолжаем с адреса конца сегмента UNIT
.Dseg
;Переменные разной размерности
; byte N
.org EndCoreDseg
;Сегмент кода MAIN. Продолжаем с адреса конца сегмента UNIT
.CSEG
.org EndCoreCSeg
;код
Вс янв 14, 2024 15:55:14
Вс янв 14, 2024 18:21:01
Вт янв 16, 2024 10:34:14
Вт янв 16, 2024 12:47:06
Вт янв 16, 2024 17:05:35
Вт янв 16, 2024 21:53:01
Ср янв 17, 2024 09:43:18
Ср янв 17, 2024 20:17:55
Чт янв 18, 2024 04:33:05
.equ Fo=3276909*3 ;300'000'033...300'000'003!!!!!!
.
.
.
LDI YH,HIGH((200-25)*Fo/1000/300-1) LDI YL,LOW((200-25)*Fo/1000/300-1); включить за 25мс до окончания 200мс периода
Чт янв 18, 2024 08:00:15
Чт янв 18, 2024 08:32:13
вот в этом месте:КРАМ писал(а):Я в каком то месте говорил про неиспользование памяти?
и у меня встречный вопрос - зачем, по-твоему, константам выделять память? константа она и потому константа, что ей не нужно выделение памяти.КРАМ писал(а):Неудобство состоит в том, что с помощью .equ вы не выделяете память, а просто подставляете число.
Чт янв 18, 2024 16:19:42
Чт янв 18, 2024 16:47:37
Чт янв 18, 2024 17:05:44
Чт янв 18, 2024 17:12:59
;
; "def_ext_disp.txt" файл объявленных имен, бит и констант
;
;----------
; variable definitions
;(таблица обьявленных имен)
;_____
;таблица обьявленных имен - пользовательские константы
;
.equ ts_ssl = 40 ; (1,50) константа интервала смены значения атрибута (0,8S)
; для теста в дебаггере =1
.equ dp_pgk = 190 ; константа предгашения (OCR1A)
.equ dp_rastr = 4000 ; константа интервала развертки кадра (ICR1)
.equ dp_maxj = 3990 ; максимальный уровень яркости ШИМ (OCR1B)
.equ dp_minj = 200 ; минимальный уровень яркости ШИМ (OCR1B)
.equ dp_lenbuf = 4 ; для сегментного порта 4 для регистрового файла 8
.equ t_mk_lenpak = 8 ; количество байт в пакете
; 4 сегментный код, 2 код яркости, 1 атрибут информации, 1=CRC
.equ dp_mask = 0b11110111 ; начальная позиция активного анода в строке
.equ dp_maoff = 0b01111000 ; маска отключения всех анодов
.equ dp_seg_port = PORTB ; переименование порта вывода сегментов
.equ dp_anod_port = PORTD ; переименование порта вывода анодов
; .equ dp_reg_port = PORTD ; переименование порта управляющих линий регфайла
.equ t_mk_port = PORTD ; переименование порта линий межблочного обмена
.equ dp_AN3 = 6 ; старшая (крайняя правая) позиция дисплея
.equ dp_AN2 = 5
.equ dp_AN1 = 4
.equ dp_AN0 = 3 ; младшая (крайняя левая) позиция дисплея
.equ t_mk_RxD = 0 ; линия входящих данных программного приемника (PORTD.0 ввод)
.equ t_mk_Txd = 1 ; линия квитирования программного приемника (PORTD.1 вывод)
; .equ dp_DS0 = n ; линия данных регфайла 0
; .equ dp_DS1 = n ; линия данных регфайла 1
; .equ dp_DS2 = n ; линия данных регфайла 2
; .equ dp_DS3 = n ; линия данных регфайла 3
; .equ dp_DS4 = n ; линия данных регфайла 4
; .equ dp_DS5 = n ; линия данных регфайла 5
; .equ dp_DS6 = n ; линия данных регфайла 6
; .equ dp_DS7 = n ; линия данных регфайла 7
; .equ dp_SH_CP = n ; общая линия строба сопровождения блока регфайлов
; .equ dp_MR = n ; общая линия строба сброса блока регфайлов
; .equ dp_ST_CP = n ; общая линия строба записи в защелку блока регфайлов
.equ s_A = 0 ; номер сегмента A в знакогенераторе
.equ s_B = 1 ; номер сегмента B в знакогенераторе
.equ s_C = 2 ; номер сегмента C в знакогенераторе
.equ s_D = 3 ; номер сегмента D в знакогенераторе
.equ s_E = 4 ; номер сегмента E в знакогенераторе
.equ s_F = 5 ; номер сегмента F в знакогенераторе
.equ s_G = 6 ; номер сегмента G в знакогенераторе
.equ s_H = 7 ; номер сегмента H в знакогенераторе
;
;_____
;таблица обьявленных имен - секция флагов пользователя
;
.equ dp_exch = 0 ; флаг готовности новых данных в rdbf и rabf
.equ dp_s_end = 1 ; передаточный флаг "строка окончена"
.equ dp_darks = 2 ; флаг "интервал на темной стороне"
.equ netpak = 3 ; флаг "прием пакета" для обхода заголовочной части
; участка обработчика байт приемника Т_МК
.equ netdbu = 4 ; оперативный буфер приема занят
.equ er_crc = 5 ; флаг "ошибка CRC"
;_____
;таблица обьявленных имен - переназначение регистров РОН
;
; принята базовая модель:
; область ограниченного функционала
.def mfr0 = r0 ; математика и обмен с ПЗУ/самопрограммирование
.def mfr1 = r1 ; математика и обмен с ПЗУ/самопрограммирование
.def dp_flags = r2 ; системные флаги (ограниченный функционал)
.def how_sreg_d = r3 ; быстрый стек для SREG для irq дисплея
.def how_sreg_n = r4 ; быстрый стек для SREG для irq USART
; .def ifr1=r5 ; системные индексы (ограниченный функционал)
; .def cfr0=r6 ; системные счетчики (ограниченный функционал)
; .def cfr0=r7 ; системные счетчики (ограниченный функционал)
.def dp_xbuf = r8 ; оперативный буфер сегментов (байтовый режим)
.def dp_masbu = r9 ; маска текущего активного анода
.def dp_idx = r10 ; смещение в строке (номер кадра)
.def dp_cntk = r11 ; счетчик кадров в строке
.def dp_ftmpl = r12 ; быстрый стек (для r16/tmp0)
.def dp_ftmph = r13 ; быстрый стек (для r17/tmp1)
.def dp_ftmxl = r14 ; быстрый стек для Xl
.def dp_ftmxh = r15 ; быстрый стек для Xh
; область полного функционала
.def tmp0 = r16 ; рабочий регистр (полный функционал)
.def tmp1 = r17 ; рабочий регистр (полный функционал)
.def ts_cntss = r18 ; счетчик строк на шаг смены атрибута (полный функционал)
.def tmp3 = r19 ; рабочий регистр (полный функционал)
.def cntb = r20 ; рабочий регистр (полный функционал)
.def cntw=r21 ; рабочий регистр (полный функционал)
; .def wfr6=r22 ; рабочий регистр (полный функционал)
; .def wfr7=r23 ; рабочий регистр (полный функционал)
.def bfr0 = r24 ; базовый регистр (полный функционал)
.def bfr1 = r25 ; базовый регистр (полный функционал)
; Xl = r26 ; адрес сегмента Х (полный функционал)
; Xh = r27 ; адрес сегмента Х (полный функционал)
; Yl = r28 ; адрес сегмента Y (полный функционал)
; Yh = r29 ; адрес сегмента Y (полный функционал)
; Zl = r30 ; адрес сегмента Z (полный функционал) ПЗУ/самопрограммирование
; Zh = r31 ; адрес сегмента Z (полный функционал) ПЗУ/самопрограммирование
; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд
; изменение их имени хотя и возможно, но нежелательно -
; возникает путаница с интегрированной абревиатурой системы команд
; в случае с "малой моделью" допускающей/достаточной для размещения ВСЕХ
; используемых ВСЕМИ подпрограммами регистров в области СОЗУ регистрового
; файла одновременно (без "подкачки" наборов параметров через ОЗУ)
; рекомендовано переназначение индивидуальных имен регистров
; согласно текущей задачи
;_____
;таблица обьявленных имен - секция определенных данных (ОЗУ)
;
.dseg
dp_datbuf: .byte dp_lenbuf ; буфер отображения: данные (4 позиции)
; младшая позиция в ячейке dp_datbuf, старшая в dp_datbuf+3
dp_atrbuf: .byte (dp_lenbuf*2) ; буфер отображения: задатчик ШИМ по каждой позиции
dp_rdbf: .byte dp_lenbuf ; буфер предобработки данных
dp_rabf: .byte (dp_lenbuf*2) ; буфер предобработки задатчика ШИМ
dp_shaps: .byte 3 ; значения для dp_cntk, dp_masbu и dp_idx по запуску строки
dp_cnts: .byte 1 ; счетчик строк на сдвиг (беглая строка)
dp_cntb: .byte 1 ; счетчик бит в байте модуля вывода
; в файл-расширитель горизонтальной координаты
dp_cntwf: .byte 1 ; счетчик байт модуля вывода
; в файл-расширитель горизонтальной координаты
net_fsr: .byte 2 ; указатель адреса в буфере предобработки
; для pakus
net_cnt: .byte 1 ; счетчик байт пакета для pakus
net_buf: .byte 8 ; оперативный буфер приема
;
;_____
;таблица обьявленных имен - секция определенных данных (EEPROM)
;
.eseg
;_____
Чт янв 18, 2024 17:26:43
я не кладу болт на распределение памяти - тот пример, который я написал, и есть мой контроль за памятью. обращаясь к памяти по созданным именам я никогда не выйду за пределы имеющейся памяти.КРАМ писал(а):Более-менее серьезный проект требует контроля за памятью
Чт янв 18, 2024 17:36:58