MySQL Configuration
Wednesday, 31 October 2007
Installing MySQL
Monday, 29 October 2007
Reading Datashets
အဲဒီအပိုင္းမွာ Timer, Oscillators, CPU speed, Memory (Program, RAM, EEPROM), Interrupt, Peripheral devices ေတြနဲ႔ဆိုင္တဲ့ အေၾကာင္းအရာေလးေတြ၊ ဒီ CPU ရဲ႕အထူးလုပ္ေဆာင္ခ်က္ေတြ ပါလို႔ပါ။
၂။ I/O ports
ကေတာ့ ဘယ္ Ports ကို ဘာ Function အတြက္သံုးရင္ ေကာင္းမလဲလုိ႔ သတ္မွတ္လို႔ ရေအာင္လို႔ပါ။
၃။ Register file Summary (Table)
ဒါကေတာ့ header file (Register Address, Name, Bits) ေတြေရးလုိ႔ရေအာင္လုိ႔ပါ။ ေရးၿပီးသား header file ေတြရွိရင္လည္း ပိုနားလည္ႏိုင္တာေပါ့။ ေကာင္းတာကေတာ့ ဒီ header file နဲ႔ Table မွာပါတဲ့ register address ေတြကို တိုက္ဆိုင္စစ္ေဆးၿပီး မွန္တယ္ဆိုမွ အဲဒီ header file ကိုသံုးပါ။
၄။ I/O Timing
အလုပ္လုပ္တဲ့ အခ်ိန္ Trigger interval (Raising, Falling Edges) ေတြကိုသိရေအာင္လုိ႔ပါ။ Timing Requirements ေတြကိုလည္းသိထားမွ ဘယ္ Oscillator (frequency) ကိုသံုးရင္ အဆင္ေျပမလဲဆိုတာ သတ္မွတ္လို႔ရမွာပါ။
Wednesday, 24 October 2007
RTC (Real Time Clock)
RTC IC ရဲ႕ပံုပါ။
SouthBridge မွာပါတဲ့ RTC နဲ႔ဆက္စပ္ပံု။
RTC Block Diagram
Monday, 22 October 2007
Interrupt (IRQ) handling for Timers
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
}
Cascading Timers
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 for Embedded Programming
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 ခ်ိတ္ၿပီးလည္းသံုးႏုိင္ပါတယ္။ ေနာက္ ပိုစ့္မွာ ဆက္ေျပာပါမယ္။