Wednesday, 31 October 2007

Installing MySQL

MySQL ကိုကၽြန္ေတာ္ မသံုးဘူးေသးပါဘူး။ အခုလဲ Install ပဲလုပ္ရေသးတာပါ။ ဒါေၾကာင့္ အားသာ၊ အားနည္းခ်က္ကိုလည္း မသိေသးပါဘူး။ ပထမဆံုးေတာ့ ကၽြန္္ေတာ္ MySQL ကို MySQL website ကေန download လုပ္တာပါပဲ။ ၿပီးေတာ့ Install လုပ္တယ္။ အဲဒါက Database သက္သက္ပါ။ သံုးလုိ႔မရေသးပါဘူး။ ေနာက္ Database Viewer ကို Download ထပ္လုပ္ပါတယ္။ ကၽြန္ေတာ္သိသေလာက္ေတာ့ Viewer (yog) ေတြအမ်ားႀကီးရွိမယ္ထင္တယ္။ ကၽြန္ေတာ္သံုးတာက SQLyog ပါ။ SQLyog ကို Download လုပ္ၿပီးတဲ့အခါ test connection ၾကည့္ရင္ “Connection Error” ဆိုၿပီးလာျပပါတယ္။ အဲဒါဆိုခဏ ပိတ္။ SQL server ရဲ႕ Configuration ကို လုပ္။ ဒီအဆင့္ကေတာ့ သူေျပာတာေလးေတြဖတ္ၿပီး step-by-step လုပ္လုိက္တာပါပဲ။ ၿပီးရင္ SQLyog ကိုျပန္ဖြင့္ connection အသစ္ လုပ္၊ ၿပီးရင္ ပံုမွန္ SQL Server (Enterprise Manager) ကိုသံုးသလုိပဲ Create Database, Create Table ေတြလုပ္လုိ႔ရပါၿပီ။ ဆက္ေရးပါဦးမယ္။

MySQL Configuration

SQLyog create connection

Download MySQL

Monday, 29 October 2007

Reading Datashets

DataSheets ေတြကို ဖတ္ရတဲ့အခါ အရမ္းပ်င္းစရာေကာင္းပါတယ္။ ကၽြန္ေတာ္ကေတာ့ အခုေျပာမည့္ ေခါင္းစဥ္ေတြပဲဖတ္တယ္။ အဓိကကေတာ့ Software ပိုင္းနဲ႔ဆိုင္တာေတြပဲ ဆိုပါေတာ့။
၁။ Overview, Features
အဲဒီအပိုင္းမွာ 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 (Real Time Clock) ကို Timer အစားသံုးလို႔ရပါတယ္။ သူက IC တစ္မ်ိဳးပါ။ တိက်တဲ့ အခ်ိန္တစ္ခုကို သတ္မွတ္တဲ့ေနရာမွာ သံုးပါတယ္။ RTC က Main System ရဲ႕ Timer ကိစၥေတြ၊ Coding ေတြ ကိုသက္သာေစပါတယ္။ ၿပီးေတာ့ ပိုၿပီးတိက်တဲ့ အခ်ိန္ကို ရပါတယ္။ ေတြမွာသံုးပါတယ္။ Maxim, Philips, Dallas Semiconductor, Texas Instruments and STMicroelectronics ကုမၸဏီေတြက RTC IC ထုတ္လုပ္ ၾကပါတယ္။ RTC ကို Microcontroller ေတြထဲမွာလည္း Build-in အျဖစ္ေတြ႕ႏိုင္ပါတယ္။ RTC မွာ (32.768 kHz) Oscillator ပါတတ္ပါတယ္။ Computer မွာေတာ့ SouthBridge Chip မွာပါပါတယ္။

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
}

setupInterrupt() ဆိုတဲ့ function ကိုေခၚၿပီး သံုးရပါတယ္။

Cascading Timers

Timer ေတြကို Cascade လုပ္တယ္ဆိုတာကေတာ့ Timer တစ္ခု Overflow (သတ္မွတ္ထားတဲ့ ကိုေရာက္တဲ့အခါ) ေနာက္ Timer ကို On (Enable) လိုက္ျခင္းကို cascade လုပ္တယ္လုိ႔ေျပာတာပါ။ အထူးသျဖင့္ Automation အပိုင္းေတြမွာ သံုးေလ့ရွိပါတယ္။ ဥပမာ - 1s ေရာက္ဖို႔ဆိုရင္ 1000 ms ေပါ့။ အဲဒီေတာ့ Timer1 ကို အႀကိမ္ ၁၀၀၀ looping (while, for) ပတ္ရမည့္ သေဘာပါ။ အဲဒီလို looping ပတ္တဲ့အခါ အခ်ိန္က Accurate မျဖစ္ေတာ့ပါဘူး။ ဘာလုိ႔လဲဆိုေတာ့ looping ရဲ႕ instruction cycle အခ်ိန္ကို ထည့္တြက္လို႔ပါ။ အဲဒီအခါမ်ိဳးမွာ Cascading ဒါမွမဟုတ္ Interrupt ကိုသံုးရပါတယ္။ Timer1 နဲ႔ Timer2 ကို Cascade ခ်ိတ္ထားျခင္းျဖင့္ အႀကိမ္ 1000 ေရာက္ မေရာက္ကို Timer2 နဲ႔စစ္ေဆးပါတယ္။ ေအာက္မွာ Coding ေရးထားပါတယ္။

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_TM1CNT &= ~TM_ENABLE;
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;

ဒါဆိုရင္ Timer1 control code ရပါၿပီ။ အဲဒီ Code ေတြကို Function တစ္ခုအျဖစ္ ခြဲထားၿပီး ယူသံုးႏိုင္ပါတယ္။
Gameboy (ARM9) မွာ Timer ၄ ခုပါပါတယ္ REG_TM0CNT, REG_TM1CNT, REG_TM2CNT, REG_TM3CNT ေတြပါ။ Timer ေတြကို Cascade ခ်ိတ္ၿပီးလည္းသံုးႏုိင္ပါတယ္။ ေနာက္ ပိုစ့္မွာ ဆက္ေျပာပါမယ္။

Gameboy Hardware Schematics

Gameboy ကို အသံုးျပဳလုိ႔ရတဲ့ Application ေနရာေတြကေတာ္ေတာ္မ်ားပါတယ္။ သူ႕မွာ ARM9/ 10/ 11 family series ကိုအသံုးျပဳထားတဲ့အတြက္ Micro-p PCB သပ္သပ္ ထပ္လုပ္စရာမလိုပဲ သံုးလုိ႔ရပါတယ္။ ဂ်ပန္္၊ ထိုင္၀မ္၊ ဥေရာပႏိုင္ငံ (အထူးသျဖင့္ ဂ်ာမနီ)၊ ယူအက္စ္ ေတြမွာသံုးတာမ်ားပါတယ္။ Gameboy Programmer ရာထူးဆိုၿပီးေတာင္ ရွိပါတယ္။ LCD Display, RAM, IO ports (RS-232, General IOs), Audio, Video ports, Buttons (10 Keys), External Oscillator ေတြပါတဲ့အတြက္ အဆင္ေျပပါတယ္။ တစ္ျခား ဆက္စပ္ Devices (Wireless, USB, NIC, SPI) ေတြနဲ႔ တြဲၿပီးသံုးရင္လည္းရပါတယ္။ ေအာက္မွာ Gameboy ရဲ႕ Schematics ကို ေပးထားပါတယ္။ဒါက Gameboy နဲ႔ RS-232 ကို ခ်ိတ္ဆက္တဲ့ Schematics ပါ။