Симуляция работы встроенного таймера в пошаговом режиме - Assembler
Формулировка задачи:
здравствуйте
Встроенный таймер Т/С0 начинает работать после установки флага TCON4
и затем можно передать управление другой программе, а он будет продолжать работать сам, пока не достигнет состояния переполнения и выработает прерывание, по адресу 013Н. (если я правильно понял из описания процессора) И тогда выполняемая в тот момент программа Main сама остановится, запомнит счетчик команд, и передаст управление программе обработки прерывания Timer10ms, и когда она выполнится, то передаст управление обратно в программу Main.
Я пробовал разные варианты -
1.с выходом из программы после включения счетчика
2.с организацией бесконечного цикла после включения счетчика и далее с выходом из программы
Результат - сама главная программа не возвращается, т.к. нет прерывания, просто делает NOP (если бесконечный цикл) или переходит снова в другой цикл счетчика, а когда пробовал во время симуляции вручную записать FFFF в регистр счетчика, чтобы вызвать переполнение, то ничего не происходит,
Вопрос: может ли кто-нибудь выложить тут кусочек кода, который так выполняется (с имитацией прерывания) при ПОШАГОВОМ симуляции?
Timer100mcs: ;start program - make initial timer settings. Timer will be play itself, while interruption will be generated ;------------------------Timer100mcs ---------- setb Timerlongperiod ;setting period flag to 0 go to 9000 period mov P0, #000H ;setting output pin P1.0 to low mov TH0, #058H ;setting timer low register mov TH1, #0FFH ;setting timer high register SETB ET0 ;set interruptiom C/T0 enable SETB EA ;set interruptiom ALL enable SETB TCON.4 ;setting timer on ;jmp $ ;start endless loop ret ;--------------------the end of Timer100mcs-------------
Решение задачи: «Симуляция работы встроенного таймера в пошаговом режиме»
textual
Листинг программы
;THIS PROGRAM created for make pulses with dutyncycle 1:10 and period 10ms. ;iT CONSIST OF 3 modules: timer10ms, timer100mcs, timer9000mcs ;Logic: the main is for processing interruption from T/C0 counter, it check flag Timelongperiod, if ; it high, start long period, if not high, start short period. The flag sets at appropriate module. ;----------------------settings section .MOD51 ;--------------------------info section---------------------------- ;allocation name size ; bit BIT 000H-0FFH ; data DATA 000H-07FH ; bdata BDATA 020H-02FH ; idata IDATA 000H-07FH ; sfrs SFRS 080H-0FFH ; xdata XDATA 000H-0FFFFH(000H-00FFFFFH*) ; code CODE 000H-0FFFFH(000H-0FFFFFFH*) ; ; relocatable_segmenLname SEGMENT segmenLtype [relocation_type] ; uni_DATA .SEGMENT DATA ; .RSEG Имя_сегмента [,allocation ] ;-------------------the end of info section ---------------------- ;.public Timerlongperiod ;label external .rseg Bts,bit Timerlongperiod .DST ;[expression] ;битовое значение when it 1 enable long period when it 0 - enable short period .public Timerlongperiod ;label external .ENDSEG ;ends of data section .RSEG uni_DATA,data ;start of data section .ENDSEG ;ends of data section ;-------------------------------------------- .ASEG uni_CODE10,code ;start of code section .EXTRN ( code) Sttngs1, Intrptupdtoutreg , Intrptadc , Cntrmpxadr , Main, Timer9000mcs, Timer100mcs,Timer10ms .ORG 00H JMP Init .ORG 0BH ;interruption from C/t0 keep here jmp Timer10ms ;jump to program proceeding interruptions from ;.ORG 13H ;interruption from INT1 ;clr EA ;clear tag all interruptions enable ;jmp (program interruption proceeding) .ORG 030H ;START initial settings Init: accum .SET Acc ;set symbol name "accum" ;-----------------------end cycle flag Load: call Timer100mcs Load1: nop nop nop Load2: nop nop nop nop Load3: nop nop nop nop nop jmp Load1 ;go to endless loop .ENDSEG ;ends of code section .END ;директива окончания трансляции
Объяснение кода листинга программы
Код написан на ассемблере и состоит из трех модулей: таймера 10 мс, таймера 100 мкс и таймера 9000 мкс. Логика работы следующая: основной модуль обрабатывает прерывания от таймера 0/С, проверяет флаг Timelongperiod
и в зависимости от его состояния запускает длинный или короткий цикл.
Ниже представлен список ключевых элементов кода:
- Название переменной: Timerlongperiod Значение: битовое значение, которое становится 1 для включения длинного периода и 0 для короткого периода.
- Название сегмента: uni_DATA Размер: 8 бит Содержание: данные
- Название сегмента: uni_CODE10 Размер: 16 бит Содержание: код
- Название переменной: accum Значение: используется для хранения значения, полученного от таймера 100 мкс.
- Название процедуры: Timer100mcs Описание: вызывает процедуру таймера 100 мкс.
- Название процедуры: Timer10ms Описание: вызывает процедуру таймера 10 мс.
- Название процедуры: Timer9000mcs Описание: вызывает процедуру таймера 9000 мкс.
- Название процедуры: Init Описание: инициализация начальных значений.
- Название процедуры: Load Описание: загрузка значения от таймера 100 мкс.
- Название процедуры: Load1 Описание: переход в бесконечный цикл.
- Название процедуры: Load2-Load3
Описание: заполнение циклами инструкциями
nop
. - Название процедуры: jmp Описание: переход к следующей процедуре.
- Название процедуры: call Описание: вызывает процедуру и возвращает управление обратно.
- Название процедуры: clr EA Описание: очистка тега, разрешение всех прерываний.
- Название процедуры: nop
Описание: инструкция
no operation
, используется для заполнения цикла. - Название процедуры: .SET
Описание: установка значения символа
accum
. - Название процедуры: .ORG Описание: установка адреса начала сегмента.
- Название процедуры: .ENDSEG Описание: завершение сегмента данных.
- Название процедуры: .END Описание: директива окончания трансляции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д