අද අපි ඉගෙන ගන්න හදන්නේ AVR වල තියෙන Timer ගැන. Timer කියන්නේ microcontrollers(MCU) වල තියෙන ඉතා ප්රයෝජනවත් අංගයක්. ඒ නිසා මේ ගැන ඉගෙන ගන්න එක ඔයාලා අනිවාර්යයෙන් කරන්න ඕනෑ දෙයක් කියන එක තමා මගේ විශ්වාසය. ඒ නිසා මේ පාඩමෙන් සරල විදිහට Timers ගැන කියලා දෙන්න මම උත්සාහ කරන්නම්.
මේ පාඩම් මාලාවට භාවිතා කරන්නේ Microchip ආයතන නිෂ්පාදනය කරන අලුත් AVR ඛාණ්ඩයේ IC කියලා මේ පාඩම් මාලාව මුල දී මම සඳහන් කළා. එකට හේතුව මේ IC වල මිල අඩු වීම සහ විශාල features ගණනක් තනි IC එකක ගැබ්වී තිබීමයි. අනිත් කරුණ තමයි ඒ ඛාණ්ඩයේ මොන IC එක ඔයාලගේ project එකට ගත්තත් මේ ඉගෙන ගන්න දේවල් කිසි වෙනසක් නැතුව පාවිච්චි කරන්න පුළුවන්කම.
අලුත් Microchip AVR Architecture එකට ඇතුලත් (ඒ කියන්නේ tinyAVR-0, tinyAVR-1 සහ ATmega-0 Series සියල්ලේම) සාමාන්ය MCU එකක Timer models දෙකක් හෝ තුනක් දැක ගන්න පුළුවන්. ඒක හරියට අපි ඉන්න ගෙදර අත් ඔරලෝසු, බිත්ති ඔරලෝසු සහ මේස ඔරලෝසු වාගේ ඔරලෝසු වර්ග කීපයක් තියෙනවා හා සමානයි. MCU එකේ තියෙන මේ Timers වලට TCA, TCB හෝ TCD වගේ නමක් තමා යොදලා තියෙන්නේ. TC කියන්නේ Timer/Counter කියන එක කැටි කරලා. A,B හෝ D කියලා නම් කරලා තියෙන්නේ ඒවායේ වෙනස්කම් සලකලා. මේ models වලට විවිධ හැකියාවන් හා සීමාවන් තියෙනවා. අනිත් කරුණ තමයි මේ model එකකින් copies එකකට වඩා microcontroller එකේ තියෙන්නේ පුළුවන්. මේ පිටපත්(copies) වලට අපි කියන්නේ instances කියලා. උදාහරණයක් විදිහට ATtiny1616 කියන MCU එකේ TCB0 සහ TCB1 කියල TCB instances දෙකක් තියෙනවා. එහෙනම් Timer එකක කියන්නේ මොකක්ද කියන තැනින් පටන් අරගෙන පාඩම කරගෙන යමු.
මොනවාද මේ Timers කියන්නේ?
Timers කියන්නේ අපි පාවිච්චි කරන ඔරලෝසු වගේ වෙලාව ගණන් කරන අවයවයක්. ඇත්තටම වෙලාව කියලා ගණන් කරන්නේ clock system එකෙන් එයට ලැබෙන clock pulse ගණන (clock ticks කියලත් කියනවා). මෙයට MCU Core එකේ උදව් නැතිව ස්වාධීනව වැඩ කරන්න පුළුවන්. අපේ ඔරලෝසුවේ කට්ට හැම තත්පරයකට වාරයක් කැරකෙනවා වගේ Timer එක එයට ලැබෙන සෑම clock pulse එකම ගණන් කරගෙන register එකක save කරනවා. මේ save කරන අගය 0 පටන් අරගෙන උපරිමයකට ගිහින් ආයෙත් 0 වෙලා නැවතත් චක්රයක් විදිහට ගණන් කරගෙන යනවා. හරියට ඔරලෝසුවේ තත්පර කට්ට 12න් පටන් අරගෙන තත්පර 60කට පස්සේ ආයෙත් 12ට එනවා වගේ. අපිට පුළුවන් Timer එකට Clock pulses ලැබෙන වේගය පාලනය කරන්න, ඒ නිසා අපිට ඕනෑ වේගයකින් 0 සිට උපරිමයට යන්න සකස් කරන්න පුළුවන්. අර මම මුල ඉදන් ම සඳහන් කරපු alarm එක ලැබෙන්නේ මෙ විදිහට එක වටයක් සම්පුර්ණ කරපු විට. මේ alarm එක interrupt signal එකක් (Interrupts ගැන වැඩිපුර ඉගෙන ගන්න මේ පාඩම බලන්න) විදිහට භාවිතා කරලා සෑහෙන ප්රයෝජන ගන්න පුළුවන්. Alarm වලට අමතරව,
- PWM signal නිපදවීම
- Time Compare unit එකක් විදිහට වැඩ ගැනීම
වාගේ ප්රයෝජන ගොඩක් ගන්න පුළුවන්. මේ AVR Timer පාඩම් මාලාවේදී වලදී TCA, TCB සහ TCD කියන timer model තුන ගැනම පිළිවෙලින් කියලා දෙන්න අදහස් කරන් ඉන්නවා. හැබැයි තනි පාඩමකට මේ ඔක්කොම ඇතුල් කරන්න බැරි නිසා පාඩම් කොටස් වශයෙන් තමා කියල දෙන්නේ. මේ පාඩමේ ඇතුලත් වෙන්නේ TCA කියන timer එක ගැන වැදගත් කරුණු සහ ප්රයෝගික ක්රියාකාරකමක්.
TCA Timer/Counter එක සමඟ වැඩ කරමු.
AVR වල පළමුවැනි Timer model එක වන TCA සමග වැඩ කරන්න කලින් එහි සැකැස්ම තේරුම් ගන්න ඕනෑ වෙන්වා. පහත රූපයේ තියෙන්නේ TCA වල සරල කැටි සටහනක්.
TCA වල හරය වෙන්නේ එකේ තියෙන Base Counter එක. මේක 16bit counter එකක්. මේ Base Counter එක තමා එයට ලැබෙන clock pulses ගණන් කර ගෙන save කර ගන්නේ. ගණන් කරන්න ඕනෑ clock pulses මෙයට ලැබෙන්නේ peripheral clock system එකෙන්. Clock System එක ගැන වැඩිපුර ඉගෙන ගන්න ආස නම් AVR Clock System පාඩම බලන්න.
අපිට පුළුවන් මේ ලැබෙන clock pulses වල වේගය අඩු කරලා ගණින වේගය පාලනය කර ගන්න. එකට තමයි Prescaler කියන කොටස තියෙන්නේ. Event System එක තමා interrupts වාගේ දේවල් පාලනය කරන්නේ. TCA එකට compare channel තුනක් තියෙනවා. මේ compare channels වලින් තමා Base Counter එකේ save වෙලා තියෙන අගය සමග සංසන්දනය කරලා විවිධ outputs ( උදා: PWM signal) අපිට හදලා දෙන්නේ. Channel තුනක් තියෙන නිසා අපිට PWM signal තුනක් ලබාගන්න පුළුවන්. මේ කොටස් ගැන වැඩි විස්තර projects කරන ගමන් ඉගෙන ගමු. සාරාංශයක් විදිහට කිව්වොත් TCA එකෙන් වැඩ වැඩ ගන්න පුළුවන් ක්රම තුනක් තියෙනවා. ඒවා නම්,
- Counter එක ලෙස භාවිතා කිරීම.
- PWM ආදී waveform නිපදවීමට භාවිතා කිරීම.
- Timer comparator එකක් ලෙස භාවිතා කිරීම.
මීට අමතරව TCA එකට වැඩ කරන්න පුළුවන් ප්රධාන mode දෙකක තියෙනවා. ඒවා හදුන්වන්නේ Normal mode සහ Split mode නමින්. Normal mode එකේදී මෙය 16bit counter එකක් ලෙස වැඩ කරනවා. Split mode එකේදී එය 8bit counters දෙකක් විදිහට තමා ක්රියා කරන්නේ. ඉහත කියපු counter, PWM generator සහ comparator කියන තුනම මේ modes දෙකේදීම භාවිතා කරන්න පුළුවන්. අපි මේ දේවල් මේ පාඩම් මාලාවෙන් ඉගෙන ගමු.
මුලින්ම Normal mode counter එකක් විදිහට ක්රියාකරන හැටි මේ පාඩමෙන් ඉගෙන ගමු. අනිත් පාඩම් ටික වෙනම පාඩම් විදිහට තමා ලියලා තියෙන්නේ. පහතින් තියෙන්නේ ඒ පාඩම් වලට යන links ටික.
TCA Project 02: SPLIT mode counter එකක් විදිහට භාවිතා කරන හැටි.
Project 01 : TCA භාවිතා කරලා Digital Watch එකක් නිර්මාණය කරන හැටි.
TCA භාවිතා කරලා digital watch එකක් සාදා ගන්නා හැටි අපි මේ Project එකෙන් ඉගෙන ගමු. මම මේ පාඩමට භාවිතා කරන්නේ ATtiny1614 කියන IC එක. නමුත් ඔබට ඕනෑම AVR ATtiny-0, ATtiny-1 හෝ ATMega-0 series වල IC එකක් භාවිතා කරන්න පුළුවන්, මේ හැම IC එකේ ම TCA එක සමානයි.මේ project හරහා මං ඔයාලාට,
- සරල digital watch hardware එකක් හදන හැටි.
- TCA එක normal 16 bit counter එකක් විදිහට භාවිතා කරන හැටි
- TCA එකේ Prescale භාවිතා කරන හැටි.
- TCA වල තියෙන Timer Interrupts භාවිතා කරන හැටි.
කියලා දෙන්නම්. මුලින් ම ඔයාලා කරන්න ඕනෑ දෙයක් තමා වැඩේට අවශ්ය Tools ටික install කර ගන්න එක. මගේ කලින් පාඩම් ටික කරලා තිබ්බා නම් ඒ ගැන වධ වෙන්න ඕනෑ නැති වෙයි. ඒත් අලුත් කෙනෙක් නම් මෙන්න මේ ටික install කරන්න වෙනවා.
- Firmware එකට Atmel Studio 7.0 or latest version (install කරන්න කියලා දෙන පාඩම)
- Circuit ඒක ඇඳ ගන්න KiCAD EDA (install කරන්න කියලා දෙන පාඩම)
ඒ වාගේ ම තමා
- Program එක IC එකට burn කරන්න PIC KIT 4 හෝ වෙනත් programmer එකක් ඕනෑ.
මේ ටික install කර ගත්තා නම් hardware එකෙන් ම වැඩේ පටන් ගමු.
Hardware එක නිර්මාණය කිරීම.
මම watch එකේ display එක විදිහට භාවිතා කරන්නේ 7 segment LED digits. මිනිත්තු සහ පැය (පැය 24 ඔරලෝසුවක් විදිහට) පමණක් තිරයේ පෙන්වන්න කියලා තමා හිතුවේ. එම නිසා 7 segment 4ක් භාවිතා කරනවා. මේ 7 segment සියල්ලම ඍජුවම මගේ MCU ට සම්බන්ධ කරන්න ඕනෑ pin ගණන මදි නිසා CD4511 කියන 7 segment driver IC 4ක් භාවිතා කරනවා. මේ IC හොයා ගන්න හරිම පහසු නිසා තමා තෝරා ගත්තේ. ATtiny1614 IC එකට පිටතින් crystal එකක් අත්යාවශ්ය වන්නේ නැති නිසා crystal එකක් භාවිතා කලේ නෑ. පහතින් තියෙන්නේ මගේ පරිපථයේ රූප සටහන්.
මේ රූපයේ තියෙන්නේ MCU එක සහ Power supply පරිපථයයි. මෙහි තියෙන AVR IC එක program කරන්න RESET pin, VCC සහ GND කියන pin තුන මම වෙනම header එකකට සම්බන්ධ කර ගත්තා.
පසෙකින් පෙන්වා තියෙන්නේ Watch එකේ 7segment තිරය. මෙහි තියෙන BCD_A, BCD_B, BCD_C සහ BCD_D වැනි සියලුම අග්ර උඩ තියෙන පරිපථය හා සම්බන්ධ වෙනවා. අපිට ඕනේ ඉලක්කමක් පෙන්වන්න කරන්න තියෙන්නේ BCD code එක දීලා ON වෙන්න ඕනේ CD4511 IC එකේ LE pin එක HIGH කරන්න එක. වේගයෙන් මේ දේ කලොත් ඉල්ලක්ම් හතරම අපේ ඇසට පෙන්නෙන විදිහට හදාගන්න පුළුවන්.
Firmware එක නිර්මාණය කිරීම.
දැන් අපට කරන්න ඉතුරු වෙලා තියෙන්නේ අපේ digital watch එකේ firmware එක ලියන්න. එකට මුලින් ම කරන්න ඕනෑ දේ තමයි අලුත් Project එකක් හදා ගන්න එක. එකත් එක්කම අපේ MCU එකේ clock source එක සකසා ගන්නත් ඕනෑ. Clock source එක හරියට අපේ හදවත වගේ, හදවත නැතුව අපිට ජීවත් වෙන්න නොහැකි සේම MCU එකට clock source එකක් නැවතුව වැඩ කරන්න බෑ. සාමාන්යයෙන් clock source එකක් විදිහට භාවිතා වෙන්නේ crystal එකක්. නමුත් අලුත් AVR IC එක ඇතුලේම clock source කීපයක් ම තියෙනවා. අවශ්ය clock source එක තෝරා ගන්න එක විතරයි අපි කරන්න ඕනෑ. අපේ මේ project එකට ඇතුළේ තියෙන 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 කියන එක තමයි. මේක අමතක කරන්න එපා!
මෙතැනින් ඉස්සරහට යන්න කලින් TCA වල තියෙන Base Counter එක ඔයාලා දැන ගන්න ඕනෑ.
Counter එකක් කියන්නේ සාමාන්ය register එකක්. එහි තියෙන විශේෂත්වය තමයි ලැබෙන clock pulses සියල්ල CPU එක නැතිව ස්වාධීනව ගණන් කරන්න පුළුවන්කම. 0 පටන් ගෙන තමා සාමාන්යයෙන් ගණන් කර ගෙන යන්නේ. Register එකක් නිසා මෙයාට ගණන් කරන්න පුළුවන් සීමාවක් තියෙනවා. එම සීමාව තීරණය වෙන්නේ register එකේ තියෙන bit ගණනෙන්. උදාහරණයක් විදිහට මම 2 bit counter එකක් ගෙන පෙන්වන්නම්.
ආරම්භය:
රූපයේ තියෙන 2bit register එකේ ආරම්භක අගය 0 කියලා හිතාගෙන ගණන් කරන්න පටන් ගමු. තත්පරයකට එක ගණනේ (1Hz) වලින් clock pulse එනවා කියලත් උපකල්පනය කරමු.
තත්පරයකට පසු:
අපට පළමු clock signal එක ආවා. අපේ counter එකේ අගය එකකින් වැඩි වෙනවා. දැන් අගය 1යි (දෙකේ පාදෙන් 0012).
තත්පර 2කට පසු:
ඊළඟ clock signal එකත් ආවා. Counter එක නැවතත් එකකින් වැඩි වෙනවා. දැන් අගය 2යි (දෙකේ පාදෙන් 0102).
තත්පර 3කට පසු:
ඊළඟ clock signal එකත් ආවා. Counter එක නැවතත් එකකින් වැඩි වෙනවා. දැන් අගය 3යි (දෙකේ පාදෙන් 0112). 2bit register එකට save කරන්න පුළුවන් උපරිම අගයේ තමයි අපි දැන් ඉන්නේ.
තත්පර 4කට පසු:
ඊළඟ clock signal එකත් ආවා. Counter එක නැවතත් එකකින් වැඩි වෙනවා. දැන් අගය 4යි (දෙකේ පාදෙන් 1002). මෙතන පොඩි ප්රශ්නයක් වෙනවා මොකද අපේ counter එකට 4 කියන අගය save කරන්න බැරි නිසා උතුරලා (Overflow) යනවා. ඒ කියන්නේ counter එක 0 වෙලා වැඩිපුර bit එක ඉවතට යනවා. මෙන්න මේ overflow signal එක තමා අපේ interrupt signal එක. මෙහෙම දිගටම වෙන නිසා හැම තත්පර 4කට වාරයක් ම interrupt එක එනවා.
හරිම සරලයි නේද? 2bit counter එකක් overflow වෙන්න 4 වාරයක් clock signal එන්න ඕනෑ වගේ 3bit counter එකක් overflow වෙන්න 8 වාරයක් ඕනෑ. මේක අපිට සරල සමීකරණයකින් පෙන්වන්න පුළුවන්,
2 bit counter එකක් overflow වෙන්න අවශ්ය clock ගණන = 4 = 22
3 bit counter එකක් overflow වෙන්න අවශ්ය clock ගණන = 8 = 23
එම නිසා,
TCA වල තියෙන්නේ 16bit counter එකක් නිසා එයට 216 ( = 65536) clock pulses ප්රමාණයක් overflow වෙන්න කලින් ගණන් කරන්න පුළුවන්. පහත දැක්වෙන රූපයේ තියෙන්නේ TCA වල Base Counter එකේ සම්පුර්ණ ආකෘතිය.
මෙහි ඇති CNT කියන 16bit counter register එක තමා දිගටම ගණන් කරන්නේ. සාමාන්යයෙන් counter එකේ bit size එක අපිට ඕනෑ විදිහට වෙනස් කරන්න බෑ. උදාහරණයක් විදිහට 8bit එකක් 16bit කරන්න හෝ 16bit එකක් 10bit කරන්නත් බෑ. නමුත් වාසනාවට TCA එක ගොඩක් දියුණුයි! එනිසා ඕනෑ නම් අපිට පුළුවන් TCA එකේ දිග 16bit වලට වඩා අඩු එකක් විදිහට (උදා: 10bit, 7bit හෝ 5bit) වැඩ කරන්න සකසන්න. හැබැයි 16bit වලට වඩා වැඩි කරන්න නම් බෑ. මෙතැන දී කරන්නේ bit අයින් කරන එක නෙවෙයි overflow වෙන්න උපරිම අගය(TOP) set කරන එක. ඒකට තමා PER කියන period register එක තියෙන්නේ. PER register එකට PERB කියලා buffer එකකුත් තියෙනවා (Buffering ගැන පස්සේ ඉගෙන ගමු). CTRLA (control A) , EVCTRL(Event Control) තියෙන්නේ,
- Enable/Disable කරන්න.
- Count වෙන වේගය පාලනය කරන්න.
- Interrupt settings හදන්න.
වාගේ දේවල් වලට. මම හිතනවා දැන් ඔයාලාට Base Counter එක ගැන හොඳ අදහසක් තියෙනවා කියලා. මිට අමතරව Timer එක්ක වැඩ කරද්දී නිතර භාවිතා වන පහත තියෙන වචන ටික ඔයාලා දැන ගන්න එක ප්රයෝජනවත් වෙයි.
අපිට අවශ්ය කරන්න පළමු දේ තමයි හරියට තත්පරයක් ගණන් කරගන්න එක. ඒ කියන්නේ තත්පරයකට සැරයක් Overlow එකක් එන්න TCA එක සකසා ගන්න එක. ඒ සඳහා 5 ශිෂ්යත්වයේ ගණන් ටිකක් තියෙනවා. අපේ CPU clock එක 2MHz නිසා අපිට 0.5us ( t = 1/f ) වාරයක් clock pulse ලැබෙනවා. 16bit තියෙන නිසා overflow එකක් වෙන්න යන කාලය පහත විදිහට ගණන් කරමු,
clock pulse 1ක් ගණන් කරන්න යන කාලය = 0.5us
ගණන් කරන්න පුළුවන් මුළු clock pulse ගණන = 216 = 65536
සියලු clock pulses ගණන් කරන්න යන මුළු කාලය = 0.5us * 65536 = 32768 us = 32.768 ms
ඒ කියන්නේ අපිට overflow එකක් ගන්න 32.768 ms වෙලාවක් ඉන්න ඕනෑ. නමුත් අපිට ඕනෑ තත්පරයකට සැරයක් overflow කර ගන්න. ඒ කියන්නේ එක්කෝ අපිට 16bit වලට වඩා ලොකු counter එකක් ඕනෑ, නැතිනම් clock pulse වල වේගය අඩු කරන්න ඕනෑ. Counter එකේ bit ගාන වැඩි කරන්න බැරි නිසා ඉතුරු වෙන්නේ clock speed එක අඩු කරන එක. ඒ සඳහා අපිට TCA වල Prescale එක පාවිච්චි කරන්න පුළුවන්. Prescale එකෙන් කරන්නේ එයට ලැබෙන clock pulses වල වේගය බෙදලා අඩු වේගයකින් counter එකට දෙන එක. අපි උදාහරණ කීපයක් අරන් බලමු වෙන්නේ කුමක්ද කියලා.
- Prescale වල අගය 2නම් , clock speed එක 2න් බෙදලා තමා එලියට දෙන්නේ. ඒ නිසා 2MHz/2 = 1MHz clock එකක් ලැබෙනවා. එවිට අපිට 32.768 ms*2 = 65.536 ms overflow එකක් ගන්න පුළුවන්.
- Prescale වල අගය 8ක් නම්, clock speed එක 8න් බෙදලා තමා එලියට දෙන්නේ. ඒ නිසා 2MHz/8 = 0.25MHz clock එකක් ලැබෙනවා. එවිට 32.768 ms*8 = 262.144 ms overflow එකක් ගන්න පුළුවන්.
- Prescale වල අගය 1024ක් නම්, clock speed එක 1024න් බෙදලා තමා එලියට දෙන්නේ. ඒ නිසා 2MHz/1024 = 1.953125kHz clock එකක් ලැබෙනවා. එවිට 32.768 ms*1024 = 33.554432 s overflow එකක් ගන්න පුළුවන්.
Prescale අගය 64 කලහොත් overflow period එක වෙන්නේ 32.768ms*64 = 2.097152 s. මේ අගය 1s වලට ගොඩක් දුරට අසන්න නිසා අපි මේ prescale අගය තෝරා ගමු. දැන් තියෙන්නේ හරියට තත්පරයක් වෙන්න adjustment එකක් කරන එක. ඒ සඳහා අපට කරන්න පුළුවන් දේ තමයි counter එකේ TOP එක පොඩි කරන එක, වෙන විදිහකින් කිව්වොත් bit 16 පිරෙන්න කලින් overflow එකක් හදා ගන්න එක. එකට තමා PER register එක තියෙන්නේ. PER register එකෙන් කරන්නේ Counter එකේ උපරිම අගය(TOP) පෙන්වන එක. සාමානයෙන් උපරිම අගය වෙන්නේ 65535 (= 216 – 1). නමුත් PER register එකට අපි අගයක් ලබා දුන්නොත් counter එකේ TOP එක අලුත් අගයට සමාන වෙනවා. මේ නිසා අපි අලුත් PER අගයක් සොයගමු.
Prescale එක 64ක් නම් clock pulse එකක් ගණන් කරන්න යන කාලය = (1/2MHz) * 64 = 32us
1s කාලයක් ගත වෙන්න ගණන් කරන්න ඕනෑ pulse ගණන = 1s/32us = 1000000us/32us = 31,250
මේ නිසා PER = 31,250 ( =0x7A1216) නම් හරියටම තත්පරයකට overflow එක ගන්න පුළුවන්. හරි දැන් නම් ගණන් ටික ඔක්කොම ඉවරයි. දැන් Timer සකසන්න ඕනෑ code එක ලියලා පෙන්වන්ම්. ඔයාත් එක ලියා ගෙන compile කරලා බලන්න. කිසි වැරද්දක් නැතිනම් errors නොමැතිව compile වෙන්න ඕනෑ.
Code එකේ දී මුලින් ම කරන්නේ TCA එකේ PER register එකට අලුත් TOP එකක් ලියන එක. ඊළඟට TCA වල CTRLA වලට prescale එක 64ක් වෙන්න (CLKSEL[2:0]) වල අගය සහ enable bit (ENABLE) එකයි set කරනවා ( Bit settings ගැන දැන ගන්න ඔබට datasheet එකේ විස්තර ටික බලන්න වෙනවා). දැන් අපේ Timer එක වැඩ කරනවා. ඊට පස්සේ කරන්නේ TCA වල overflow interrupts enable කරන එක. මොකද අපිට ගෙවෙන හැම තත්පරයක්ම variable එකකට ගණන් කරගන්න ඕනේ. එකට TCA එකේ INTCTRL(interrupt control) register එකේ OVF bit එක “1” කරනවා. ඉන්පසු Global interrupts එක sei() function එකෙන් enable කරනවා. මේ වෙද්දී ඔක්කොම TCA වල settings ටික කරලා ඉවරයි.
ඉතුරු වෙලා තියෙන්නේ timer overflow උනාම වෙන්න ඕනෑ code එක ලියන්න. ඒ කියන්නේ අපේ ISR function එක ලියන එක. එකට කරන්න ඕනේ ISR function එකට TCA0_OVF_vect කියන overflow interrupt vector pointer එක set කරන එක. (Interrupt පාඩමෙන් vector pointers කියන්නේ මොනාද කියල ඉගෙනගන්න). මෙතැනදී දැන ගන්න ඕනේ වැදගත් කරුණුක් තියෙනවා,
- ඒ ISR එකට ගියපු විගසම TCA වල INTFLAG කියන register එකේ තියෙන OVF FLAG bit එකට “1” ලියලා එය මකන එක. මිට හේතුව ISR එක run වුන ගමන් මෙය auto clear නො වීමයි. ඒසේ නොකලොත් ISR එක එක දිගට run වෙනවා.
දැන් ඉතින් timer එකේ වැඩ ටිකනම් ඉවරයි. ඉතුරු වෙලා තියෙන්නේ watch එකේ button දෙකයි 7-segment display එක පාලනය කරගන්න එක. ඒ ටිකත් ඉවර කරපු code එකේ source එක තමා පහත තියෙන GitHub link එකේ තියෙන්නේ.
වැදගත්:
ඔයාලට සමහරක් විදිහට note වෙන්න ඇති TCA0.SINGLE කියලා හැම තැනම ලියලා තියෙනවා. ඊට හේතුව TCA තියෙනවා SINGLE mode, SPLIT mode කියලා වැඩ කරන විදි දෙකක්. SINGLE එකේදී වෙන්නේ TCA තනි 16bit counter එකක් විදිහට වැඩ කරන එක. SPLIT mode එකේදී වෙන්නේ 8bit counter දෙකක් විදිහට වැඩ කරන එක. අපි ඊලග පාඩමෙන් SPLIT mode එක ඉගෙන ගමු.
දැන් අපි අපේ code එක IC එකට program කරලා run කරලා බලමු.
thanks for these lessons sir
You are welcome