Search This Blog

Wednesday, May 26, 2010

Using SPI on Low-End Microcontroller

SPI က IC အချင်းချင်း ဆက်သွယ်ဖို့ အတွက် ရိုးရှင်းပြီး ထိရောက်တဲ့ bus တစ်ခုပါ။ Real Time Clock၊ EEPROM အစရှိတဲ့ chip အများစုမှာ ဆက်သွယ်ဖို့ အတွက် SPI ဒါမှမဟုတ် I2C bus တွေ ပါလေ့ရှိပါတယ်။ ထူးခြားတဲ့ အချက် မရှိရင် တော့ SPI သုံးရတာကို I2C ထက်ပိုကြိုက်ပါတယ်။ သူက ပိုမြန်ပြီး ပိုရှင်းလို့ပါ။ သူ့ကို software နဲ့ ဖန်တီး emulate လုပ်ဖို့လဲ လွယ်ပါတယ်။
တစ်ခါက 10MHz ရှိတဲ့ SPI ပါတဲ့ LED driver chip တစ်ခုကို လုပ်ဆောင်မှု အရမ်းမမြင့်တဲ့ 4MHz microcontroller နဲ့ တွဲသုံးဖြစ်ပါတယ်။ Design လုပ်တုန်းက ဈေးသက်သာ ဖို့ အတွက် အဓိက ထားလို့ပါ။ Microcontroller ကလဲ တစ် ဒေါ်လာတောင် မပေးရပါဘူး။ ဒါပေမယ့် သူ့မှာ firmware နဲ့ font တွေသိမ်းဖို့ flash အလုံအလောက် ရှိပါတယ်။ အစကတော့ SPI ကို ဒေတာ ပို့ဖို့၊ လက်ခံဖို့ အတွက် ပုံမှန် အတိုင်းပဲ နှေးတဲ့ အဝေးပို့ RS232 တို့၊ CAN bus တို့မှာ သုံးနေကြ အတိုင်း circular buffer ကို hardware interrupt နဲ့ တွဲသုံးပါတယ်။ အဲဒါက ပုံမှန် အခြေအနေမှာ တော့ အိုကေ ပါတယ်။ ပြဿနာ က ကြီးမားတဲ့ 96x16 dot-matrix LED ဆိုင်းဘုတ် ကြီးကို တစ်စက္ကန့် ၁၂၅ ကြိမ် မောင်းချင်ပြီး CPU ကို အသုံးချ တဲ့ utilization က အရမ်းမြင့်နေတာပါ။ အကျိုးဆက် အနေနဲ့ စာသားတွေကို ဘေးတိုက် ပြေးတာ အစရှိတဲ့ ဂရပ်ဖစ် လုပ်ဆောင်မှုတွေကို ကိုင်တွယ်ရတဲ့ အခါ ကောင်းကောင်း မလုပ်နိုင်တော့ပဲ ဖုတ်လှိုက် ဖုတ်လှိုက် ဖြစ်ချင်လာ ပါတယ်။ ဒါနဲ့ပဲ အရင်းအမြစ်ကို စာရင်းစစ် ကြည့်လိုက်တော့ အဓိက အသုံးအများဆုံး ဖြစ်တဲ့၊ CPU က အမြဲတမ်းလိုလို လုပ်ဆောင်နေ ရတဲ့ SPI function က interrupt တွေ၊ circular buffer တွေနဲ့ ဖောင်းပွ နေပြီး သူ့ကို ထိရောက်အောင် ပြင်နိုင်ရင် CPU က တော်တော် သက်သာသွားမယ် ဆိုတာ တွေ့ရပါတယ်။ ပုံမှန်ကတော့ hardware interrupt ကိုသုံးတာက ပိုထိရောက်၊ ပိုမြန်တာ မှန်ပါတယ်။ ဒါပေမယ့် ဒီ ကိစ္စမှာတော့ ပုံမှန် မဟုတ်ပါဘူး နှေးတဲ့ CPU က အရမ်းမြန် အရမ်းအသုံးပြုဖို့ လိုတဲ့ SPI ကို မောင်းဖို့ လိုနေလို့ပါ။ SPI ကို ဒေတာ တစ်လုံး ပို့တိုင်း CPU cycle တွေ အရမ်းစားတဲ့ ပို့တဲ့ interrupt function၊ လက်ခံတဲ့ interrupt function တွေကို လုပ်နေရလို့ပါ။ နောက်တော့ polling ဒါမှမဟုတ် emulation ကို သုံးပြီး SPI ကို ဆက်သွယ်တာက interrupt ထက် ပိုမြန်တာကို တွေ့ရပါတယ်။ ဒါတောင် polling ကိုသုံးမယ်ဆိုရင် hardware က လက်ခံတဲ့ bus speed ကိုပဲ သုံးလို့ရမှာပါ။ ဒါနဲ့ SPI function ကို ပိုထိရောက်အောင် firmware ကို ပြင်လိုက်တော့ ကောင်းသွားပါတယ်။ ဒါကြောင့် SPI ကို emulating လုပ်ရင် ကောင်းတဲ့ အချက် တစ်ချို့ ကို ကျွန်တော် တို့ရဲ့ အတွေ့အကြုံ အရ ပြောချင်တာက
  1. SPI ကို software မှာ emulate လုပ်ရင် ပိုမြန်တဲ့ အခါတွေ လည်း ရှိပါတယ်။
  2. အရည်အသွေး လည်း ပိုကောင်းပါတယ်။ ဘာကြောင့်လဲ ဆိုတော့ ရိုးရှင်းတာရယ်၊ interrupt ကြောင့် ဖြစ်လာနိုင်တဲ့ ပြဿနာ အများစုကနေ ရှောင်ပြီးသား ဖြစ်သွားလို့ပါ။
  3. ရိုးရှင်းတဲ့ code လေးကို ရေးရတာ ပိုမြန်၊ ပိုလွယ်ကူ၊ ပိုပြီး အမှားနည်းနိုင်ပါတယ်။ မဟုတ်ရင် အသစ်သုံးမယ့် microcontroller တိုင်း အတွက် အမျိုးမျိုးသော register setting တွေနားလည်ဖို့ datasheet ကို အချိန်ပေး ဖတ်ဖို့ လိုမှာပါ။
  4. အကောင်းဆုံးကတော့ portable ဖြစ်ပြီး hardware ကို မမှီခိုတော့ တာပါပဲ။
