AFON // радиотехник affonya@mail.ru
← Проекты на PIC

Проект 19. Точная задержка на таймере TMR0

Вместо пустых циклов время отсчитывает аппаратный таймер TMR0. Проект вводит предделитель, флаг переполнения и расчёт интервала — базу всех точных задержек.

Задача

Мигать светодиодом с выдержкой, отсчитанной аппаратным таймером.

Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.

Что понадобится

  • PIC16F84A
  • кварц 4 МГц + 2×22 пФ
  • светодиод + резистор 330 Ом
  • резистор 10 кОм

Схема подключения

ВыводПодключение
RB0светодиод через резистор 330 Ом
MCLRчерез 10 кОм на +5 В

Алгоритм

  1. Настроить OPTION_REG: источник — внутренний такт, предделитель 1:256.
  2. Обнулить TMR0 и сбросить флаг T0IF.
  3. Дождаться установки флага — таймер переполнился.
  4. Повторить нужное число раз и переключить светодиод.

Листинг на ассемблере

Код проверен ассемблером и собирается без ошибок. Скачать: p19.asm · p19.hex (готовая прошивка).

;=======================================================
; Проект 19. Точная задержка на таймере TMR0
; PIC16F84A, 4 МГц. Светодиод RB0 мигает с периодом 1 с
; TMR0 с предделителем 1:256 — опрос флага T0IF
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        ovf                     ; счётчик переполнений
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0      ; банк 1
        clrf    TRISB           ; порт B — выходы
        movlw   b'00000111'     ; TMR0 от кварца, предделитель 1:256
        movwf   OPTION_REG
        bcf     STATUS,RP0
        clrf    PORTB

Main
        call    Delay500ms
        movlw   b'00000001'
        xorwf   PORTB,f         ; переключаем светодиод
        goto    Main

;--- 500 мс: 1 переполнение = 256*256 мкс = 65,5 мс ---
;--- нужно примерно 8 переполнений ---
Delay500ms
        movlw   .8
        movwf   ovf
Wait
        bcf     INTCON,T0IF     ; сбрасываем флаг
        clrf    TMR0            ; начинаем счёт с нуля
TWait
        btfss   INTCON,T0IF     ; ждём переполнения
        goto    TWait
        decfsz  ovf,f
        goto    Wait
        return

        END

Пояснения

  • Один цикл переполнения при 4 МГц и предделителе 1:256 занимает 256×256 мкс ≈ 65,5 мс. Восемь переполнений дают около 0,5 с.
  • Предделитель делится между TMR0 и сторожевым таймером — бит PSA в OPTION_REG выбирает, кому он достаётся.
  • Таймер считает независимо от программы, поэтому выдержка не «плывёт» от изменения кода, в отличие от циклов задержки.

Что дальше

Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.