29/01/2021
Programming a Microcontroller
==================
Microcontroller ဆိုတာ ေသးငယ္တဲ့ electronic chip ျပားေလးပါ။
သူ႔ထဲ မွာ RAM, ROM, CPU, I/O Ports, Timer, Counter အစရွိတဲ့ ကြန္ပ်ဴတာတစ္လံုးမွာ ပါရွိရမယ္
အေျခခံအစိတ္အပိုင္းေတြ အားလံုးပါရွိလို႔ micro computer လို႔လည္းဆိုႏိုင္ပါတယ္။
Microcontroller ေတြကို Embedded systems ေတြမွာ ကုန္က်စရိတ္အနည္းဆံုးနဲ႔ အသံုးျပဳႏိုင္ေအာင္ ထုတ္လုပ္ထားတာပါ။
Manufacturer အလိုက္ အမ်ိဳးစားအမ်ိဳးမ်ိဳးရွိတဲ့အနက္ Atmel ရဲ႕ AVR microcontroller ေတြဟာ လူသံုးအမ်ားဆံုးျဖစ္ပါတယ္။
ATmega8, ATmega16, ATmega32 နဲ႔ ATmega328 တို႔ကို အသံုးမ်ားပါတယ္။
- Microcontroller နဲ႔ ဘာေတြလုပ္လို႔ရလဲ။
လၽွပ္စစ္ပစည္းေတြ ကိုကြန္ပ်ဴတာပရိုဂရမ္နဲ႔ ထိန္းခ်ဳပ္ေစခိုင္းဖို႔အတြက္ အသံုးျပဳႏိုင္ပါတယ္။
Microcontroller ေတြကို C programming, Assembly language တို႔နဲ႔ program ေရးသြင္းႏိုင္ပါတယ္။
- ဘယ္ေနရာေတြမွာသံုးလဲ။
အိမ္သံုးလၽွပ္စစ္ပစည္းေတြျဖစ္တဲ့ အဝတ္ေလၽွာ္စက္၊ အဲယားကြန္း၊ တီဗီ၊ smart phones၊ မိုက္ခရိုေဝ့ဖ္စတာေတြအျပင္
atm, fingure print, gsm gprs, card reader, sensors doors, digital notice board, led boards,
remote control systems နဲ႔ IoT devices ေတြမွာ သံုးပါတယ္။
- ဘယ္မွာဝယ္လို႔ရလဲ။
Atmel microcontroller နဲ႔ ဆက္စပ္ပစည္းေတြကို ရန္ကုန္မွာဆို ေမာင္ခိုင္လမ္းက လၽွပ္စစ္ပစည္းဆိုင္ေတြမွာ ဝယ္လို႔ရပါတယ္။
နယ္ေတြထိပို႔ေပးတဲ့ online store ေတြကေတာ့ Green electronic ( https://www.greenelectronicstore.com/ ) နဲ႔
Friends ( http://friendonlinestore.com/ ) တို႔ရွိပါတယ္။
ေစ်းႏႈန္းက Microcontroller တစ္ခုကို ၃၀၀၀က်ပ္ဝန္းက်င္ပဲ ရွိပါတယ္။
- ဘယ္လို program သြင္းရမလဲ။
** Atmel studio **
Atmel studio ( https://www.microchip.com/content/dam/mchp/documents/parked-documents/as-installer-7.0.2542-full.exe )
ကိုသံုးၿပီး avr microcontroller ထဲကို C programming နဲ႔ ေရးသားထားတဲ့ program ေတြထဲ့သြင္းလို႔ရပါတယ္။
USB Programmer (online store ေတြမွာဝယ္ယူရရွိႏိုင္ပါတယ္) လို႔ေခၚတဲ့ connector ျဖင့္ ကြန္ပ်ဴတာနဲ႔ avr microcontroller တို႔ကိုခ်ိတ္ဆက္ထားရပါမယ္။
ဒီlink (https://youtu.be/1oT4AcWPTLM) မွာ LED မီး blink လုပ္တဲ့ program ကို atmel avr microcontroller ထဲေရးသြင္းပံုကို ေလ့လာႏိုင္ပါတယ္။
Online store ကေန AVR Starter Kit Set တစ္ခုမွာယူလိုက္ရင္ လက္စြဲစာအုပ္ႏွင့္အတူ jumper pin, led မီးသီး, sensors, push buttons
အစရွိတဲ့ ဆက္စပ္ပစည္းေတြအစံုလိုက္ပါလာမွာပါ။
**Arduino**
Arduino နဲ႔လည္းေရးသားႏိုင္ပါတယ္။ Arduino Starter Kit မွာ arduino uno board နဲ႔အတူ လိုအပ္တဲ့ပစည္းအားလံုးပါရွိပါတယ္။
Arduino studio ကို download လုပ္ၿပီး example ေတြကို စမ္းသပ္ႏိုင္ပါတယ္။
- Microcontroller ထဲ program ထဲ့ၿပီးသြားရင္ ဘာဆက္လုပ္ရမလဲ။
Bread board မွာ ကိုယ္စမ္းထားတဲ့ pin လမ္းေၾကာင္းေတြအတိုင္း circuit design ဆြဲၿပီး PCB (Printed Circuit Board) manufacturer ဆီမွာအပ္ရပါမယ္။
Circuit board မွာ program သြင္းထားတဲ့ microcontroller နဲ႔ အျခားလိုအပ္တဲ့ sensor, led, lcd စတဲ့ သင္ design ဆြဲထားတဲ့ အစိတ္ပိုင္းေတြတပ္ဆင္လုိက္မယ္ဆိုရင္
ကိုယ္ပိုင္ embedded system တခုရရွိမွာျဖစ္ပါတယ္။ ဥပမာ အလိုေလၽွာက္မီးအဖြင့္ပိတ္လုပ္ႏိုင္တဲ့ sensor မီးအိမ္၊ timer ေပးၿပီး လၽွပ္စစ္ကိုျဖတ္ေတာက္ခ်ႏိုင္တဲ့ extension မီးဘုတ္ စသျဖင့္ေပါ့။
PCB board ေတြကိုေတာ့ commercial လုပ္မယ္ဆို China ကမွာယူရပါတယ္။ စမ္းသပ္ရံုဆိုရင္ home made PCB ေတြလုပ္ျပီးသံုးနိုင္ပါတယ္။
[Programming a Microcontroller]
------------------------------------------
Microcontroller chip တစ္ခုခ်င္းအတြက္ PIN Diagram တစ္ခုစီရွိျကပါတယ္။ ေအာက္ပါ ATMega8 microcontroller မွာဆိုရင္
PB0, PB1, .., PB5 စတဲ့ PB နဲ့စတာေတြကို Port B လို့ေခာ္ျပီး PB0 က Port B ရဲ့ Pin 0 ျဖစ္ပါတယ္။
Port တစ္ခုမွာ Pin ၈ခုစီရွိျကပါတယ္။ Pin တစ္ခုခ်င္းစီက data size 1 bit စီလက္ခံပါတယ္။
ဒါေျကာင့္ Port တစ္ခုစီက 8 bit data ကိုလက္ခံပါတယ္။ PD0 က Port D ရဲ့ Bit 0 ကို ကိုယ္စားျပုပါတယ္။
Port တစ္ခုစီမွာ Register ၃ ခုစီရွိပါတယ္။ Register ဆိုတာကို function တစ္ခုလို့ယူဆနိုင္ပါတယ္။
- DDRx register
Data Direction Register က Port ရဲ့ pin ေတြကို input အတြက္သံုးမွာလား
output အတြက္သံုးမွာလား ဆိုတာသတ္မွတ္တာျဖစ္ပါတယ္။ 1 က output ျဖစ္ျပီး 0 က input ပါ။ ဉပမာ
DDRB= 0b11111111;
က Port B ရဲ့ Pin အားလံုးကို output အတြက္သံုးမယ္လို့ ေျကညာတာပါ။
- PINx register
PINx register ကို Port pin ေတြဆီက data ကို read ဖို့အတြက္သံုးပါတယ္။ Pin တစ္ခုက data ကိုဖတ္မယ္ဆိုရင္
အဲဒီ Pin ကို DDRx register မွာ input အျဖစ္အရင္ေျကညာရပါတယ္။ ဉပမာ
DDRD = 0x00; //Set port D as input
x = PIND; //Read contents of port d
- PORTx register
PORTx register က Port pin ေတြကို data write လုပ္ဖို့အတြက္သံုးပါတယ္။ ဉပမာ
DDRB = 0xFF; //make port B as outputs
PORTB = x; //output variable on port
Pin 0 တစ္ခုတည္းကိုပဲ data write မယ္ က်န္တဲ့ Pin အားလံုးကို input အျဖစ္ပဲထားမယ္ဆိုရင္
DDRB = 0b00000001; //make port B Pin 0 as outputs
PORTB = 0b11111110; //turn off port B Pin 0 and turn on all other pins
VCC Pin နဲ့ GND Pin တို့ကို Power supply အတြက္သံုးပါတယ္။
Pin 0 ကို input 1 ထားျခင္းဟာ အဲဒီ Pin မွာ လ်ွပ္စစ္ျဖတ္စီးေစတာပါ။ Pin 0 က value 1 ကို Pin 1 မွာ assign လုပ္၊
Pin 1 ကို output 1 ထားျပီး LED မီးသီးနဲ့ ခ်ိတ္ဆက္ထားမယ္ဆိုရင္ ...
ဒါက AVRStudio မွာ simulator နဲ့ run ျကည့္လို့ရမယ့္ BlinkLed code ပါ။ C programming ပါ။
/* Defines pins and ports, etc */
int main(void) {
/* Inits */
DDRB = 0b00000010; /* Data Direction Register B pin one as output*/
while(1) {
PORTB = 0b00000010; /* Turn on LED on port b pin one */
_delay_ms(1000);
PORTB = 0b00000000; /* Turn off all port b pins */
_delay_ms(1000);
}
return 0;
}