Федеральне агентство з атомної енергії
Снежинская державна фізико-технічна академія
Кафедра АІВС
ПОЯСНЮВАЛЬНА ЗАПИСКА
До курсової роботи
з дисципліни: «Мікропроцесорні пристрої».
Група
Студент ______________
(Підпис)
Викладач ________
(Підпис)
Снежинск
2007
Анотація
Мета роботи: реалізувати вимірювач тривалості натискання клавіші.
У процесі роботи над курсовим проектом потрібно здійснити:
- Вивчення завдання;
- Розробка алгоритму;
- Реалізація на PIC-контролері;
- Оформлення пояснювальної записки до курсового проекту
Зміст
1. Постановка завдання
2. Текст програми
3. Граф-схема алгоритму
4. Принципова електрична схема
5. Специфікація
6. Список літератури
1. Постановка завдання
Виміряти тривалість натискання кнопки. Виміряні значення зберігати в ОЗУ мікро c хеми PCF 8583. Виміряні значення вивести на РК - дисплей.
2. Текст програми
LIST P = 16F84f
INCLUDE <P16F84.INC>
count EQU 0x10
count1 EQU 0x20
count2 EQU 0x21
LCDcfg EQU 0x22
LCDout EQU 0x23
Time EQU 0x11
temp EQU 0x12
DATA_I2C EQU 0x34
TX_Buffer EQU 0x32
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC
GOTO START
Підпрограма запису байта control по шині I2C
Write_I2C
CALL Start_Bit_I2C; Видача на шину I2C Start Bit
Адреса годин з встановленим бітом для запису
MOVLW 0 xA 0
CALL Transmit _ Data
Внутрішній адресу годин для запису
MOVLW 0 x 00; адреса для запису
CALL Transmit_Data; на шину I2C ...
MOVF DATA_I2C, w; Видача даних
CALL Transmit_Data; на шину I2C ...
CALL Stop_Bit_I2C; Видача на шину I2C Stop Bit
RETURN
Підпрограма скидання лічильника секунд на годиннику PCF 8583
Write_time_I2C
CALL Start_Bit_I2C; Видача на шину I2C Start Bit
Адреса годин з встановленим бітом для запису
MOVLW 0xA0
CALL Transmit _ Data
Запис регістра з якого читають з встановленим бітом на запис
MOVLW 0x02
CALL Transmit_Data
MOVLW 0x00
CALL Transmit_Data
MOVLW 0x00
CALL Transmit_Data
CALL Stop_Bit_I2C; Видача на шину I2C Stop Bit
RETURN
Підпрограма читання результатів вимірювання з ОЗУ PCF 8583
Read_Saved_I2C
CALL Start_Bit_I2C; Видача на шину I2C Start Bit
адреса годин з встановленим бітом для запису
MOVLW 0xA0
CALL Transmit _ Data
Запис регістра з якого читають з встановленим бітом на запис
MOVLW 0x11
CALL Transmit _ Data
Нова стартова послідовність
CALL Start_Bit_I2C; Видача на шину I2C Start Bit
Адреса годин з встановленим бітом для читання
MOVLW 0xA1
CALL Transmit_Data
CALL Receive_data
CALL Stop_Bit_I2C; Видача на шину I2C Stop Bit
RETURN
Підпрограма запису результатів вимірювання в ОЗУ PCF 8583
Save_time_I2C
MOVWF Time
CALL Start_Bit_I2C; Видача на шину I2C Start Bit
Адреса годин з встановленим бітом для запису
MOVLW 0xA0
CALL Transmit_Data
Запис регістра з якого читають з встановленим бітом на запис
MOVLW 0x10
CALL Transmit_Data
Нова стартова послідовність
CALL Start_Bit_I2C; Видача на шину I2C Start Bit
Адреса годин з встановленим бітом для читання
MOVLW 0xA0
CALL Transmit_Data
MOVLW 0x10
CALL Transmit_Data
MOVF Time, W
CALL Transmit_Data
MOVF Time, W
CALL Transmit_Data
CALL Stop_Bit_I2C; Видача на шину I2C Stop Bit
RETURN
Підпрограма читання секунд з годин PCF 8583
Read_I2C
CALL Start_Bit_I2C; Видача на шину I2C Start Bit
Адреса годин з встановленим бітом для запису
MOVLW 0 xA 0
CALL Transmit_Data
Запис регістра з якого читають з встановленим бітом на запис
MOVLW 0 x 02
CALL Transmit _ Data
Нова стартова послідовність
CALL Start_Bit_I2C; Видача на шину I2C Start Bit
Адреса годин з встановленим бітом для читання
MOVLW 0xA1
CALL Transmit_Data
CALL Receive_data
CALL Stop_Bit_I2C; Видача на шину I2C Stop Bit
RETURN
Підпрограма читання байти з шини IIC
Receive _ data
CLRF DATA_I2C
MOVLW 8
MOVWF temp
BCF STATUS, 5
BCF PORTB, 4; SDA - вхід
BCF STATUS, 5
RX_Data_LP
RLF DATA_I2C, 1
BCF PORTB, 5
NOP
NOP
NOP
NOP
NOP
BCF DATA_I2C, 0
BTFSS PORTB, 4
BCF DATA_I2C, 0
BCF PORTB, 5
DECFSZ temp, 1
GOTO RX_Data_LP
Відправлення біта підтвердження ASK = 1
BCF STATUS, 5
BCF PORTB, 4; SDA - вихід
BCF STATUS, 5
BCF PORTB, 4
NOP
BCF PORTB, 5
NOP
NOP
NOP
NOP
BCF PORTB, 5
RETURN
Підпрограма передачі байта по шині I 2 C
Transmit_Data
MOVWF TX_Buffer
MOVLW 8
MOVWF temp
BCF STATUS, 5; вибір банку 1
BCF PORTB, 4; SDA - вихід
BCF STATUS, 5; вибір банку 0
BCF PORTB, 5
TX_Data_LP
BTFSS TX_Buffer, 7
GOTO TX_Data_Lo; bits 7 = 0
BCF PORTB, 4
GOTO TX_Data_LP1
TX_Data_Lo
BCF PORTB, 4
TX_Data_LP1
BCF PORTB, 5
NOP
NOP
NOP
NOP
BCF PORTB, 5
RLF TX_Buffer, 1
DECFSZ temp, 1
GOTO TX_Data_LP
RLF TX _ Buffer, 1
BCF PORTB, 4
Читання біта підтвердження - ASK
BCF STATUS, 5
BCF TRISB, 4; PORTB, 4 - вхід
BCF STATUS, 5
BCF PORTB, 5
NOP
NOP
NOP
NOP
NOP
BTFSC PORTB, 4
NOP
BCF PORTB, 5
RETURN
Підпрограма організації стартовою бітової послідовності
Start_Bit_I2C
BCF PORTB, 4
BCF STATUS, 5; вибір 1 банку
BCF PORTB, 4; SDA - як вихід даних з MCU в
EEPROM
BCF STATUS, 5; вибір 0 банку
BCF PORTB, 4
NOP
NOP
NOP
NOP
BCF PORTB, 5
NOP
NOP
NOP
NOP
NOP
BCF PORTB, 4
NOP
NOP
NOP
NOP
NOP
BCF PORTB, 5
RETLW 0
Підпрограма організації стопою бітової послідовності
Stop_Bit_I2C
BCF PORTB, 4
BCF STATUS, 5; вибір 1 банку
BCF PORTB, 4; SDA - як вихід даних з MCU в
; EEPROM
BCF STATUS, 5; вибір 0 банку
BCF PORTB, 4
NOP
NOP
BCF PORTB, 5
NOP
NOP
BCF PORTB, 4
NOP
NOP
RETURN
################################################## ##########
Підпрограми для організації затримок
Wait250ms
MOVLW 0x77, 250 мс
MOVLW count2
c03 MOVLW 0x02
MOVWF count
c02 MOVLW 0x1F
MOVWF count1
c01 DECFSZ count1
GOTO c01
DECFSZ count
GOTO c02
DECFSZ count2
GOTO c03
RETURN
Wait100
MOVLW 0x02; 100 мкс
MOVWF count1
w50 MOVLW 0x14
MOVWF count
c24 DECFSZ count
GOTO c24
DECFSZ count1
GOTO w50
RETURN
Wait50
MOVLW 0x14, 50 мкс
MOVWF count
c13 DECFSZ count
GOTO c13
RETURN
Wait15
MOVLW 0x06; 4 мкс
MOVWF count
c15 DECFSZ count
GOTO c15
RETURN
Wait160
MOVLW 0x35; 160 мкс
MOVWF count
c16 DECFSZ count
GOTO c16
RETURN
Wait1k; 1 сек
MOVLW 0x04
MOVWF count2
w2 MOVLW 0xE0
MOVWF count1
w1 DECFSZ count1
GOTO w1
DECFSZ count2
GOTO w2
RETURN
################################################## ###############
Підпрограма виводу байта на РК екран
NumOut
MOVWF temp
BCF temp, 7, 0 Формуємо
BCF temp, 6, 0 номер
BCF temp, 5, 1 стовпця
BCF temp, 4, 1 містить символи для виведення
BCF LCDcfg, 0
MOVF temp, W
CALL LCD _ write; Виводимо спочатку старшу тетраду
RETURN
Підпрограма записи по лініях даних молодшої тетради.
LCD_writehalf
MOVWF LCDout
BCF STATUS, RP0
BCF PORTA, 4
ALL Wait250ms
MOVF LCDout, W
MOVWF PORTA
BCF PORTB, 0
CALL Wait160
BCF PORTB, 0
CLRF PORTB
CLRF PORTA
RETURN
Підпрограма записи по лініях даних цілого байта.
LCD _ write
BCF STATUS, RP 0
MOVWF LCDout
SWAPF LCDout, W;
MOVWF PORTA
BTFSS LCDcfg, 0
BCF PORTA, 4
BTFSC LCDcfg, 0
BCF PORTA, 4
BCF PORTB, 0
BTFSS LCDcfg, 0
CALL Wait250ms
BTFSC LCDcfg, 0
CALL Wait50
BCF PORTB, 0
MOVF LCDout, W
MOVWF PORTA
BTFSS LCDcfg, 0
BCF PORTA, 4
BTFSC LCDcfg, 0
BCF PORTA, 4
BCF PORTB, 0
BTFSS LCDcfg, 0
CALL Wait250ms
BTFSC LCDcfg, 0
CALL Wait50
BCF PORTB, 0
CALL Wait250ms
RETURN
Підпрограма попередньої ініціалізації РК екрану.
IniLCD
MOVLW 0 x 0 E
wait _ power
CALL Wait1k
DECFSZ temp
GOTO wait_power
BCF LCDcfg, 0
MOVLW 0x03
CALL LCD_writehalf
CALL Wait250ms
MOVLW 0x03
CALL LCD_writehalf
CALL Wait160
BCF LCDcfg, 0
MOVLW 0x03
CALL LCD_writehalf
CALL Wait50
MOVLW 0x02
CALL LCD_writehalf
CALL Wait50
MOVLW 0x20
CALL LCD_write
CALL Wait50
MOVLW 0x20
CALL LCD_write
CALL Wait50
MOVLW 0x0E
CALL LCD_write
CALL Wait50
MOVLW 0x0F
CALL LCD_write
CALL Wait50
MOVLW B'00011111 '
CALL LCD_write
CALL Wait50
MOVLW B'10000000 '
CALL LCD_write
CALL Wait50
BCF LCDcfg, 0 MOVLW B '00000110 '; установка напрямок переміщення курсору РК екрану
CALL LCD_write
MOVLW 0 x 02;
Встановити курсор в початковий стан.
CALL LCD _ write
MOVLW 0 x 01;
Очищення РК екрану
CALL LCD _ write
CALL Wait250ms
CALL Wait250ms
CALL Wait250ms
RETURN
Підпрограма виведення часу
OutTime
BCF LCDcfg, 0
MOVLW 0 x 02; встановити курсор в початковий стан.
CALL LCD_write
CALL Read_I2C
SWAPF DATA_I2C, W
CALL NumOut
MOVF DATA_I2C, W
CALL NumOut
CALL Save _ time _ I 2 C; зберігаємо результат вимірювань в ОЗУ
PCF 8583
RETURN
Підпрограма виводу та збереження результатів вимірювання
GetTime
BCF LCDcfg, 0
MOVLW 0x02; встановити курсор в початковий стан.
CALL LCD_write
CALL Read_I2C; read seconds from clock
MOVF DATA_I2C, W
MOVWF Time
CALL Save _ time _ I 2 C; зберігаємо результат вимірювань в ОЗУ
PCF 8583
CALL Read_Saved_I2C; зчитуємо результат вимірювань з ОЗУ
PCF 8583
SWAPF DATA_I2C, W
CALL NumOut; виводимо на РК екран результат вимірювань
MOVF DATA _ I 2 C, W
CALL NumOut; виводимо на РК екран результат вимірювань
RETURN
Основна підпрограма
START
CLRF PORTB
CLRF PORTA
BCF STATUS, RP 0
Налаштування портів
MOVLW B'11100000 '
MOVWF TRISA & 0x7F
MOVLW B'11001100 '
MOVWF TRISB
BCF OPTION_REG, 7
CALL IniLCD;
Виклик підпрограми попередньої ініціалізації РК екрану.
BCF STATUS, RP0; вибір 0го банку пам'яті
CALL Read_Saved_I2C; зчитуємо результат вимірювань з ОЗУ
PCF 8583 при збереженні
SWAPF DATA_I2C, W
CALL NumOut; виводимо на РК екран результат вимірювань
OVF DATA_I2C, W
CALL NumOut; виводимо на РК екран результат вимірювань
MZ
BTFSC PORTB, 3
GOTO MZ; перехід до MZ, кнопка не натиснута
CALL Write_time_I2C; то викликаємо підпрограму обробки режиму скидання лічильника, початок відліку
M1
BTFSS PORTB, 3
GOTO M1; перехід до M1, кнопка натиснута, очікування відпускання кнопки
Якщо відпустили кнопку,
CALL GetTime;
Підпрограма виводу та збереження результатів вимірювання
CALL Wait250ms
GOTO MZ; зациклення програми
END
4. Принципова електрична схема
5. Специфікація
Позиція | Тип, номінал | Кол. | Примітка |
|
| шт. |
|
| Конденсатори |
|
|
С1 | 25В - 10,0 мкФ | 1 |
|
С2 | SMD 1206 - 0,1 мкФ | 1 |
|
|
|
|
|
| Мікросхеми |
|
|
DD1 | РКІ HD44780 | 1 |
|
DD2 | Годинник реального часу PCF 8583 | 1 |
|
|
|
|
|
|
|
|
|
| Резистори |
|
|
R1 | 1 кОм | 1 |
|
R2 | 5,1 кОм | 1 |
|
R3 | 5,1 кОм | 1 |
|
R 4 | 1 кОм | 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| Інші елементи |
|
|
Z1 | Кварцовий резонатор 32768 Гц | 1 |
|
SB 3 | Кнопки ПКН - 159 | 1 |
|
SW1.1 | перемикач | 1 |
|
SW1.2 | перемикач | 1 |
|
XC1 | роз'єм | 1 |
|
XC2 | роз'єм | 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6. Список літератури
Яценків В.С. - Мікроконтролери MicroChip Практичне керуючи-ство (2002 рік).
Майкл Предко. - Довідник з PIC - мікроконтролерів: Пер. з англ. - М.: ДМК Пресс, 2006. - 512с.: Іл. (Серія «Довідник»)
Курс лекцій.