Pull to refresh

Программирование PIC16F876A. Собираем схему с плавно мигающим светодиодом

Programming microcontrollers *
Эта статья направлена на новичков в программировании микроконтроллеров семейства PIC16 от Microchip. В нашем случае, я выбрал немного превосходящий микроконтроллер для таких задач, а именно — PIC16F876A. Программирование микроконтроллера будем производить в MPLAB IDE.

Цель работы: собрать схему, которая будет мигать светодиодом, внимание, с применением ШИМ.

И так, цель задачи обозначили. Теперь перейдем к реализации наших планов.

Часть 1. Железо.


В первую очередь нам понадобятся компоненты, из которых мы будем собирать схему. А именно:
  • Микроконтроллер PIC16F876A
  • Рассыпуха к нему
  • Светодиод
  • Макетная плата
Светодиод можно взять любой по вкусу, какой Вам больше нравится.
Макетную плату желательно иметь в наличии.
В понятие «рассыпухи» входят такие детали как: пара конденсаторов для кварца и конденсатор на выход модуля CPP (Для того что бы сгладить пульсации).

Собранная схема выглядит следующим образом:



Это типовое включение микроконтроллера, ничего нового я тут не придумывал.

Так же, для программирования микроконтроллера я пользуюсь программатором-отладчиком ICD2. Он подключается к компьютеру по USB и прекрасно работает как на системе Windows, так и на GNU/Linux. В нашем случае будем использовать родной MPLAB IDE в Windows.
Скрин в процессе разработки:



Часть 2. Программная.


Светодиод подключаем на 1й модуль CPP (ШИМ). За настройку модуля в микроконтроллере отвечает регистр CPP1CON. Чтобы модуль у нас заработал, предварительно необходимо инициализировать таймер. Для режима ШИМ используется таймер TMR2. За его конфигурацию отвечает регистр T2CON. Инициализация:
movlw  .0     
bcf   STATUS, 5

movwf  T2CON ; Помещаем в регистр T2CON - 0
bsf   T2CON, 0 ; Устанавливаем бит T2CKPS0 (Предделитель)
bsf   T2CON, 2 ; Включаем таймер TMR2 битом TMR2ON
bsf   T2CON, 3 ; Устанавливаем бит TOUTPS0 (Постделение)


На этом инициализация таймера закончена. Теперь при включении контроллера от будет служить источником для нашего ШИМ модуля.

Инициализация ШИМ модуля происходит следующим образом:
movlw   00101111b ; Подготавливаем конфигурацию
movwf   CPPCON ; Конфигурируем ШИМ
bsf    CPPCON, 2 ; Включаем модуль ШИМ

Все, на этом инициализация закончена. Теперь мы можем помещать в регистр CPP1L число от 0 до 255, тем самым меняя скважность выходных импульсов.

Полный исходник программы для прошивки нашего микроконтроллера:

STATUS   equ     03h    
TRISC    equ     07h                
CPPCON   equ      17h
CPP1L    equ      15h
T2CON    equ      12h
counter  equ      23h
tmp      equ      25h    
      org     0     
      goto    start    
start   
  bsf     STATUS, 5  
                 
  movlw    .0     
  movwf    TRISC   
  bcf      STATUS, 5
  movwf    T2CON
  bsf      T2CON, 0
  bsf      T2CON, 2
  bsf      T2CON, 3
  movlw    00101111b
  movwf    CPPCON
  bsf     CPPCON, 2
  movlw    .0
  movwf    CPP1L
  movlw    .255
  movwf    tmp
  decfsz  tmp, 1
    goto $+2
    goto $+4
      call delay10mS
      incf CPP1L, 1
      goto $-5
  movlw    .255
  movwf    tmp
    decfsz  tmp, 1
    goto $+2
    goto $+4
      call delay10mS
      decf CPP1L, 1
      goto $-5
  goto $-16
delay10mS
  movlw  .50
  movwf  counter
loop
  call  delay200uS
  decfsz  counter
  goto  loop
  return
delay200uS
  movlw  .100  
  addlw  -1
  btfss  STATUS,2
  goto  $-2
  return  
end  

Краткая заметка по командам, использованных в программе.
equ — Присвоение имени на определенный адрес.
goto — Переход программы на метку, либо определенную строку
call — Вызов подпрограммы
movlw — Поместить в регистр W, число
movwf — Переместить из регистра W число
bsf — Установить бит в регистре, в состояние 1
bcf — Установить бит в регистре, в состояние 0
addlw — Прибавить в регистр W число
btfss — Проверить бит в регистре на 1
incf — Инкриминировать регистр (прибавить 1)
decf — Декриминировать регистр (вычесть 1)
decfsz — Вычесть 1 из регистра + проверка на 0

Задержки в программе откалиброваны на частоту кварцевого резонатора в 8мгц.

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

В переменной tmp мы можем задавать скважность, тем самым меняя максимальную яркость светодиода.

Далее реализована часть программы, которая отвечает за само мигание светодиода, с учетом использования ШИМ. Сначала, инкриминируя CPP1L до значения tmp мы заставляем светодиод медленно начать светиться, а затем делаем обратную операцию.

Часть 3. Финальная


Перед тем как прошивать Ваш контроллер, Вам необходимо установит биты конфигурации микроконтроллера. Без них, ничего работать не будет.

И так:
1) WDT — выключаем. Это сторожевой таймер. Предназначен для аппаратного сброса микроконтроллера в момент непредвиденного зависания.
2) LWP — выключаем. Это низковольтное программирование. Мы используем нормальный программатор, который подает на MCLR 13В.
3) Осцилятор: В данном случае мы имеем 8мгц. Значит ставим значение XT.

Часть 4. Бонусная.


Видео для тех, кто еще не программировал/не собирал схемы, но очень хочет увидеть результат:



Часть 5. Информация.


Официальный сайт microchip — www.microchip.com
Цитируемые источники — www.wikipedia.org
Русская документация для микроконтроллеров PIC — www.microchip.ru/lit/?mid=1x0
Tags:
Hubs:
Total votes 65: ↑55 and ↓10 +45
Views 32K
Comments Comments 65