10.Right click vào Source file ở cửa sổ main.mcw chọn Add files , Browse tới
main.c chọn open
10.Right click vào Source file ở cửa sổ main.mcw chọn Add files , Browse tới
main.c chọn open
70 trang |
Chia sẻ: hao_hao | Lượt xem: 2498 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng Xuất nhập i/o port, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nếu TMR1ON=1 :
− 1 : Sự đếm lên của timer1 sẽ được điểu khiển bởi cổng Timer 1
− 0 : Timer 1 có thể đếm lên mà không cần quan tâm đến trạng thái của cổng timer 1 .
T1GINV : Bit đảo cổng timer1
Giáo trình thí nghiệm vi điều khiển ứng dụng
32
1 : Cổng timer1 tác động mức cao (Timer1 hoạt động khi cổng ở mức cao ).
0 : Cổng timer 1 tác động mức thấp (Timer 1 hoạt động khi cổng ở mức thấp).
3.3 Timer1 on :
Không giống với timer 0 , chúng ta cần khởi tạo một số bit thì timer 1 mới có thể hoạt động
được . Từ sơ đồ trên ta có thể thấy việc bật/tắt timer 1có hai dạng :
Cho phép timer 1 hoạt động mà không cần tác động từ bên ngoài :
TMR1ON=1;
TMR1GE=0;
Cho phép timer 1 hoạt động khi có tín hiệu logic ở chân T1G :
//Cho phép điện trở treo .
//Khởi tạo chân T1G là ngõ vào .
ANS13=0;
TRISB5=1;
RB5=1;
TMR1ON=1;
TMR1GE=1;
T1GINV=.....; //Tùy theo mức logic ở chân T1G là mức cao hay thấp.
T1GSS=1;
3.4 Ngắt trong timer 1 :
Timer 1 cũng có thể tạo ra sự kiện ngắt khi xảy ra tràn timer , các bit khởi tạo ngắt của
timer 1 :
TMR1IF : Cờ ngắt , bit này tự động bằng 1 khi có sự kiện tràn timer .
TMR1IE :Bit cho phép ngắt tràn timer .
PEIE :Bit cho phép ngắt ngoại vi .
GIE :Bit cho phép ngắt toàn cục .
Sơ đồ ngắt timer 1
3.5 Khởi tạo timer 1 hoạt động với chế độ đếm counter :
//Khởi tạo chân T1CKI là ngõ vào số ……
T1OSCEN=1;
TMR1CS=1;
T1CKPS1=…..;
T1CKPS0=…..;
T1SYNC=0;
//Cho phép timer 1 on
//Khởi tạo ngắt nếu có
Giáo trình thí nghiệm vi điều khiển ứng dụng
33
Ngoài ra , timer 1 còn có thể hoạt động với chế độ timer sử dụng thạch anh ngoài , độc
lập với tần số họat động của vi điều khiển , thạch anh ngoài ta có thể kết nối với hai chân :
OSC1 và OSC2 và khởi tạo tương tự như trên .
3.6 Khởi tạo timer 1 hoạt động với chế độ định thời timer :
TMR1CS=0;
T1CKPS1=…..;
T1CKPS0=…..;
T1SYNC=1;
//Cho phép timer 1 on
//Khởi tạo ngắt nếu có
4.Timer 2 :
Khác với timer 0 và timer 1 , timer 2 chỉ có thể hoạt động ở chế độ định thời timer , tuy nhiên
timer 2 có hai bộ chia và một giá trị đặt do đó thời gian định thời có thể linh hoạt hơn , và ít sai
số trong tín toán .
Sơ đồ khối timer 2
Nguyên tắc hoạt động timer 2 :
Khi có xung clock tần số Fosc/4 qua bộ chia Prescaler đi vào thanh ghi TMR2 , làm thanh
ghi TMR2 tăng lên , khi thanh ghi TMR2 bằng giá trị thanh ghi đặt PR2 thì sẽ có một xung clock
đi qua bộ chia Postscaler , đồng thời thanh ghi TMR2 trở về vị trí ban đầu , nếu tỉ lệ bộ chia
Postscaler được chọn 1:1 thì sẽ xảy ra sự kiện ngắt timer 2 .
4.1 Công thức tín định thời timer 2 :
T=
PR 2−TMR 2′ ∗Postscaler ∗Prescaler ∗4
Fosc
Trong đó
T :Thời gian định thời timer 2
PR2 :giá trị thanh ghi đặt
TMR2‟ : giá trị bắt đầu đếm của thanh ghi TMR0
Prescaler : Tỉ lệ bộ chia prescaler
Postscaler : Tỉ lệ bộ chia Postscaler
Fosc :Tần số hoạt động của vi điều khiển .
Giáo trình thí nghiệm vi điều khiển ứng dụng
34
4.2. Thanh ghi điều khiển timer 2 :
T2CKPS: Bit lựa chọn tỉ lệ bộ chia Prescaler
00 : 1:1
01 : 1:4
1x : 1:16
TMR2ON : Bit cho phép timer 2 hoạt động
0:Không cho phép timer2 hoạt động
1:Cho phép timer 2 hoạt động
TOUTPS: Bit lựa chọn tỉ lệ bộ chia Postscaler
4.2.Khởi tạo timer 2 hoạt động với chế độ định thời timer :
//Tín toán lựa chọn tỉ lệ bộ chia Prescaler , Postscaler
//Chọn tỉ lệ bộ chia Prescaler
T2CKPS1=……..; T2CKPS0=……;
//Chọn tỉ lệ bộ chia Postscaler
TOUTPS3=…….; TOUTPS2=…….;
TOUTPS1=…….; TOUTPS0=…….;
//Đặt giá trị lớn nhất cho giá trị thanh ghi đếm TMR2
PR2=……;
//Cho phép timer 2 họat động
TMR2ON=1;
//Khởi tạo ngắt timer 2 nếu có sử dụng :
TMR2IE=1;
TMR2IF=0;
PEIE=1;
GIE=1;
Giáo trình thí nghiệm vi điều khiển ứng dụng
35
IV.BÀI TẬP THỰC HÀNH :
Bài 1: Viết chương trình đọc số lần nhấn nút tại chân T0CKI(RA4) và hiển thị kết quả lên
LCD:
Sơ đồ phần cứng :
*Bước 1: Tạo một project mới với tên 03_01_ MSSV
*Bước 2: Nhập chương trình sau vào máy tính và hoàn thành vào dấu …….
#include
#include
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BO
RDIS&IESODIS&LVPDIS&FCMDIS);
#include "lcd.h";
void main( )
{
lcd_init( );
TRISA4=…….; RA4=…….; //Khởi tạo chân T0CKI là ngõ vào
T0CS =…….; //Chọn clock cấp cho Timer0 là từ chân T0CKI
T0SE =…….; //Chọn cạnh tác động là cạnh xuống
PSA =…….; //Xung clock không qua bộ chia (-------------1------------)
//(-------------2------------)
while(1)
{
lcd_gotoxy(0,0);
printf("\fSo lan nhan nut la:\r\n %d",TMR0);
_delay(100000);
}
}
void putch(char c)
{
lcd_putc(c);
}
*Bước 3:Nhấn nút nhấn kết nối với chân T0CKI và quan sát kết quả trên LCD.
Giáo trình thí nghiệm vi điều khiển ứng dụng
36
*Bước 4:Xóa dòng (-------------1------------)
*Bước 5:Thêm vào dòng (-------------2------------) đoạn code sau :
PSA=0; //Chọn bộ chia thuộc về timer
PS2=0; //Chọn tỉ lệ chia
PS1=1;
PS0=1;
*Bước 6: Quan sát kết quả khi nhấn nút nhấn.
*Bước 7: So sánh hai kết quả trước và sau khi sửa code , giải thích ? Nêu chức năng của bộ chia
trong timer 0:
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
Bài 2: Viết chương trình chớp tắt led RE1 , định thời bằng timer 0,tần số Fosc/4:
*Bước 1: Tạo một project mới với tên 03_02_ MSSV
*Bước 2: Nhập chương trình sau vào máy tính và hoàn thành vào dấu …….
#include
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BO
RDIS&IESODIS&LVPDIS&FCMDIS);
void insothuc(unsigned char old_ADRESH) ;
void main( )
{
ANS6=…….;TRISE1=…….; //Khởi tạo chân RE1 là digital output
T0CS=…….; //Chọn xung clock cấp cho timer 0 là từ Fosc/4
PSA=…….; //Xung clock sẽ đi qua bộ chia
PS2=…….; PS1=…….; PS0=…….; //Tỉ lệ bộ chia là 128
//Khởi tạo ngắt cho timer 0
T0IE=…….; //Cho phép ngắt timer 0
T0IF=…….; //Reset cờ ngắt
GIE=…….; //Cho phép ngắt toàn cục
while(1); //Lặp vô tận
}
void interrupt isr()
{
if(T0IE&T0IF) //Chương trình con ngắt cho timer0
{
RE1^=1; //Chớp tắt led
TMR0=0; //Khởi tạo giá trị đếm ban đầu cho timer0(-------1--------)
Giáo trình thí nghiệm vi điều khiển ứng dụng
37
T0IF=0; //Reset cờ ngắt.
}
}
*Bước 3 : Biên dịch chương trình , nạp xuống kít thí nghiệm , quan sát trạng thái của led .
*Bước 4:Tăng giá trị TMR0 ở dòng (-------1--------) từ thấp đến cao(0-255) , biên dịch chương
trình và nạp xuống kit thí nghiệm , đến lúc mắt không còn nhìn thấy led RE1 chớp tắt , tính
tần số ứng với giá trị thanh ghi TMR0 vừa tìm được .
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
*Bước 5 : Sử dụng oscillocope đo tần số vừa tìm được và so sánh với kết quả tính toán , nhận
xét.
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
Bài 3:Viết chương trình hiển thị đồng hồ lên LCD , sử dụng timer 1 định thời , thạch anh
ngoài 32.768KHz.
*Bước 1 : Tạo một project mới với tên 03_03_ MSSV
*Bước 2: Nhập chương trình sau vào máy tính và hoàn thành vào dấu …….
#include
#include
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BO
RDIS&IESODIS&LVPDIS&FCMDIS);void insothuc(unsigned char old_ADRESH);
#include "lcd.h"
unsigned char hh,mm,ss; //Khai báo biến chứa giờ , phút , giây
void main()
{
lcd_init();
//Khởi tạo các chân ngõ vào thạch anh 32.768KHz
TRISC0=TRISC1=1;RC0=RC1=0;
T1OSCEN= …….; //Cho phép timer 1 hoạt động clock ngoài
TMR1CS= …….; //Clock cấp cho timer 1 là clock ngoài
T1CKPS1=T1CKPS0=…….; //Tỉ lệ bộ chia 1:8(-------1--------)
T1SYNC= …….; //Qua khối đồng bộ
//Cho phép timer hoạt động không cần tác động bên ngoài
Giáo trình thí nghiệm vi điều khiển ứng dụng
38
TMR1ON= …….;
TMR1GE= …….;
TMR1IE= …….; //Khởi tạo ngắt timer1
TMR1IF= …….; //Reset cờ ngắt timer 1
PEIE= …….; //Cho phép ngắt ngoại vi
GIE= …….; //Cho phép ngắt toàn cục
while(1); //Lặp vô tận
}
void putch(char c) //Chương trình con cho hàm printf( )
{
lcd_putc(c);
}
void interrupt isr( )
{
if(TMR1IE&&TMR1IF) //Ngắt tràn timer 1
{
ss++;
if(ss==60)
{
ss=0;
mm++;
if(mm==60)
{
mm=0;
hh++;
}
}
lcd_gotoxy(0,0);
printf("\fBay Gio La :\r\n %02d:%02d:%02d",hh,mm,ss);
TMR1H=239; //Khởi tạo giá trị đếm ban đầu cho timer1 (-------2--------)
TMR1L=255; // (-------3--------)
TMR1IF=0;
}
}
*Bước 3 : Nạp chương trình xuống kit thí nghiệm , jumper J1(XTAL).Quan sát lcd , và so sánh
kết quả với đồng hồ thực, nhận xét :
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
Dựa vào công thức định thời của timer 1, chứng minh những thông số ở các dòng (1),(2),(3):
Giáo trình thí nghiệm vi điều khiển ứng dụng
39
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
Bài 4: Viết chương trình sử dụng timer 2 điều khiển led RE1 chớp tắt với chu kì T=0.1s ,
sử dụng thạch anh ngoài 20MHz.
*Bước 1 : Tạo một project mới với tên 03_04_ MSSV
*Bước 2: Nhập chương trình sau vào máy tính :
#include
#include
__CONFIG(HS&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BORDI
S&IESODIS&LVPDIS&FCMDIS);
void main()
{
ANS6=…….;TRISE1=…….;RE1=…….; //Khởi tạo chân RE1 là ngõ ra số
T2CKPS1=…….;T2CKPS0=…….; //chọn tỉ lệ bộ chia prescaler 1:1
//Chọn tỉ lệ bộ chia postscaler 1:2 (-------1--------)
TOUTPS3=0;TOUTPS2=0;TOUTPS1=…….;TOUTPS0=…….;
PR2=…….; //Giá trị thanh ghi PR2 (-------2--------)
TMR2=…….; //Giá trị bắt đầu đếm của timer 2 (-------3--------)
//Cho phép timer 2 hoạt động
TMR2ON=…….;
//Khởi tạo ngắt timer 2
TMR2IE=…….; //Cho phép ngắt tràn timer 2
TMR2IF=…….; //Reset cờ ngắt
PEIE=…….; //Cho phép ngắt ngoại vi
GIE=…….; //Cho phép ngắt toàn cục
while(1)
{
}
}
void interrupt isr()
{
if(TMR2IE&&TMR2IF)
{
RE1^=1;
TMR2IF=…….; //Xóa cờ ngắt Timer2
TMR2=……. ; //Khởi tạo giá trị bắt đầu đếm timer2(-------4------)
Giáo trình thí nghiệm vi điều khiển ứng dụng
40
}
}
*Bước 3 : Tính toán các thông số ở dòng (1),(2),(3),(4)
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
*Bước 4 : Hoàn thành vào dấu .............và biên dịch chương trình , nạp xuống kít thí nghiệm ,
quan sát led .
V.BÀI TẬP TỰ GIẢI :
Bài 5 : Viết chương trình hiển thị tốc độ động cơ lên lcd theo sơ đồ phần cứng sau :
(Tạo một project mới với tên 03_05_ MSSV)
Giáo trình thí nghiệm vi điều khiển ứng dụng
41
BÀI 4: KHỐI CCP
(CAPTURE-COMPARE-PWM)
I.MỤC ĐÍCH THÍ NGHIỆM :
Kiến thức sinh viên cần đạt được sau khi thực tập:
− Giải thích nguyên tắc hoạt động và khởi tạo chế độ Capture.
− Giải thích nguyên tắc hoạt động và khởi tạo chế độ Compare .
− Giải thích nguyên tắc hoạt động và khởi tạo chế độ PWM.
− Phân biệt sự khác nhau và giống nhau giữa hai khối CCP1 và CCP2.
− Thiết lập được tần số PWM và điều chỉnh độ rộng xung PWM theo yêu cầu.
II.DỤNG CỤ THÍ NGHIỆM:
Kít thí nghiệm + cáp USB.
Động cơ DC12V.
Oscillocope.
Máy tính .
Nguồn 12V/1A.
III.CƠ SỞ LÝ THUYẾT :
Các chân được sử dụng cho khối CCP:
Các chân được sử dụng trong khối CCP
Để sử dụng khối CCP chúng ta cần phải biết khởi tạo và sử dụng thành thạo timer 0,1,2 bởi
vì một mình khối CCP không thể hoạt động được một ứng dụng mà phải sử dụng kết hợp với
một trong 3 timer , cụ thể là :
Giáo trình thí nghiệm vi điều khiển ứng dụng
42
1.Thanh ghi khởi tạo khối CCP1:
Khối CCP1 còn tích hợp thêm 4 chân mang kí hiệu : P1A, P1B, P1C, P1D hỗ trợ cho việc
điều khiển cầu H.
Các chân CCP1 hỗ trợ điều khiển cầu H
P1M : Bit khởi tạo ngõ ra PWM
Nếu khối CCP1 được khởi tạo ở chế độ capture hoặc compare thì chân có kí hiệu P1A là
chân hoạt động ở chế độ capture hoặc compare , còn các chân có kí hiệu P1B, P1C, P1D là các
chân không liên quan đến khối CCP1 , chúng ta có thể gán cho chúng chức năng I/O thông
thường .
Nếu khối CCP1 được khởi tạo ở chế độ PWM thì 2 bit P1M có 4 trạng thái điều khiển
cầu H như sau :
00:Ngõ ra đơn , P1A tạo xung , P1B , P1C, P1D hoạt động với chức năng I/O.
01:Chế độ Full – Bridge thuận , P1D tạo xung , P1A tác động , P1B , P1C không tác động
10:Chế độ hafl – Bridge , P1A ,P1B tạo xung , P1C, P1D hoạt động với chức năng I/O.
11: Chế độ Full – Bridge nghịch , P1B tạo xung , P1C tác động , P1A , P1D không tác
động .
DC1B : Hai bit mang trọng số nhỏ nhất trong chế độ hoạt động PWM10bit .Ở chế độ
Capture và Compare thì không cần quan tâm đến hai bit này.
CCP1M : Bit lựa chọn chế độ họat động khối CCP1
0000: Capture/Compare/PWM off(reset khối CCP1)
0001: Không sử dụng
0010: Chế độ Compare , đảo ngõ ra khi có sự kiện Compare (bit CCP1IF = 1).
0011: Không sử dụng
0100: Chế độ Capture , sự kiện Capture xảy ra khi ở chân CCP1 có 1 xung cạnh xuống .
0101: Chế độ Capture , sự kiện Capture xảy ra khi ở chân CCP1 có 1 xung cạnh lên .
0110: Chế độ Capture , sự kiện Capture xảy ra khi ở chân CCP1 có 4 xung cạnh lên .
0111: Chế độ Capture , sự kiện Capture xảy ra khi ở chân CCP1 có 16 xung cạnh lên .
Giáo trình thí nghiệm vi điều khiển ứng dụng
43
1000: Chế độ Compare , ngõ ra bằng 1 khi có sự kiện Compare (bit CCP1IF = 1).
1001: Chế độ Compare , ngõ ra bằng 0 khi có sự kiện Compare (bit CCP1IF = 1).
1010: Chế độ Compare , tạo ra sự kiện ngắt nội (bit CCP1IF = 1 , chân CCP1 không sử
dụng ).
1011: Chế độ Compare, tạo ra sự kiện trigger (CCP1IF =1; CCP1 resets TMR1 or
TMR2)
1100: Chế độ PWM , P1A , P1C tác động – mức cao , P1B , P1D tác động – mức cao
1101: Chế độ PWM , P1A , P1C tác động – mức cao , P1B , P1D tác động – mức thấp
1110: Chế độ PWM , P1A , P1C tác động – mức thấp , P1B , P1D tác động – mức cao
1111: Chế độ PWM , P1A , P1C tác động – mức thấp , P1B , P1D tác động – mức thấp
2.Thanh ghi khởi tạo khối CCP2:
Khác với khối CCP1 , khối CCP2 không có chức năng hỗ trợ điều khiển cầu H , trong chế
độ PWM , khối CCP2 chỉ có chức năng tạo ra xung PWM 10 bít ở chân CCP2.
DC2B : Hai bit mang trọng số nhỏ nhất trong chế độ hoạt động PWM-10bit , ở chế độ
Capture và Compare thì không cần quan tâm đến hai bit này.
CCP2M : Bit lực chọn chế độ họa động khối CCP1
0000: Capture/Compare/PWM off(reset khối CCP1)
0001:Không sử dụng
0010:Chế độ Compare , đảo ngõ ra khi có sự kiện Compare (bit CCP1IF = 1).
0011:Không sử dụng
0100:Chế độ Capture , sự kiện Capture xảy ra khi ở chân CCP1 có 1 xung cạnh xuống .
0101:Chế độ Capture , sự kiện Capture xảy ra khi ở chân CCP1 có 1 xung cạnh lên .
0110:Chế độ Capture , sự kiện Capture xảy ra khi ở chân CCP1 có 4 xung cạnh lên .
0111:Chế độ Capture , sự kiện Capture xảy ra khi ở chân CCP1 có 16 xung cạnh lên .
1000: Chế độ Compare , ngõ ra bằng 1 khi có sự kiện Compare (bit CCP1IF = 1).
1001: Chế độ Compare , ngõ ra bằng 0 khi có sự kiện Compare (bit CCP1IF = 1).
1010: Chế độ Compare , tạo ra sự kiện ngắt nội (bit CCP1IF = 1 , chân CCP1 không sử
dụng ).
1011: Chế độ Compare, tạo ra sự kiện trigger (CCP1IF =1; CCP1 resets TMR1 or
TMR2)
1100:Chế độ PWM , P1A , P1C tác động – mức cao , P1B , P1D tác động – mức cao
1101:Chế độ PWM , P1A , P1C tác động – mức cao , P1B , P1D tác động – mức thấp
1110:Chế độ PWM , P1A , P1C tác động – mức thấp , P1B , P1D tác động – mức cao
1111:Chế độ PWM , P1A , P1C tác động – mức thấp , P1B , P1D tác động – mức thấp
Giáo trình thí nghiệm vi điều khiển ứng dụng
44
3.Capture :
Sơ đồ khối chế độ capture
3.1 Nguyên tắc hoạt động của chế độ capture :
Khi có sự kiện (cạnh lên , cạnh xuống , 4 cạnh lên hoặc 16 cạnh lên ) ở chân CCPx (có thể là
CCP1 hay CCP2 tùy vào ta sử dụng khối CCP1 hay CCP2) thì giá trị thanh ghi đếm của timer 1
là TMR1H và TMR1L sẽ được cập nhật qua hai thanh ghi CCPRxH và CCPRxL của khối CCPx.
đồng thời có thể xảy ra ngắt nội bằng việc cho phép cờ ngắt CCPRxIF = 1 .(x=0,1)
3.2 Các bước khởi tạo chế độ capture :
Khởi tạo chân CCPx là ngõ vào : TRISCx=1;RCx=1;
Khởi tạo timer 1 hoạt động .
Khởi tạo khối CCPx hoạt động với chế độ capture :
CCPxCON = ......; //Chọn chế độ capture .
CCPRxH=CCPRxL=0; //reset hai thanh ghi của khối CCPx.
Khởi tạo ngắt (nếu có sử dụng):
CCPxIE=1; //Cho phép ngắt CCP
CCPxIF=0; //Reset cờ ngắt
PEIE=1; //Cho phép ngắt ngoại vi
GIE=1; //Cho phép ngắt toàn cục .
Giáo trình thí nghiệm vi điều khiển ứng dụng
45
4.Compare :
Sơ đồ khối chế độ compare
4.1Nguyên tắt hoạt động của chế độ compare :
Khi hai thanh ghi đếm TMR1H và TMR1L của timer 1 đếm đến giá trị của hai thanh ghi
CCPRxH và CCPRxL thì sẽ xảy ra một trong các sự kiện sau :
Đảo trạng thái ngõ ra của chân CCPx.
Tạo tín hiệu chân CCPx lên bằng 1 .
Xóa tín hiệu chân CCPx xuống bằng 0 .
Tạo ra ngắt .(CCPxIF =1 , chân CCPx không sử dụng )
Tạo ra sự kiện trigger .(CCP1IF=1,CCP1 reset timer 1 hoặc timer 2,CCP2IF=1,CCP2
reset timer 1 và ADC bắt đầu chuyển đổi nếu khối ADC được cho phép chuyển đổi , chân
CCP2 không sử dụng ).
4.2Các bước khởi tạo chế độ compare:
Khởi tạo chân CCPx là ngõ ra : TRISCx=0;
Khởi tạo timer 1 hoạt động .
Khởi tạo khối CCPx hoạt động với chế độ compare :
CCPxCON = ......; //Chọn chế độ compare .
CCPRxH=....;CCPRxL=.....; //Chọn giá trị đặt .
Khởi tạo ngắt (nếu có sử dụng) :
CCPxIE=1; //Cho phép ngắt CCP
CCPxIF=0; //Reset cờ ngắt
PEIE=1; //Cho phép ngắt ngoại vi
GIE=1; //Cho phép ngắt toàn cục .
5.PWM(Pulse-Width Modulated) :
Nói đến PWM thì ta phải nói đến hai đặc tính cơ bản là : tần số (do timer 2 tạo ra ) và độ
rộng xung (do thanh ghi CCPRxL:CCPxCON tạo ra ).
Sơ đồ tạo xung PWM là sự kết hợp của khối CCPx với timer 2 :
Giáo trình thí nghiệm vi điều khiển ứng dụng
46
Sơ đồ điều chế PWM
5.1Nguyên tắt hoạt động của chế độ PWM :
Thanh ghi đếm của timer 2 là TMR2 đếm đến giá trị thanh ghi CCPRxL:CCPxCON
của khối CCPx thì trạng thái logic chân CCPx bị đảo , khi giá trị của thanh ghi TMR2 đến giá trị
PR2 thì hoàn tất một chu kỳ tạo xung PWM .
Chú ý : Từ sơ đồ trên ta thấy để tạo xung PWM thì giá trị CCPRxL::CCPxCON
phải nhỏ hơn hoặc bằng giá trị thanh ghi PR2 , và muốn thay đổi độ rộng xung ta chỉ cần thay
đổi giá trị thanh ghi CCPRxL::CCPxCON trong lập trình .
Công thức tính chu kỳ PWM :
Công thức tính độ rộng xung PWM :
6.Các bước khởi tạo chức năng PWM:
Bước 1 : Cho phép chân PWM là ngõ vào:
TRISCx=1; //x= 1 , 2
Bước 2 : Khởi tạo tần số PWM bằng việc định giá trị thanh ghi PR2 của timer 2:
PR2=....; //Tính toán được từ công thức chu kỳ PWM
Bước 3: Đặt khối CCP hoạt động ở chế độ PWM
CCPxCON=0bxxxx11xx; //x=0;1
Bước 4 : Đặt độ rộng xung của khối PWM bằng việc đặt giá trị cho thanh ghi CCPRxL
và 2 bit DCxB của thanh ghi CCPxCON
CCPRxL=.....; //Có thể điều chỉnh giá trị này trong khi vi điểu khiển hoạt động
để thay đổi độ rộng xung khi cần thiết .
DCxB1=.....; //Nếu sử dụng PWM 8 bit thì có thể bỏ qua dòng này
Giáo trình thí nghiệm vi điều khiển ứng dụng
47
DCxB0=.....; //Nếu sử dụng PWM 8 bit thì có thể bỏ qua dòng này
Bước 5 : Khởi tạo và cho phép timer 2 hoạt động :
TMR2IF=0; //Xóa cờ ngắt TMR2IF của thanh ghi PIR1
//Chọn tỉ lệ bộ chia của timer 2 :
T2CKPS1=.....; //Chọn tỉ lệ bộ chia Prescaler
T2CKPS0=.....;
TOUTPS3=....; //Chon tỉ lệ bộ chia Postscaler
TOUTPS2=....;
TOUTPS1=....;
TOUTPS0=....;
//Cho phép timer 2 hoạt động
TMR2ON=1;
Bước 6 : Cho phép ngõ ta PWM sau khi chu kỳ PWM mới được bắt đầu :
while(TMR2IF); // Chờ cho đến khi timer 2 tràn (bit TMR2IF của thanh ghi
PIR1 được bậc lên 1)
TRISCx = 0 ; //x = 1 , 2 .
IV.BÀI TẬP THỰC HÀNH :
Bài 1:Viết chương trình tạo xung PWM có tần số 20KHz ở hai chân : CCP1(RC2) và
CCP2(RC1) với độ rộng xung CCP1 là 50% xung , CCP2 là 80% xung .
Sơ đồ phần cứng :
*Bước 1 :Tạo một project mới với tên 04_01_ MSSV
*Bước 2: Nhập chương trình sau vào máy tính và hoàn thành vào dấu …….
#include
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BO
RDIS&IESODIS&LVPDIS&FCMDIS);
void main( )
{
//Khởi tạo tần số 20Khz PWM (timer 2)
PR2=…….; //Chọn tần số 20KHz
T2CKPS1=T2CKPS0=…….; //Bộ chia Prescales 1:1
TOUTPS3=TOUTPS2=TOUTPS1=TOUTPS0=…….;//Bộ chia Postcales1:1
//Khởi tạo khối CCP1
TRISC2=…….; //Disable ngõ ra của chân CCP1
CCP1CON=0b00001100; //(-------1--------)
CCPR1L=…….; //Tạo PWM 50% xung ỡ chân CCP1(-------2--------)
TMR1IF=…….; //Xóa cờ ngắt của khối CCP1
// Khởi tạo khối CCP2
Giáo trình thí nghiệm vi điều khiển ứng dụng
48
TRISC1=…….; // Disable ngõ ra của chân CCP1
CCP2CON=0b00001100; // Khởi tạo module CCP2 hoạt động chế độ PWM
CCPR2L=…….; //Tạo xung PWM 80% ở chân CCP2(-------3--------)
TMR2IF=…….; // Xóa cờ ngắt của khối CCP2
//Cho phép timer 2 hoạt động bắt đầu tạo xung PWM
TMR2ON =…….; //Cho phép timer 2 hoạt động
TRISC2 =…….; //Cho phép chân CCP1 là ngõ ra
TRISC1 =…….; //Cho phép chân CCP2 là ngõ ra .
while(1);
}
*Bước 3 : Nạp chương trình vào kit thí nghiệm , dùng oscillocope đo tín hiệu hai xung ở chân
CCP1 và CCP2 .
*Bước 4 : Thay đổi dòng (-------1--------) thành đoạn code sau :
CCP1CON=0b00001111;
Biên dịch chương trình nạp vào kít , dùng oscillocope đo ngõ ra PWM chân CCP1 , quan
sát xung được tạo ra , nhận xét sự khác nhau giữa xung trước và sau khi thay đổi code , và giải
thích sự khác nhau đó .
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
*Bước 5 : Tính toán giá trị thanh ghi CCPR1L cho CCP1 tạo ra PWM 90% .
Tính toán giá trị thanh ghi CCPR2L cho CCP2 tạo ra PWM 10% .
Thay vào (-------2--------) và (-------3--------) , biên dịch chương trình , nạp xuống kít
thí nghiệm , sử dụng oscillocope đo ngõ ra xung và hoàn thành vào bảng sau :
PWM 90% PWM 10%
CCPR1L
CCPR2L
Giáo trình thí nghiệm vi điều khiển ứng dụng
49
Bài 2 : Viết chương trình điều khiển tốc độ động cơ sử dụng IC chuyên dụng L298 theo
yêu cầu sau : (Tạo một project mới với tên 04_02_ MSSV)
− Nhấn RB0 tốc độ động cơ tăng dần (mỗi lần nhấn tăng 10% độ rộng xung).
− Nhấn RB1 tốc độ động cơ giảm dần(mỗi lần nhấn giảm 10% độ rộng xung).
− Nhấn RB2 động cơ đảo chiều quay .
Với PWM tần số 10Khz , độ phân giải 8 bit , thạch anh nội 4MHz.
Phần cứng :
*Bước 1 :Tạo một project mới với tên 04_02_ MSSV
*Bước 2 :Nhập chương trình sau vào máy tính và hoàn thành vào dấu …….
#include
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BO
RDIS&IESODIS&LVPDIS&FCMDIS);
void main( )
{
ANSEL=ANSELH=…….; //Tắt chức năng xử lý analog ở tất cả các chân
TRISB=…….; //Khởi tạo PORTB là ngõ vào
PORTB=…….;
WPUB=…….; //Cho phép điện trở treo tất cả PORTB
RBPU=…….;
IOCB =…….; //Cho phép ngắt on-change cả PORTB
RBIE =…….; //Enable ngắt on-change ở PORTB
RBIF =…….; //Xóa cờ ngắt on-change
GIE =…….; //Cho phép ngắt toàn cục
TRISE0=…….; //Khởi tạo chân RE0 là ngõ ra , mức cao
RE0 =…….;
T2CON = 0x04; //Timer 2 , prescaler 1:1 , postcaler 1:1 , TMR2ON=1
PR2 =…….; //tần số 10KHz
CCP1CON=0x0C; //Khởi tạo chế độ PWM cho module CCP1
Giáo trình thí nghiệm vi điều khiển ứng dụng
50
CCP2CON=0x0C; //Khởi tạo chế độ PWM cho module CCCP2
CCPR1L=0;
CCPR2L=0;
TRISC2=1;
TRISC1=1;
while(1)
{
}
}
void interrupt isr()
{
if(RBIE&&RBIF)
{
if(!RB0)
{
CCPR1L+=10;
CCPR2L+=10;
TMR2ON=1;
}
if(!RB1)
{
CCPR1L-=10;
CCPR2L-=10;
TMR2ON=1;
}
if(!RB2)
{
TRISC2^=1;
TRISC1=~TRISC2;
TMR2ON=1;
}
RBIF=0;
}
}
*Bước 3 : Jum header CCP2 (J2) , biên dịch chương trình nạp xuống kít thí nghiệm , kết nối
động cơ và cấp nguồn cho L298 , tiến hành nhấn nút và quan sát kết quả .
V.BÀI TẬP TỰ GIẢI :
*Bài 3 : Viết chương trình sử dụng chức năng capture đo tần số ở chân CCP1(RC2) và hiển thị
giá trị đó lên LCD theo sơ đồ phần cứng sau (Tạo một project mới với tên 04_03_ MSSV):
Giáo trình thí nghiệm vi điều khiển ứng dụng
51
*Bài 4 : Viết chương trình tạo xung PWM 8 bit ở chân CCP2(RC1) với tần số 15 KHz theo
yêu cầu sau (Tạo một project mới với tên 04_04_ MSSV)::
Nhấn nút nhấn (không giữ ) ở chân RB0 lần 1 : Độ rộng xung 15% .
Nhấn nút nhấn (không giữ ) ở chân RB0 lần 2 : Độ rộng xung 30% .
Nhấn nút nhấn (không giữ ) ở chân RB0 lần 3 : Độ rộng xung 45% .
Nhấn nút nhấn (không giữ ) ở chân RB0 lần 4 : Độ rộng xung 60% .
Nhấn nút nhấn (không giữ ) ở chân RB0 lần 5 : Độ rộng xung 75% .
Nhấn nút nhấn (không giữ ) ở chân RB0 lần 6 : Độ rộng xung 90% .
Nhấn nút nhấn (không giữ ) ở chân RB0 lần 7 : Trở lại trạng thái nhấn lần 1 .
*Bài 5 :Viết chương trình theo yêu cầu sau (Tạo một project mới với tên 04_05_ MSSV):
Nhấn RB0 động cơ quay cùng chiều kim đồng hồ , PWM 10Khz , độ rộng xung 90%.
Nhấn RB1 động cơ quay ngược chiều kim đồng hồ , PWM 15Khz , độ rộng xung 70%.
Giáo trình thí nghiệm vi điều khiển ứng dụng
52
Giáo trình thí nghiệm vi điều khiển ứng dụng
53
BÀI 5:GIAO TIẾP NỐI TIẾP BẤT ĐỒNG BỘ (USART)
I.MỤC ĐÍCH THÍ NGHIỆM :
Kiến thức sinh viên cần đạt được sau khi thực tập:
Giải thích nguyên lý truyền nhận tín hiệu UART.
Trình bày được khái niệm : baund , start bit , stop bit , frame truyền , parity .
Liệt kê được các thanh ghi liên quan truyền nhận UART.
Thiết lập các bit cho vi điều khiển truyền nhận dữ liệu qua chuẩn UART.
II.DỤNG CỤ THÍ NGHIỆM:
Kít thí nghiệm + cáp USB.
Động cơ DC12V.
Oscillocope.
Máy tính .
Nguồn 12V/1A.
III.CƠ SỞ LÝ THUYẾT :
Các chân liên quan đến chức năng giao tiếp nối tiếp :
Các chân truyền nhận UART
1.Khái niệm về giao tiếp nối tiếp bất đồng bộ :
Các thuật ngữ trong truyền nhận nối tiếp bất đồng bộ :
Thuật ngữ USART trong tiếng anh gọi là :Universal synchronous và Asynchronous serial
Receiver and Transmitter , nghĩa là bộ truyền nối tiếp đồng bộ và bất đồng bộ . USART hay
UART cần phải kết hợp với một thiết bị chuyển đổi điện áp để tạo nên một chuẩn giao tiếp nào
đó .Ví dụ chuẩn Rs232(COM Port ) trên máy tính là sự kết hợp của chip UART và chip chuyển
đổi mức điện áp .Tín hiệu từ chip UART thường theo mức điện áp : mức high là +5V , mức slow
là 0V .Trong khi đó tín hiệu theo chuẩn RS232 trên máy tính thường là -12v cho mức high , và
+12v cho mức slow .
Giáo trình thí nghiệm vi điều khiển ứng dụng
54
Cấu trúc một frame truyền
Sơ đồ điện áp trong giao tiếp RS232 .
Truyền thông nối tiếp :
Giả sử muốn truyền một dữ liệu 8-bit giữa hai vi điều khiển với nhau , chúng ta có thể
nghĩ đến cách đơn giản nhất là kết nối một PORT (8 bit) của mỗi vi điều khiển với nhau ,
mỗi đường trên PORT sẽ đảm nhiệm việc truyền/nhận một bit dữ liệu . Đây gọi là cách
giao tiếp song song , cách này đơn giản và truyền nhận dữ liệu cũng không qua bất cứ một
giải thuật truyền nhận nào , và tốc độ truyền nhận cũng rất nhanh .Tuy nhiên , nhược điểm
của cách truyền này là số đường truyền nhiều , dữ liệu truyền càng lớn thì số đường truyền
càng nhiều , do đó hệ thống truyền nhận song song thường rất cồng kềnh và kém hiệu quả .
Ngược lại trong truyền thông nối tiếp , dữ liệu được truyền theo từng bit trên một đừơng
truyền , chính vì vậy dữ liệu cho dù có lớn thì chúng ta cũng chỉ cần có một đường truyền
duy nhất .
Sơ đồ truyền nhận 8 bit theo giao thức song song và nối tiếp .
Các thông số cơ bản trong truyền nhận nối tiếp :
Baund rate (tốc độ baund ): để truyền nhận nối tiếp xảy ra thành công thì các thiết bị
phải thống nhất với nhau về khoảng thời gian giành cho một bit truyền , hay nói cách khác
là tốc độ truyền phải được cài đặt giống nhau , tốc độ này gọi là tốc độ baund .Tốc độ
Giáo trình thí nghiệm vi điều khiển ứng dụng
55
baund là số bit truyền trong 1 giây . Ví dụ nếu tốc độ baund là 9600 thì thời gian giành cho
một bit truyền là 1/9600(s).
Frame (khung truyền ) : Khung truyền quy định về số bit trong mỗi lần truyền , các bit
báo như start , stop , các bit kiểm tra như parity , ngoài ra số lượng các bit trong một dữ liệu
cũng được quy định bởi khung truyền . Hình trên mô tả ví dụ về một khung truyền theo
UART , khung truyền này được bắt đầu bằng một start bit , tiếp theo là 8 bit , sau đó là 1bit
parity dùng để kiểm tra dữ liệu và cuối cùng là 2 bits stop .
Start bit : start bit là bit đầu tiên được truyền trong một frame , bit này có nhiệm vụ báo
cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới .Start bit là bit bắt buộc
phải có trong một khung truyền .
Data : là số dữ liệu mà chúng ta cần phải truyền nhận , data có thể là gói 8 bit hay 9 bit
tùy theo yêu cầu truyền nhận mà ta quy định .Trong truyền thông nối tiếp UART , bit có
trọng số nhỏ nhất LSB(Least significant bit ) sẽ được truyền trước , sau đó bit có trọng số
lớn nhất sẽ được truyền sau cùng MSB(Most signnificant bit ).
Parity bit : parity dùng để kiểm tra dữ liệu truyền có đúng không , có hai loại parity là
parity chẳn (event parity )và parity lẻ (odd parity ) .
Stop bit : stop bit là một hoặc các bit báo cho thiết bị rằng các bit đã được gởi xong. Sau
khi nhận được stop bit , thiết bị nhận sẽ tiến hành kiển ra khung truyền để đảm bảo tính
chính xác của dữ liệu .Stop bit là bit bắt buộc xuất hiện trong khung truyền .
Các thanh ghi điều khiển truyền UART:
Sơ đồ khối bộ truyền UART
Nguyên tắc hoạt động :
Dữ liệu cần truyền được đặt vào thanh ghi TXREG , baund rate được tạo ra , khi bit TXEN
được gán bằng một , dữ liệu từ thanh ghi TXREG đi vào thanh ghi TSR đồng thời baund rate tác
động đến thanh ghi TSR , đẩy dữ liệu cần truyền ra bộ điệm , sau đó xuất ra chân TX và đi ra
ngoài .
Bit TXIF dùng để báo trạng thái trong thanh ghi TXREG , nếu có dữ liệu trong thanh ghi
TXREG thì bít này sẽ có tín hiệu là 1 , ngược lại sau khi dữ liệu đã được truyền xuống thanh ghi
Giáo trình thí nghiệm vi điều khiển ứng dụng
56
TSR thì bít TXIF được xóa về không .Tương tự như bit TXIF , bit TRMT dùng để báo trạng thái
của thanh ghi TSR .Quá trình truyền cũng có thể tạo ra ngắt truyền , mỗi khi dữ liệu truyền đã
kết thúc bằng việc đặt bit TXIF=1.
Ngoải ra bộ truyền còn có thể truyền với chế độ 9 bit bằng việc cho bit TX9 =1 , và dữ liệu
của bit thứ 9 do bit TX9D quy định .
Thanh ghi quy định chế độ truyền :
Các bit liên quan đến chế độ truyền nhận bất đồng bộ.
TX9 :bit cho phép truyền nhận chế độ 9-bit
− 1:Cho phép hoạt động với chế độ 9 bit
− 0:Hoạt động với chế độ 8bit
TXEN:bit cho phép truyền UART
− 1:Cho phép truyền .
− 0:Không cho phép truyền .
SYNC :bit lực chọn chế độ truyền .
− 1:Truyền nhận chế độ đồng bộ.
− 0:Truyền nhận chế độ bất đồng bộ.
BRGH: bit lựa chọn chế độ baund rate
− 1: tốc độ cao (bất đổng bộ )
− 0:tốc độ thấp (bất đồng bộ)
TRMT : bit hiển thị trạng thái thanh ghi truyền
− 1:Thanh ghi TSR trống .
− 0:Thanh ghi TSR có dữ liệu .
TX9D : Dữ liệu bit thứ 9 trong chế độ truyền 9 bit
Ngắt truyền UART
Các bit khởi tạo ngắt truyền UART :
TXIF : cờ ngắt , sau khi thanh ghi TXREG truyền dữ liệu xuống thanh ghi TSR thì bit này tự
động bằng 1 .
TXIE : bit cho phép ngắt truyền , để tạo ra ngắt truyền ta cần phải cho phép bit này bằng 1 .
PEIE : bit cho pháp ngắt ngoại vi .
Giáo trình thí nghiệm vi điều khiển ứng dụng
57
GIE : bit cho phép ngắt toàn cục .
Các bước khởi tạo chế độ truyền UART :
*Bước 1 : Khởi tạo thanh ghi SPBRGH , SPBRG và các bit BRGH và BRG16 để tạo ra baund
rate cần thiết .
*Bước 2 : Cho phép giao tiếp bất đồng bộ :
SYNC=0;
SPEN=1;
*Bước 3 : Cho phép chế độ 9 bit (nếu sử dụng truyền nhận 9 bit ) :
TX9=1;
*Bước 4 : Cho phép truyền :
TXEN=1;
*Bước 5 : Nếu sử dụng ngắt thì cần phải khởi tạo :
TXIE=1;
PEIE=1;
GIE=1;
*Bước 6: Gởi dữ liệu cần truyền của bit thứ 9 (nếu sử dụng truyền nhận 9 bit ):
TX9D=…..;
*Bước 7 : Gởi dữ liệu cần truyền vào thanh ghi 8 bit:
TXREG=…..;
Các thanh ghi điều khiển nhận UART:
Sơ đồ khối bộ truyền UART
Nguyên tắc hoạt động :
Khi có dữ liệu được truyền tới chân RX , nếu bit SPEN được cho phép , thì dữ liệu sẽ được
đồng bộ với khối tạo xung , vì baund rate giữa hai khối truyền nhận bằng nhau, nên xung baund
mang dữ liệu từng bit vào thanh ghi RSR , khi một frame truyền hoàn tất (dấu hiệu từ bit stop) ,
thì dữ liệu được truyền xuống thanh ghi RCREG , bit thứ 9 được truyền xuống RX9D(nếu sử
Giáo trình thí nghiệm vi điều khiển ứng dụng
58
dụng chế độ 9 bit) , nếu trên đường truyền có lỗi thì các bit OERR, FERR sẽ được hiển thị để
báo .
Quá trình nhận củng có thể tạo ra ngắt sau khi kết thúc một frame truyền nhận, bằng việc làm
cho bit RCIF =1 .
Thanh ghi quy định chế độ nhận :
Các bit liên quan đến chế độ truyền nhận bất đồng bộ.
SPEN : Bit cho phép khởi tạo cổng nối tiếp :
− 1:Cho phép cổng nối tiếp
− 0: Không cho phép cổng nối tiếp
RX9: Bit cho phép nhận 9 bit
− 1: Chế độ nhận 9 bit
− 0: Chế độ nhận 8 bit
CREN : bit cho phép nhận liên tục
− 1: Cho phép .
− 0: Không cho phép .
ADDEN : bit cho phép phát hiện địa chỉ (sử dụng ở chế độ truyền nhận bất đồng bộ 9 bit )
− 1:Cho phép phát hiện địa chỉ , cho phép ngắt và tải bộ đệm nhận khi RSR được set.
− 0:Không cho phép phát hiện địa chỉ , tất cả byte được nhận và bit thứ 9 dùng làm bit
parity
FERR : bit báo lỗi frame
− 1: Có lỗi
− 0:Không có lỗi .
OERR : lỗi OVERRUN
− 1:Có lỗi (có thể xóa bằng việc xóa bít CREN)
− 0:Không lỗi .
RX9D : Bit chứa dữ liệu nhận của bit thứ 9
Ngắt nhận UART
Các bit khởi tạo ngắt nhận UART :
RCIF : cờ ngắt , sau khi thanh ghi RCREG nhận được dữ liệu thì bit này tự động bằng 1.
RCIE : bit cho phép ngắt nhận , để tạo ra ngắt nhận ta cần phải cho phép bit này bằng 1 .
Giáo trình thí nghiệm vi điều khiển ứng dụng
59
PEIE : bit cho pháp ngắt ngoại vi .
GIE : bit cho phép ngắt toàn cục .
Các bước khởi tạo chế độ nhận UART :
*Bước 1 : Khởi tạo thanh ghi SPBRGH , SPBRG và các bit BRGH và BRG16 để tạo ra baund
rate cần thiết .
*Bước 2 : Cho phép giao tiếp bất đồng bộ :
SYNC=0;
SPEN=1;
*Bước 3 : Nếu sử dụng ngắt nhận :
RCIE=1;
PEIE=1;
GIE=1;
*Bước 4 : Cho phép chế độ 9 bit bằng (nếu sử dụng truyền nhận 9 bit ) :
RX9=1;
*Bước 5 : Cho phép nhận dữ liệu :
CREN=1;
*Bước 6 : Cờ ngắt RCIF = 1 khi dữ liệu chuyển đổi từ RSR tới bộ điệm nhận . Ngắt sẽ được tạo
ra nếu RCIE=1.
*Bước 7 : Đọc thanh ghi RCSTA để phát hiện các lỗi trong quá trình truyền nhận.
*Bước 8 : Nhận 8 bit dữ liệu từ bộ điệm nhận bằng cách đọc thanh ghi RCREG.
*Bước 9 : Nếu có lỗi overrun xảy ra , xóa cờ OERR bằng cách xóa bit CREN.
Công thức tính tốc độ baund rate :
Trong đó :
FOSC là tần số hoạt động của vi điều khiển .
n=SPBRGH:SPBRG
Ví dụ : Tính tốc độ baund 9600 ,với điều kiện các bit khởi tạo như sau :
SYNC=0 ; BRG16=1; BRGH=1; Fosc= 4Mhz
Khi đó theo bảng ta có :
9600=
𝐹𝑂𝑆𝐶
4(𝑛+1)
n=103
Giáo trình thí nghiệm vi điều khiển ứng dụng
60
Do đó : SPBRG=103 , SPBRGH=0;
IV:BÀI TẬP THỰC HÀNH :
Bài 1 :Viết chương trình truyền nhận UART của vi điều khiển với máy tính , điều khiển
hoạt động của led theo yêu cầu sau :
Vi điều khiển nhận một số từ máy tính và điều khiển hai led RE1 va RE2 với 4 trạng thái
Nhận số 1: Hai led tắt , gởi lên máy tính chuỗi "Number 1".
Nhận số 2: Hai led sáng, gởi lên máy tính chuỗi "Number 2".
Nhận số 3:Led RE1 sáng,RE2 tắt ,gởi lại máy tính chuỗi "Number 3".
Nhận số 4:Led RE1 tắt ,RE2 sáng ,gởi lại máy chuỗi "Number 4".
Số khác :Hai led cùng chớp tắt với chu kỳ _delay(100000);gởi lại máy tính chuỗi "Other
numbers".
Vi điều khiển sử dụng thạch anh nội 4MHz , tốc độ baund : 9600 , truyền nhận 8 bit .
Cấu hình phần cứng :
*Bước 1 : Tạo một project mới với tên 05_01_ MSSV
*Bước 2 : Nhập chương trình sau vào máy tính và hoàn thành vào dấu …….
#include
#include
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&FC
MDIS&IESODIS&LVPDIS&BORDIS);
void send_string(char *s);
void send_char(char c);
char data ;
void main()
{
ANS6=ANS7=…….;TRISE1=TRISE2=…….; //Khởi tạo RE1,RE2 là ngõ ra số
//Cấu hình truyền UART
TXEN=…….; //Cho phép truyền
SYNC=…….;
//Cấu hình nhận UART
Giáo trình thí nghiệm vi điều khiển ứng dụng
61
SPEN =…….; //Cấu hình chân RX,TX ở chế độ truyền nhận UART
CREN=…….;
//Khởi tạo tốc độ baund 9600=Fosc/(4*(n+1)) với n=SPBRGH:SPBRG
BRG16=1; //(--------1----------)
BRGH=1; //(--------2----------)
SPBRG=103;SPBRGH=0; //(--------3----------)
//Khởi tạo ngắt nhận
RCIE =…….;
PEIE =…….;
GIE =…….;
while(1)
{
switch(data)
{
case 1:
RE1=RE2=…….;send_string("Number 1\r"); //Hai led tắt
break;
case 2:
RE1=RE2=…….;send_string("Number 2\r"); //Hai led sáng
break;
case 3:
RE1=0;RE2=…….;
send_string("Number 3\r"); //RE1 tắt , RE2 sáng
break;
case 4:
RE1=…….;RE2=…….;
send_string("Numer 4\r"); //RE2 tắt , RE1 sáng
break;
default:
RE1^=…….;RE2=RE1; //Hai led cùng chớp tắt.
send_string("Other numbers\r");
break;
}
_delay(100000);
}
}
void interrupt isr()
{
if(RCIF)
{
data=RCREG;
}
}
void send_char(char c)
Giáo trình thí nghiệm vi điều khiển ứng dụng
62
{
while(!TXIF);
TXREG=c;
}
void send_string(char *s)
{
while(*s)
send_char(*s++);
}
*Bước 3 : Nạp chương trình vào kít thí nghiệm , kết nối máy tính với kít thí nghiệm bằng cổng
COM(Nếu sử dụng Laptop thì cần có cáp USB−>COM .
*Bước 4 : Sử dụng chương trình Terminal (chương trình dùng test cổng COM) truyền nhận kí tự
xuống kit thí nghiệm , đồng thời quan sát 2 led trên kit thí nghiệm .
*Bước 5 : Chứng minh thông số của dòng (1) , (2), (3).
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------
Bài 2 : Làm lại bài 1 với tốc độ baund 14400 (Tạo một project mới với tên 05_02_ MSSV).
V.BÀI TẬP TỰ GIẢI :
Bài 3 : Viết chương trình truyền nhận UART của vi điều khiển với máy tính , hiển thị kết
quả lên lcd theo sơ đồ phần cứng sau (Tạo một project mới với tên 05_02_ MSSV):
Yêu cầu : Truyền một chuỗi số (tối đa 5 chữ số xxxxx) từ máy tính xuống vi điều khiển , vi điều
khiển hiển thị số vừa nhận được từ máy tính lên lcd , đồng thời gởi lại máy tính số vừa nhận
cộng thêm 10.Thạch anh 4Mhz , baund 9600 , truyền nhận 8-bit , phần cứng kết nối lcd theo thư
viện lcd.h .
Giáo trình thí nghiệm vi điều khiển ứng dụng
63
Bài 4 : Viết chương trình truyền nhận giữa vi điều khiển và máy tinh với các yêu cầu sau :
Máy tính truyền xuống vi điều khiển kí tự „S‟ , động cơ start.
Máy tính truyền xuống vi điều khiển kí tự „P‟ , động cơ stop.
Máy tính truyền xuống vi điều khiển kí tự „B-xxx‟ , động cơ quay thuận ,với xxx là độ
rộng xung PWM 8 bit .
Máy tính truyền xuống vi điều khiển kí tự „F-xxx‟ , động cơ quay nghịch , với xxx là độ
rộng xung PWM 8 bit .
Giáo trình thí nghiệm vi điều khiển ứng dụng
64
Bài 5 : Viết chương trình truyền nhận giữa máy tính và vi điều khiển với yêu cầu sau : máy tính
hiển thị vận tốc động cơ trên Terminal , baund 9600, Fosc = 4Mhz .
Giáo trình thí nghiệm vi điều khiển ứng dụng
65
TÀI LIỆU THAM KHẢO :
[1] PIC16F882/883/884/886/887 Data Sheet
[2]Dogan lbrahim , Advanced PIC Microcontroller Projects in C
[3]
[4]
Giáo trình thí nghiệm vi điều khiển ứng dụng
66
Phụ Lục
I.Cửa sổ chương trình :
I.Khởi tạo một project mới :
1.Tạo một folder (A) chứa tất cả các file chương trình
2.Khởi động MPLAB : Chọn Project , Project Wizard
Thanh Menu
Thanh Công Cụ
Của sổ viết
chương trình
1
2
Giáo trình thí nghiệm vi điều khiển ứng dụng
67
3.Chọn Next :
4.Chọn dòng PIC muốn lập trình , Next :
5.Lựa chọn công cụ lập trình (ở đây chọn H-TECH) , Next:
Chú ý : Chỉ duy nhất có dòng H-TECH sau khi cài đặt thành công Hi-tech C.
3
4
5
6
7
Giáo trình thí nghiệm vi điều khiển ứng dụng
68
6.Browse tới folder (A) , đặt tên cho bài làm (main), Next :
7.Nhấn Next , chọn Finish:
9
10
Giáo trình thí nghiệm vi điều khiển ứng dụng
69
8.Chọn NewFile ở thanh công cụ , viết đoạn chương trình #include trong
MPLAB IDE Editor , chọn Save :
9.Đặt tên main.c (Chú ý : phải có “.c” và Save in ở thư mục A) ,chọn save :
11
12
13
15
14
16
Giáo trình thí nghiệm vi điều khiển ứng dụng
70
10.Right click vào Source file ở cửa sổ main.mcw chọn Add files , Browse tới
main.c chọn open :
11.Hoàn tất tạo một project , tiếp tục viết chương trình .
17
18
Các file đính kèm theo tài liệu này:
- giao_trinh_thi_nghiem_vdk_4004.pdf