මේ AVR Timers පාඩම් මාලාවේ තුන්වන පාඩම. කලින් පාඩම් වලින් අපි AVR වල තියෙන TCA කියන Timer එක Normal mode සහ Split mode කියන ආකාර දෙකන් ම සාමාන්ය counter එකක් ලෙසට වැඩ ගන්න හැටි ඉගෙන ගත්තා. ඒවා භාවිතා කරලා digital watch එකකුත් හැදුවා. මම මේ පාඩමේදී කියලා දෙන්න බලාපොරොත්තු වෙන්නේ TCA වලින් ගන්න පුළුවන් තවත් වැදගත් ප්රයෝජනයක් ගැන. ඒ තමා TCA එක comparator එකක් විදිහට භාවිතා කරන හැටි කියලා දෙන්න. Comparator එකක් කියන්නේ යම් දෙයක් තවත් දෙයක් එක්ක සංසන්දනය කරලා සමාන උනොත් අපිට ප්රතිදානයක් දෙන දෙයක් කියලා ඔයාලා දන්නවා. TCA comparator එකක් විදිහට වැඩ කරන කොට සංසන්දය කරන්නේ එයාගේ CNT register එක සහ අපි ලබා දෙන අගයක්. අපි බලමු මේක කොහොමද වෙන්නේ කියලා.
TCA වල comparator ක්රියාකාරිත්වය තේරුම් ගනිමු
අපි මේ වෙනකොට TCA එක සරල counter එකක් විදිහට වැඩ කරන හැටි දන්නවා. නැවතත් කෙටියෙන් මතක් කලොත් counter එකක් කරන්නේ එයට ලැබෙන clock pulse ගණන් කරගෙන register එකක save කරගන්න එක. මේ අගය 0 සිට උපරිමයකට(TOP) ගිහින් නැවතත් 0 වෙලා චක්රයක් ලෙස නොනවත්වා ගණන් කරනවා. Comparator එකක් ලෙස වැඩ කරන විටත් මේ දේවල් කිසි වෙනසක් නැතව වෙන්වා. නමුත් comparator එකේදී අමතර කාර්යයක් වෙනවා. ඒ තමයි ගණන් කරන අතරමගදී counter register එකේ අගය අපි දෙන වෙනත් අගයකට සමාන උනොත් interrupt එකක් නිපදවන එක. මේ interrupt එක overflow, underflow කියන interrupt දෙකට අමතරව තියෙන තව එකක්. අපි TCA වල සැකැස්ම දිහා නැවත බලමු එවිට මේ ක්රියාකාව තවත් හොඳට බලා ගන්න පුළුවන්.
රූපයේ තියෙන දේවල් වලින් හදුනා ගන්න ඕනෑ මුල්ම කරණය තමයි base counter සහ එයට පහතින් ඇති Compare channel තුන. Base counter එක තුල තියෙන්නේ clock pulse ගණන් කරන්න ඕනෑ කරන මුලික දේවල්. ඒ අතරින් CNT කියන counter register එක වැදගත් මොකද ගණන් කරපු අගය save වෙලා තියෙන්නේ මේකේ. මේ දේවල් ඔයාලා මේ වෙද්දී දන්නවා. Compare channel එකේ තියෙන CMPn කියන register එක අපිට කැමති අගයක් ලියන්න පුළුවන්. CNT වල අගය 0න් පටන් අරන් ඉහලට යද්දී යම් මොහොතක අපි CMPn ට දුන් අගයට සමාන වෙනවා. අන්න ඒ මොහෙතිදී තමා පෙර සඳහන් කරපු interrupt එක සැදෙන්නේ. අපි මේකට කියන්නේ match interrupt එක කියලා. මේ interrupt එකෙන් අපිට සැහෙන ප්රයෝජන ගන්න පුළුවන්. ඉතින් මෙන්න මේ විදිහට තමා comparator එක වැඩ කරන්නේ.
TCA වල compare channel තුනක් තියෙනවා CMP0, CMP1 සහ CMP2 කියලා තමා ඒවා නම් වෙන්නේ. මේ නිසා counter එක 0 සිට TOP එකට ගණන් කරන එක චක්රයක් තුලදී එකිනෙකට වෙනස් CMPn ( මෙහි n = 0,1,2) අගයන් තුනකට match interrupt තුනක් ලබා ගන්න පුළුවන්. ඉතින් TCA වල comparator එක ගැන කියන්න තියෙන්නේ මේ කරුණු ටික තමා. දැන් අපි මේ දේ ප්රයෝගිකව අත්හදා බලමු.
Project 03: TCA වල comparator එක භාවිතා කරලා digital ඔරලෝසුවක් සාදමු.
මේ project එකේදී අපි ඉගෙන ගන්නේ TCA වල comparator එකක් ලෙස භාවිතා කරන්නේ කොහොමද කියන කාරණය. අපි මුල ඉදන් කරගෙන අපි digital watch hardware එකම මේකට භාවිතා කරලා firmware එක විතරක් වෙනස් කරලා මේ අත්හදා බැලීම කරමු. අනිත් පාඩම් වල වාගේම මේ පාඩමටත් Atmel Studio සහ IC එකට program කරන්න PICKit programmer එකකතු ඕනෑ කරනවා. මේ ටික ලැහැස්ති නම් අපි වැඩ පටන් ගමු.
Hardware එක නිර්මාණය කිරීම.
මේ project එකට භාවිතා කරන්නෙත් project 01 එකේ hardware එකම තමයි. ඒ නිසා අමුතුවෙන් මේ ගැන විස්තර කරන්න ඕනේ නෑ කියලා මම හිතනවා. ඔයාලාට පුළුවන් දීල තියෙන link එකෙන් ඒ පරිපථ සටහන බලන්න.
Firmware එක නිර්මාණය කිරීම.
දැන් අපි firmware එක ලියමු. එකට මුලින් ම කරන්න ඕනෑ දේ තමයි අලුත් Project එකක් හදා ගන්න එක. එකත් එක්කම MCU එකේ clock source එක සකසා ගන්නත් ඕනෑ. පරිපථයේ clock source එකක් විදිහට crystal එකක් භාවිතා කලේ නැති නිසා AVR IC එක ඇතුලේම තියෙන clock source එකක් තෝරා ගන්න වෙනවා. ඒ නිසා ඇතුලේ තියන 20Mhz clock source එක තෝරා ගමු. මේ සඳහා Step 01 අනුගමනය කරන්න.
Atmel Studio එකේ File > New > Atmel Start Project තෝරා ගන්න
ඔබ තෝරා ගත් microcontroller එක search box එක අධාරයෙන් සොයා ගන්න. ඉන් පසුව Create New Project වලට යන්න.
දැන් ඔබට පහත දැක්වෙන පරිදි window එකක් දකින්න ලැබේවි. එකේ තියෙන CLKCTRL කියන එක ඔබන්න.
එවිට අලුත් project එක save කරන්න ඕනෑ තැන සහ project එකට නමක් පවරන්න කියලා අසාවි. ඔබ කැමති නමක් භාවිතා කර කැමති තැනක save කරන්න.
MAIN CLOCK CONFIGURATION යටතේ තියෙන,
- Enable = True
- Main Clock Source = 20Mhz internal Osc.
- PEN:Prescaler enable = True
- PDIV: Prescaler Division = 10
ලෙස සකසා ගන්න. අනිත් දේවල් වලට කිසි වෙනසක් කරන්න යන්න එපා! අවසානයේ GENERATE PROJECT ඔබන්න.
සමහරක් විට save කරන්න යද්දී රූපයේ දැක්වෙන message එක පෙන්වන්න පුළුවන්. එහෙම උනොත් NO button එක click කරන්න.
දැන් අපේ project එක save වෙලා ඉවරයි. ඕනෑ නම් ATMEL START window එක close කරන්න පුළුවන්. ඔයාලාට පේනවා ඇති Solution Explorer Window එකේ ඔයාගේ project එක පෙන්නනවා. Solution Explorer එක පෙනෙන්නේ නැතිනම් View > Solution Explorer වලින් ඒක ගන්න. main.c file එක double click කරපු විට පහත තියෙන view එක ඔයාටත් එන්න ඕනෑ. පළමු පියවර සාර්ථකයි. දැන් තියෙන්නේ Timer එකට අදාළ code එක ලියන්න
වැදගත්:
හොඳට මතක තියා ගන්න දැන් අපට 2MHz CPU clock එකක් තියෙනවා කියලා. මොකද අපි 20MHz internal clock එක 10න් බෙදලා (PDIV = 10) ගත්ත නිසා. ඒ කියන්නේ අපේ ලියන program එක IC එකේ දී ඇත්තටම run වෙන වේගය 2MHz කියන එක තමයි. මේක අමතක කරන්න එපා!
Firmware එකේදී අපි මුලින්ම කරන්න ඕනෑ දේ තමයි හරියට තත්පරයක් ගණන් කරගන්න එක. TCA Project 01 වලදී ඒ සඳහා කරපු දේ තමයි අපේ counter එක හරියටම තත්පරයකදී overflow වෙන්න PER කියන period register එකට අගයක් ලියපු එක. එමඟින් සිදුවුනේ timer එකේ TOP එක අපිට ඕනෑ කරන කුඩා අගයක් බවට පත්වීම. නමුත් අපි දැන් comparator එකක් විදිහට වැඩ කරන නිසා අපිට පුළුවන් ඒ අගයම compare channel එකකට ලබා දෙන්න. එවිට CNT එක 0 ඉදන් ගැන කරගෙන යනකොට අපි දුන්න අගයට සමාන වෙනවත් සමඟම match interrupt එකක් ලැබෙනවා. එවිට අපිට පුළුවන් එකට අදාල interrupt function එක හරහා ඔරලෝසුවේ වෙලාව ගනින වැඩේ කරගන්න. (interrupt ගැන වැඩි විස්තර දැනගන්න මේ පාඩම කියවන්න).
Comparator එකක් විදිහට වැඩ කරද්දී දැනගන්න ඕනෑ කරන වැදගත් දෙයක් තියෙනවා. ඒ තමා match interrupt එකේදී CNT වල අගය ස්වයන්ක්රියව 0 බවට පත් නොවන වග. එසේ වෙන්නේ overflow වන අවස්ථාවක දී විතරයි! ඒ නිසා match interrupt එක ලැබුන විගසම CNT වල අගය 0 කරන්න අපි වගබලා ගන්න ඕනේ.
අපේ clock source එක 2MHz ( =20MHz/10) නිසා. අපිට project 01 එකේ prescale සංගුණකය වූ 64ම තෝරාගන්න පුළුවන්. එවිට අපිට PER සඳහා ලැබුන අගය වුනේ 31,25010 ( = 0x7A1216) කියන අගය. අපි මේ අගය CMP0 වලට යොදමු. CMP0 භාවිතා කරන නිසා එකට අදාළ ISR එක ලියන්න අපි වගබලා ගන්න වෙනවා. දැන් මම code එක ලියලා පෙන්වන්නම්.
Code එකේ දී මුලින් ම කරන්නේ CMP0 එකට සසඳන්න ඕනෑ කරන අගය ලබා දෙන එක. ඉන්පසු ඒ compare channel එක enable කරනවා. Enable කලොත් පමණයි සංසන්දනය වන ක්රියාව වෙන්නේ. පසුව PER වලට MAX අගය (මෙය කරන්න අනිවාර්යය නෑ මොකද default එක MAX එක නිසා) ලබා දී TCA එකේ prescale එක 64ක් වන (CLKSEL[2:0]) අගය සහ enable bit (ENABLE) එකයි set කරනවා ( Bit settings ගැන දැන ගන්න ඔබට datasheet එකේ විස්තර ටික බලන්න වෙනවා). දැන් අපේ Timer එක දුවන්න පටන් ගන්නවා. ඊළඟට කරන්නේ compare channel 0 වල interrupt එක සක්රිය කරන එක. ඒ සඳහා TCA එකේ INTCTRL(interrupt control) register එකේ CMP0 bit එක “1” කරනවා. අවසානයේ Global interrupts එක sei() function එකෙන් enable කරනවා.
ඉතුරු වෙලා තියෙන්නේ match එකකදී වෙන්න ඕනෑ code එක ලියන්න. ඒ කියන්නේ අපේ ISR function එක ලියන එක. එකට කරන්න ඕනේ ISR function එකට TCA0_CMP0_vect කියන TCA channel-0 match interrupt vector pointer එක set කරන එක. (Interrupt පාඩමෙන් vector pointers කියන්නේ මොනාද කියල ඉගෙනගන්න). මෙතැනදී දැන ගන්න ඕනේ වැදගත් කරුණු දෙකක් තියෙනවා. එනම්,
- ඒ ISR එකට ගියපු විගසම CNT වල අගය 0 කිරීම.
- ඒ ISR එකට ගියපු විගසම TCA වල INTFLAG කියන register එකේ තියෙන CMP0 FLAG bit එකට “1” ලියලා එය මකන එක. මිට හේතුව ISR එක run වුන ගමන් මෙය auto clear නො වීමයි. ඒසේ නොකලොත් ISR එක එක දිගට run වෙනවා.
දැන් ඉතින් timer එකේ වැඩ ටිකනම් ඉවරයි. ඉතුරු වෙලා තියෙන්නේ watch එකේ button දෙකයි 7-segment display එක පාලනය කරගන්න එක. ඒ ටිකත් ඉවර කරපු code එකේ source එක තමා පහත තියෙන GitHub link එකේ තියෙන්නේ.
දැන් අපි අපේ code එක IC එකට program කරලා run කරලා බලමු.