SPI မှာ တိကျတဲ့ formal standard မရှိပါဘူး။ ပုံမှန် shift register တစ်ခုလို ရှင်းလွန်းလို့ပါ။ Timing diagram ကိုမြင်ရုံနဲ့ နားလည်နိုင်ပါတယ်။ အောက်က နမူနာက SPI မျိုးကွဲ တစ်ခုကို emulate လုပ်တဲ့ C function တစ်ခုပါ။
//-------------------------------------
unsigned char spi(unsigned char d)
{
    unsigned char i;
    SCLK=1;
    EN=1;
    for(i=0;i<8;i++)
    {
        MOSI=(d & 0x80)?1:0;        
        //Delay(period/2)-optional for slower SPI bus speed
        SCLK=0;
        d<<=1;        
        d|=MISO;
        //Delay(period/2)-optional for slower SPI bus speed
        SCLK=1;
    }
    EN=0;
    return d;
}
//-------------------------------------

Tuesday, May 25, 2010

Astable Multivibrator using Op-amp

မိတ်ဆွေ တစ်ယောက်က op-amp circuit တစ်ခုရဲ့ oscillation frequency ကို တွက်ထုတ်ဖို့ အကူ အညီ တောင်းလာ ပါတယ်။ တိုင်းကြည့်လို့ ရတဲ့ frequency က ၁၀၉ kHz ရှိတယ်လို့ ဆိုပါတယ်။ သူက ထွက်လာတဲ့ oscillation frequency နဲ့ သုံးထားတဲ့ passive component တွေရဲ့ ဆက်သွယ်မှု ကို တွက်ထုတ် ချင်တာ ပါ။ ဒီလို analog circuits တွေကို မတွေ့ ဖြစ်တာ တော်တော် ကြာနေ ပေမယ့် ကြည့်ပေးမယ် လို့ သဘောတူ လိုက်ပါတယ်။ ဒါနဲ့ သူက ဆားကစ် ပတ်လမ်း ပုံကို ဖုန်းနဲ့ ဓာတ်ပုံရိုက် ပြီး MMS နဲ့ ပို့ လိုက်ပါတယ်။ ကြည့် လိုက်တော့ သူ့ရဲ့ တည်ဆောက်ပုံ က ရိုးရှင်းပြီး တွေ့ နေကြ ပုံစံ မျိုး ဖြစ်နေတာနဲ့ frequency ကို တွက်ကြည့် ပြီး ဖုန်းနဲ့ ဓာတ်ပုံ ပြန်ရိုက်၊ အောက်က ပုံတွေကို သူဆီကို MMS နဲ့ ပြန် ပို့ လိုက်ပါတယ်။

