Chương trình 1.7: Source file software_timer.cGhi chú: Đối với các bài tập sau, việc bổ sung software timer được thực hiện tượng tự, do đó sẽ không trình bày lại source code... Chương tr
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH
BÁO CÁO THỰC HÀNH
VI XỬ LÝ - VI ĐIỀU KHIỂN LAB 2: TIMER INTERRUPT AND LED SCANNING
Trang 2Mục lục
1.1 Thiết lập Timer Interrupt 4
1.1.1 Sơ đồ nguyên lý 4
1.1.2 Source code 4
1.2 Bài 1 6
1.2.1 Sơ đồ nguyên lý 6
1.2.2 Source code 6
1.2.3 Trả lời câu hỏi 9
1.3 Bài 2 10
1.3.1 Sơ đồ nguyên lý 10
1.3.2 Source code 10
1.3.3 Trả lời câu hỏi 12
1.4 Bài 3 12
1.4.1 Hiện thực hàm update7SEG(int index) 12
1.4.2 Source code 13
1.5 Bài 4 13
1.5.1 Source code 13
1.6 Bài 5 14
1.6.1 Hiện thực hàm updateClockBuffer() 14
1.6.2 Source code 14
Trang 31.7 Bài 6 15
1.7.1 Trả lời câu hỏi 16
1.7.2 Trả lời câu hỏi 16
1.7.3 Trả lời câu hỏi 16
1.8 Bài 7+8 17
1.9 Bài 9 17
1.9.1 Sơ đồ nguyên lý 17
1.9.2 Hiện thực hàm updateLEDMatrix(int index) 18
1.9.3 Hiển thị ký tự 18
1.10 Bài 10 21
1.10.1 Source code 21
Trang 4Chương 1
Timer Interrupt and LED Scanning
Link GitHub
Link Overleaf
Trang 51.1 Thiết lập Timer Interrupt
Sử dụng header file software_timer.h và source file software_timer.c để hiện thực software timer.
1 # i f n d e f I N C _ S O F T W A R E _ T I M E R _ H _
2 # d e f i n e I N C _ S O F T W A R E _ T I M E R _ H _
3
4 e x t e r n int t i m e r 0 _ f l a g ;
Trang 6Chương trình 1.2: Source file software_timer.c
Khởi tạo chương trình đơn giản, với một LED nối vào chân PA2 và thiết lập các thông số phù hợp cho timer interrupt.
Trang 7Hình 1.2: Sơ đồ nguyên lý
Sử dụng header file led_display.h và source file led_display.c để hiện thực các hàm liên quan đến điều khiển LED.
Trang 86 v o i d d i s p l a y 7 S E G (int num ) {
7 if ( num >= 0 && num <= 9) {
8 GPIOA - > ODR = ( GPIOA - > ODR | ( s e t 7 S E G [ num ] < < 8) ) & ~( r e s e t 7 S E G [ num ]
Chương trình 1.5: Source file led_display.c
Hiện thực bổ sung timer1 dùng để điều khiển quá trình quét LED.
Trang 9Chương trình 1.7: Source file software_timer.c
Ghi chú: Đối với các bài tập sau, việc bổ sung software timer được thực hiện tượng
tự, do đó sẽ không trình bày lại source code.
Trang 10Chương trình 1.8: Các thay đổi trong source file main.c
Ghi chú: Xuyên suốt bài thực hành, đoạn chương trình trình bày source file main.c chỉ trình bày những phần USER CODE có sự thay đổi, những phần không thay đổi sẽ không được trình bày.
Xác định tần số của quá trình quét LED.
Chu kỳ của quá trình quét LED: T = 0.5 + 0.5 = 1(s).
Tần số của quá trình quét LED: f = 1/T = 1/1 = 1(Hz).
Trang 13Chương trình 1.10: Các thay đổi trong source file main.c
Xác định tần số của quá trình quét LED.
Chu kỳ của quá trình quét LED: T = 0.5 + 0.5 + 0.5 + 0.5 = 2(s).
Tần số của quá trình quét LED: f = 1/T = 1/2 = 0.5(Hz).
Trang 15Xác định giá trị DURATION_1.
Chu kỳ của quá trình quét LED: T = 1/f = 1/1 = 1(s).
Thời gian sáng của mỗi LED: t = T /LED_NUMBER = 1/4 = 0.25(s) = 250(ms).
Trang 174 H A L _ G P I O _ T o g g l e P i n ( L E D _ R E D _ G P I O _ P o r t , L E D _ R E D _ P i n ) ;
7 }
Chương trình 1.16: Đoạn chương trình mẫu sử dụng để nhấp nháy đèn LED
Nếu dòng 1 của đoạn code mẫu trên bị thiếu, điều gì sẽ xảy ra và tại sao? Nếu dòng 1 của đoạn code mẫu trên bị thiếu, biến timer_flag0 sẽ không được set Khi đó, điều kiện trong vòng lặp while (1) sẽ không bao giờ đúng, LED_RED sẽ không được chuyển đổi trạng thái.
Nếu dòng 1 của đoạn code mẫu trên đổi thành setTimer0(1), điều gì sẽ xảy ra và tại sao?
Nếu dòng 1 của đoạn code mẫu trên đổi thành setTimer0(1), biến timer_flag0
sẽ được set sau 1ms Khi đó, điều kiện trong vòng lặp while (1) sẽ trở thành đúng, LED_RED sẽ chuyển đổi trạng thái rất nhanh ở lần đầu tiên Sau đó, hàm set- Timer0(2000) sẽ lần lượt được gọi, LED_RED sẽ chuyển đổi trạng thái sau một khoảng thời gian nhất định (2000ms).
Nếu dòng 1 của đoạn code mẫu trên đổi thành setTimer0(10), những thay đổi gì sẽ xảy ra so với 2 câu hỏi trước và tại sao?
Nếu dòng 1 của đoạn code mẫu trên đổi thành setTimer0(10), biến timer_flag0
sẽ được set sau 10ms Khi đó, điều kiện trong vòng lặp while (1) sẽ trở thành đúng, LED_RED sẽ chuyển đổi trạng thái nhanh hơn bình thường ở lần đầu tiên Sau đó, hàm setTimer0(2000) sẽ lần lượt được gọi, LED_RED sẽ chuyển đổi trạng thái sau một khoảng thời gian nhất định (2000ms).
So với trường hợp 1, LED_RED có thể thay đổi trạng thái bình thường So với trường hợp 2, LED_RED ở trường hợp 3 chuyển đổi trạng thái lần đầu tiên chậm hơn (10ms so với 1ms).
Trang 18Các chân từ PB8 đến PB15 theo thứ tự kết nối với các tín hiệu từ ROW_0 đến ROW_7.
Hình 1.4: Sơ đồ nguyên lý
Trang 191.9.2 Hiện thực hàm updateLEDMatrix(int index)
1 u i n t 1 6 _ t s e t M a t r i x E n a b l e [9] = {0 x01 , 0 x02 , 0 x04 , 0 x08 , 0 x10 , 0 x20 , 0 x40 ,
0 x80 , 0 x00 };
2 u i n t 1 6 _ t r e s e t M a t r i x E n a b l e [9] = {0 xFE , 0 xFD , 0 xFB , 0 xF7 , 0 xEF , 0 xDF , 0xBF , 0 x7F , 0 xFF };
Trang 2185 GPIOB - > ODR = ( GPIOB - > ODR | ( s e t M a t r i x R o w [ c - 'A' + 1 0 ] [ i n d e x ] < < 8) )
Chương trình 1.18: Hàm displayLEDMatrix(char c, int index)
Hiện thực bổ sung timer4 dùng để điều khiển quá trình quét LED ma trận Giá trị của DURATION_4 được đặt tùy ý.
Cập nhật sourcefile main.c thực hiện yêu cầu của đề bài.