Báo cáo thí nghiệm kỹ thuật vi xử lý bài 1 gpio sinh viên viết chương trình cho led1 và led2 sáng tắt luân phiên thời gian giữa 2 lần sáng tắt là khoảng 1s

13 19 0
Báo cáo thí nghiệm kỹ thuật vi xử lý bài 1 gpio sinh viên viết chương trình cho led1 và led2 sáng tắt luân phiên  thời gian giữa 2 lần sáng tắt là khoảng 1s

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BỘ GIÁO DỤC & ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐẠI HỌC ĐÀ NẴNG KHOA ĐIỆN TỬ VIỄN THÔNG  BÁO CÁO THÍ NGHIỆM KỸ THUẬT VI XỬ LÝ Thành viên NGUYỄN TRÂM ANH – 20DT1 ĐÀM THỊ ÁI NHI – 20DT1 NGUYỄN ĐÌNH TH[.]

BỘ GIÁO DỤC & ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA-ĐẠI HỌC ĐÀ NẴNG KHOA ĐIỆN TỬ-VIỄN THÔNG  BÁO CÁO THÍ NGHIỆM KỸ THUẬT VI XỬ LÝ Thành viên : NGUYỄN TRÂM ANH – 20DT1 : ĐÀM THỊ ÁI NHI – 20DT1 : NGUYỄN ĐÌNH THUẬN – 20DT2 Lớp HP : 20N38C GVHD : ThS TRẦN VĂN LÍC Đà Nẵng, tháng năm 2023 Các thí nghiệm Bài 1: GPIO Các ghi liên quan đến GPIO: 1.1 Direction Register PxDIR (P1DIR, P2DIR): Đây ghi bit điều khiển chiều chân port P1DIR điều khiển PORT1, P2DIR điều khiển PORT2  Bit = 1: Chân PORT tương ứng cấu hình thành output  Bit = 0: Chân PORT tương ứng cấu hình thành input 1.2 Input Register (PxIN): Đây ghi bit chứa giá trị đọc từ chân PORT  Bit = 1: Chân PORT tương ứng mức cao  Bit = 0: Chân PORT tương ứng mức thấp 1.3 Output Register (PxOUT): Đây ghi điều khiển ngõ PORT  Bit = 1: Xuất mức cao chân PORT tương ứng  Bit = 0: Xuất mức thấp chân PORT tương ứng 1.4 Function Select Register: Đây ghi chọn chức cho chân PORT Mỗi chân PORT cấu hình chọn chức Input/Output chức đặc biệt khác  Bit = 1: Chọn chức đặc biệt  Bit = 0: Chọn chức GPIO Các lưu ý viết chương trình cho lab này: 2.1 Watchdog Timer: Trong lab này, không cần sử dụng Watchdog timer Để tắt Watchdog timer, ghi giá trị 5A vào bit cao ghi WDTCTL set thứ ghi WDTCTL WDTCTL = 0x5A00 | 0x0080 Hoặc: (WDTCTL = WDTPW | WDTHOLD) 2.2 Delay: Bởi chương trình chưa định nghĩa clock nên CPU sử dụng thạch anh 32.768 kHz Để có thời gian delay khoảng 1s, vịng delay đếm xuống từ 30.000SV dùng câu lệnh để tạo delay: for(int i=30000;i>0;i++); Bài 1.1 Yêu cầu: Sinh viên viết chương trình cho LED1 LED2 sáng tắt luân phiên Thời gian lần sáng tắt khoảng 1s Câu hỏi 1: Các LED kết nối với MCU hình Điền vào chỗ trống để trả lời câu hỏi + LED1 nối vào chân MCU? (Cổng (Port) nào?) Trả lời: …………………P1.0………………………… + LED2 nối vào chân MCU? (Cổng (Port) nào?) Trả lời: …………………P1.6………………………… + Để điều khiển LED, chân port phải input hay output? Trả lời: …………………Output……………………… + Để LED sáng, phải xuất giá trị chân port? Trả lời: ……………P1OUT = BIT + BIT 6……… Câu hỏi 2: Hồn chỉnh chương trình cách điền vào chỗ trống: #include int main(void) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT0 + BIT6; P1OUT &=~BIT0 + BIT6; P1OUT |= BIT0 while(1) { int i=10000; } do(i ); while(i!=0); { P1OUT^= BIT6 + BIT0; delay_cycles(1000000); } } Bài 1.2 Yêu cầu: Sinh viên viết chương trình để đảo trạng thái LED1 S2 nhấn Câu hỏi 1: Các SW(switch) kết nối với MCU hình Điền vào chỗ trống để trả lời câu hỏi + SW1 nối vào chân MCU? (Cổng (Port) nào?) Trả lời: Chân 16 MCU, cổng RST/SBWTDIO + SW2 nối vào chân MCU? (Cổng (Port) nào?) Trả lời: Chân MCU, cổng P1.3 + Để đọc trạng thái switch, chân port phải input hay output? Trả lời:…………………Input………………………… Câu hỏi 2: Hồn chỉnh chương trình cách điền vào chỗ trống: #include int main(void) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW | WDTHOLD; P1DIR |= BIT0; P1REN |= BIT3; P1OUT |= BIT3; while (1) { if (!(P1IN & BIT3)) { P1OUT ^= BIT0; delay_cycles(500000); } } } // kiem tra neu S2 duoc nhan Bài GPIO INTERRUPT & MSP430 thiết kế để làm việc với ứng dụng công suất thấp Vì CPU thường trạng thái “off” phần lớn thời gian Để đưa CPU vào trạng thái “off”, bit SCG1, SCG0 CPUOFF ghi SR set Một ngắt xảy đánh thức CPU Khi ghi SR lưu vào stack CPU thực thi ISR Khi thoát khỏi ISR, ghi SR lấy từ stack làm cho CPU tắt trở lại Đưa CPU vào trạng thái công suất thấp cho phép ngắt: Bit GIE ghi SR set cho phép ngắt Ta đưa CPU vào trạng thái công suất thấp, cho phép ngắt lệnh: _BIS_SR (LPM3_bits + GIE); Trong đó: LPM3_bits = (SCG1+SCG0+CPUOFF) Định nghĩa chương trình phục vụ ngắt (ISR): Ta định nghĩa ISR vector ngắt ISR_VECTOR cấu trúc sau: #pragma vector=ISR_VECTOR interrupt void myISR (void) { ……………………… } 1.5 Các ghi cấu hình ngắt cho chân PORT: Mỗi chân PORT MSP430 dùng để tạo ngắt Các ngắt cấu hình thơng qua ghi PxIFG, PxIE, PxIES 1.5.1 Interrupt enable Register (PxIE): Mỗi bit ghi dùng phép/không cho phép ngắt chân PORT tương ứng  Bit = 1: Cho phép ngắt  Bit = 0: Cấm ngắt 1.5.2 Interrupt Edge Select Registers (PxIES): Dùng để chọn cạnh tín hiệu ngắt  Bit = 1: Ngắt cạnh xuống tín hiệu  Bit = 0: Ngắt cạnh lên tín hiệu 1.5.3 Interrupt Flag Registers (PxIFG): Thanh ghi chứa cờ ngắt Các cờ tự động bật phần cứng, phải xóa phần mềm Các cờ bật phần mềm phép ngắt   Bit = 1: Một ngắt chờ xử lý Bit = 0: Khơng có ngắt chờ Bài 2.1 Yêu cầu: Sinh viên viết chương trình đảo trạng thái LED1 Switch nhấn Trong chương trình sử dụng ngắt chân port giao tiếp Switch Câu hỏi 1: Các SW(switch) kết nối với MCU hình Điền vào chỗ trống để trả lời câu hỏi + SW2 nối vào chân Port CPU? Trả lời: …………………P1.3………………………… + Khi Switch nhấn, có chuyển trạng thái chân PORT? + Để cho phép ngắt chân P1.0, ta phải ghi P1IE |= BIT3 vào bit ghi P1IE + Để chọn cạnh xuống cho ngắt chân P1.0, ta phải ghi P1IES |= BIT3 vào bit ghi P1IES Câu hỏi 2: Hồn chỉnh chương trình cách điền vào chỗ trống: #include "msp430g2553.h" int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT0; P1OUT |= BIT0; P1DIR &= ~BIT3; P1REN |= BIT3; P1OUT |= BIT3; P1IE |= BIT3; P1IES |= BIT3; _BIS_SR(GIE); } #pragma vector=PORT1_VECTOR interrupt void Port_1(void){ while (!(P1IN & BIT3)); delay_cycles(500000); P1OUT ^= BIT0; P1IFG &= ~BIT3; } Bài 2.2 Yêu cầu: Sinh viên viết chương trình cho phép/khơng cho phép LED1 nhấp nháy Switch nhấn Hướng dẫn: Để thực thí nghiệm này, sinh viên cần thực việc cấu hình cho cổng I/O, thiết lập đường ngõ vào để đọc tín hiệu từ nút nhấn ngõ để điều khiển LED1 Sinh viên sử dụng số gợi ý sau để viết chương trình Để phát nút nhấn có nhấn hay khơng, sử dụng cấu trúc lệnh: if ( !P1IN & 0x01) Sau khai báo biến điều khiển chương trình phát LED nhấp nháy hay không, nút nhấn:  Định nghĩa biến thị LED nháy: Unsigned char blink_status = 1;  Thiết lập chương trình hoạt động phụ thuộc vào trạng thái biến while(1){ // Infinite loop if (blink_status == 1) { P2OUT ^= 0x04; // Toggle Port P2.2 i=15000; // Delay (i‐‐); while (i !=0); } if (!(P1IN & 0x01)) { // Detect S1 pressed i=1500; // Delay, button debounce (i‐‐); while (i !=0); while (!(P1IN & 0x01)); // Wait for the release of the button i=1500; // Delay, button debounce (i‐‐); while (i !=0); if (blink_status ==1){ // If led is blinking, stop it P2OUT&= _ 0x04; // Turn Led off blink_status=0; }else blink_status=1; Viết chương trình vào đây: #include "msp430g2553.h" unsigned int blink_status = 1; int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT0; P1OUT |= BIT0; P1DIR &= ~BIT3; P1REN |= BIT3; P1OUT |= BIT3; while(1){ if(blink_status == 1){ P1OUT ^= BIT0; // Dao trang thai P1.0 delay_cycles(500000); }else { P1OUT &= ~BIT0; // Tat den led } if(!(P1IN & BIT3)){ // Kiem tra neu S2 duoc nhan delay_cycles(5000000); while (!(P1IN & BIT3)); if(blink_status == 1){ // cho phep nhay led P1OUT &= ~BIT0; // Tat den led blink_status = 0; } } } } }else { blink_status = 1; delay_cycles(100000); Bài 2.3 Yêu cầu: Sinh viên viết chương trình cho phép/không cho phép LED1 nhấp nháy Switch nhấn Trong chương trình sử dụng ngắt chân port giao tiếp Switch Hướng dẫn: Sinh viên vận dụng kiến thức hướng dẫn có 2.1 2.2 để viết chương trình Viết chương trình vào đây: #include "msp430g2553.h" unsigned int blink_status = 1; int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT0 ; P1OUT &= ~BIT0 ; P1DIR &= ~BIT3; P1REN |= BIT3; P1OUT |= BIT3; P1IE |= BIT3; P1IES |= BIT3; _BIS_SR(GIE); } while(1){ if(blink_status == 1){ // cho phep nhay led P1OUT ^= BIT0; // Dao trang thai P1.0 delay_cycles(500000); }else { P1OUT &= ~BIT0; // Tat den led } } #pragma vector=PORT1_VECTOR interrupt void Port_1(void){ while(!(P1IN & BIT3)); if(blink_status == 1){ P1OUT &= ~BIT0; blink_status = 0; } }else { blink_status=1; } delay_cycles(100000); P1IFG &= ~BIT3; Bài 2.4 Yêu cầu: Sinh viên viết chương trình cho phép LED1 khơng cho phép LED2 nhấp nháy Switch nhấn, không cho phép LED1 cho phép LED2 nhấp nháy Switch nhấn Hướng dẫn: Sinh viên vận dụng kiến thức hướng dẫn có 2.1 2.2 để viết chương trình Viết chương trình vào : #include "msp430g2553.h" int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer P1DIR |= BIT0 | BIT6; // Set P1.0 and P1.6 as output P1DIR &= ~BIT3; // Set P1.3 as input P1REN |= BIT3; // Enable pull-up resistor for P1.3 int blink_led1 = 0; // Flag to enable/disable blinking for LED1 int blink_led2 = 0; // Flag to enable/disable blinking for LED2 while(1) { if (!(P1IN & BIT3)) { // Check if button is pressed delay_cycles(10000); // Delay for button debounce if (!(P1IN & BIT3)) { // Check if button is still pressed if (blink_led1) { blink_led1 = 0; // Disable blinking for LED1 11 P1OUT &= ~BIT0; // Turn off LED1 blink_led2 = 1; // Enable blinking for LED2 }else { blink_led1 = 1; // Enable blinking for LED1 blink_led2 = 0; // Disable blinking for LED2 } } while (!(P1IN & BIT3)); // Wait for button release } if (blink_led1) { // If flag for LED1 is set, blink LED1 P1OUT ^= BIT0; // Toggle P1.0 delay_cycles(100000); // Delay for LED1 blink }else { P1OUT &= ~BIT0; // Turn off LED1 } if (blink_led2) { // If flag for LED2 is set, blink LED2 P1OUT ^= BIT6; // Toggle P1.6 delay_cycles(50000); // Delay for LED2 blink }else { P1OUT &= ~BIT6; // Turn off LED2 } } } Bài 2.5 Yêu cầu: Sinh viên viết chương trình cho phép LED1 không cho phép LED2 nhấp nháy Switch nhấn, không cho phép LED1 cho phép LED2 nhấp nháy Switch nhấn Trong chương trình sử dụng ngắt chân port giao tiếp Switch Hướng dẫn: Sinh viên vận dụng kiến thức hướng dẫn có 2.1 2.2 để viết chương trình Viết chương trình vào đây: #include "msp430g2553.h" unsigned int blink_status = 1; int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT0 + BIT6; P1OUT |= BIT0 + BIT6; /* setup GPIO cho nut nhan P1.3 */ P1DIR &= ~BIT3; // P1.3 la input P1REN |= BIT3; // cho phep dien tro keo P1OUT |= BIT3; // dien tro keo len nguon P1IE |= BIT3; // cho phep ngat tai P1.3 P1IES |= BIT3; // chon tin hieu ngat la suon xuong (high-to-low) _BIS_SR(GIE); while(1){ if(blink_status == 1){ P1OUT ^= BIT0; P1OUT |= BIT6; delay_cycles(500000); } else { P1OUT |= BIT0; P1OUT ^= BIT6; delay_cycles(500000); } } } #pragma vector=PORT1_VECTOR interrupt void Port_1(void){ while(!(P1IN & BIT3)); if(blink_status == 1){ blink_status = 0; } else { blink_status=1; } delay_cycles(100000); P1IFG &= ~BIT3; }

Ngày đăng: 11/04/2023, 05:55