Sunday, May 2, 2010

Choosing name for our daughter

သမီးလေး မွေးလာတော့ သူ့အတွက် နာမည် ပေးဖို့ စဉ်းစားရင်း ဖတ်မိတဲ့ စာအုပ်တွေထဲက ရယ်၊ ကိုယ့်ဟာကိုယ် ကြိုက်တဲ့ အချက် လေးတွေရယ် ကိုပြန်ပြီး အမှတ်တရ တင်လိုက်ပါတယ်။
  1. ပထမဆုံး စဉ်းစားတဲ့ အချက်က သမီး ငယ်စဉ်ခါရော၊ လူကြီးဖြစ်လာတဲ့အခါရောပါ အသက် အရွယ် မရွေး အဆင်ပြေမယ့် နာမည်မျိုးပါ။
  2. ကျွန်တော်တို့ ရွေးလိုက်တဲ့ နာမည် ကြောင့် သမီးလေး အနောက် အပြောင် ခံရနိုင် စရာ အကြောင်းလုံးဝ မရှိတဲ့ နာမည်မျိုး ဖြစ်အောင်လည်း အထူး စိုက်ရပါသေးတယ်။
  3. အဓိပ္ပာယ် ကောင်းတဲ့ နာမည်လေး ဖြစ်ရင်တော့ ပိုကောင်းတာပေါ့ နော်။
  4. ရိုးရာ အစဉ်အလာ မပျက် မြန်မာ နာမည် ပဲပေးချင်ပါတယ်။ နေ့နံ ကိုက်တဲ့ ဟာမျိုးလည်း ဖြစ်ချင်ပါသေးတယ်။ သမီးတုန်းက တော့ မွေးဖို့ ခန့်မှန်းထားတဲ့ ရက်က တနင်္ဂနွေ ဆို့တော့ 'အေး' နဲ့စဖို့ စဉ်းစားထားတာ တစ်ကယ်မွေးတော့ စနေ နေ့မှာ။
  5. ကဗျာ တစ်ပုဒ်လို ရွတ်ဆိုရ ချော မွေ့ တဲ့ နာမည်မျိုး၊ သီချင်းလေး တစ်ပုဒ် လို အသံထွက် ငြိမ့်ညောင်းတဲ့ နာမည် မျိုးလည်း ဖြစ်ချင် ပြန်ရော။
  6. အဖေ ဆီက နာမည်တစ်လုံး၊ အမေ ဆီက နာမည် တစ်လုံး စီလည်း သမီးနာမည် မှာ ပါစေချင်သေးတယ်။
  7. ဖြစ်ချင်တာတွေ၊ ထည့်စဉ်းစား ထားတာ တွေ ဘယ်လိုပဲ ရှိရှိ ၊ အခု စဉ်းစား နေတဲ့ နာမည်က သမီးလေး အတွက် ဆိုတော့ သမီးလေး ဘဝ တစ်လျှောက်လုံး သူကြိုက်မည့် နာမည်မျိုး ဖြစ်ဖို့သာ အရေးအကြီး ဆုံးလို့ ကျွန်တော် တို့ ဘာသာ ပြန်ပြီး သတိပေးရ ပါသေး တယ်။

Friday, April 30, 2010

C Programming on Windows

