Bài giảng Xuất nhập i/o port

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

pdf70 trang | Chia sẻ: hao_hao | Lượt xem: 2395 | Lượt tải: 1download
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:

  • pdfgiao_trinh_thi_nghiem_vdk_4004.pdf
Tài liệu liên quan