iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
自我挑戰組

MCU功能介紹與實作系列 第 18

Day 18: 中斷處理程式的編寫

  • 分享至 

  • xImage
  •  

以下是一個簡單的範例,示範如何在一個程序中使用外部中斷、定時器中斷和ADC中斷。我們使用AVR ATmega328P MCU,並且有一個外部按鈕連接到外部中斷引腳(INT0)、一個會定期觸發的定時器中斷,以及一個用於模擬數據轉換的ADC中斷。

#include <avr/io.h>
#include <avr/interrupt.h>

// 定義中斷優先順序
#define INTERRUPT_PRIORITY_LOW 0
#define INTERRUPT_PRIORITY_MEDIUM 1
#define INTERRUPT_PRIORITY_HIGH 2

// 函式用於比較中斷的優先順序
int compareInterruptPriorities(uint8_t interrupt1, uint8_t interrupt2) {
    if (interrupt1 < interrupt2) {
        return -1;
    } else if (interrupt1 > interrupt2) {
        return 1;
    } else {
        return 0;
    }
}

// 外部中斷處理函式
ISR(INT0_vect) {
    // 外部中斷處理程序程式碼
}

// 定時器中斷處理函式
ISR(TIMER1_COMPA_vect) {
    // 定時器中斷處理程序程式碼
}

// ADC中斷處理函式
ISR(ADC_vect) {
    // ADC中斷處理程序程式碼
}

int main(void) {
    // 初始化設定外部中斷
    // ...

    // 初始化設定定時器中斷
    // ...

    // 初始化設定ADC中斷
    // ...

    // 設定中斷優先級
    uint8_t int0Priority = INTERRUPT_PRIORITY_LOW;
    uint8_t timer1Priority = INTERRUPT_PRIORITY_MEDIUM;
    uint8_t adcPriority = INTERRUPT_PRIORITY_HIGH;

    // 比較中斷優先順序並設定中斷
    if (compareInterruptPriorities(int0Priority, timer1Priority) > 0) {
        sei();  // 啟用全域中斷
    }

    while (1) {
        // 主程式碼
    }

    return 0;
}

上一篇
Day 17: 中斷控制器配置
下一篇
Day 19: 電源管理單元(PMU)
系列文
MCU功能介紹與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言