C programming ကို စလေ့လာ နေကြတဲ့ မိတ်ဆွေ တွေက ဘယ် IDE ကို Windows ပေါ်မှာသုံး လို့ ကောင်းမလဲ လို့ မေးကြပါတယ်။ ကျွန်တော့် အထင်ကတော့ Microsoft Visual Studio Express က တော်တော် သုံးလို့ကောင်းပါတယ်။ ဒီလင့် http://www.microsoft.com/express/ မှာ အလကား ရ နိုင်ပါတယ်။ နောက် လူကြိုက်များတာ တစ်ခု ကတော့ Bloodshed က Dev-C++ ပါ။ သူ့ကို လည်း http://www.bloodshed.net/devcpp.html မှာ ဖရီး ဒေါင်းလုပ် လုပ် နိုင်ပါတယ်။ နမူနာ အနေနဲ့ C project တစ်ခုကို Visual C++ 2008 Express Edition မှာ ဖန်တီး ကြည့်ထားပါတယ်။ စစချင်း File menu>>New>>Project... ကိုသွားပါ။ New Project window ပေါ်လာ ပါမယ်။ Project types: Visual C++ မှာ Win32 ကိုရွေးပါ။ Templates: Visual Studio Installed templates မှာ Win32 Console Application ကိုရွေးပါ။ အောက်နားက text box မှာ project နာမည် ရိုက်ထည့် ပြီး၊ သိမ်းမည့် folder ကို ရွေးပါ။ OK ကိုနှိပ်ပါ။ Win32 Application Wizard box ပေါ်လာရင် Next ကိုနှိပ်ပါ။ Application type မှာ Console application ကိုရွေးပါ။ နောက် additional options: မှာ Empty project ကိုရွေးနိုင်ပါတယ်။ Finish ခလုပ်ကို နှိပ်ပါ။ အောက်မှာ ပြထားတဲ့ အတိုင်းSolution Explorer window ထဲက Source Files ပေါ်မှာ right click နှိပ်ပြီး Add>>New Item... ကိုနှိပ်ပါ။ Add new item window ပေါ်လာရင် Name text box ထဲမှာ file name ကို.c extension နဲ့ ထည့်ရိုက်ဖို့ အရေးကြီးပါတယ်။ ဥပမာ StrPos.c။ အောက်က နမူနာ ပရိုဂရမ်က ဘယ်လိုရေးရမလဲလို့ မေးကြတဲ့ string position ကို C library functions တွေ မသုံးပဲ ရှာတဲ့ဟာပါ။ စာလုံး အကြီး အသေး မခွဲ ပါဘူး။
#include <stdio.h>
typedef signed char   CHAR;
typedef signed int    POSITION;
#define ToL(c) (((c)>='A')&&((c)<='Z')?(c+0x20):(c))
POSITION strcmp(CHAR* s1,CHAR* s2)
{ 
    for(;*s2;s1++,s2++) if(ToL(*s1)!=ToL(*s2)) return 0;
    return 1;
}
POSITION stripos (CHAR* haystack,CHAR* needle,POSITION offset)
{        
    for(;*(haystack+offset);offset++) if(strcmp(haystack+offset,needle)) return offset;    
    return -1;  
}
int main(int argc,char *argv[])
{
  CHAR str1[]="Hello! Good morning!";
  CHAR str2[]="good";
  printf("\nFound at: %d \n",stripos(str1,str2,0));   
  return 0;
}
အဲဒီနောက် F5 သို့မဟုတ် Debug menu>>Start Debugging ကိုနှိပ်ပြီး run ကြည့်နိုင်ပါတယ်။ Debug menu>>Start Without Debugging ကို သုံးလို့လည်း ရပါတယ်။

Tuesday, February 2, 2010

VB2005 Timers

The .NET Framework ထဲမှာ သုံးစရာ timer အမျိုးမျိုး ရှိပါတယ်။ Windows Forms applications တွေမှာ ဆိုရင် System.Windows.Forms.Timer control ကို သုံးနိုင်ပြီး user interface မရှိတဲ့ application မှာ ဆိုရင်တော့ System.Threading.Timer class ဒါမှမဟုတ် the System.Timers.Timer class ကို သုံးနိုင်ပါတယ်။ အောက်မှာ ပြထားတဲ့ နမူနာ မှာ System.Threading.Timer class ကို သုံး ပြီး procedure တစ်ခုကို ခေါ်သုံးထား ပါတယ်။ Timer ကို စပြီးတာ နဲ့ သူ့ရဲ့ တန်ဖိုးတွေကို ပြောင်းချင်ရင် Change method ကိုသုံးပြီးမှ ပြောင်းလို့ ရပါတယ်။ Stop method မရှိပါဘူး။ ရပ်ချင်ရင် Dispose method ကိုသုံးမှ ရပါမယ်။
Imports System.Threading
Dim dueTime as New TimeSpan(0,0,1)
Dim period as New TimeSpan(0,0,0,0,500)
Dim t As New Timer(AddressOf TimerProc, Nothing, dueTime, period)
Dim tEn As Boolean = True
Private Sub TimerProc(ByVal state As Object)
 If tEn = True Then
'Do timer things
 End If
End Sub

Friday, December 11, 2009

Protecting Flash Memory of a Fujitsu MCU

တစ်လောက Fujitsu MB95F128JB ရဲ့ flash memory ကို ကာကွယ် ဖို့ အတွက် သင့်တော်တဲ့ နည်းလမ်း ရှာ ကြည့် တော့ စိတ်ကြိုက် မတွေ့ခဲ့ပါဘူး။ နောက်တော့ သူ့ရဲ့ .mhx ဖိုင်ကို ပြင်ကြည့် ဖို့ စိတ်ကူးရပါတယ်။ ဖိုင်ရဲ့ နောက်ဆုံးလိုင်း ရဲ့ ရှေ့ မှာ အောက်ပါ လိုင်းကို ဖြည့်လိုက်ရင် အဆင်ပြေသွား ပါလိမ့်မယ်။
S104400001BA
Ref: http://en.wikipedia.org/wiki/SREC_%28file_format%29

Saturday, October 10, 2009

Multidrop network for RS232

တစ်ခါက project တစ်ခုမှာ master device တစ်ခုနဲ့ slave device ရှစ်ခု ဆက်သွယ်ပြီး communicate လုပ်ဖို့ လိုလာပါတယ်။ အစက RS485 half-duplex communication သုံးဖို့ ရည်ရွယ်ထား ပေမယ့် ဖြစ်ချင်တော့ ရောက်လာ ပြီးသား ပစ္စည်း အားလုံးက RS232 interface တွေပဲ ရှိကြတယ်။ RS232 communication က ပစ္စည်း တစ်ခု တစ်ခု ချင်းဆက်ဖို့ပါ။ တစ်ကယ်လို့ master device တစ်ခုက ပဲ ပို့ပြီး ကျန်တဲ့ slave တွေက နားပဲထောင် နေရင် ပြသနာ မရှိပေမယ့် slave တွေရဲ့ transmit line တွေက disable ဖြစ်အောင် ပိတ်ထားလို့ မရတဲ့ အတွက် master device ဆီကို ပြန်ပို့ဖို့ ဝါယာ လိုင်း တစ်ခုထဲကို တိုက်ရိုက် သွားဆက်လို့ မရပါဘူး။ သူ့တို့ရဲ့voltage အဝင်အထွက် တွေကို ကြည့်ပြီးတဲ့ အခါမှာတော့ အဲဒီ ပြသနာကို ဖြေရှင်းဖို့ နည်းလမ်းတစ်ခု ကို စဉ်းစားမိ ပါတယ်။ slave တစ်ခုချင်း စီရဲ့ transmit line တွေမှာ diode တစ်ခုစီ ထည့်ပေးလိုက်ရင် RS485 half-duplex communication လိုပဲ ဆက်သွယ်လို့ ရမယ့် hardware connection တစ်ခုကို ရရှိနိုင်ပြီး အဲဒါကိုအောက်က ပုံမှာ ကြည့်နိုင်ပါတယ်။
Updated: 2017 Sep 02
မှတ်ချက် ရေးကြ၊ မေးကြ တဲ့ ပေါ်မူ တည်ပြီး နောက်ထပ် ဆက်လို့ ရတဲ့ ပုံစံ တွေထပ် ဖြည့်လိုက် ပါတယ်။ စိတ်ဝင်စား ကြတဲ့ အတွက် ကျေးဇူး တင် ပါတယ်။

RS232 network with multiple masters and multiple slaves



UART/TTL-Serial network with single master and multiple slaves

