[C14] Review buổi training về GPIO_Interrupt ngày 20/3

NghiaJenius

Ban Chủ Nhiệm
Chào các bạn, trong buổi training đầu tiên của khoá C14, các bạn đã được các anh chị hướng dẫn về nguyên tắc hoạt động của GPIO và Interrupt, và các bước để code trên kit MSP430 Launchpad.

Tinh thần ham học hỏi của các bạn rất đáng khen ngợi với số lượng đi học vẫn khá đông đủ, dù có các bạn kẹt giờ học và đi thi, hi vọng các bạn sẽ tiếp tục duy trì được sự cố gắng này trong suốt quá trình học để trở thành một lứa gà chất lượng của PIF.
:2cool_sexy_girl:

1. Tổng kết buổi đầu tiên, chúng ta đã được ôn lại và học thêm những kiến thức sau:
- Cách cấu hình chức năng GPIO cho vi điều khiển, những lưu ý khi sử dụng trở nội, dòng sink và source của chân VDK, cấu tạo của mạch pull-up, pull-down cơ bản.
- Nguyên lý hoạt động và cách sử dụng ngắt ngoài (GPIO_Interrupt), cách khai báo trong code, cách code thế nào là đúng.
- Cách đọc datasheet để tìm thông tin liên quan đến các thanh ghi trong bài học.
- Các bạn có thể dùng tài liệu tham khảo của các khoá học trước để tham khảo và hiểu thêm về những gì đã được nghe trong buổi training, nhưng vẫn khuyến khích các bạn đọc thêm User Guide và Datasheet để hiểu hơn.

2. Để các bạn bớt rảnh rỗi, chúng ta có bài tập về nhà như sau:
- Có 8 con LED và 2 nút nhấn trên ChickenBoard, code để từng con LED một sáng tuần tự từ trái sang phải, ví dụ con thứ 1 sáng, đến thứ 2 sáng, ... đến thứ 8 sáng. Sau đó đổi chiều lại, con thứ 7, đến 6 ,... Cứ như vậy, 1 lần sẽ có 1 con LED sáng, chạy qua chạy lại với thời gian chuyển vị trí là 0.2s.

- Nhấn nút 1: LED đổi chiều chạy NGAY TỨC KHẮC. Ví dụ: LED 2, đến 3, đến 4, nhấn nút --> lùi về 3, 2,...

- Nhấn nút 2: tăng số lượng LED sáng cùng lúc. Ví dụ: bắt đầu LED 1, đến 2, 3, nhấn nút --> 3 và 4 sáng, 4 và 5 sáng,...

- Khi không nhấn nút: LED vẫn chạy qua lại với chu kì chuyển vị trí là 0.2s, với số lượng LED sáng cùng lúc quy định bởi nút 2, và nút 1 có nhiệm vụ đổi chiều chạy ngay lập tức với độ delay <0.2s.

Không được sử dụng timer!

3. Code mẫu về cách sử dụng GPIO_Interrupt đã được đính kèm, các bạn có thể tham khảo để code cho đúng cách.
Mỗi bạn có thể sáng tạo cách code của riêng mình, miễn sao thoả yêu cầu và không mắc những lỗi đã được nhắc ở buổi training.

Chúng ta sẽ nộp bài tập ở buổi học tiếp theo, các bạn cố gắng hoàn thành. Mọi thắc mắc có thể liên hệ Advisor của từng nhóm hoặc post câu hỏi lên forum, lưu ý phải có [C14] ở đầu và câu hỏi rõ ràng để được hồi đáp nhanh chóng.

Good luck!
:6cool_boss:

Code:
#include <msp430.h>
#include "stdbool.h"
/*
* main.c
*/
bool i;
void main(void)
{
    // GPIO Init
    WDTCTL = WDTPW + WDTHOLD;    // Stop watch dog timer
 
    P1DIR |= BIT0 + BIT6;        // Set P1.0 and P1.6 to output
    P1OUT &= ~(BIT0 + BIT6);
 
    P1DIR &= ~BIT3;                // Set P1.3 to input
    P1REN |=BIT3;
    P1OUT |=BIT3;
 
    // Interrupt config
    P1IE |= BIT3;                // Enable P1.3 Interrupt
    P1IES |= BIT3;                // Falling Edge Interrupt
    P1IFG &= ~BIT3;                // Clear Interrupt Flags
 
    _BIS_SR(GIE);                // enable global interrupt
 
    i = 0;
    while(1){
        if(i==1){
            P1OUT^=BIT0;
            __delay_cycles(200000);
        }
        else{
            P1OUT^=BIT6;
            __delay_cycles(200000);
        }
    }
}
 
/******************************************************************************
* INTERRUPT
*****************************************************************************/
#pragma vector = PORT1_VECTOR
__interrupt void P1_ISR (void)
{
    i = (i==0);
    __delay_cycles(200000);
    P1IFG &= ~BIT3;    // Clear Interrupt Flags
}
 
// If using GCC toolchain
//static void
//__attribute__((__interrupt__(PORT1_VECTOR)))
//P1_ISR (void)
 
Top