Задача
Мигать светодиодом с выдержкой, отсчитанной аппаратным таймером.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- светодиод + резистор 330 Ом
- резистор 10 кОм
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0 | светодиод через резистор 330 Ом |
| MCLR | через 10 кОм на +5 В |
Алгоритм
- Настроить
OPTION_REG: источник — внутренний такт, предделитель 1:256. - Обнулить TMR0 и сбросить флаг
T0IF. - Дождаться установки флага — таймер переполнился.
- Повторить нужное число раз и переключить светодиод.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: 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.