Задача
Сохранять показания в энергонезависимую память и просматривать их.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- две кнопки + 2 резистора 10 кОм
- 8 светодиодов + резисторы
Схема подключения
| Вывод | Подключение |
|---|---|
| RA0 | кнопка «записать», подтяжка 10 кОм |
| RA1 | кнопка «пролистать», подтяжка 10 кОм |
| RB0…RB7 | индикация значения |
Алгоритм
- Положить адрес в
EEADR, данные — вEEDATA. - Разрешить запись битом
WRENи выполнить последовательность 0x55, 0xAA вEECON2. - Установить бит
WRи дождаться его аппаратного сброса. - Для чтения задать адрес и установить бит
RD.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p34.asm · p34.hex (готовая прошивка).
;=======================================================
; Проект 34. Логгер показаний в EEPROM
; PIC16F84A, 4 МГц. Кнопка RA0 — записать значение,
; кнопка RA1 — пролистать записи, вывод на RB0..RB7
;=======================================================
LIST p=16F84A
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
cblock 0x0C
d1, d2, wraddr, rdaddr, value
endc
ORG 0x000
goto Start
Start
bsf STATUS,RP0
clrf TRISB
movlw b'00011111'
movwf TRISA
bcf STATUS,RP0
clrf wraddr
clrf rdaddr
clrf value
Main
incf value,f ; имитация измеряемой величины
movf value,w
movwf PORTB
btfss PORTA,0
call SaveValue
btfss PORTA,1
call ReadNext
call Delay
goto Main
;--- запись текущего значения в EEPROM ---
SaveValue
call Debounce
btfsc PORTA,0
return
movf wraddr,w
bsf STATUS,RP0
movwf EEADR
bcf STATUS,RP0
movf value,w
bsf STATUS,RP0
movwf EEDATA
bsf EECON1,WREN ; разрешаем запись
movlw 0x55 ; обязательная последовательность
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR ; старт записи
WWait
btfsc EECON1,WR ; ждём окончания
goto WWait
bcf EECON1,WREN
bcf STATUS,RP0
incf wraddr,f ; следующая ячейка
movlw .64
subwf wraddr,w
btfsc STATUS,C
clrf wraddr ; по кругу: у 16F84A 64 байта EEPROM
WRel
btfss PORTA,0
goto WRel
return
;--- чтение очередной записи ---
ReadNext
call Debounce
btfsc PORTA,1
return
movf rdaddr,w
bsf STATUS,RP0
movwf EEADR
bsf EECON1,RD ; чтение
bcf STATUS,RP0
bsf STATUS,RP0
movf EEDATA,w
bcf STATUS,RP0
movwf PORTB ; показываем сохранённое значение
incf rdaddr,f
movlw .64
subwf rdaddr,w
btfsc STATUS,C
clrf rdaddr
call DelayLong
RRel
btfss PORTA,1
goto RRel
return
Debounce
movlw .26
movwf d1
DB1 movlw .255
movwf d2
DB2 decfsz d2,f
goto DB2
decfsz d1,f
goto DB1
return
Delay
movlw .150
movwf d1
DA1 movlw .250
movwf d2
DA2 nop
decfsz d2,f
goto DA2
decfsz d1,f
goto DA1
return
DelayLong
call Delay
call Delay
call Delay
return
END
Пояснения
- Последовательность 0x55/0xAA — аппаратная защита от случайной записи при сбое программы; пропустить её нельзя, запись просто не начнётся.
- Одна запись занимает несколько миллисекунд, поэтому дожидаться сброса бита
WRобязательно. - Ресурс EEPROM — около 100 000 циклов на ячейку, поэтому логгер пишет по кругу, распределяя износ по всем 64 байтам.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.