RS232 transceivers တွေ မသုံးပဲ UART ကအထွက် TTL level signal တွေကိုပဲ သုံးမယ် ဆိုရင်တော့ အောက် ကအတိုင်း ဆက်နိုင် ပါတယ်။



UART/TTL-Serial network with multiple masters and multiple slaves



Friday, September 25, 2009

CRC Calculation in VB and C

CRC -Cyclic Redundancy Check ကို တွက်ထုတ် ဖို့ အတွက် Visual Basic 2005 နဲ့ C ကို သုံးပြီး ရေးထားတဲ့ code တချို့ပါ။

CRC Calculation in VB2005

CRC Calculation အချို့အတွက် Visual Basic 2005 source code များကို အောက်ပါ လင့်ခ် မှာတွေ့နိုင်ပါတယ်။ Calculation ကို ပိုမြန်စေဖို့ အတွက် table ကို သုံးပြီး တွက်ထားပါတယ်။


CRC Calculation - GitHub

ဥပမာ အနေနဲ့ CRC16 CCITT Calculation နမူနာ တစ်ခုကို အောက်မှာ ပြထားပါတယ်။

Dim StrIn as String= "String to calculate CRC"
Dim CRCVal16 As UInt16 = 0
Dim crc As String
CRCVal16 = CRC16_CCITT.Calculate(StrIn)
crc = CRC16_CCITT.ToString(CRCVal16)

CRC16 CCITT ရဲ့ initial value က 0xFFFF ဖြစ်ပြီး သူ့ ကို အခြား တန်ဖိုး နဲ့ စသုံးချင်ရင်တော့ အောက်ပါအတိုင်း သုံးနိုင်ပါတယ်။

CRCVal16 = CRC16_CCITT.Calculate(Str1)
CRCVal16 = CRC16_CCITT.Calculate(Str2, CRCVal16)
crc = CRC16_CCITT.ToString(CRCVal16)

CRC Calculation in C

CRC Calculation အချို့အတွက် C source code များကို အောက်ပါ လင့်ခ် မှာတွေ့နိုင်ပါတယ်။ Storage သုံးတာ သက်သာအောင် table ကို မသုံးပဲ တွက်ထားပါတယ်။


CRC Calculation - GitHub

ဥပမာ အနေနဲ့ CRC16 CCITT Calculation နမူနာ တစ်ခုကို အောက်မှာ ပြထားပါတယ်။

#define STRLEN 4
char str[STRLEN]={0x01,0x01,0x00,0x0B};
unsigned char c[2];
unsigned int crc;
//Calculate CRC16 CCITT
crc=CRC16CCITT_InitialValue();
crc=CRC16CCITT_Calculate(str,STRLEN,crc);
CRC16CCITT_ToString(crc,c);
printf("CRC16 CCITT = %02X %02X \n",c[0],c[1]);


အောက်ကလို Online checksum calculator တွေကလည်း ကုဒ်တွေကို debug လုပ်တဲ့ အခါ အသုံးကျပါတယ်။

Online Checksum Calculator

Tuesday, August 18, 2009

SDCC - Small Device C Compiler

SDCC - Small Device C Compiler က အလကား ရနိုင်တဲ့ free open source C compiler ပါ။ သူက 8051 နဲ့ အခြား microcontroller အချို့အတွက်ပါ။ SDCC လို အလကား မဟုတ်ပဲ ပိုက်ဆံ ပေးဝယ်ရတဲ့ အခြား Keil တို့လို compiler တွေလဲ ရှိပါတယ်။ အဲဒီမှာ free evaluation version ကိုရနိုင်ပေမယ့် အစမ်းသဘော အတွက်ပဲ ရည်ရွယ်ပြီး code size ကို 2k byte ထက် ပိုသုံးလို့ မရအောင် ကန့်သတ်ထားပါတယ်။ SDCC ရဲ့ကောင်းတဲ့ အချက်ကတော့ ပိုက်ဆံ တစ်ပြားမှ မကုန်ပဲ အလကား ရနိုင်တာပါ။ ဒီမှာ ပြောမှာ ကတော့ SDCC manual ကို အကျဉ်းချုံး ထုတ်နုတ်ပြော တာပါ။

Installing
http://sdcc.sourceforge.net/ ကိုသွားပြီး setup program ကို download လုပ်နိုင်ပါတယ်။ နောက် setup program ကို Run ပါ။

Testing the SDCC Compiler
နောက် command prompt ကိုသွားပြီး compiler အလုပ် လုပ်မလုပ် စမ်းကြည့်ဖို့ "sdcc -v" ကို enter လုပ်ပါ။ SDCC ကသူ့ရဲ့ ဗားရှင်း နံပါတ်ကို reply ပြန်တာ ကို တွေ့ ရပါလိမ့် မယ်။

Example C Program
အောက် ပါ နမူနာ program ကို စိတ်ကြိုက် ASCII editor တစ်ခုခု သုံးပြီး ရိုက်ပါ။ ထို့နောက် led.c အမည်ဖြင့် သိမ်းပါ။ Eclipse အစရှိတဲ့ development IDE တွေသုံးလို့ လဲရပါတယ်။ အဲဒီ အကြောင်း ကြုံရင် ပြောပါမယ်။ ဒီနမူနာ က 8051 microcontroller ရဲ့ P3.4 pin ကိုဆက်သွယ်ထား တဲ့ LED ကို မှိတ်တုပ် မှိတ်တုပ် အဖွင့် အပိတ် လုပ်ပေးဖို့ ပါ။
#include<8052.h>
void main()
{
int i;
while(1)
{
P3_4=0;   //Output 0
for(i=0;i<30000;i++);  //delay loop
P3_4=1;   //Output 1
for(i=0;i<30000;i++);  //delay loop
}
}


Compiling and Getting Hex File
command prompt မှာ ဖိုင် led.c ရှိတဲ့ နေရာကို သွားပြီး "sdcc led.c" ကို enter လုပ်ပါ။ အားလုံး အဆင်ပြေရင် အမှား မတက်ပဲ led.ihx ဆိုတဲ့ဖိုင် ထွက်လာပါမယ်။ "dir" ကို enter လုပ်ပြီး အဲဒီဖိုင် ထွက်မထွက် ကြည့်နိုင်ပါတယ်။ နောက် သင့်ရဲ့ chip ထဲကို download လုပ်ဖို့ သင့်တော်တဲ့ intel hex file ရအောင် "packihx led.ihx>led.hex" ကို enter လုပ်ပါ။ ထွက်လာတဲ့ led.hex ကို သုံးလို့ ရပါပြီ။

Projects with Multiple Source Files
SDCC က တစ်ကြိမ်မှာ တစ်ဖိုင် ပဲ compile လုပ်ပေးနိုင်ပါတယ်။ ဥပမာ main.c blink.c ဆိုတဲ့ ဖိုင်တွေရှိ တဲ့ project ကို စမ်းဖို့ အောက်ပါ အတိုင်း ရိုက်ထည့်ပြီး ဖိုင် များကို ဖန်တီးပါ။
//File name: main.c
#include "blink.h"
void main()
{
while(1)
{
toggle();
delay();
}
}


//File name: blink.c
#include <8052.h>
#include "blink.h"
void toggle()
{
P3_4^=1;
}
void delay()
{
int i;
for(i=0;i<30000;i++); //delay loop
}


//File name: blink.h
void toggle();
void delay();

main() function မပါတဲ့ ဖိုင်များကို "sdcc -c blink.c" ဆိုတဲ့ command သုံးပြီး သပ်သပ် compile လုပ်ပါ။ နောက် main() function ပါတဲ့ ဖိုင်ကို နောက်ဆုံးမှ "sdcc main.c blink.rel" ဆိုတဲ့ ပုံစံ အတိုင်း compile လုပ်နိုင်ပါတယ်။ main.ihx ဆိုတဲ့ ဖိုင်ထွက်လာမှာ ဖြစ်ပြီး ထုံးစံ အတိုင်း main.hex ကို ရယူ အသုံးပြု နိုင်ပါတယ်။

Monday, March 16, 2009

String and ASCII Code Conversion in VB 2005

ကျွန်တော်တို့ အခါအားလျော်စွာ သုံးဖို့ လိုတဲ့ ASCII code နဲ့ string အပြန် အလှန် ပြောင်းလဲတဲ့ ဖန်ရှင်လေး တွေကို ရေးကြည့်ထား ပါတယ်။ အဲဒါ ကို A Visual Basic class to convert between hexadecimal, ascii, and text string on GitHub မှာ ယူနိုင်ပါတယ်။
'Author: Yan Naing Aye
'WebSite: http://cool-emerald.blogspot.sg/
'Updated: 2009 April 24
'-----------------------------------------------------------------------------
Public Class ClsMyStr
    Public Shared Function AsAsciiEncodedStr(ByVal CharString As String) As String
        Dim outS As String = ""
        Dim temp As String = ""
        Dim i As Integer = 0
        For i = 0 To CharString.Length - 1
            temp = "00" & Hex(Asc(CharString(i)))
            temp = Right(temp, 2)
            outS = outS & temp
        Next i
        Return outS
    End Function
    Public Shared Function AsSpacedAsciiEncodedStr(ByVal CharString As String) As String
        Dim outS As String = ""
        Dim temp As String = ""
        Dim i As Integer = 0
        For i = 0 To CharString.Length - 1
            temp = "00" & Hex(Asc(CharString(i)))
            temp = Right(temp, 2)
            outS = outS & temp & " "
        Next i
        Return outS
    End Function
    Public Shared Function AsAsciiDecodedStr(ByVal AsciiEncodedStr As String) As String
        Dim outS As String = ""
        Dim i As Integer = 0
        Dim l As Integer = AsciiEncodedStr.Length - 2

        If (AsciiEncodedStr.Length Mod 2) <> 0 Then
            l -= 1
        End If
        For i = 0 To l Step 2
            outS = outS & Chr(Val("&H" & AsciiEncodedStr.Substring(i, 2)))
        Next i
        Return outS
    End Function
    Public Shared Function GetAsciiEncodedStr(ByVal RawAsciiEncodedStr As String) As String
        Dim i As Integer = 0
        Dim c As String
        Dim cmd As String = ""

        For i = 0 To RawAsciiEncodedStr.Length - 1
            c = RawAsciiEncodedStr(i)
            If (Asc(c) >= &H30) AndAlso (Asc(c) <= &H39) Then
                cmd = cmd & c
            ElseIf (Asc(c) >= &H41) AndAlso (Asc(c) <= &H5A) Then
                cmd = cmd & c
            ElseIf (Asc(c) >= &H61) AndAlso (Asc(c) <= &H7A) Then
                cmd = cmd & Chr(Asc(c) - &H20) 'change to upper case
            Else
                'MessageBox.Show("Got invalid character.")
            End If
        Next i
        If cmd.Length < 2 Then
            cmd = "0" & cmd
        End If
        Return cmd
    End Function
    Public Shared Function DoubleQuote() As String
        Return ControlChars.Quote
    End Function
    Public Shared Function Byte2Text(ByVal byteArray() As Byte) As String
        Dim str As String = BitConverter.ToString(byteArray)
        Return str
    End Function
    Public Shared Function Byte2Str(ByVal byteArray() As Byte) As String
        'Dim str As String = System.Text.Encoding.ASCII.GetString(byteArray)
        Dim str As String = ""
        For i As Integer = 0 To UBound(byteArray)
            str &= Chr(byteArray(i))
        Next
        Return str
    End Function
    Public Shared Function Str2Byte(ByVal str As String) As Byte()
        'Dim ba() As Byte = System.Text.Encoding.ASCII.GetBytes(str)
        Dim ba() As Byte
        Try
            ReDim ba(str.Length - 1)
            For i As Integer = 0 To UBound(ba)
                ba(i) = Asc(str(i))
            Next
        Catch ex As Exception
            ReDim ba(0)
            ba(0) = 0
        End Try        
        Return ba
    End Function
    Public Shared Function GetSignedDecimalText(ByVal RawStr As String) As String
        Dim i As Integer = 0
        Dim c As String
        Dim cmd As String = ""

        For i = 0 To RawStr.Length - 1
            c = RawStr(i)
            If (Asc(c) >= &H30) AndAlso (Asc(c) <= &H39) Then
                cmd = cmd & c
            ElseIf (Asc(c) = &H2D) Then
                If cmd.Length = 0 Then
                    cmd = cmd & c
                End If
            Else
                'MessageBox.Show("Got invalid character.")
            End If
        Next i        
        Return cmd
    End Function
End Class