Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Микроконтроллеры PIC фирмы Microchip для начинающих выпуск №13


РАССЫЛКА Микроконтроллеры PIC фирмы Microchip для начинающих
Ведущий: Алексей (pont_a@mail.ru)


Доброго времени суток, дамы и господа!!

Сегодня будем писать программу для устройства, которое было Вам описано в десятом выпуске, когда мы рассматривали аппаратную часть!  

Как мы помним, на той схеме у нас тактировался микроконтроллер от внешнего кварца на частоте 20МГц. Также, на нулевой пин порта D был заведен светодиод. Так вот, мы напишем программу, которая будет включать или выключать светодиод, приблизительно раз в секунду. Почему приблизительно, потому что кварц на нашем микроконтроллере не позволяет получить частоту тактирования таймера 0, кратную 256. Когда будем рассматривать таймер 2, я покажу, как с помощью него можно запрограммировать точное значение таймаута, почти, под любой кварц!  
Открываем проект, который мы создали в восьмом выпуске рассылки. В окне редактора кода удаляем нашу тестовую программу.
Написанный код является полностью законченным и готовым к программированию на микроконтроллер. Можете его использовать в своих дальнейших разработках электронных устройств, как изначальный.

;=========================================================================
; подключаем стандартный заголовочный файл
#include <P18F452.INC>
; директивой LIST задаем тип микроконтроллера, формат HEX-файла
; и формат констант, по-умолчанию - десятичный.
   LIST    P=18F452, f=INHX32, R=DEC
; задаем биты конфигурации (как задавать, смотрите шестой выпуск)
   CONFIG       OSC=HS                ; тактирование от кварца частотой 20МГц
   CONFIG       OSCS=OFF              ; запретить переключать частоту тактирования микроконтроллера
   CONFIG       PWRT=ON               ; включать задержку на 72мс после включения питания            
   CONFIG       BOR=ON, BORV=45       ; схему сброса по провалу питания включить. Порог = 4,5В
; старайтесь использовать сторожевой таймер всегда!
   CONFIG       WDT=ON, WDTPS=128     ; сторожевой таймер включить, период 2,3 сек
   CONFIG       STVR=ON               ; по переполнению стека давать сброс микроконтроллера
; объявляем константы
ab       equ 0   ; признак, что переменная находиться в access bank                  
bb       equ 1   ; признак, что адрес необходимо считать с использованием регистра BSR
rw       equ ab  ; rw=0. Результат размещается в регистр-аккумулятор WREG
rf       equ bb  ; rf=1.  Результат размещается в регистр FREG
; объявляем переменные
; в программах, где используется большое количество переменных удобно использовать
; директиву ассемблера CBLOCK. А дальше перечислять переменные. Заканчивается блок
; переменных командой ENDC
 CBLOCK  0x000  ; блок начинается с нулевого адреса банка 0
      timer0h, temp            ; и т.д.
 ENDC
; основная программа         
  ORG  0
  BRA  Main_Init                   ; делаем так. Когда будем рассматривать прерывания, поймете почему
  ORG  0x20                        ; вся программа начинаться будет с адреса 0x20
Main_Init:
; изначально, при инициализации, всегда запрещают все прерывания
  CLRF    INTCON, ab              ; сбросили глобальные флаги прерываний
; если пины не используются на схеме, то они должны быть настроены все на вход
; при включении питания все порты ввода/вывода по умочанию настроены на вход
; поэтому мы должны настроить на выход только пин 0 порта D для работы светодиода
; также надо отключить аналоговые входа.
  MOVLW   0x07
  MOVWF   ADCON1, ab           ; отключаем аналоговые входа, все пины цифровые
  CLRF    LATD, ab             ; на выход светодиода пойдет сразу 0 (будет выключен)
  BCF     TRISD, RD0, ab       ; пин 0 порта D настроили, как выход, и на  светодиод пошел 0
; инициализируем таймер 0
  CLRF    T0CON, ab            ; перед тем, как настраивать, отключаем таймер
; флаг прерывания мы уже сбросили, очистив регистр INTCON
; таймаут расчитывается следующим образом: 20МГц/4=5000000 столько импульсов придет на таймер за 1сек
; 5000000/256/256=76,2939453125 - это значение старшего программного байта таймера 0
; где 256 - прескалер и еще 256 - переполнение таймера 0
; берем ближнее значение = 76. На него и будем проверять наш программный старший байт
; Тогда кол-во импульсов равно: 76*256*256=4980736
; а реальный таймаут  получится следующим: 4980736/5000000=0,9961472 сек
  MOVLW   76
  MOVWF   timer0h, ab         ; старший байт таймера 0 реализуем программой
  CLRF    TMR0L, ab           ; очищаем таймер 0
  MOVLW   0x47                ; прескалер=256, 8-ми битный режим, тактирование от Fosc=5МГц=20МГц/4
  MOVWF   T0CON, ab
  BSF     T0CON, TMR0ON, ab   ; старт таймера 0
Main_Loop:
; теперь начинается основной цикл микроконтроллера                        
  CLRWDT                      ; сброс сторожевого таймера, обязательно, как минимум, раз в 2,3сек
  BTFSS   INTCON, TMR0IF, ab  ; таймер 0 переполнился?
  BRA     Main_Loop           ; нет. Ждем, когда это произойдет
  BCF     INTCON, TMR0IF, ab  ; да, сбросили флаг прерывания
  DECFSZ  timer0h, rf, ab     ; вычитаем из старшего байта 1 и проверяем, закончился таймаут или нет?
  BRA     Main_Loop           ; таймаут не закончился, ждем нового переполнения таймера 0           
  BTG     LATD, RD0, ab       ; закончился, проинвертировали выход на светодиод (вкл. или выкл.)
  MOVLW   76
  MOVWF   timer0h, ab         ; запускаем новый таймаут
  BRA     Main_Loop   
  END
;=========================================================================

Вставляем данный текст в проект. Сохраняем его и компилируем весь проект. Если ассемблерный текст скопирован правильно, то проект скомпилируется без ошибок. Потом, попробуйте данную программу отлаживать с помощью  Mplab SIM. Это Вам домашнее задание.  На сегодня, думаю, будет достаточно! Попытайтесь понять: как рассчитывается таймаут, как работать с таймером 0, портами ввода/вывода!

В следующем выпуске будем изучать таймера 1 и 2 микроконтроллера PIC18F452!

Полный архив рассылки Вы можете прочитать на нашем сайте!  При любом опубликовании текстов данной рассылки ссылка на сайт http://www.2aplusa.ru обязательна!

Теперь на нашем сайте начал работать форум, где Вы можете общаться на интересующие Вас вопросы по поводу разработки собственных устройств или задавать вопросы по поводу рассылки! 

Желаю Вам удачи! До скорой встречи!


С уважением, Алексей pont_a@mail.ru
Cайт разработчиков 2AplusA http://2aplusa.ru


В избранное