၁။
၂။ Send Read Command to
၃။ Read back the Reply Value (Read 2 bytes)
ဆိုၿပီးရွိပါတယ္။ အေသးစိတ္အဆင့္ေတြကို ေအာက္မွာ Flow Chart နဲ႔ျပထားေပးပါတယ္။
သူက MCU နဲ႔ဆက္သြယ္တဲ့ေနရာမွာ
၁။
၂။ Send Read Command to
၃။ Read back the Reply Value (Read 2 bytes)
ဆိုၿပီးရွိပါတယ္။ အေသးစိတ္အဆင့္ေတြကို ေအာက္မွာ Flow Chart နဲ႔ျပထားေပးပါတယ္။
သူက MCU နဲ႔ဆက္သြယ္တဲ့ေနရာမွာ
XBee
XBee ဆိုတာက RF သံုးလို႔ရတဲ့ IC ပါ။ MaxStream Company’s product ပါ။ သူ႔ကိုတစ္ျခား MCU တစ္ခုနဲတြဲၿပီးသံုးေလ့ရွိပါတယ္ ေအာက္မွာ PIC MCU နဲ႔ XBee ခ်ိတ္ဆက္အသံုးျပဳထားတဲ့ Daughter Board ပံုကိုျပထားပါတယ္။ Computer နဲ႔ဆက္ၿပီးသံုးခ်င္ရင္ XBee Demonstration Board ကိုသံုးရင္လည္းရပါတယ္။ COM (Serial) port ကိုသံုးၿပီးခ်ိတ္ဆက္ပါတယ္။
ဒီ Post ကေတာ့ နဲနဲမ်က္စိလည္မယ္ထင္ပါတယ္။ ကၽြန္ေတာ္ၾကံဳခဲ့ရတဲ့ အျဖစ္အပ်က္ေလးပါ။ Software တစ္ခုေပါ့ အဲဒါကကၽြန္ေတာ့ဆီမွာရွိတဲ့ ေနာက္ဆံုးဆိုတဲ့ Source Code ကလည္း ေနာက္ဆံုးဟုတ္မဟုတ္ မေသခ်ာတဲ့အခါမွာ Microprocessor ထဲကေန Hexa Codes ကိုျပန္ယူ။ Assembly Code ေျပာင္း ေနာက္ C Code ကိုျပန္ေျပာင္း ေနာက္ၿပီး C Code ကိုျပင္ ၿပီးေတာ့မွ Microprocessor ထဲကိုျပန္ၿပီး Download လုပ္လုိက္ရတဲ့ အေျခအေနပါ။ Hex Code ကိုဖတ္တဲ့ေနရာမွာ ဥပမာေျပာရရင္ 02 04 65 53 က Assembly ဆိုရင္ LJMP 0465H
DSP (Digital Signal Processing) ကိုကၽြန္ေတာ္ေလ့လာေနတုန္းပါ။ အမွန္အတိုင္းေျပာရရင္ အဲဒီအပိုင္းမွာ Theory ပိုင္းေတြအမ်ားႀကီးလိုပါတယ္။ တကယ္ေတာ့ သူကသပ္သပ္ Degree, Diploma တစ္ခုေပးလို႔ရတဲ့ Subject ပါ။ ကၽြန္ေတာ္ကေတာ့ လံုး၀နီးပါးမသိခဲ့လို႔ ခုမွ စေလ့လာတုန္းပါ။ ကၽြန္ေတာ္ဖတ္ေနတဲ့ e-Book ေလးကိုတဆင့္ေ၀မွ်လိုက္ပါတယ္။ အေျခခံကေနစၿပီး ေတာ္ေတာ္ေလး စံုစံုလင္လင္ေရးထားပါတယ္။
Chapter (1) Chapter (2) Chapter (3) Chapter (4) Chapter (5)
Chapter (6) Chapter (7) Chapter (8) Chapter (9) Chapter (10)
Chapter (11) Chapter (12) Chapter (13) Chapter (14) Chapter (15)
Chapter (16) Chapter (17) Chapter (18) Chapter (19) Chapter (20)
Chapter (21) Chapter (22) Chapter (23) Chapter (24) Chapter (25)
Chapter (26) Chapter (27) Chapter (28) Chapter (29) Chapter (30)
Chapter (31) Chapter (32) Chapter (33) Chapter (34)
Frequency Generator အတြက္ပဲသံုးတာပါ။ အခုသံုးေနတာေပါ့။ သူက Frequency 1 MHz အထိအမ်ားဆံုးရတယ္။ Amplitude က 24V (Peak to Peak) အထိရတယ္။ ၿပီးေတာ့ Sine Wave form နဲ႔ Square Wave form ႏွစ္မ်ိဳးထုတ္လို႔ရတယ္။ ေမ့သြားမွာစိုးလို႔ တင္ထားတာပါ။
eZ430 and Texas Instruments MSP430x Proecssor
eZ430 and MSP Mojo Target Board
MySQL Configuration
၂။ I/O ports
၄။ I/O Timing
SouthBridge မွာပါတဲ့ RTC နဲ႔ဆက္စပ္ပံု။
RTC Block Diagram
Interrupt မွာ ၂ မ်ိဳးရွိပါတယ္။ Hardware IRQ နဲ႔ Software IRQ ပါ။ Hardware မွာ Port IRQs, Key IRQs, Display IRQs ေတြပါၿပီးေတာ့၊ Software မွာ Timer IRQs, DMA IRQs ေတြပါတယ္လို႔ ခြဲလို႔ရပါတယ္။ Hardware, Automation, Machine ေတြကို Accurate Timing နဲ႔ အလုပ္လုပ္ခ်င္တဲ့အခါ သံုးၾကတာပါ။ Embedded Software ေတြမွာ အဓိကသံုးပါတယ္။ Interrupt မွာသံုးတဲ့ Register ေတြကေတာ့ REG_INTERUPT, REG_IME, REG_IE, REG_IF ေတြပါ။
REG_INTERUPT က interrupt handler ပါ။ interrupt ျဖစ္တဲ့အခါ လုပ္လုိက္တဲ့ Action ကို မွတ္တဲ့ register ပါ။
REG_IME က master interrupt ပါ။ Interrupt ေတြကို အဖြင့္အပိတ္ (Enable, Disable) လုပ္ေပးတဲ့ register ပါ။
REG_IE က interrupt enable ပါ။ ဘယ္ interrupt ကို လုပ္မယ္ဆိုတာ သတ္မွတ္ေပးတာပါ။ REG_IME နဲ႔ကြာတဲ့အခ်က္ကေတာ့ က interrupt တစ္ခုခ်င္းစီအတြက္ (Enable, Disable) လုပ္တာပါ။
REG_IF က လက္ရွိေရာက္ေနတဲ့ interrupt ကို စစ္ေဆးတာပါ။ ဥပမာ - Timer0 overflow interrupt ကိုေရာက္သြားၿပီဆိုရင္ REG_IF မွာ Timer0 ရဲ႕ bit pattern ေရာက္သြားပါတယ္။ REG_IE bit pattern နဲ႔ အတူတူပါပဲ။ ေအာက္က နမူနာ program ကိုၾကည့္ရင္ ရွင္းပါလိမ့္မယ္။
//.......................INTERRUPT Routine
void enableTimerInterrupt()
{
REG_IE |= INT_TIMER0; // Enable Timer interrupt detection
REG_TM0CNT |= TIME_IRQ_ENABLE; // Make Timer generate IRQ
}
void interruptHandler(void)
{
REG_IME = 0; //disable interrupts
if(REG_IF==INT_TIMER0)
{
if(stateflag==0){SCLO();stateflag=1;}
else if(stateflag==1){SCHI();stateflag=0;}
}
REG_IF = REG_IF; // Tell GBA that interrupt has been handled
REG_IME = 1; //enable interrupts
}
void setupInterrupts(void)
{
REG_IME = 0x0; //disable interrupts
REG_INTERUPT = (u32)interruptHandler; //set int handler
enableTimerInterrupt();
REG_IME = 0x1; //enable interrupts
}
REG_TM1CNT= TM_ENABLE | TM_FREQ_SYSTEM | TM_IRQ;
REG_TM1D = - 0x4000;
REG_TM2CNT= TM_ENABLE | TM_FREQ_SYSTEM | TM_IRQ | TM_CASCADE;
while(REG_2 != 1000){}
REG_TM2CNT &= ~TM_ENABLE;
Timer2 ကိုသံုးတဲ့အခါမွာ Cascade လို႔ေျပာလိုက္တာနဲ႔ သူ႔အေရွ႕က Timer1 ကို Cascade လုပ္ရမယ္လုိ႔ အလိုလိုသိပါတယ္။ Cascade ကို Overflow လို႔လဲ ေရးေလ့ရွိပါတယ္။
Timer ဆိုတာကိုေတာ့ သံုးဘူးၾကမွာပါ။ ဒီ Post က Hardware နဲ႔ဆက္စပ္တဲ့ Timer ပါ။ ARM9/ 10/ 11 CPU နဲ႔ Gameboy Hardware ကိုအေျခခံၿပီးရွင္းျပသြားပါမယ္။ Case Study သေဘာေပါ့။ ကၽြန္ေတာ္က ARM9 ကိုအသံုးျပဳၿပီး Gameboy ကေန Frequency အမ်ိဳးမ်ိဳးထုတ္ေပးႏိုင္တဲ့ Program ေရးတာပါ။ Frequency ထုတ္တာကေတာ့ Signal ကို low/ high ေတြ တစ္လွည့္စီေပးၿပီး အဲဒီ signal ေတြၾကားမွာ time interval ေလးေတြျခားေပးျခင္းအားျဖင့္ frequency ထုတ္တာပါပဲ။ Pseudo frequency သေဘာပါပဲ။ Oscilloscope နဲ႔တိုင္းတာၿပီးစစ္ေဆးလုိ႔ ရေအာင္လုိ႔ပါ။
အဲဒီအခါမွာ time interval က အလြန္တိက်ဖို႔ လိုအပ္လာပါတယ္။ ဒါေၾကာင့္ Timer နဲ႔ Interrupt ကို အသံုးျပဳၿပီး ေရးတာပါ။ ဒီ Post မွာေတာ့ Interrupt အေၾကာင္းမပါေသးပါဘူး။
ARM ရဲ႕Timer မွာ Frequency ၄ မ်ိဳးပါပါတယ္။ Frequency ေပၚမူတည္ၿပီး interval ေတြ ကြာျခားပါတယ္။ ဥပမာ - 16.384 kHz ဆိုရင္ ရဲ႕တန္ဖိုးကို တစ္ႀကိမ္မွာ 61.04 μs ႏႈန္းနဲ႔ တိုးေပးတာပါ။ Frequency ေတြကေတာ့ ဒီလိုေတြ ရွိပါတယ္။
၁။ 1 Cycle, 16.78 MHz Frequency, 59.59 ns Interval
၂။ 64 Cycle, 262.21 kHz Frequency, 3.815 μs Interval
၃။ 256 Cycle, 65.536 kHz Frequency, 15.26 μs Interval
၄။ 1024 Cycle, 16.384 kHz Frequency, 61.04 μs Interval
တစ္ျခား CPU ေတြမွာလည္း ဒီလိုသေဘာမ်ိဳးပါပဲ။ ဥပမာ - ကၽြန္ေတာ္က 1 ms ကို အတိအက် လုိခ်င္တယ္ ဆိုပါေတာ့။ C Language နဲ႔ဆိုရင္ ဒီလိုေရးရပါတယ္။
// Control Register ထဲမွာ Timer ကို အသံုးျပဳမယ္။ Timer ရဲ႕ Frequency က 16.78 Mhz ပါ (တစ္ႀကိမ္ကို ၁ စီတိုး)။ Interrupt ကိုအသံုးျပဳမယ္။
REG_TM1CNT= TM_ENABLE | TM_FREQ_SYSTEM | TM_IRQ;
// Data register ထဲမွာ Timer တန္ဖိုး ကိုထည့္ပါမယ္။ hex 4000 ရဲ႕ value က 16384 ျဖစ္လုိ႔ပါ။ (“-” ထည္ေပးတာကေတာ့ Timer က “0” အထိေရာက္ေအာင္ တိုးလုိ႔ပါ)။ တိုက္႐ိုက္တန္ဖိုး ၁၆၃၈၄ လည္းထည့္လုိ႔ရပါတယ္။
REG_TM1D = - 0x4000;
// ၿပီးရင္ Timer ကို ျပန္ပိတ္ေပးပါ။
REG_TM1CNT &= ~TM_ENABLE;
Gameboy (ARM9) မွာ Timer ၄ ခုပါပါတယ္ REG_TM0CNT, REG_TM1CNT, REG_TM2CNT, REG_TM3CNT ေတြပါ။ Timer ေတြကို Cascade ခ်ိတ္ၿပီးလည္းသံုးႏုိင္ပါတယ္။ ေနာက္ ပိုစ့္မွာ ဆက္ေျပာပါမယ္။

