- •Література
- •Інформаційні ресурси
- •Використання mplab для складання та налагодження програм мікроконтролера
- •Теоретичні відомості
- •Порядок виконання лабораторної роботи
- •Лабораторна робота № 21 Дії з портами мікроконтролера, логічні операції та обробка окремих бітів
- •Теоретичні відомості
- •21.1. Аналіз роботи програми
- •Лабораторна робота № 22 Створення програмної затримки часу за допомогою циклів
- •Теоретичні відомості
- •22.1. Результати аналізу програми
- •Лабораторна робота № 23 Створення затримки часу за допомогою переривань від таймера
- •23.2. Варіанти задання коефіцієнтів ділення переддільника
- •23.2. Алгоритм управління світлодіодами з затримкою від таймера tmr0
- •23.3. Результати аналізу програми
- •Використання енергонезалежної пам'яті даних
- •У регістрі eecon1 розміщені такі біти керування:
- •24.1. Блок-схема алгоритму обміну з eeprom
- •Використання клавіатури з мікроконтролером
- •Теоретичні відомості
- •25.1. Таблиця результатів тестування
- •Виведення цифрової інформації на семисегментні індикатори
- •Основи використання mplab-icd пояснено далі в ході роботи.
- •Закрити вікно icd Options ().
- •Дослідження мікроконтролерного модуля аналого-цифрового перетворювача
- •Закрити вікно icd Options().
- •27.1. Результати вимірів і обчислень
- •Мікроконтролерне дослідження дренькоту контактів
- •Результати вимірів кількості замикань контактів
Закрити вікно icd Options().
У вікні MPLAB ICD мають бути обрані такі пункти: COM1, 19200, Minimum and Watch window, 2MHz-10MHz (вікно MPLAB ICD не закривати!).
Стандартним шляхом скопіювати текст програми з файлу D:\TEMP\ACP.asm в асемблерний файл вашого проекту. Переглянувши текст програми, дописати асемблерні фрагменти, вказані в коментарі.
;*********************************************************
;Лабораторна робота 27
;Дослідження модуля АЦП мікроконтролера PIC16F877
;*********************************************************
list p=16f877 ;директива визначення типу процесора
#include <p16f877.inc> ;включення файлу стандартних імен
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_ON & _CPD_OFF
CBLOCK 20H
T_C;тимчасове зберігання результату АЦ перетворення
_N ;змінна для завдання величини затримки
LOOP3 ;змінні
LOOP2 ; для
LOOP1 ; підпрограм
LOOP0 ; затримок
LSD;молодший десятковий розряд значення температури
MSD ;старший десятковий розряд значення температури
L7 ;7-сегментний код молодшої цифри
M7 ;7-сегментний код старшої цифри
ENDC
;======================================
; Основна програма
;======================================
org 0x000
nop ;початок програми
nop
goto Start
;=================
org 0x4
nop
int: retfie
;=================
Start: clrf PORTA ;обнулити порт А
bsf PORTA,2 ;зняти скидання регістрів зсуву
clrf PORTC ;Обнулити порт С,
bsf STATUS,RP0 ;банк регістрів 1
movlw b'11111011' ;RA2 - на виведення,
movwf TRISA ;інші біти порту А - на введення,
; в т.ч. RA0 !
movlw b'11010111' ;встановити RC5, RC3 на виведення,
movwf TRISC ;інші біти порту С - на введення
bcf STATUS,RP0 ;банк регістрів 0
banksel PORTC
clrf PORTC ;очистити PORTC
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;встановлення режимів роботи модуля АЦП
????? ??????????? ;встановити тактову частоту
; Fosc/8, канал 0
????? ?????? ;і ввімкнути модуль АЦП
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
banksel OPTION_REG
movlw B'10000111' ;переддільник підключити до
; таймера TMR0,
movwf OPTION_REG ;і встановити коефіцієнт 1:256
movlw B'00001110' ;вирівнювання вліво, один
; аналоговий канал № 0,
movwf ADCON1 ;опорні напруги: V+ = Uживл. = +5 В,
; V- = 0
banksel PORTC
Main: btfss INTCON,T0IF ;очікування переповнення
; таймера 0
goto Main
bcf INTCON,T0IF ;скидання ознаки переповнення
;таймера 0
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
??? ????????? ;\старт АЦ перетворення
Wait: ????? ?????? ;\очікування завершення перетворення
???? ????
???? ???????? ;запис результату АЦ перетворення
????? ??? ;в регістр T_C
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
call RASPAK ;розпаковка байта на дві окремі тетради
;---------------------------------------------------------
MAIN_1: call HEX_7 ;перетворення НЕХ коду 2-х цифр у
; код 7-сегментних індикаторів
disp: CALL DISPLAY ;результат вимірювання – через
;регістри зсуву - на індикацію
movlw 1 ;константа для паузи 0.25 секунди
MOVWF LOOP3
MAIN_2:
CALL DELAY_LONG ;затримка на час (LOOP3)*0.25 с
DECFSZ LOOP3, F
GOTO MAIN_2
;-----------------------------------------------
GOTO Main ;перехід до Main
;===============================================
;п/п зсуву вмісту регістрів M7, L7 молодшими розрядами
; вперед у 2 регістри зсуву 74НС164
DISPLAY:
bcf PORTA,2 ;скидання регістрів
bsf PORTA,2 ;зсуву (для індикаторів)
movlw d'16' ;лічильник в _N
movwf _N
NastBit: rrf M7,f ;зсув вправо пари регістрів M7, L7
rrf L7,f
bcf PORTC,5 ;якщо висунутий біт=0, встановити RC5=0
btfsc STATUS,C ;якщо висунутий біт=1, - RC5=1,
bsf PORTC,5 ;
nop
bsf PORTC,3 ;
nop ;тактовий імпульс
bcf PORTC,3 ;
decfsz _N,f ;лічильник - 1, і пропустити, якщо він
; дорахував до нуля
goto NastBit ;зсув повторюється 16 разів
return
;---------------------------------------
DELAY_LONG
MOVLW .250 ;затримка 250 мс
MOVWF LOOP1
DELAY_N_MS:
OUTTER:
MOVLW .102 ;затримка 1 мс
MOVWF LOOP2
INNER:
movlw d'2'
movwf LOOP0
ININNER:
DECFSZ LOOP0,F
goto ININNER
DECFSZ LOOP2, F
GOTO INNER
DECFSZ LOOP1, F
GOTO OUTTER
RETURN
;---------------------------------------
DELAY_10USEC: ;затримка тривалістю (W)*10 мкс
MOVWF LOOP1
DELAY_10USEC_0
movlw d'2'
movwf LOOP0
DELAY_10USEC_1:
DECFSZ LOOP0,F
GOTO DELAY_10USEC_1
decfsz LOOP1,f
goto DELAY_10USEC_0
return
;********************************************
; Стандартні процедури роботи з дисплеєм
;********************************************
;п/п розпаковки дворозрядного 16-кового числа
RASPAK: MOVF T_C,w
andlw h'f0'
movwf MSD
swapf MSD,f
MOVF T_C,w
andlw h'0f'
MOVWF LSD
retlw 0
;------------------------------------
;п/п перетворення 2-х чотирибітних чисел з регістрів MSD,
; LSD
;у 7-сегментні коди двох цифр в регістрах M7, L7
HEX_7: movf MSD,W
call tab7s ;п/п перетворення цифри (W)=0..F у
;7-сегментний код в W
movwf M7 ;7-сегм. код старшої цифри
movf LSD,W
call tab7s
movwf L7 ;7-сегм. код молодшої цифри
return
;------------------------------------
tab7s: addwf PCL,f ;п/п перетворення шістнадцяткової
; цифри (W)=0..F у 7-сегментний код в W
retlw b'11111100' ;0
retlw b'01100000' ;1
retlw b'11011010' ;2
retlw b'11110010' ;3
retlw b'01100110' ;4
retlw b'10110110' ;5
retlw b'10111110' ;6
retlw b'11100000' ;7
retlw b'11111110' ;8
retlw b'11110110' ;9
retlw b'11101110' ;A
retlw b'00111110' ;b
retlw b'10011100' ;C
retlw b'01111010' ;d
retlw b'10011110' ;E
retlw b'10001110' ;F
retlw b'00000000' ;код гасіння індикатора
;*************************************************
END
Виконати компіляцію програми (Project – Make Project, або кнопка у вигляді зеленої лійки, або клавіша F9). На екрані з'являється вікно результатів компіляції (Build Results).
Якщо з'явилось повідомлення про помилки (error), ознайомившись з поясненням змісту помилки, слід натиснути мишею на цей рядок вікна Build Results. MPLAB зробить активним той рядок у тексті програми, де ймовірно зроблено помилку. Треба виправити її і далі так само й інші помилки. Потім повернутись до п. 8, 9, поки не буде видано повідомлення "Build completed successfully" (Компіляцію завершено успішно). При цьому створюється файл з тим же ім'ям і розширенням .hex. Може також з'явитись віконце нагадування про те, що після змін у програмі потрібно виконати програмування мікроконтролера за допомогою відладчика.
Слід закрити це вікно і вікно Build Results. Виконати програмування мікроконтролера, натиснувши у вікні MPLAB ICD кнопку Program.
Виконати пуск програми, натиснувши клавішу F9 або кнопку зеленого світлофора.
Підключити вольтметр до входу RA0/AN0 АЦП і загального виводу. Змінюючи викруткою положення змінного резистора R56, встановлювати за показами вольтметра значення напруг, обчислених за формулою:
U(i) = 0,05*i*N, для і = 0, 1, 2, ..., 10, де N – номер бригади.
Для кожної встановленої напруги записати з цифрового індикатора результат АЦ перетворення у шістнадцятковій формі. Отримані значення занести в таблицю 8.1. Перевести шістнадцяткові коди у десяткові. Розрахувати значення аналогових напруг, відповідних цим кодам з формули лінійного перетворення:
, (1)
де U*(i) – аналогова напруга, відповідна коду;U+таU–– позитивна і негативна опорні напруги (U+= 5 В,U–= 0); С(і) – десятковий код з таблиці; С+, С–– коди, що відповідають позитивній і негативній опорним напругам (С+= 255, С–= 0). Для зручності розрахунку треба перетворити (1) до виглядуU*(i) =f [С(і)].
Обчислити приведену похибку: .
Результати занести в таблицю 27.1.