Симуляция работы встроенного таймера в пошаговом режиме - Assembler

Узнай цену своей работы

Формулировка задачи:

здравствуйте Встроенный таймер Т/С0 начинает работать после установки флага TCON4
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-------------
и затем можно передать управление другой программе, а он будет продолжать работать сам, пока не достигнет состояния переполнения и выработает прерывание, по адресу 013Н. (если я правильно понял из описания процессора) И тогда выполняемая в тот момент программа Main сама остановится, запомнит счетчик команд, и передаст управление программе обработки прерывания Timer10ms, и когда она выполнится, то передаст управление обратно в программу Main. Я пробовал разные варианты - 1.с выходом из программы после включения счетчика 2.с организацией бесконечного цикла после включения счетчика и далее с выходом из программы Результат - сама главная программа не возвращается, т.к. нет прерывания, просто делает NOP (если бесконечный цикл) или переходит снова в другой цикл счетчика, а когда пробовал во время симуляции вручную записать FFFF в регистр счетчика, чтобы вызвать переполнение, то ничего не происходит, Вопрос: может ли кто-нибудь выложить тут кусочек кода, который так выполняется (с имитацией прерывания) при ПОШАГОВОМ симуляции?

Решение задачи: «Симуляция работы встроенного таймера в пошаговом режиме»

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 и в зависимости от его состояния запускает длинный или короткий цикл. Ниже представлен список ключевых элементов кода:

  1. Название переменной: Timerlongperiod Значение: битовое значение, которое становится 1 для включения длинного периода и 0 для короткого периода.
  2. Название сегмента: uni_DATA Размер: 8 бит Содержание: данные
  3. Название сегмента: uni_CODE10 Размер: 16 бит Содержание: код
  4. Название переменной: accum Значение: используется для хранения значения, полученного от таймера 100 мкс.
  5. Название процедуры: Timer100mcs Описание: вызывает процедуру таймера 100 мкс.
  6. Название процедуры: Timer10ms Описание: вызывает процедуру таймера 10 мс.
  7. Название процедуры: Timer9000mcs Описание: вызывает процедуру таймера 9000 мкс.
  8. Название процедуры: Init Описание: инициализация начальных значений.
  9. Название процедуры: Load Описание: загрузка значения от таймера 100 мкс.
  10. Название процедуры: Load1 Описание: переход в бесконечный цикл.
  11. Название процедуры: Load2-Load3 Описание: заполнение циклами инструкциями nop.
  12. Название процедуры: jmp Описание: переход к следующей процедуре.
  13. Название процедуры: call Описание: вызывает процедуру и возвращает управление обратно.
  14. Название процедуры: clr EA Описание: очистка тега, разрешение всех прерываний.
  15. Название процедуры: nop Описание: инструкция no operation, используется для заполнения цикла.
  16. Название процедуры: .SET Описание: установка значения символа accum.
  17. Название процедуры: .ORG Описание: установка адреса начала сегмента.
  18. Название процедуры: .ENDSEG Описание: завершение сегмента данных.
  19. Название процедуры: .END Описание: директива окончания трансляции.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы