PIC16F84 фирмы "Microchip" - миниатюрный, но мощный микроконтроллер. Он основан на EEPROM или "FLASH" технологии, позволяющей перепрограммировать его буквально за секунды. Типовое количество циклов перезаписи - около 1000. Из его 18-ти выводов 13 могут использоваться как разряды ввода/вывода общего назначения. Когда они программируются на вывод, то допускают ток "1" до 20мА и ток "0" до 25мА (более чем достаточный для подключения, например, светодиодов). Это позволяет разрабатывать на данном микроконтроллере простые и недорогие электронные устройства и делает его идеальным для желающих изучить принципы работы микроконтроллеров.
Выводы RA* и RB* - это контакты ввода/вывода, связанные с регистрами микроконтроллера PORTA и PORTB соответственно (RA4 также может быть использоваться как вход внутреннего таймера, а RB0 может быть использован как источник прерываний). VDD и VSS - выводы питания (+Uпит и GND соответственно). Серия 16x84 работает в широком диапазоне питающих напряжений, но обычно VSS подключен к 0В, а VDD подключен +5В. Вывод основного сброса /MCLR обычно подключен к VDD (напрямую или через резистор), потому что микроконтроллер содержит надежную схему сброса при включении питания - все, что вам надо, микроконтроллер выполнит сам. Выводы OSC1 и OSC2 подключаются к генератору тактовой частоты и могут быть сконфигурированы для различных его типов, включая режимы кварца и RC-генератора. Простая схема, которая используется как база для проекта с использованием PIC16F84 представлена на рисунке:
Более наглядная схема:
Схема содержит RC-генератор и один вывод (RB4) подключен к индикатору.
Charles Manning (Electronics Australia, April 1996) написал изумительно короткую (6 слов) программу для мигания индикатора, которую вы можете использовать с этой схемой:
LIST P=16C84 ; MOVLW 0 TRIS 6 OPTION LOOP SLEEP INCF 6,F GOTO LOOP END
Эта программа написана для MPASM (бесплатный ассемблер от Microchip, доступный по адресу http://www.microchip.com). Для использования программы вы должны извлечь ее из этого файла любым редактором, сохранить в другой файл (например LIGHTS.ASM), затем проассемблировать с помощью MPASM (используйте команду "MPASM LIGHTS.ASM") для получения HEX файла LIGHTS.HEX, который может быть загружен в микроконтроллер с помощью программатора. Не обращайте внимания на замечания MPASM о том, что использование регистров TRIS и OPTION "не рекомендуется". Убедитесь в том, что сторожевой таймер "watchdog" включен и выбран RC-генератор. Если у вас еще нет MPASM, то здесь представлен HEX-вариант приведенной выше программы:
:0C0000000030660062006300860A0328DE :00000001FF
Вы можете записать эти две строки в файл LIGHTS.HEX без использования MPASM.
Программа использует таймаут "watchdog" таймера как как источник синхронизации для определения моментов включения и выключения светодиода; в результате вы можете заставить светодиод вспыхивать с различной частотой, подключая его к различным разрядам порта PORTB (RB0-RB7, выводы 6-13). Это необычное использование "watchdog" таймера. Обычно "watchdog" таймер используется, чтобы удостовериться, что PIC ведет себя в соответствии с заданной программой, и, если ваша программа специально не сконфигурирована для использования "watchdog" таймера, активизировать его было бы большой ошибкой. Простая программа LIGHTS использует его для выхода из режима "SLEEP" (т.е. режима "засыпания"); при выходе из этого режима PIC увеличивает содержимое регистра PORTB, что изменяет состояние RB0-RB7 и опять переходит в режим "засыпания" до следующего таймаута "watchdog" таймера. "Watchdog" таймер синхронизирован внутренним RC генератором, который имеет одинаковый период на всех PIC микроконтроллерах, следовательно, использование "watchdog" таймера для операций со временем гарантирует, что временные задержки будут измеряться стабильно независимо от конфигурации задающего генератора микроконтроллера или используемой частоты (желательно, чтобы частота составляла хотя бы несколько кГц). Это свойство делает программу LIGHTS очень удобной для начального тестирования большинства макетных плат для PIC. Схема может быть изменена для получения значительно большего количества эффектов путем добавления сведодиодов. Подключите первый из них к выводу RB0 (контакт 6), второй - к RB1 (контакт 7), третий - к RB2 (контакт 8) и т.д. Наилучшим вариантом является использование как минимум четырех светодиодов с увеличением до восьми (последний подключить к RB7, т.е. контакт 13). Каждый сведодиод подключается через резистор 470 Ом между ножкой микроконтроллера и "землей" (см. схему). Следующая программа реализует эффект "бегущего огня": ; WALKLEDS.ASM
LIST P=16f84 ; PORTB EQU 6 TRISB EQU 86H OPTREG EQU 81H STATUS EQU 3 CARRY EQU 0 RP0 EQU 5 MSB EQU 3 ;номер бита для крайнего слева светодиода ; CLRF PORTB ;погасить все светодиды BSF STATUS,RP0 ;выбрать регистровый банк 1 CLRF TRISB^80H ;установить все разряды PORTB на вывод информации MOVLW 0AH MOVWF OPTREG^80H ;настроить предварительный делитель в WDT на (1:4) BCF STATUS,RP0 ;выбрать регистровый банк 0 INCF PORTB,F ;включить крайний справа светодиод BCF STATUS,CARRY ;очистить флаг CARRY LEFT SLEEP ;подождать таймаута WDT ("watchdog" таймера) RLF PORTB,F ;сдвинуть содержимое индикатора влево BTFSS PORTB,MSB ;достигли крайней левой позиции? GOTO LEFT ;если нет - цикл RIGHT SLEEP ;подождать таймаута WDT RRF PORTB,F ;сдвинуть содержимое индикатора вправо BTFSS PORTB,0 ;достигли крайней левой позиции? GOTO RIGHT ;если нет - цикл GOTO LEFT ;начать новый цикл END
Проассемблируйте эту программу с помощью MPASM для получения ее HEX представления: :100000008601831686010A3081008312860A031056 :100010006300860D861D08286300860C061C0C28CC :020020000828AE :00000001FF
Снова вы должны с указать программатору включить "watchdog" таймер и RC генератор.
Программа "бегущий огонь" предназначена для использования четырех светодиодов, но вы можете изменять значение MSB для использования большего количества светодиодов: для количества светодиодов 5, 6, 7 и 8 значения MSB должны быть 4, 5, 6 и 7 соответственно.
В программе не используются команды TRIS и OPTIONS, не рекомендованные к применению фирмой "MicroChip", т.к. они могут не поддерживаться в будущих микроконтроллерах. Таким образом, в отличие от предыдущей программы, во время ассемблирования не будут генерироваться предупреждения Для предотвращения генерации MPASM'мом сообщений о корректном использовании регистровых банков необходимо инвертировать старший значащий бит в любом адресе, приходящемся на банк 1 (например, использовать TRISB^80H вместо обычного TRISB, где оператор "^" означает битовое "исключающее ИЛИ"). Это - одна из уловок, которые используются для подавления вывода предупреждающих сообщений MPASM.
В качестве заключительного примера рассмотрим программу, которая демонстрирует такие же эффекты, как и программа WALKLEDS на 4-х светодиодах. Вы обратите внимание на то, что она значительно больше по объему и ее нельзя назвать примеров эффективного программирования. Она всего лишь предназначена для демонстрации нескольких ключевых идиом и технологий PIC микропроцессоров. Кроме прочего, она содержит обработчик прерываний, процедуры записи и чтения данных встроенного FLASH EEPROM и демонстрирует, как в PIC реализован принцип табличного поиска. Программа содержит примеры одной из наиболее удобных особенностей MPASM, такой как два вида макрокоманд. Она также показывает, как отменить заданное по умолчанию основание системы счисления (шестнадцатеричное) для чисел и как внедрить информацию о конфигурации микроконтроллера. По крайней мере, по стилю она больше напоминает "настоящую" программу для микроконтроллера.
При записи данных в EEPROM необходимо выполнять условие, указанное ниже Есть обязательная процедура записи
EXAMPLE : DATA EEPROM WRITE
++++++++++++++++++++++++++++++++++++++++++++
блок целый, но обязательная часть внизу отделена для наглядности
MOVWF EECON2 ; Write 55h MOVLW AAh ; MOVWF EECON2 ; Write AAh BSF EECON1,WR ; Set WR bit ; begin write BSF INTCON, GIE ; Enable INTs.
The write will not initiate if the above sequence is not exactly followed (write 55h to EECON2, write AAh to EECON2, then set WR bit) for each byte. We strongly recommend that interrupts be disabled during this code segment.
Пример чтения из памяти EEPROM
EXAMPLE : DATA EEPROM READ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BCF STATUS, RP0 ; Bank 0 MOVLW CONFIG_ADDR ; MOVWF EEADR ; Address to read BSF STATUS, RP0 ; Bank 1 BSF EECON1, RD ; EE Read BCF STATUS, RP0 ; Bank 0 MOVF EEDATA, W ; W = EEDATA
Пример проверки после записи ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
EXAMPLE 5-1: WRITE VERIFY
+++++++++++++++++++++++++++++ BCF STATUS, RP0 ; Bank 0 : ; Any code can go here : ; MOVF EEDATA, W ; Must be in Bank 0 BSF STATUS, RP0 ; Bank 1 READ BSF EECON1, RD ; YES, Read the ; value written BCF STATUS, RP0 ; Bank 0 ; ; Is the value written (in W reg) and ; read (in EEDATA) the same? ; SUBWF EEDATA, W ; BTFSS STATUS, Z ; Is difference 0? GOTO WRITE_ERR ; NO, Write error : ; YES, Good write : ; Continue program ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ; PATTERN.ASM
; Программа разработана для демонстрации процедур чтения/записи данных EEPROM и обработки ; прерываний таймера. Таблица значений записана в EEPROM процессор выполняет "холостой" ; цикл. Когда таймер переполняется, происходит прерывание работы процессора и следующее ; значение таблицы считывается из EEPROM и записывается в порт B, т.е. отображается на ; светодиодах. С помощью изменений в таблице может быть изображен любой образец длиной до ; 64 значений.
#define bank0 bcf STATUS,RP0 ;выбрать Bank 0 #define bank1 bsf STATUS,RP0 ;выбрать bank 1 magic macro ;"магическая" последовательность записи в EEPROM movlw 55H movwf EECON2^80H movlw 0AAH movwf EECON2^80H endm
cblock 0CH ;блок переменных n_vals n_tmp endc
;**********************************; ; Основная точка входа в программу ; ;**********************************; org 0 goto start
;**************************; ; Точка входа в прерывание ; ;**************************; org 4
; Обычно содержимое необходимо сохранять перед процедурой обработки прерывания и ; восстанавливать после нее, но в данной программе в этом нет необходимости, т.к. ; процессор ничего не делает между прерываниями. Смотрите PIC datasheet для ; рекомендуемой процедуры.
movf EEADR,w xorwf n_vals,w btfsc STATUS,Z ;EEADR == n_vals? clrf EEADR ;если да, то начать с нуля call ee_rd movf EEDATA,w ;читать EEPROM movwf PORTB ;отобразить байт incf EEADR,f ;новый адрес bcf INTCON,T0IF ;очистить флаг прерывания retfie
start clrf PORTB bank1 clrf TRISB^80H ;все разряды порта B на вывод movlw B'00000111' movwf OPTREG^80H ;таймер 0 предварительный делитель 256:1 bsf EECON1^80,WREN ;разрешить запись в EEPROM bank0 call ee_init ;пересылка таблицы в EEPROM bank1 bcf EECON1^80H,WREN ;запретить запись в EEPROM bank0 bsf INTCON,T0IE ;разрешить прерывания от таймера bsf INTCON,GIE ;разрешить все прерывания
loop goto loop ;"холостой" цикл
; ee_init ; ; инициализация EEPROM из таблицы
ee_init clrw call lut ;получить кол-во элементов в таблице movwf n_vals ;и сохранить movwf n_tmp ;сохранить еще раз clrf EEADR decf EEADR,f ;EEADR = -1 ee_in1 incf EEADR,f ;следующий адрес movf EEADR,w addlw 1 call lut ;получить соответствующее значение таблицы movwf EEDATA call ee_wr ;запись в EEPROM decfsz n_tmp,f ;есть еще? goto ee_in1 ;да clrf EEADR ;нет, завершить return
; lut ; ; просмотр таблицы
lut addwf PCL,f ;добавить W к PCL для получ. адреса эл-та таблицы retlw D'12' ;число элементов в таблице retlw B'1000' ;первый элемент retlw B'1000' retlw B'0100' retlw B'0100' retlw B'0010' retlw B'0010' retlw B'0001' retlw B'0001' retlw B'0010' retlw B'0010' retlw B'0100' retlw B'0100' ;последний элемент
; ee_wr ; ; Записать байт из EEDATA в EEPROM по адресу в EEADR. Прерывания ; должны быть запрещены перед вызовом ee_wr.