Monday, 26 July 2010

MCU မ်ားႏွင့္ Embedded OS မ်ား ေပါင္းစပ္ျခင္း

Embedded (XP, Ubantu, Win CE, Android, LINUX) ေတြကို Industrial PC ေတြမွာ သံုးၾကပါတယ္။ သူတို႔က အရင္က CPU တစ္ခုပါရတယ္ (Intel, AMD, ..)။ အခုေနာက္ပိုင္း Smart phone, Touch screen phone, PDA ေတြ အသံုးတြင္က်ယ္လာတဲ့အခါမွာ MCU ေတြမွာ OS ေတြ ေပါင္းၿပီး ထဲ့လာၾကတယ္။ Rabbit MCU ေတြမွာေတာင္ FTP အတြက္ UNIX, Tiny OS ေတြ ထဲ့သံုးလာၾကတယ္။ Mini web server ေတြအထိ ထဲ့သံုးလာၾကတယ္။ အဲ့ဒီကေန တစ္ဆင့္ တက္လာတဲ့အခါ အခုေနာက္ပိုင္း အရမ္းေခတ္စားလာတာက Touch PDA development board ေတြပါ။ အမ်ိဳးအစား အမ်ားႀကီးရွိလာေပမယ့္ သေဘာတရားကအတူတူပါ။ ထူးျခားခ်က္က ထုတ္လုပ္သူ (Samsung, Freescale, ST) ေတြသာေျပာင္းသြားတယ္ သံုးၾကတဲ့ Core ကေတာ့ ARM9, 11 ေတြ ျဖစ္ေနတာပါပဲ။ Industrial PC ေတြေလာက္ စြမ္းရည္မျမင့္ေပမယ့္ Low level protocol ေတြသံုးဖို႔အတြက္ SPI, UART, I2C စတဲ့ protocol ေတြကို တိုက္႐ိုက္သံုးလို႔ရတဲ့အတြက္ အလြန္အဆင္ေျပပါတယ္။ က်ေတာ္ဒါကို ေလ့လာဆဲျဖစ္တဲ့အတြက္ သိသေလာက္ကို ထပ္ထပ္ တင္သြားေပးပါ့မယ္။


Thursday, 1 July 2010

4x4 Metrix Keypad

Matrix Keypad (4x4, 3x4, 3x3 ) ေတြကို ေနရာစံုမွာ သံုးၾကပါတယ္။ ဖုန္း ေတြရဲ့ ေတြ အျဖစ္၊ ေတြရဲ့ ေတြအျဖစ္ သံုးၾကပါတယ္။ ခုေျပာခ်င္တာက ဒီေကာင္ေလးရဲ့ တည္ေဆာက္ပံုနဲ႔ Matrix Keypad ရဲ့ သေဘာတရားပါ။ ႐ိုး႐ိုးေလး ေတြးၾကည့္လိုက္ရင္ 16 Keys (4x4) ကို scan လုပ္ဖို႔အတြက္ Input pin ၁၆ ခု လိုပါတယ္။ Input (whole 8 bits port) ေတြ အဲ့ေလာက္အမ်ားႀကီး မသံုးႏိုင္ေတာ့တဲ့အခါ Software controlled matrix Keypad ကို သံုးၾကပါတယ္။

ေအာက္က ပံုေတြမွာ Schematic ေကာ Keypad ပံုစံေတြပါ ျပထားပါတယ္။ Software controlled logic ကေတာ့ ..
၁။ ၄ လိုင္းစီ (4 Outputs and 4 Inputs) ထားပါ။ Row, Column ႀကိဳက္သလို ထားလို႔ရပါတယ္။
၂။ Output ၁ လိုင္းစီကေန logic (High/ Low) ေပးပါ။ ၁ လိုင္းေပးတိုင္း Input 4 lines လံုးကို scan ပါ။ ၁ လိုင္းမိတာနဲ႔ ထြက္ပစ္လိုက္ပါ။
ဥပမာ - Output 1 and Input 1 ဆိုရင္ Row 1, Col 1 ဆိုေတာ့ “Key 1"
Output 2 and Input 3 ဆိုရင္ Row 2, Col 3 ဆိုေတာ့ “Key 6"။ အဲလိုနည္းစနစ္နဲ႔ ေရးသြားပါတယ္။
၃။ Key Bonce ကို ေျဖာက္ခ်င္ယင္ေတာ့ ၂ ခါျပန္ scan လုပ္ၿပီး တူတယ္ဆိုမွ အဲ့ဒီ Key ကို ယူပါ။ ေအာက္မွာ နမူနာ source code ထဲ့ေပးထားပါတယ္။


#include //Include file for 8051
#define keyport P2 //keypad connected to P2
#define col1 P2_0 //column 1
#define col2 P2_1 //column 2
#define col3 P2_2 //column 3
#define col4 P2_3 //column 4
#define TRUE 1 //some defines
#define FALSE 0

/*
+---------------------------------------+
| Prototype: void key_init(void); |
| Return Type: void |
| Arguments: None |
| Description: Initialize ports and |
| Keypad. |
+---------------------------------------+
*/
void key_init(){
keyport &=0x0F; //make Rows as o/p and cols are i/p
}

/*
+-----------------------------------------------+
| Prototype: unsigned char get_key(void); |
| Return Type: unsigned char |
| Arguments: None |
| Description: To read key from the keypad |
+-----------------------------------------------+
*/
unsigned char get_key(){
unsigned char i,k,key=0;
k=1;
for(i=0;i<4;i++){>
keyport &=~(0x80>>i); //to make rows low 1 by 1
if(!col1){ //check if key1 is pressed
key = k+0; //set key number
while(!col1); //wait for release
return key; //return key number
}
if(!col2){ //check if key2 is pressed
key = k+1; //set key number
while(!col2); //wait for release
return key; //return key number
}
if(!col3){ //check if key3 is pressed
key = k+2; //set key number
while(!col3); //wait for release
return key; //return key number
}
if(!col4){ //check if key4 is pressed
key = k+3; //set key number
while(!col4); //wait for release
return key; //return key number
}
k+=4; //next row key number
keyport |= 0x80>>i; //make the row high again
}
return FALSE; //return false if no key pressed
}