Đểkhởi tạo chức năng pwm, đầu tiên ta phải cấu hình cho PORTC2 là output. Tiếp
theo khởi tạo chu kì của PWM thông qua việc cấu hình thanh ghi PR2. Sau đó ta khởi tạo
duty cycle của xung pwm bằng cách cấu hình thanh ghi CCPR1L.
71 trang |
Chia sẻ: chaien | Lượt xem: 1788 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Thí nghiệm vi xử lý - Vi điều khiển, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
timer 0 sau 1s khi 3 led được bật ở trong ngắt ngoài thì tắt 3
led đơn RB1, RB2, RB3 cùng lúc.
2. Viết chương trình hiển thị kí tự lên LCD.
3.1 Kiến thức liên quan
3.1.1 Tóm tắt các thanh ghi điều khiển ngắt
Thanh ghi INTCON:
Thanh ghi PIE1:
Thanh ghi PIE2:
Thanh ghi PIR1:
Thanh ghi PIR2:
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 22 Thực hành Vi xử lý
Sơ đồ điều khiển ngắt:
3.2 Các bước hiện thực yêu cầu 1
Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Interrupt,
tạo file interrupt.asm và chọn chip 18f4520. Ta được hình sau:
Bước 2. Include file p18f4520.inc vào file interrupt.asm
Bước 3. Khởi tạo PortB là output sử dụng các lệnh clrf, bcf
init clrf LATB ; RB1-RB3 la cong xuat
movlw 0x0F
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 23 Thực hành Vi xử lý
movwf ADCON1
bsf TRISB,RB0
bcf TRISB,RB1
bcf TRISB,RB2
bcf TRISB,RB3
movlw .10 ; khoi dong bien delay=10
movwf delay
return
Bước 4. Khởi tạo timer 0 tạo ngắt 100 ms (với xung clock 4 MHz, chọn prescaler 2:1, số
đếm 50000), cho ngắt timer 0 có độ ưu tiên thấp.
init_timer0
bsf RCON,IPEN ; cho phep uu tien ngat.
bcf INTCON2,TMR0IP ; timer0 uu tien thap
bcf INTCON,TMR0IF ; xoa co ngat timer0
bsf INTCON,TMR0IE ; cho phep ngat timer0
bsf INTCON,GIEH ; cho phep ngat uu tien cao
bsf INTCON,GIEL ; cho phep ngat uu tien thap
clrf T0CON ; prescaler 2:1
movlw HIGH (-50000) ; nap so dem 50000 cho timer0
movwf TMR0H
movlw LOW (-50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phep timer0 dem
return
Bước 5. Khởi tạo ngắt ngoài 0 tích cực cạnh xuống.
Đối với ngắt ngoài INT1 và INT2, độ ưu tiên phụ thuộc vào 2 bit INT1IP và INT2IP
trong thanh ghi INTCON3. Còn với ngắt ngoài INT0 thì độ ưu tiên luôn là cao.
init_int0
bcf INTCON2,INTEDG0 ; tac dong canh xuong
bcf INTCON,INT0IF ; xoa co ngat
bsf INTCON,INT0IE ; cho phep ngat ngoai INT0
return
Bước 6. Viết chương trình cho ngắt ngoài 0, bật 3 đèn led đơn cùng sáng và khởi tạo lại
giá trị cho biến delay để 1s sau thì ngắt timer sẽ tắt 3 đèn đó.
int0_isr
bcf INTCON,INT0IF
bsf LATB,RB1
bsf LATB,RB2
bsf LATB,RB3
movlw .10
movwf delay
return
Bước 7. Viết chương trình cho ngắt timer0, sau 1s sau khi led được bật sáng thì nó sẽ
làm cho led tắt.
Thời gian để timer đếm lên 1 đơn vị đựơc tính bằng công thức :
t = (1/(Focs/4))*prescaler = (1/(4Mhz/4))*2) =2μs
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 24 Thực hành Vi xử lý
Như vậy, muốn có thời khoảng 100 ms (100000μs), ta cần đếm 50000 lần.
timer0_isr
bcf INTCON,TMR0IF
decfsz delay,1
bra timer0_isr_1
bcf LATB,RB1
bcf LATB,RB2
bcf LATB,RB3
movlw .10
movwf delay
timer0_isr_1
bcf T0CON,TMR0ON
movlw HIGH (-50000) ; nap lai so dem 50000 cho timer0
movwf TMR0H
movlw LOW (-50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phep timer0 dem lai
return
3.3 Chương trình mẫu yêu cầu 1
;=====================================;
; Name: led_don.asm
; Project: Viết chương trình khởi tạo 2 ngắt:
; -Ngắt ngoài 0 với độ ưu tiên cao.
; -Ngắt timer 0 với độ ưu tiên thấp.
; -Ngắt INT0 : bật 3 led đơn RB1, RB2, RB3 sáng cùng ;lúc
; -Ngắt timer0 : tắt 3 led đơn RB1, RB2, RB3 sau 1s
; Author: BKIT HARDWARE CLUB
; Homepage:
; Creation Date: 7 - 31 - 2009
;======================================;
list p = 18f4520
#include P18f4520.inc
code 0
goto main
org 08H
goto isr_high
org 18H
goto isr_low
; Vung du lieu
udata
delay res 1
; Vung bat dau code
PRG code
main
call init
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 25 Thực hành Vi xử lý
call init_timer0
call init_int0
goto $
; Ham khoi dong ban dau
init clrf LATB ; RB1-RB3 la cong xuat
movlw 0x0F
movwf ADCON1
bsf TRISB,RB0
bcf TRISB,RB1
bcf TRISB,RB2
bcf TRISB,RB3
movlw .10 ; khoi dong bien delay=10
movwf delay
return
; Ham khoi dong timer0
init_timer0
bsf RCON,IPEN ; cho phep uu tien ngat.
bcf INTCON2,TMR0IP ; timer0 uu tien thap
bcf INTCON,TMR0IF ; xoa co ngat timer0
bsf INTCON,TMR0IE ; cho phep ngat timer0
bsf INTCON,GIEH ; cho phep ngat uu tien cao
bsf INTCON,GIEL ; cho phep ngat uu tien thap
clrf T0CON ; prescaler 2:1
movlw HIGH (-50000) ; nap so dem 50000 cho timer0
movwf TMR0H
movlw LOW (-50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phep timer0 dem
return
; Ham khoi dong int0
init_int0
bcf INTCON2,INTEDG0 ; tac dong canh xuong
bcf INTCON,INT0IF ; xoa co ngat
bsf INTCON,INT0IE ; cho phep ngat ngoai INT0
return
; Ham xu ly ngat timer0
timer0_isr
bcf INTCON,TMR0IF
decfsz delay,1
bra timer0_isr_1
bcf LATB,RB1
bcf LATB,RB2
bcf LATB,RB3
movlw .10
movwf delay
timer0_isr_1
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 26 Thực hành Vi xử lý
bcf T0CON,TMR0ON
movlw HIGH (-50000) ; nap lai so dem 50000 cho timer0
movwf TMR0H
movlw LOW (-50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phep timer0 dem lai
return
; Ham xu ly ngat int0
int0_isr
bcf INTCON,INT0IF
bsf LATB,RB1
bsf LATB,RB2
bsf LATB,RB3
movlw .10
movwf delay
return
; Ham xu ly ngat uu tien cao
isr_high
call int0_isr
retfie
; Ham xu ly ngat uu tien thap
isr_low
call timer0_isr
retfie
end
Sau khi có chương trình mẫu ta thực hiện việc compile chương trình và nạp xuống
mạch để chạy chương trình như hướng dẫn ở chương 1.
3.4 LCD ký tự 2x16
3.4.1 Hình dạng và ý nghĩa các chân:
Tên chân Mức logic Mô tả
GND - Đất (0V)
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 27 Thực hành Vi xử lý
VCC - Nguồn (+5V)
VEE - Chỉnh contrast (0 – VCC)
RS 0
1
D0-D7 là giá trị lệnh
D0-D7 là giá trị dữ liệu
R/W 0
1
Ghi giá trị vào LCD
Đọc giá trị ra từ LCD
E 0
1
Từ 1 xuống 0
Cấm truy xuất LCD
LCD hoạt động trao đổi dữ liệu
Dữ liệu/Lệnh đưa vào LCD
D0 0/1 Bit 0/LSB
D1 0/1 Bit1
D2 0/1 Bit2
D3 0/1 Bit3
D4 0/1 Bit4
D5 0/1 Bit5
D6 0/1 Bit6
D7 0/1 Bit7/MSB
A - Chân Anode của đèn nền
K - Chân Cathode của đèn nền
3.4.2 Tổ chức vùng nhớ của LCD
Display Data Ram (DDRAM): lưu trữ mã ký tự hiển thị ra màn hình. Mã này giống
với mã ASCII. Có tất cả 80 ô nhớ DDRAM. Vùng hiển thị tương ứng với cửa sổ gồm 16
ô nhớ hàng đầu tiên và 16 ô nhớ hàng thứ hai. Chúng ta có thể tạo hiệu ứng dịch chữ
bằng cách sử dụng lệnh dịch (mô tả sau), khi đó cửa sổ hiển thị sẽ dịch đem lại hiệu ứng
dịch chữ.
Character Generator Ram (CGRAM): lưu trữ tám mẫu ký tự do người dùng định
nghĩa. Tám mẫu ký tự này tương ứng với các mã ký tự D7-D0 = 0000*D2D1D0 (* mang
giá trị tùy định 0 hay 1).
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 28 Thực hành Vi xử lý
Character Generator Rom (CGROM): lưu trữ cứng các mẫu ký tự tương ứng với mã
ASCII. Dưới đây là bảng ánh xạ giữa mã ký tự và mẫu ký tự.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 29 Thực hành Vi xử lý
Chúng ta muốn hiển thị chữ “CE” ở giữa hàng đầu tiên, giả sử cửa sổ hiển thị đang
bắt đầu từ vị trí đầu tiên (hàng thứ nhất hiển thị dữ liệu của ô nhớ từ 0x00 đến 0x0f, hàng
thứ hai hiển thị dữ liệu của ô nhớ từ 0x40 đến 0x4f, đây là vị trí home). Giá trị của ô nhớ
0x07 là 0x43 (ký tự C), của ô nhớ 0x08 là 0x45 (ký tự E).
Chúng ta muốn hiển thị chữ “®” ở giữ hàng thứ hai, giả sử cử sổ hiển thị đang ở vị trí
home. Trong bảng mẫu ký tự chúng ta thấy không có mẫu “®”. Lúc này chúng ta phải
định nghĩa mẫu “®” 5x8 điểm, gồm có 8 byte, sau đó lưu vào vị trí của mẫu ký tự
CGRAM thứ nhất. Lúc này giá trị của ô nhớ 0x47 là 0x00 hoặc 0x08 (vị trí của mẫu ký
tự CGRAM thứ nhất “®”).
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 30 Thực hành Vi xử lý
3.4.3 Các lệnh giao tiếp với LCD
Lệnh RS RW D7 D6 D5 D4 D3 D2 D1 D0 Thời gian thực thi
Clear display
0 0 0 0 0 0 0 0 0 1 1.52ms
Return home
0 0 0 0 0 0 0 0 1 * 1.52ms
Entry mode set
0 0 0 0 0 0 0 1 I/D SH 37µs
Display on/off
control 0 0 0 0 0 0 1 D C B 37µs
Cursor/Display
shift 0 0 0 0 0 1
S/
C
R/
L * * 37µs
Function set
0 0 0 0 1 DL N F * * 37µs
Set CGRAM
address 0 0 0 1 CGRAM address 37µs
Set DDRAM
address 0 0 1 DDRAM address 37µs
Read BUSY flag
(BF) 0 1 BF DDRAM address 0µs
Write to
DDRAM or
CGRAM
1 0 D7 D6 D5 D4 D3 D2 D1 D0 43µs
Read from
DDRAM or
CGRAM
1 1 D7 D6 D5 D4 D3 D2 D1 D0 43µs
Các bit trên bảng tóm tắt các lệnh có ý nghĩa như sau:
I/D 1 Increment 0 Decrement
SH 1 Entire shift on 0 Entire shift off
S/C 1 Display shift 0 Cursor move
R/L 1 Shift to the Right 0 Shift to the Left
DL 1 8 bits 0 4 bits
N 1 2 Lines 0 1 Lines
F 1 5x10 dots Font 0 5x8 dots Font
BF 1 Internally operating 0 Can accept instruction
Trên kit thí nghiệm LCD ký tự 2x16 được kết nối vào Port D ở chế độ 4 bit. Ở chế độ
4 bit, để đọc hay ghi một byte phải tiến hành cài dữ liệu hai lần, lần đầu là 4 bit cao, lần
thứ hai là 4 bit thấp.
3.4.4 Khởi tạo LCD
Sơ đồ kết nối LCD:
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 31 Thực hành Vi xử lý
Q2
MMBT2222A
VCC
R20 2.2K
RD7
RD4
RD5
RD6
Vss
1
Vdd
2
Vee
3
RS
4
R/W
5
E
6
D0
7
D1
8
D2
9
D3
10
D4
11
D5
12
D6
13
D7
14
A
15
K
16
LCD1
RD3
RD2
RD1
RD0
LCD ký tự 2x16
Trước khi xuất ký tự ra màn hình LCD, LCD controller phải được khởi tạo khi mới
được cấp nguồn. Trình tự khởi tạo như lược đồ sau. Trên lược đồ, lệnh “Display clear” có
giá trị 0x01 được gửi hai lần, lần đầu là 4 bit cao có giá trị 0x0, lần thứ hai là bốn bit thấp
có giá trị 0x01. Lệnh “Function set” gửi hai lần giá trị 0x2.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 32 Thực hành Vi xử lý
Bật nguồn
(chân PD7 out ra mức logic 1)
Chờ tối thiểu 30ms
(Đợi VDD > 4.5V)
Gửi lệnh
“Function set”
RS RW D7 D6 D5 D4
0 0 0 0 1 0
0 0 0 0 1 0
0 0 N F * *
Chờ tối thiểu 39µs
0 0 0 0 0 0
0 0 1 D C B
Chờ tối thiểu 39µs
0 0 0 0 0 0
0 0 0 0 0 1
Kết thúc khởi tạo
0 0 0 0 0 0
0 0 0 1 I/D SHGửi lệnh “Display on/off control”
RS RW D7 D6 D5 D4
Gửi lệnh
“Entry mode set”
RS RW D7 D6 D5 D4
Gửi lệnh
“Display clear”
RS RW D7 D6 D5 D4
3.5 Các bước hiện thực yêu cầu 2
Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là LCD, tạo
file lcd.asm và chọn chip 18f4520. Ta được hình sau:
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 33 Thực hành Vi xử lý
Bước 2. Include file p18f4520.inc vào file lcd.asm
Bước 3. Dựa vào sơ đồ nguyên lý kết nối vi điều khiển với LCD kí tự ta define lại để dễ
dàng sử dụng hơn.
#define LCD_D4 LATD, RD0 ; LCD data bits
#define LCD_D5 LATD, RD1
#define LCD_D6 LATD, RD2
#define LCD_D7 LATD, RD3
#define LCD_D4_DIR TRISD, RD0 ; LCD data bits
#define LCD_D5_DIR TRISD, RD1
#define LCD_D6_DIR TRISD, RD2
#define LCD_D7_DIR TRISD, RD3
#define LCD_E LATD, RD6 ; LCD E clock
#define LCD_RW LATD, RD5 ; LCD read/write line
#define LCD_RS LATD, RD4 ; LCD register select line
#define LCD_E_DIR TRISD, RD6
#define LCD_RW_DIR TRISD, RD5
#define LCD_RS_DIR TRISD, RD4
#define LCD_INS 0
#define LCD_DATA 1
Bước 4. Viết hàm xuất dữ liệu 4 bit ra cho LCD kí tự :
LCDWriteNibble
btfss STATUS, C ; Set the register select
bcf LCD_RS
btfsc STATUS, C
bsf LCD_RS
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 34 Thực hành Vi xử lý
bcf LCD_RW ; Set write mode
bcf LCD_D4_DIR ; Set data bits to outputs
bcf LCD_D5_DIR
bcf LCD_D6_DIR
bcf LCD_D7_DIR
nop ; Small delay
nop
bsf LCD_E ; Setup to clock data
nop
nop
btfss temp_wr, 7 ; Set high nibble
bcf LCD_D7
btfsc temp_wr, 7
bsf LCD_D7
btfss temp_wr, 6
bcf LCD_D6
btfsc temp_wr, 6
bsf LCD_D6
btfss temp_wr, 5
bcf LCD_D5
btfsc temp_wr, 5
bsf LCD_D5
btfss temp_wr, 4
bcf LCD_D4
btfsc temp_wr, 4
bsf LCD_D4
nop ; Small delay
nop
bcf LCD_E ; Send the data
return
Bước 5. Tiếp tục ta viết hàm để truyền lệnh (command) cho lcd kí tự.
Macro LCDWrite_command có một đối số là data, ta dùng đối số này để truyền lệnh
cho lcd. Ở đây, LCD ta thiết lập chế độ 4 bít nên khi truyền lệnh nó cũng chỉ cần 4 bit để
điều khiển. Trong macro này data1 chỉ sử dụng 4 bit cao mà thôi.
LCDWrite_command macro data1
bcf LCD_RS ;write command
movlw data1
movwf temp_wr
call LCDWriteNibble
movlw 0xF
movwf delay
rcall DelayXCycles
endm
Bước 6. Sau đó viết thêm hàm truyền dữ liệu hiển thị ra LCD kí tự.
Macro LCDWrite_data có một đối số là data1, ta dùng macro với đối số tương ứng để
truyền data hiển thị lên màn hình LCD. Như trên ta đã đề cập, trong ứng dụng này ta sử
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 35 Thực hành Vi xử lý
dụng LCD chế độ 4 bít, nên data ở đây được truyền theo thứ tự là 4 bit cao truyền trước
sau đó 4 bít thấp được truyền sau.
LCDWrite_data macro data1
bsf LCD_RS ;write data
movff data1,temp_wr
rcall LCDBusy
bsf STATUS, C
rcall LCDWrite
movlw 0x0F ;Wait ~100μs @ 20 MHz
movwf delay
rcall DelayXCycles
endm
Bước 7. Hàm quan trọng nhất của LCD kí tự chính là hàm khởi tạo LCD. Trước khi sử
dụng được lcd ta phải khởi tạo cho nó theo như giản đồ khởi tạo lcd ở trên phần
hướng dẫn lý thuyết. Ngoài ra do thiết kế mạch, để LCD có thể hiện thị bình
thường trước tiên ta phải bật nguồn của LCD lên, chân nguồn của LCD được
điều khiển bởi PortD.7 tích cực mức cao, nên trước khi muốn sử dụng LCD ta
phải bật PortD.7 lên 1.
LCDInit1
call init_variable
bsf LATD, RD7
bcf TRISD, RD7
bcf LCD_E_DIR ;configure control lines
bcf LCD_RW_DIR
bcf LCD_RS_DIR
movlw b'00001110'
movwf ADCON1
movlw 0xff ; Wait ~15ms @ 20 MHz
movwf COUNTER
lil11
movlw 0xFF
movwf delay
rcall DelayXCycles
decfsz COUNTER,F
bra lil11
LCDWrite_command 0x20
LCDWrite_command 0x20
LCDWrite_command 0x80
LCDWrite_command 0x00
LCDWrite_command 0xf0
LCDWrite_command 0x00
LCDWrite_command 0x10
call LongDelay ;2ms
call LongDelay ;2ms
LCDWrite_command 0x00
LCDWrite_command 0x20
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 36 Thực hành Vi xử lý
call Lcd_clear
return
Bước 8. Đến đây ta có thể viết chương trình để hiển thị kí tự lên lcd kí tự.
Ý tưởng thực hiện ở đây là lúc đầu ta khai báo một vùng nhớ gồm 32 ô nhớ tương
ứng với 32 vị trí trên lcd kí tự. Hàm lcd_display của chúng ta sẽ thực hiện một việc đơn
giản là lấy dữ liệu chứa trong vùng nhớ này ra hiển thị lên lcd kí tự. Còn người dùng
muốn hiển thị lên lcd thì chỉ cần update giá trị vào vùng nhớ này là xong.
Lcd_display
movff INDF0,temp_wr1
movlw .0
cpfseq temp_wr1
goto Lcd_display1
movlw 0x20
movwf temp_wr1
Lcd_display1
LCDWrite_data temp_wr1
incf FSR0L
clrf WREG
addwfc FSR0H, F
movlw .0
cpfseq flag_line
goto Lcd_display_line2
;display line1
incf index_of_lcd
molw MAX_INDEX
cpfseq index_of_lcd
goto Exit_Lcd_display
clrf Index_of_lcd
movlw .1
movwf flag_line
Set_cursor .0,.1
goto Exit_Lcd_display
;display line2
Lcd_display_line2
incf index_of_lcd
movlw MAX_INDEX
cpfseq index_of_lcd
goto Exit_Lcd_display
clrf Index_of_lcd
movlw .0
movwf flag_line
movlw HIGH Lcd_buffer
movwf FSR0H
movlw LOW Lcd_buffer
movwf FSR0L
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 37 Thực hành Vi xử lý
Set_cursor .0, .0
Exit_Lcd_display
return
3.6 Bài tập
a) Viết chương trình kiểm tra phát hiện rung phím RA4.
b) Viết chương trình chạy chữ qua LCD.
c) Viết chương trình thay đổi chữ hiển thị trên LCD khi nhấn nút.
3.7 Báo cáo
a) Bố cục của chương trình có sử dụng ngắt quãng.
b) Dùng ngắt ngoài đọc trạng thái nút nhấn RA4 có bị rung không ? Làm sao biết để
chống rung ?
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 38 Thực hành Vi xử lý
Bài 4 : Khảo sát bộ định thời
Nội dung:
Khảo sát các chế độ hoạt động của các bộ định thời.
Khảo sát các thanh ghi điều khiển bộ định thời.
Sử dụng bộ định thời trong chương trình.
Yêu cầu:
Sử dụng bộ timer0 cứ sau 1s đếm lên 1 đơn vị rồi xuất giá trị ra led đơn.
Viết chương trình sử dụng bộ định thời làm đồng hồ điều khiển đèn giao thông.
4.1 Các bước hiện thực yêu cầu 1
Bước 1. Tạo project mới tên timer.
Bước 2. Tạo tập tin nguồn timer.asm.
Bước 3. Khởi tạo PORTB là cổng xuất.
init clrf PORTB ; toàn bộ PORTB là cổng xuất
clrf TRISB
return
Bước 4. Khởi tạo các vector ngắt.
Địa chỉ 0x00 bắt đầu chương trình chính.
Địa chỉ 0x08 địa chỉ của vector ngắt có độ ưu tiên cao.
Địa chỉ 0x18 địa chỉ của vector ngắt có độ ưu tiên thấp.
code 0
goto main
org 0x000008 ; vector ngắt ưu tiên cao
goto isr_high
org 0x000018 ; vector ngắt ưu tiên thấp
goto isr_low
; Vùng định nghĩa dữ liệu
udata
bien res 1
; Vùng bắt đầu code
PRG code
main
call init
. . .
; chương trình phục vụ ngắt ưu tiên cao
isr_high . . .
retfie
; chương trình phục vụ ngắt ưu tiên thấp
isr_low . . .
retfie
Bước 5. Khởi tạo ngắt timer0 phát ra ngắt 100ms (với xung clock 4 MHz, chọn prescaler
2:1, số đếm 50000).
;=====================;
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 39 Thực hành Vi xử lý
; Initializing timer 0: 16BIT
;=====================;
init_timer0
bsf RCON,IPEN ; cho phép dùng ưu tiên ngắt.
bcf INTCON2,TMR0IP ; ngắt timer0 ưu tiên thấp
bcf INTCON,TMR0IF ; xóa cờ báo ngắt timer0
bsf INTCON,TMR0IE ; cho phép ngắt timer0
bsf INTCON,GIEH ; cho phép ngắt ưu tiên cao
bsf INTCON,GIEL ; cho phép ngắt ưu tiên thấp
clrf T0CON ; prescaler 2:1
movlw HIGH (-50000) ; nạp số đếm 50000 cho timer0
movwf TMR0H
movlw LOW (-50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phép timer0 đếm
return
Bước 6. Viết chương trình con chạy trong timer, sau 1s tăng giá trị hiển thị ra ngoài led
đơn.
Vì cứ 100ms thì có ngắt một lần, do đó để sau 1s ta tăng lên một giá trị thì cần 10 lần
ngắt như vậy, nên ban đầu ta phải khởi tạo cho biến delay = 10. Và đây là hàm chính thực
hiện chức năng của bài tập 1.
timer0_isr
bcf INTCON,TMR0IF
decfsz delay ; đếm số lần xảy ra ngắt
bra timer0_isr_1 ; chưa đủ, chuyển đi
incf LATB ; đã đủ tăng PORTB lên 1
movlw .10 ; nạp lại biến đếm số lần ngắt xảy ra
movwf delay ; 10 x 100 ms = 1s
timer0_isr_1
bcf T0CON,TMR0ON
movlw HIGH (-50000) ; nạp lại số đếm 50000 cho timer0
movwf TMR0H
movlw LOW (-50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phép timer0 đếm lại
return
4.2 Chương trình mẫu
;==================================================
; Name: timer.asm
; Project: Su dung bo Timer0, cu sau 1s đem len 1 đon vi roi xuat gia tri ra led don.
; Author: BKIT HARDWARE CLUB
; Homepage:
; Creation Date: 8 - 6 - 2009
;==================================================
list p = 18f4520
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 40 Thực hành Vi xử lý
#include p18f4520.inc
code 0
goto main
org 0x000008 ; vector ngat uu tien cao
goto isr_high
org 0x000018 ; vector ngat uu tien thap
goto isr_low
; Vung du lieu
udata
delay res 1
; Vung bat dau code
PRG code
main
call init
call init_timer0
goto $
; Ham khoi dong ban dau
init clrf PORTB ; toan bo PORTB la cong xuat
clrf TRISB
return
;===========================================;
; Khoi dong Timer0 dem 16 bit.
; De tinh thoi khoan tao ra boi Timer0, ta can biet mot so diem
; 1. Tan so xung clock ngoài: 4Mhz
; 2. Thong so dem truoc Timer0 : 1:2
; thoi gian tao ra ngat tu Timer0 = 1/((FOSC /4)*2) = 2μs
;===========================================;
init_timer0
bsf RCON,IPEN ; cho phep uu tien ngat.
bcf INTCON2,TMR0IP ; timer0 uu tien thap
bcf INTCON,TMR0IF ; xoa co ngat timer0
bsf INTCON,TMR0IE ; cho phep ngat timer0
bsf INTCON,GIEH ; cho phep ngat uu tien cao
bsf INTCON,GIEL ; cho phep ngat uu tien thap
clrf T0CON ; prescaler 2:1
movlw HIGH (-50000) ; nap so dem 50000 cho timer0
movwf TMR0H
movlw LOW (-50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phep timer0 dem
return
;===============================================;
; chuong trinh phuc vu ngat quang uu tien cao
;===============================================;
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 41 Thực hành Vi xử lý
isr_high ; khong lam gi ca
retfie
;===============================================;
; Chuong trinh phuc vu ngat quang uu tien thap
;===============================================;
isr_low
call timer0_isr
retfie
;===============================================;
; Chuong trinh phuc vu ngat quang Timer0
;===============================================;
timer0_isr
bcf INTCON,TMR0IF
decfsz delay,1
bra timer0_isr_1
incf LATB
movlw .10
movwf delay
timer0_isr_1
bcf T0CON,TMR0ON
movlw HIGH (-50000) ; nap lai so dem 50000 cho timer0
movwf TMR0H
movlw LOW (-50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phep timer0 dem lai
return
end
4.3 Bài tập
a) Làm lại bài thí nghiệm nhưng sử dụng Timer1 thay vì Timer0.
b) Dùng bộ định thời tạo xung vuông chu kì 10ms, duty cycle 30%.
c) Thực hiện yêu cầu 2 của bài thí nghiệm dùng timer điều khiển đèn giao thông.
4.4 Báo cáo
a) Giải thích ý nghĩa công thức tính thời gian của Timer. Nếu dùng prescaler 16:1 thì
cần chỉnh các thông số nào trong bài thí nghiệm để thời gian không đổi.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 42 Thực hành Vi xử lý
Bài 5 : Kỹ thuật quét ma trận phím
Nội dung:
Khảo sát cấu tạo, hoạt động của ma trận phím.
Tìm hiểu kỹ thuật lấy dữ liệu từ ma trận phím, chống rung phím nhấn.
Yêu cầu:
Viết chương trình lấy dữ liệu từ phím nhấn sau đó hiện thị giá trị của phím nhấn
ra led đơn.
5.1 Kết nối mạch ma trận phím
Ma trận phím gồm 16 phím nhấn kết nối chung 4 hàng và 4 cột. Bốn cột COL1-COL4
nối vào bốn bit thấp của Port D D0-D3. Bốn hàng ROW1-ROW4 nối vào bốn bit cao của
Port D D4-D7. Bốn cột được nối với điện trở kéo lên để đảm bảo mức logic 1 khi phím
không được nhấn.
ROW1
COL2 COL3 COL4COL1
ROW2
ROW3
ROW4
RD1
1
RD0
2
RD3
3
RD2
4
RD5
5
RD4
6
RD7
7
RD6
8
RE1
9
RE0
10
GND
11
VCC
12
CON12A
COL2
COL4
ROW2
ROW4
COL1
COL3
ROW1
ROW3
VCC
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 43 Thực hành Vi xử lý
Connector mở rộng Port D
5.2 Các bước hiện thực
Bước 1. Tạo project mới tên là Key. Ta được hình sau:
Bước 2. Đánh code vào tập tin Key.asm theo dạng "Relocatable".
Bước 3. Define các port tương ứng với hàng và cột của ma trận phím để dễ sử dụng sau
này. Dựa vào sơ đồ mạch ta định nghĩa như sau:
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 44 Thực hành Vi xử lý
#define COLUMN_1 PORTD, 0
#define COLUMN_2 PORTD, 1
#define COLUMN_3 PORTD, 2
#define COLUMN_4 PORTD, 3
#define ROW_1 PORTD, 4
#define ROW_2 PORTD, 5
#define ROW_3 PORTD, 6
#define ROW_4 PORTD, 7
Bước 4. Khởi tạo input và output cho các port tương ứng. Ở đây column là output, còn
row là input. Portb dùng để hiển thị led đơn cũng được cấu hình là output.
INIT_IO
;assigning PORTB is a digital output
MOVLW 0x0F
MOVWF ADCON1
; setup portb for outputs
CLRF TRISB
CLRF PORTB
MOVLW 0x0F
MOVWF TRISD
MOVLW 0xFF
MOVWF PORTD
RETURN
Bước 5. Khởi tạo timer, phần này chúng ta đã học từ chương 4, ta có thể có một hàm
khởi tạo timer đơn giản như sau:
INIT_TIMER0
BSF RCON,IPEN ;enable priority interrupts.
BSF INTCON2,TMR0IP
BSF INTCON,TMR0IF
BSF INTCON,TMR0IE
BSF INTCON,GIEH
BSF INTCON,GIEL
CLRF T0CON
MOVLW 0x3c
MOVWF TMR0H
MOVLW 0xAF
MOVWF TMR0L
BSF T0CON,TMR0ON
RETURN
Bước 6. Viết hàm Get_key với 2 đối số. Đối số thứ nhất có tên là temp_wr, chính là giá
trị output tương ứng với các cột của ma trận phím, đối số thứ 2 có tến là col
chính là giá trị bắt đầu của mỗi cột. Ví dụ cột 1 thì giá trị đó bằng 0, cột 2 thì giá
trị đó bằng 1, cột 3 thì giá trị đó bằng 2 và cột 4 thì giá trị đó bằng 3.
GET_KEY
BTFSS temp_wr, 0
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 45 Thực hành Vi xử lý
BCF COLUMN_1
BTFSS temp_wr, 0
BSF COLUMN_1
BTFSS temp_wr, 1
BCF COLUMN_2
BTFSS temp_wr, 1
BSF COLUMN_2
BTFSS temp_wr, 2
BCF COLUMN_3
BTFSS temp_wr, 2
BSF COLUMN_3
BTFSS temp_wr, 3
BCF COLUMN_4
BTFSS temp_wr, 3
BSF COLUMN_4
BTFSC PORTD,4 ;BIT TEST F, SKIP IF SET
GOTO NEXT_BUTTON_1
MOVLW .0
MOVWF KeyReg1
GOTO EXIT_GET_KEY
NEXT_BUTTON_1
BTFSC PORTD,5 ;BIT TEST F, SKIP IF SET
GOTO NEXT_BUTTON_2
MOVLW .4
MOVWF KeyReg1
GOTO EXIT_GET_KEY
NEXT_BUTTON_2
BTFSC PORTD,6 ;BIT TEST F, SKIP IF SET
GOTO NEXT_BUTTON_3
MOVLW .8
MOVWF KeyReg1
GOTO EXIT_GET_KEY
NEXT_BUTTON_3
BTFSC PORTD,7 ;BIT TEST F, SKIP IF SET
GOTO NEXT_BUTTON_2
MOVLW .12
MOVWF KeyReg1
EXIT_GET_KEY
MOVFF COL,W
ADDWF KeyReg1,d
RETURN
Bước 7. Dựa vào hàm Get_key ở trên ta có thể hoàn thiện hàm Scan_button một cách dễ
dàng. Ở đây ta nhắc lại cách mà sử lý phím để nhận dữ liệu ngược trở về là tại
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 46 Thực hành Vi xử lý
một thời điểm chỉ cho một cột được tích cực (ở đây là mức 0) sau đó đọc ngược
giá trị từ các hàng. Hàng 1 tương ứng với cột 1 là số 0, tương tự hàng 2 với cột
1 là số 4
Khi nhấn phím thì sẽ có hiện tượng rung phím, để giải quyết trường hợp này ta có
một cách giải quyết ở đây là đọc dữ liệu 3 lần liên tiếp mỗi lần cách nhau 10ms, sau đó so
sánh 3 giá trị đọc được. Nếu 3 giá trị bằng nhau thì ta xem như có một nút nhấn được
nhấn. Trong hàm Scan_button ta dùng 3 biến KeyReg1, KeyReg2 và KeyReg3 để lưu giá
trị của 3 lần đọc dữ liệu liên tiếp, khi kiểm tra 3 biến này có giá trị bằng nhau thì ta sẽ lưu
vào biến KeyReg và xuất dữ liệu ra PORTB.
Scan_button
MOVFF KeyReg2,KeyReg3
MOVFF KeyReg1,KeyReg2
MOVLW 0x0E
MOVWF temp_wr
MOVLW .0
MOVWF COL
CALL GET_KEY
MOVLW 0x0D
MOVWF temp_wr
MOVLW .1
MOVWF COL
CALL GET_KEY
MOVLW 0x0B
MOVWF temp_wr
MOVLW .2
MOVWF COL
CALL GET_KEY
MOVLW 0x07
MOVWF temp_wr
MOVLW .3
MOVWF COL
CALL GET_KEY
MOVFF KeyReg1,W
CPFSEQ KeyReg2
GOTO EXIT_SCAN_BUTTON
CPFSEQ KeyReg3
GOTO EXIT_SCAN_BUTTON
MOVFF KeyReg,W
CPFSEQ KeyReg1
GOTO Scan_button1
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 47 Thực hành Vi xử lý
GOTO EXIT_SCAN_BUTTON
Scan_button1
MOVFF KeyReg1,KeyReg
CALL Button_process
EXIT_SCAN_BUTTON
RETURN
Bước 8. Như giải thuật trên nói là cứ mỗi 10ms thì ta đọc dữ liệu một lần, để cho điều
này được thực hiện dễ dàng thì ta phải dùng đến interrupt timer. Ta khởi tạo một
interrupt timer cứ sau 10ms thì interrupt một lần. Để làm được điều này các bạn
có thể xem lại chương timer để có thể làm việc một cách dễ dàng.
Ở đây chỉ giới thiệu cho các bạn là hàm Timer0_routine, hàm này được gọi trong
interrupt timer và trong hàm này ta gọi hàm Scan_button ở trên.
TIMER0_ROUTINE
BCF INTCON,TMR0IF
BCF T0CON,TMR0ON
MOVLW 0x3c
MOVWF TMR0H
MOVLW 0xaf
MOVWF TMR0L
BSF T0CON,TMR0ON
CALL SCAN_BUTTON
RETURN
5.3 Bài tập
a) Cải tiến hàm chống rung phím, khi nhấn đè 1 phím thì phải sau 1 thời gian
TimeOutForKey thì mới tích cực phím nhấn đó.
b) Viết ứng dụng đồng hồ casio đơn giản (hiển thị giờ, ngày, cho phép chỉnh sửa
ngày giờ) sử dụng ma trận phím và LCD.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 48 Thực hành Vi xử lý
Bài 6 : Kỹ thuật quét LED
Nội dung:
Khảo sát cấu tạo, hoạt động của LED 7 đoạn, LED ma trận.
Tìm hiểu kỹ thuật quét LED 7 đoạn và LED ma trận.
Yêu cầu:
Viết chương trình cho phép hiển thị giá trị ra led 7 đoạn và led ma trận.
6.1 Cấu tạo LED 7 đoạn và LED ma trận
LED 7 đoạn gồm có 7 đoạn được đánh dấu: a, b, c, d, e, f, g và một điểm dp.
LED 7 đoạn có hai loại là Common Anode và Common Cathode, tương ứng các LED
nối chung Anode hay nối chung Cathode.
Common
Anode
Common
Cathode
LED ma trận 8x8 hai màu được bố trí thành 8 hàng và 8 cột. Mỗi điểm có hai LED.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 49 Thực hành Vi xử lý
Các LED trên cùng một hàng nối chung Anode, các LED cùng loại trên cùng một cột
nối chung Cathode.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 50 Thực hành Vi xử lý
6.2 Kết nối mạch
R
ow
.5
R
ed
.5
G
re
en
.5
R
ed
.6
G
re
en
.1
G
re
en
.6
G
re
en
.7
R
ow
.6
G
re
en
.8
R
ow
.7
R
ed
.7
R
ed
.1
R
ow
.8
R
ed
.8
G
re
en
.2
R
ow
.1
R
ow
.2
G
R
1
24
R
D
1
23
R
W
1
22
G
R
2
21
R
D
2
20
R
W
2
19
G
R
3
18
R
D
3
17
G
R
5
1
R
D
5
2
R
W
5
3
G
R
6
4
R
D
6
5
R
W
6
6
G
R
7
7
R
D
7
8
R
W
7
9
G
R
8
10
R
W
3
16
G
R
4
15
R
D
4
14
R
W
4
13
R
D
8
11
R
W
8
12
ML1LED 8x8x2
R
ed
.3
G
re
en
.3
R
ed
.4
G
re
en
.4
R
ow
.3
R
ow
.4
ENABLE_LED3
C
E
G
e
1 d
2
g
10
c
4
dot
5
b
6 a
7
f
9
V
cc
3
V
cc
8
8.
LED3
led7
F
B
A
ENABLE_LED4
D
C
E
G
e
1 d
2
g
10
c
4
dot
5
b
6 a
7
f
9
V
cc
3
V
cc
8
8.
LED4
led7
F
B
A
DOT
D
G
ENABLE_LED1
DOT
E
e
1 d
2
g
10
c
4
dot
5
b
6 a
7
f
9
V
cc
3
V
cc
8
8.
LED1
led7
A
C
F
B
DOT
D
DOT
E
G
ENABLE_LED2
e
1 d
2
g
10
c
4
dot
5
b
6 a
7
f
9
V
cc
3
V
cc
8
8.
LED2
led7
A
C
D
F
B
R
ed
.2
Mạch LED mở rộng gồm có 4 LED 7 đoạn và 1 LED ma trận hai màu xanh đỏ. Mạch
được nối vào một phần của Port PICtail. Dữ liệu được dịch nối tiếp và được cài bởi IC
74HC595, TPIC6595. Module SPI của PIC đảm nhận việc dịch dữ liệu nối tiếp thông qua
chân dữ liệu SDO và chân clock dịch SCK. Sau khi dịch đủ 4 byte, tín hiệu LATCH
chuyển từ mức 0 lên mức 1 sẽ đẩy dữ liệu của 4 byte tạm ra 4 byte ngõ ra QA-QH tương
ứng. Tín hiệu CLR_DISP tích cực mức 0 không cho phép hiển thị.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 51 Thực hành Vi xử lý
SCK
SDO
VCC
VCC
VCC
R5330
R6330
Red.1
R7330
R8330
R1330
Red.4
Red.3
Red.2
Red.6
Red.5
Red.8
Red.7
R2330
R3330
R4330
Row.2 ENABLE_LED2
Row.1 ENABLE_LED1
COM
10
V
+
9
IN1
1
IN2
2
IN3
3
IN4
4
IN5
5
IN6
6
IN7
7
IN8
8
OUT1
18
OUT2
17
OUT3
16
OUT4
15
OUT5
14
OUT6
13
OUT7
12
OUT8
11
U3
UDN2981
Row.6
Row.5
Row.3 ENABLE_LED3
Row.8
Row.7
Row.4 ENABLE_LED4
R13100
R14100
R15100
Green.1
R16100
Green.3
Green.2
R9100
Green.6
Green.5
Green.4
Green.8
Green.7
R10100
R11100
R12100
LATCH
CLR_DISP
R21330
R22330
A
R23330
B
R24330
C
R17330
E
D
DOT
G
F
R18330
R19330
R20330
SDI
3
SRCLR
8
G
9
RCLK
12
SRCLK
13
SDO
18
DRAIN0
4
DRAIN1
5
DRAIN2
6
DRAIN3
7
DRAIN4
14
DRAIN5
15
DRAIN6
16
DRAIN7
17
U3 TPIC6595
VCC
SDO
VCC
LATCH
SCK
LATCH
SDO
9
CLR
10
G
13
SDI
14
SRCLK
11 RCLK
12
QA
15
QB
1
QC
2
QD
3
QE
4
QF
5
QG
6
QH
7
U4 74HC595
CLR_DISP
SCK
LATCH
CLR_DISP
SCK
CLR_DISP
SCK
LATCH
SDI
3
SRCLR
8
G
9
RCLK
12
SRCLK
13
SDO
18
DRAIN0
4
DRAIN1
5
DRAIN2
6
DRAIN3
7
DRAIN4
14
DRAIN5
15
DRAIN6
16
DRAIN7
17
U1 TPIC6595
SDI
3
SRCLR
8
G
9
RCLK
12
SRCLK
13
SDO
18
DRAIN0
4
DRAIN1
5
DRAIN2
6
DRAIN3
7
DRAIN4
14
DRAIN5
15
DRAIN6
16
DRAIN7
17
U2 TPIC6595
VCC
GND
1 +5V
2 RC2
3 RC1
4 RC0
5 RA2
6 RA1
7 RA0
8 RC3
9 RC4
10 RC5
11 RA3
12
PICtail
CON12
6.3 Các thanh ghi liên quan và cách điều khiển
- Thanh ghi trạng thái SSPSTAT:
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 52 Thực hành Vi xử lý
- Thanh ghi điều khiển SSPCON1:
- Sơ đồ khối module Synchronous Serial Port:
Với sơ đồ mạch trên, mỗi lần có một hàng LED ở LED ma trận hay một con LED 7
đoạn hiển thị dữ liệu. Lợi dụng hiện tượng lưu ảnh của mắt, dữ liệu của mỗi hàng LED
ma trận hay mỗi con LED 7 đoạn được xuất ra tuần tự hàng (con) này đến hàng (con)
khác, chúng ta sẽ thấy được hình ảnh của cả màn hình ma trận LED hay của cả 4 con
LED 7 đoạn.
Khi tất cả các hàng LED ma trận và tấc cả các con LED 7 đoạn đã được hiển thị
(quét) qua một lần, ta nói đã hiển thị một frame. Để mắt không cảm thấy hình ảnh bị rung
thì số lần hiển thị frame trong một giây phải lớn hơn 24 lần (thường là 30 lần).
Đầu tiên tín hiệu CLR_DISP tích cực (mức 0) không cho LED hiển thị, sau đó dịch
bốn byte dữ liệu, tín hiệu LATCH chuyển từ mức 0 lên mức 1 đưa dữ liệu mong muốn
sẵn sàn ở ngõ ra, cuối cùng đưa tín hiệu CLR_DISP lên mức 1 cho phép LED hiển thị dữ
liệu mong muốn. Cứ như vậy lặp lại chu trình này.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 53 Thực hành Vi xử lý
Bốn byte dữ liệu được dịch ra mỗi lần có ý nghĩa tương ứng là dữ liệu của một hàng
LED đỏ, dữ liệu của một hàng LED xanh, dữ liệu của một con LED 7 đoạn, điều khiển
hàng (con) LED nào hiển thị.
Cách điều khiển được minh họa thông qua hình sau :
GREEN LED dataRED LED data
00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Control
1 0 0 0 0 0 0 0
7SEG
00 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0
00 0 1 0 01 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0
00 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0
00 1 0 0 0 01 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0
00 1 0 0 0 01 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0
00 1 0 0 0 01 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0
00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
Control
1 0 0 0 0 0 0 0
GREEN
LED data
RED LED
data 7SEG
0 0
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
10 0 0 0 0 0 00 0
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
100 0 0 0 0 00 0
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
a
b
g
c
f
e
d p
10 00 0 0 0 00 0
Giá trị của byte “control” chỉ chứa nhiều nhất một bit 1. Như hình vẽ, cần 12 lần xuất
dữ liệu (4 byte) cho 1 frame gồm cả LED ma trận và LED 7 đoạn, 8 lần xuất dữ liệu cho
1 frame gồm chỉ có LED ma trận (không quan tâm nội dung hiển thị LED 7 đoạn), 4 lần
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 54 Thực hành Vi xử lý
xuất dữ liệu cho 1 frame gồm chỉ có LED 7 đoạn(không quan tâm nội dung hiển thị LED
ma trận).
6.4 Các bước hiện thực.
Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Led và chọn
chip 18f4520. Ta được hình sau:
Bước 2. Include file p18f4520.inc vào file Led_matran.asm
Bước 3. Khai báo các buffer cần thiết để viết driver cho led. Vì ở đây ta viết driver nên
mọi người khi sử dụng những module này sẽ không sử dụng những hàm mà
chúng ta viết trong này chỉ có thể thao tác trên các buffer mà thôi.
GREEN_SCREEN_BUFFER RES .8
RED_SCREEN_BUFFER RES .8
SEVEN_LED_BUFFER RES .8
COLUMN_BUFFER RES .8
INDEX_OF_BUFFER RES .1
RED_DATA RES .1
GREEN_DATA RES .1
SEVEN_LED_DATA RES .1
COLUMN_DATA RES .1
Bước 4. Ngoài ra nhìn vào mạch ta có thể dễ dàng nhận thấy được rằng dữ liệu của
chúng ta được truyền theo kiểu truyền đồng bộ nối tiếp, chính xác hơn ở đây
người ta sử dụng chức năng SPI để truyền dữ liệu. Do đó ta phải cấu hình cho
chip làm sao có thể hoạt động được ở chế độ SPI này.
INIT_SPI
CLRF SSPCON1 ;SET Fspi = f/4
BSF SSPCON1,5 ;ENALBLE SPI MODE
BCF TRISC,5
BCF TRISC,3
RETURN
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 55 Thực hành Vi xử lý
Trên đây ta mới chỉ khởi tạo module SPI để nó có thể hoạt động nhưng nhìn lại sơ đồ
mạch ta lại thấy có thêm vài kết nối nữa từ vi điều khiển ra IC74595. Để IC này hoạt
động được thì ta cần thêm một chân tạo clock để có thể chuyển dữ liệu nối tiếp ra song
song của IC này. Ta define thêm cho chân Latch của IC 74595.
#define LATCH_DIR TRISA,1
#define LATCH_DATA PORTA,1
Đồng thời khởi tạo các PORT liên quan:
INIT
MOVLW 0x0F
MOVWF ADCON1
BCF LATCH_DIR
BCF LATCH_DATA
CLRF INDEX_OF_BUFFER
RETURN
Bước 5. Ngoài ra để thực hiện được bài này không thể nào thiếu timer được, vì để hiển
thị ra led ma trận ta phải quét từng cột led trên ma trận led.
Khi nhìn vào cấu tạo của ma trận led ta thấy để hiện thị được một hình gì đó trên ma
trận led thì ta phải quét led, vì tại một thời điểm chỉ có thể hiển thị một cột led mà thôi.
Nhờ vào hiện tượng lưu ảnh ở mắt mà khi quét với tần số cao thì mắt ta sẽ thấy như là cột
đó sáng chứ không phải chớp nháy nữa.
Vậy làm sao biết được ta quét led với tần số bao nhiêu là hợp lý. Như trong phim ảnh
khi xem phim thực chất ta biết là nó đang chạy với tần số là 24 hình /s. Ở đây ta cũng giả
sử như vậy, cả màn hình của led cũng chớp nháy với tần số là 24 hình/s, mà mỗi hình ta
phải quét 8 lần vì có 8 cột. Từ đó ta có thể suy ra tần số ta cần phải quét cho mỗi cột là
8x24 lần/s. Từ đây ta có thể dễ dàng tính được timer của chúng ta cần bao nhiêu để có thể
quét led được một cách dễ dàng.
INIT_TIMER0
BSF RCON,IPEN ;enable priority interrupts.
BSF INTCON2,TMR0IP
BSF INTCON,TMR0IF
BSF INTCON,TMR0IE
BSF INTCON,GIEH
BSF INTCON,GIEL
CLRF T0CON
MOVLW 0x3c
MOVWF TMR0H
MOVLW 0xAF
MOVWF TMR0L
BSF T0CON,TMR0ON
RETURN
Bước 6. Ban đầu ta khởi tạo các buffer để hiển thị cũng như quét cột led. Để dễ dàng
trong việc sử lý ta sẽ khởi tạo cho Column_Buffer các giá trị tương ứng làm sao,
khi xuất ra nó chỉ tích cực một cột của led mà thôi. Ở đây giả sử tích cực tại mỗi
cột là tích cực mức cao thì ta có thể khởi tạo cho Column_buffer các giá trị sau:
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 56 Thực hành Vi xử lý
Bước 7. Đến đây mọi sử chuẩn bị đã xong, ta có thể bắt đầu viết hàm để hiển thị dữ liệu
ra led. Đầu tiên ta sẽ viết một macro SPI_transmit với đối số sẽ là giá trị byte sẽ
được truyền nối tiếp ra ngoài.
SPI_TRANSMIT MACRO TEMP_DATA
;Has data been received (transmit complete)?
BTFSS SSPSTAT, BF
GOTO $-2 ;No
MOVF TEMP_DATA, W ;W reg = contents of TXDATA
MOVWF SSPBUF
ENDM
Bước 8. Tiếp theo là làm sao lấy dữ liệu từ các buffer để đưa vào các biến tương ứng
xuất ra led. Ta viết thêm một Macro nữa gồm 2 đối số là buffer và temp_data.
Macro này sẽ làm nhiệm vụ là lấy dữ liệu tại vị trí (được lưu trong biến
index_of_buffer) của buffer lưu vào temp_data.
UPDATE_DATA MACRO BUFFER,TEMP_DATA
MOVLW HIGH BUFFER
MOVWF FSR0H
MOVLW LOW BUFFER
MOVWF FSR0L
MOVFF INDEX_OF_BUFFER,W
ADDWF FSR0L,F
CLRF W
ADDWFC FSR0H
MOVFF INDF0,TEMP_DATA
ENDM
Bước 9. Như trên đã giới thiệu để xuất dữ liệu ra led, ngoài việc dùng module SPI để
xuất dữ liệu ta cần phải có thêm một tín hiệu clock tác động lên IC74595 thì dữ
liệu nối tiếp của ta mới chuyển qua song song và hiển thị ra led. Do đó ta phải
viết thêm một hàm tạo clock trên chân đã define khi nãy là Latch_data.
CLOCK_STORAGE
BSF LATCH_DATA
NOP
NOP
BCF LATCH_DATA
NOP
NOP
BSF LATCH_DATA
RETURN
Bước 10. Cuối cùng là hàm quan trọng nhất, hàm này được gọi trong timer để thực hiện
việc quét led.
DISPLAY
CALL INCREASING_INDEX
UPDATE_DATA RED_SCREEN_BUFFER,RED_DATA
UPDATE_DATA
GREEN_SCREEN_BUFFER,GREEN_DATA
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 57 Thực hành Vi xử lý
UPDATE_DATA
SEVEN_LED_BUFFER,SEVEN_LED_DATA
UPDATE_DATA COLUMN_BUFFER,COLUMN_DATA
SPI_TRANSMIT RED_DATA
SPI_TRANSMIT GREEN_DATA
SPI_TRANSMIT SEVEN_LED_DATA
SPI_TRANSMIT COLUMN_DATA
CALL CLOCK_STORAGE
RETURN
6.5 Bài tập
a) Xây dựng ứng dụng cho phép số “1234” chạy qua các led 7 đoạn.
b) Xây dựng ứng dụng cho phép 1 dòng chữ chạy qua led ma trận.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 58 Thực hành Vi xử lý
Bài 7 : Khảo sát bộ truyền nhận nối tiếp
Nội dung:
Khảo sát cổng COM máy PC, các thông số truyền nối tiếp.
Khảo sát bộ truyền nối tiếp của PIC.
Tìm hiểu cách sử dụng chương trình Hyper Terminal truyền nhận nối tiếp trên
máy PC.
Yêu cầu:
Viết chương trình giao tiếp giữa máy tính và vi điều khiển PIC.
7.1 Các bước hiện thực.
Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Uart và
chọn chip 18f4520. Ta được hình sau:
Bước 2. Include file p18f4520.inc vào file uart.asm
Bước 3. Khởi tạo PortB là output, PORTC.6 là output, PORTC.7 là input.
INIT_PORT
CLRF LATB ; Clear PORTB output latches
CLRF TRISB ; Config PORTB as
all outputs
BCF TRISC,6 ; Make RC6 an output
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 59 Thực hành Vi xử lý
BSF TRISC,7
RETURN
Bước 4. Khởi tạo các vector ngắt
org 00000h ; Reset Vector
goto Start
org 00008h ; Interrupt vector
goto IntVector
Start
GOTO $
IntVector
RETFIE
Bước 5. Khởi tạo cho ngắt UART, tốc độ 9600baud tại tần số 4Mhz.
INIT_UART
MOVLW 19h ; 9600 baud @4MHz
MOVWF SPBRG
BSF TXSTA,TXEN ;
Enable transmit
BSF TXSTA,BRGH ; Select high
baud rate
BSF RCSTA,SPEN ; Enable Serial Port
BSF RCSTA,CREN ; Enable
continuous reception
BCF PIR1,RCIF ; Clear RCIF
Interrupt Flag
BSF PIE1,RCIE ; Set RCIE
Interrupt Enable
BSF INTCON,PEIE ; Enable
peripheral interrupts
BSF INTCON,GIE ; Enable global
interrupts
RETURN
Bước 6. Viết chương trình trong ngắt thực hiện nhiệm vụ nhận một dữ liệu từ máy tính
truyền xuống sau đó gởi lại kí tự đó cho máy tình nhận lại.
IntVector
btfss PIR1,RCIF ; Did USART cause
interrupt?
goto ISREnd ; No, some other interrupt
movlw 06h ; Mask out unwanted bits
andwf RCSTA,W ; Check for errors
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 60 Thực hành Vi xử lý
btfss STATUS,Z ; Was either error status bit
set?
goto RcvError ; Found error, flag it
movf RCREG,W ; Get input data
movwf LATB ; Display on LEDs
movwf TXREG ; Echo character back
goto ISREnd ; go to end of ISR, restore
context, return
RcvError
bcf RCSTA,CREN ; Clear receiver status
bsf RCSTA,CREN
movlw 0FFh ; Light all LEDs
movwf PORTB
goto ISREnd ; go to end of ISR, restore
context, return
ISREnd
retfie
7.2 Chương trình mẫu
;=====================================;
; Name: uart.asm
; Project: Viết chương trình giao tiếp giữa máy tính và vi điều khiển PIC.
; Author: BKIT HARDWARE CLUB
; Homepage:
; Creation Date: 8 - 8 - 2009
;======================================;
list p=18F4520 ; set processor type
include
;************************************************************
; Reset and Interrupt Vectors
org 00000h ; Reset Vector
goto Start
org 00008h ; Interrupt vector
goto IntVector
;************************************************************
; Program begins here
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 61 Thực hành Vi xử lý
org 00020h ; Beginning of program EPROM
Start
CALL INIT_PORT
CALL INIT_UART
Main
goto Main ; loop to self doing nothing
INIT_PORT
clrf LATB ; Clear PORTB output latches
clrf TRISB ; Config PORTB as all
outputs
bcf TRISC,6 ; Make RC6 an output
bsf TRISC,7 ; Make RC7 an input
RETURN
INIT_UART
movlw 19h ; 9600 baud @4MHz
movwf SPBRG
bsf TXSTA,TXEN ; Enable transmit
bsf TXSTA,BRGH ; Select high baud rate
bsf RCSTA,SPEN ; Enable Serial Port
bsf RCSTA,CREN ; Enable continuous
reception
bcf PIR1,RCIF ; Clear RCIF Interrupt Flag
bsf PIE1,RCIE ; Set RCIE Interrupt Enable
bsf INTCON,PEIE ; Enable peripheral
interrupts
bsf INTCON,GIE ; Enable global interrupts
RETURN
;************************************************************
; Interrupt Service Routine
IntVector
btfss PIR1,RCIF ; Did USART cause
interrupt?
goto ISREnd ; No, some other interrupt
movlw 06h ; Mask out unwanted bits
andwf RCSTA,W ; Check for errors
btfss STATUS,Z ; Was either error status bit
set?
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 62 Thực hành Vi xử lý
goto RcvError ; Found error, flag it
movf RCREG,W ; Get input data
movwf LATB ; Display on LEDs
movwf TXREG ; Echo character back
goto ISREnd ; go to end of ISR, restore
context, return
RcvError
bcf RCSTA,CREN ; Clear receiver status
bsf RCSTA,CREN
movlw 0FFh ; Light all LEDs
movwf PORTB
goto ISREnd ; go to end of ISR, restore
context, return
ISREnd
retfie
end
7.3 Bài tập
a) Viết chương trình trên PC, gửi 1 chuỗi string xuống board, dòng chữ này sẽ chạy
qua led ma trận hoặc LCD.
b) Khi nhấn 1 phím trên board nhấn, sẽ gửi 1 chuỗi string lên PC qua cổng COM,
viết chương trình trên PC nhận chuỗi string này và in ra giao diện.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 63 Thực hành Vi xử lý
Bài 8 : Khảo sát khối chuyển đổi A-D
Nội dung:
Khảo sát hoạt động khối chuyển đổi A-D.
Khảo sát các thanh ghi điều khiển hoạt động khối chuyển đổi A-D.
Yêu cầu:
Viết chương trình đọc và hiển thị giá trị điện áp thay đổi bởi biến trở.
8.1 Các bước hiện thực
Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là a2d và chọn
chip 18f4520. Ta được hình sau:
Bước 2. Include file p18f4520.inc vào file a2d.asm
Bước 3. Khởi tạo module ADC để ta có thể sử dụng một cách dễ dàng.
InitializeAD
Movlw B'00000100' ; Make RA0,RA1,RA4 analog inputs
movwf ADCON1
movlw B'11000001' ; Select RC osc, AN0
selected,
movwf ADCON0 ; A/D enabled
movlw 0x01
movwf ADCON2
call SetupDelay ; delay for 15 instruction
cycles
bsf ADCON0,GO ; Start first A/D conversion
return
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 64 Thực hành Vi xử lý
Để khởi tạo được module ADC ta chỉ cần quan tâm chủ yếu tới các thanh ghi
ADCCON1, ADCCON0, ADCON2. Như chương trình khởi tạo trên ta thấy đầu tiên phải
cấu hình cho các pin tương ứng phải là chân AN0, mặc định của các chân này có chức
năng là Input/Output digital. Sau đó ta phải chọn kênh ADC tương ứng, ở đây ta sử dụng
kênh AD0. Và một điểm quan trọng nữa chính là bit GO trong thanh ghi ADCON0, khi
bít này được bật lên thì module AD mới bắt đầu chuyển đổi tín hiệu.
Bước 4. Tiếp theo là hàm đọc giá trị ADC:
Update_adc
bsf ADCON0,GO ;start conversion
btfsc ADCON0,GO
bra $-2
movf ADRESH,W
return
Sau khi chuyển đổi tín hiệu A-D, giá trị số sẽ được lưu vào thanh ghi ADRESH. Đến
đây tùy vào ứng dụng cụ thể mà ta có thể biến đổi giá trị này tùy theo yêu cầu mà ta
mong muốn.
8.2 Bài tập
a) Tích hợp module LCD, lấy giá trị điện thế từ biến trở hiển thị lên LCD.
b) Sử dụng module ADC của Pic để đo nhiệt độ trong phòng, dùng LCD để hiển thị
giá trị nhiệt độ.
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 65 Thực hành Vi xử lý
Bài 9 : Khảo sát các khối chức năng đặc biệt khác
Nội dung:
Khảo sát khối chức năng WDT.
Khảo sát khối chức năng PWM .
Khảo sát các chế độ hoạt động của vi điều khiển.
Yêu cầu:
Viết chương trình sử dụng chức năng WDT.
Viết chương trình sử dụng chức năng PWM điều khiển độ sáng của LED.
Viết chương trình sử dụng chức năng Power control.
9.1 Các bước hiện thực PWM
Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là pwm và
chọn chip 18f4520. Ta được hình sau:
Bước 2. Include file p18f4520.inc vào file pwm.asm.
Bước 3. Tích hợp module LCD vào project pwm, tham khảo bài tập về LCD.
Bước 4. Khởi tạo module PWM để ta có thể sử dụng một cách dễ dàng.
Init_pwm
;configure CCP1 module for buzzer
bcf TRISC,2
movlw 0x80
movwf PR2 ;initialize PWM
period
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 66 Thực hành Vi xử lý
movlw 0x80 ;initialize PWM duty
cycle
movwf CCPR1L
bcf CCP1CON,CCP1X
bcf CCP1CON,CCP1Y
;postscale 1:1, prescaler 4, Timer2 ON
movlw 0x05
movwf T2CON
movlw 0x0F ;turn buzzer on
movwf CCP1CON
return
Để khởi tạo chức năng pwm, đầu tiên ta phải cấu hình cho PORTC2 là output. Tiếp
theo khởi tạo chu kì của PWM thông qua việc cấu hình thanh ghi PR2. Sau đó ta khởi tạo
duty cycle của xung pwm bằng cách cấu hình thanh ghi CCPR1L.
9.2 Chương trình mẫu
;=====================================;
; Name: pwm.asm
; Project: Su dung Pwm de xuat am thanh ra loa.
; Author: BKIT HARDWARE CLUB
; Homepage:
; Creation Date: 20 - 8 - 2009
;======================================;
list p=18f4520
#include "p18f4520.inc"
; vectors
org 0x000000 ; reset vector
bra START
;************************************************************
; program
START
call Init_pwm
goto $
Init_pwm
bcf TRISC,2
Trường ĐH. Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 67 Thực hành Vi xử lý
movlw .249
movwf PR2 ;initialize PWM
period
movlw .125 ;initialize PWM duty
cycle
movwf CCPR1L
bcf CCP1CON,CCP1X
bcf CCP1CON,CCP1Y
;postscale 1:1, prescaler 4, Timer2 ON
movlw 0x05
movwf T2CON
movlw 0x0F ;turn buzzer on
movwf CCP1CON
return
END
9.3 Bài tập
a) Tìm hiểu và hiện thực chương trình điều khiển RC Servo.
Các file đính kèm theo tài liệu này:
- tnvxlvdk_v2_2022.pdf