2009年12月8日 星期二

紅外線發射程式

最近用微處理器(MCU)寫了個紅外線發射的程式…
原本的想法太過於複雜,程式寫久了會想要把東西寫的更靈活,於是會自己加了很多動態的計算、即時的判斷程式碼,沒想到對系統資源有限、時序要求非常嚴苛的 MCU 卻是一種負擔,這在多核的MCU如FPPA下不是什麼大問題,但在傳統的 MCU 如 EMC 或 PIC 卻會讓你越靈活就越難以控制(尤其是當你用C而不用組合語言來寫的時候)。
在重新思考及嘗試後才發現原來程式很簡單…

/// 這邊的編碼是以 SM5032 為例…
void IR_Bit0( void )
{
/// 產生1/4週期的38KHZ載波
}

void IR_Bit1( void )
{
/// 產生3/4週期的38KHZ載波
}

void IR_Empty( void )
{
/// 空周期延時
}

void IR_Head( void ){
      IR_Bit1();
      IR_Bit1();
      IR_Bit0();
}

void IR_Custom( void )
{
      IR_Bit1();
      IR_Bit1();
}

void IR_Tail( void )
{
      IR_Empty();
      IR_Empty();
      IR_Empty();
      IR_Empty();
}

#define _0 IR_Bit0();   
#define _1 IR_Bit1();
#define _H IR_Head();    /// HEAD code
#define _C IR_Custom();/// Custom code
#define _T IR_Tail(); /// End code
   
void main()
{
    Initial();
    Initial_IO();
   
    while(1)
    {
        if( BTN0 == 0 )
        {
            _H _C _0 _0 _0 _0 _0 _0 _1 _T                       
        } else if( BTN1 == 0 )
        {
            _H _C _0 _0 _0 _0 _0 _1 _0 _T     
        } else if( BTN2 == 0 )
        {
            _H _C _0 _0 _0 _1 _0 _0 _0 _T                       
        } else if( BTN3 == 0 )
        {
            _H _C _1 _0 _0 _0 _0 _1 _1 _T                       
        } else if( BTN4 == 0 )
        {
            _H _C _0 _0 _0 _0 _1 _0 _0 _T                       
        } else if( BTN5 == 0 )
        {
            _H _C _0 _0 _1 _0 _0 _0 _0 _T                       
        } else if( BTN6 == 0 )
        {
            _H _C _0 _1 _0 _0 _0 _0 _0 _T                       
        }
    }
}






另外有一點要特別注意,一般紅外線發射會使用455KHZ的晶振,算是比較低頻,各家 MCU 特性不同,有可能會需要在 OSCO 串上個串聯電組 (5-10K)才會正常起振。

沒有留言:

更高效處理 micro second 的方式

更高效處理 micro second 的方式…  以 STM32 為例… __IO unsigned long sys_tick = 0; void SysTick_Handler(void) {     HAL_IncTick();     sys_tick += (SysTi...