最近用微處理器(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)才會正常起振。
2009年12月8日 星期二
訂閱:
張貼留言 (Atom)
VirtualBox 空間減肥
sdelete64 -z c: VBoxManage modifymedium disk "/Users/fellow/VirtualBox VMs/Win10/Win10.vdi" --compact *.vdi 路徑可以在 VirtualBox 儲...
-
https://github.com/ljean/modbus-tk/ install pip… sudo apt-get install python-pip install... download modbus_tk-x.x.x.tar.gz tar zxvf...
-
ARis... ARis 是日本一間公司出品的產品,應用了 ARToolKit 技術。 展示影片在這… http://www.youtube.com/watch?v=yCCx7zANsGE YouTube上可以找到更多類似的影片。 這邊是我用 FLARToolK...
-
由於ASSEMBLA即將開始收費,因此要把所有的SVN進行大搬家,連帶的一些教學文件也跟著搬家了,看來還是GOOGLE的窩最舒適(重點是免費) FPPA實驗平台教學教材-使用C語言 FPPA實驗平台簡介 實驗(一) 8位元LED輸出單元 與 模組設計總論 實驗(二) 按鍵開關輸入...
沒有留言:
張貼留言