Формирование сигналов управления и индикации

 

1. ЦЕЛЬ

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

 

       
   
 

2. Элементы функциональной схемы

 
 

           
     
 
 

3. ЗАДАНИЕ ПО ЛАБОРАТОРНОЙ РАБОТЕ

3.1. На заданном выводе микроконтроллера сформировать сигнал с заданной частотой и скважностью Q = 2 при нажатой кнопке.

3.1.1. Разработать функциональную схему микроконтролерного устройству с выводом сигнала на звуковой излучатель.

3.1.2. Разработать и наладить управляющую программу.

3.2. На заданном выводе микроконтроллера сформировать сигнал с заданной частотой и скважнистю Q = 2 при отжатой кнопке.

3.2.1. Разработать функциональную схему микроконтролерного устройству с выводом сигнала на дискретный свитлодиодний индикатор.

3.2.2. Разработать и наладить управляющую программу.

3.3. На девятиразрядном семисегментном свитлодиодному индикаторе с помощью динамической индикации с заданной частотой возобновления всех разрядов индикатора, отобразить группу и свои инициалы.

3.3.1. Разработать функциональную схему микроконтролерного устройству.

3.3.2. Разработать и наладить управляющую программу.

Для заданий 3.1 и 3.2 позволяется разработать общую функциональную схему и управляющую программу. Выводы микроконтроллера для подключения кнопок выбрать самостоятельно.

Тактування микроконтроллера выполнить от тактового генератора с частотой Fosc = 4 МГц.

 

 

4. ВАРИАНТЫ ЗАДАНИЙ

4.1. Варианты задания 3.1.

 
Вывод RA0 RA1 RA2 RA3 RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 RA0 RA1 RA2
Частота, Гц

4.2. Варианты задания 3.2.

 
Вывод RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 RA0 RA1 RA2 RA3 RB0 RB1 RB2
Частота, Гц 0,2 0,4 0,6 0,8 1,5 2,5 0,3 0,5 0,7 0,9 1,2 1,7

4.3. Варианты задания 3.3.

 
Частота, Гц

 

Пример.Формирование символов на семисегментном индикаторе

Соответствие сегментов индикатора разрядам двоичного числа:

H G F E D C B А
                 

 

Для отображения символа "5" на индикатор необходимо выдать следующий двоичный код:

 

                 

 

Пример программы.Управляющая программа прострой, который отображает четыре символа на индикаторе с помощью динамической индикации, подсчет количества нажатий и отпусков кнопки, изменяя при этом частоту возобновления индикатора и частоту звукового сигнала.

; подключение файла с описанием стандартных констант и значений

#include p16f84a.inc

 

; формирование конфигурационного слова

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

 

; описание ячеек памяти данных

cblock 0x0C ; начиная с адреса 0x0C

W_TEMP ; сохранение W при вызове прерывания

STATUS_TEMP ; сохранение STATUS при прерывании

dig0 ; буфера на 4 разряда

dig1

dig2

dig3

segment ; номер отображаемого разряда

endc

 

 

; описание констант

init_porta equ b'00000100' ; RA2 на вводе, другие - на вывод

init_portb equ b'00000000' ; все разряды на вывод

init_option equ b'00000011' ; TMR0 считает CLKOUT/16

init_intcon equ b'10100000' ; прерывание от TMR0

 

 

; начало программы

org 0 ; вектор сброса

bcf INTCON, GIE ; запрещение всех прерываний

goto main ; переход на начало основной программы

 

 

; обработчик прерывания

int_start

org 0x04 ; вектор прерывания

movwf W_TEMP ; сохранение W и STATUS

swapf STATUS, W

movwf STATUS_TEMP

btfsc INTCON,T0IF ; прерывание от таймера?

goto tmr_int ; переход на обработчик прерывания

; при переполнении таймера

movlw b'00100000' ; разрешение прерываний только от таймера

movwf INTCON

goto int_end ; переход в заключение обработчика

 

 

; обработчик прерывания от таймера

tmr_int

bcf INTCON, T0IF ; очистка флажка переполнения TMR0

call UpdateDig ; возобновление состояния индикатора

swapf dig0, W ; инициализация значения таймера

andlw 0xF0

movwf TMR0

movlw b'00001000' ; формирование звукового сигнала

xorwf PORTA, F

int_end ; окончание обработчика прерывания

swapf STATUS_TEMP, W ; восстановление значений

movwf STATUS ; регистров W и STATUS

swapf W_TEMP, F

swapf W_TEMP, W

retfie ; возвращение из прерывания

 

 

; подпрограмма восстановления состояния индикатора

UрdаtеDіg

incf PORTA, W ; выбор дежурного разряда

andlw 0x03

movwf segment

movf PORTA, W

andlw 0xFC

iorwf segment, W

movwf PORTA

movlw dig0 ; подготовка содержания текущего разряда

addwf segment, W

movwf FSR

movf INDF, W

call bcd_table ; превращение в 7-сегментный код

movwf PORTB ; вывод текущего разряда

return

 

 

; подпрограмма превращения двоичного значения в 7-сегментный код

 

bcd_table

andlw 0x0F

addwf PCL, F

retlw b'00111111' ; 0

retlw b'00000110' ; 1

retlw b'01011011' ; 2

retlw b'01001111' ; 3

retlw b'01100110' ; 4

retlw b'01101101' ; 5

retlw b'01111101' ; 6

retlw b'00000111' ; 7

retlw b'01111111' ; 8

retlw b'01101111' ; 9

retlw b'01110111' ; А

retlw b'01111100' ; B

retlw b'00111001' ; C

retlw b'01011110' ; D

retlw b'01111001' ; E

retlw b'01110001' ; F

 

 

; подпрограмма инициализации микроконтроллера

Init

bsf STATUS, RP0 ; выбор банка 1

movlw init_porta ; инициализация регистра TRISA

movwf TRISA^80h

movlw init_portb ; инициализация регистра TRISB

movwf TRISB^0x80

movlw init_option ; инициализация регистра OPTION

movwf OPTION_REG^80h

clrf STATUS ; выбор банка 0

clrf dig0 ; инициализация отображения символа

movlw .10

movwf dig1

movlw 6

movwf dig2

movlw 9

movwf dig3

movlw init_intcon ; инициализация регистра INTCON, movwf INTCON ; разрешение прерываний

return

 

 

; основная программа

main

call Init ; инициализация микроконтроллера

m1 btfsc PORTA, 2 ; ожидание нажатия на кнопку

goto m1

incf dig0, F ; увеличение значения первого разряда

m2 btfss PORTA, 2 ; ожидание отпуска кнопки

goto m2

incf dig0, F ; увеличение значения первого разряда

goto m1

end ; конец программы