මේ පාඩමෙන් ඔයාලා ඉගෙන ගන්නේ tinyAVR-0, tinyAVR-1 සහ megaAVR-0 ඛාණ්ඩ වලට අයත් microcontroller වල තියෙන Event System (EVSYS) නමින් හඳුන්වන විශේෂ අවයවය ගැන. Event System එක නිර්මාණ කර තියෙන්නේ CPU එකේ මැදිහත් වීමක් නැතුව විවිධ අවයවන් අතර පණිවුඩ (signal) හුවමාරු කර දෙන්න. මේ නිසා EVSYS එකට පුළුවන් එක් අවයවයක් ක්‍රියාත්මක වී ලැබෙන ප්‍රථිපලය වෙනත් අවයවයක ක්‍රියාවක් පාලනය කරන්න ඍජුවම යොදාගන්න. ඒ බැවින්,

  • අවයව අතර ක්‍රියාවලිය ප්‍රමාද නොවී කරගෙන අවසන් ප්‍රතිපලය ඉතා ඉක්මන් ලබා ගන්න පුළුවන්.
  • Software එකක් හරහා (එනම් CPU එක යොදාගෙන) පාලනය කරනවාට මෙන් නොව, සමස්ත ක්‍රියාවලියට යන කාලය නිශ්චිත ලෙස මැන ගන්න හැකියාව ලැබෙනවා. ඊට හේතුව software එකක ක්‍රියාවට බාධා කරන පද්ධතියේ ඇති වෙනත් interrupts මේ EVSYS එකේ ක්‍රියාකාරිත්වයට බාධාවක් නොවීමයි.
  • අවයව කීපයක් යොදාගෙන කරන කාර්යයන් එකට synchronize (එකම වෙලාවකට හෝ එකම රිද්මයක කියන අර්ථය) කරන්න පුළුවන්. ඒ නිසා ස්වයන්ක්‍රියව අවශ්‍යය විට ක්‍රියාකරන අවයව දාමයක් නිර්මාණය කරන්න පුළුවන්.
  • අවයවයන් අතර පණිවුඩ හුවමාරු කරන්න ඔබට වෙනම code ලියන්න අවශ්‍ය නැති නිසා මුළු code ප්‍රමණය සහ සමස්ථ software එකේ සංකීර්ණ ස්වභාවය අඩු කර ගන්න පුළුවන්.

මේ වැනි කරුණු නිසා EVSYS කියන්නේ AVR microcontroller වල දැකගන්න පුළුවන් සැහෙන ප්‍රබල අංගයක්. මේ නිසා නියම ඉංජිනේරු වැඩක් කරන්න බලාපොරොත්තු වෙන කෙනෙක්ට මෙය භාවිතා කරන්න ඉගෙන ගන්න එක ඉතාම වැදගත්. Event System එකෙන් නියම ප්‍රයෝජනය ගන්න නම් එය යොදන්නේ කිනම් අවස්තාවකද යන්න ඔබ හරිහැටි තේරුම් ගන්න ඕනේ. පහත උදාහරණයේ පෙන්වා තියෙන්නේ එවැනි ප්‍රයෝගික අවස්ථාවක්. එවැනි අවස්තාවක දී අපිට ලබා දෙන්න පුළුවන් විසඳුම් දෙකක් තියෙනවා. එකක් තමා interrupt පාදක කරගත් ක්‍රමය අනික තමා EVSYS යොදා ගෙන විසඳන ක්‍රමය. ඒ දෙආකාරයටම විසඳන හැටි වෙන වෙනම පෙන්වා තිබෙනවා. ඒවා සංසන්දනය කර බැලීමෙන් EVSYS එකේ වටිනාකම තේරුම් ගන්න පුළුවන් වේවි කියා මා විශ්වාස කරනවා.

රූපයේ පෙන්වා තියෙන්නේ එකතරා ඉලෙක්ට්‍රොනික පරිපථයකින් නිපදවන analog signal එකක කාල ප්‍රස්තාරයක්. ඔබ සිතන්න මේ signal එක 1.8V ලක්ෂය පසුකර හරියටම 100us කාලයක් ගියපසු ලැබෙන voltage අගය මැනගෙන ඒ අගය serial port එක හරහා පරිගණකයකට යොමු කරන්න MCU පරිපථයක් අවශ්‍යය වෙනවා කියලා. ඒය නිර්මාණය කරන වගකීම ඔබට භාර උනොත් ඔබ කරන්නේ කුමක්ද?

අදාළ voltage අගය කියවා ගන්න Analog to Digital Converter (ADC) එක නිසැකවම භාවිතා කරන්න වෙනවා. නමුත් එම signal එකේ අගය 1.8V වලට වඩා වැඩිවෙන මොහොත ක්ෂණිකව දැනගන්න නම් අපිට ADC එක පමණක් ප්‍රමාණවත් වෙන්නේ නෑ! ඒ නිසා Analog Comparator (AC) එකත් භාවිතා කරන්න වෙන්වා. ඉන්පසු එළඹෙන 100us කාලය software delay එකක් (උද: delay_us() වැනි function එකක්) හෝ hardware timer එකක් භාවිතා කරගෙන ගණන් කරගන්න පුළුවන්. මේ සඳහා වඩාත්ම උචිත වෙන්නේ hardware timer එකක් යොදා ගැනීමයි. ඊට හේතුව hardware timer එක 100us කාලය ගණන් කරගෙන යන අතර තුර දී serial port එක හරහා කලින් ලබාගත් ADC කියවීම් තිබේනම් ඒවා ඉවතට යවන්න පුළුවන් වීමයි. Software delay එකක් භාවිතා කලොත් serial port එක හරහා දත්ත යවන්න තවත් ප්‍රමාද වෙනවා. ඒ නිසා කියවාගත් ADC අගයන් පසුවට යවන්න RAM එකේ save කරගන්න වෙනවා. මෙසේ ප්‍රමාද වෙන්න වෙන්න save කරන්න ඕනේ වෙන ADC කියවීම් ගණන වැඩි වෙලා RAM එකේ ඉඩ මදී වෙන්නත් පුළුවන්. මේ දේවල් ගැන හොඳින් හිතලා ඔබට මේ විසඳුම නිර්මාණය කරන්න පුලුවන්ද?

මේ ක්‍රමයේදී අවයව අතර ක්‍රියාකාරීත්වය ඉක්මන් කරන්න යොදාගන්නේ ඒ අවයව වලින් ලබා දෙන interrupt signal. CPU එක එම signal ලැබුන ගමන් අදාල ISR code එක run කරලා ඊළඟට වෙන්න ඕනේ දේ කරලා දෙනවා. පහත කාල ප්‍රස්ථාරයෙන් එය සිදුවෙන හැටි දැකගන්න පුළුවන්.

මේහි තියෙන ලොකුම අවාසිය වන්නේ ISR එකක් CPU එකට load වෙලා run වෙන්න යන කාලය. එය සාමාන්‍යයෙන් clock cycle 5ක් පමණ වෙනවා. නමුත් සෑම ISR එකකටම මෙය පොදු නිසා අවසාන ප්‍රථිපලය ලැබෙන්න යන මුළු කාලය ඒ සියල්ල එකතු වෙනවා. අනිත් කරුණ වෙන්නේ මේ සියලුම ISR code ලියන වගකීම අප සතු වීමයි. මේ නිසා code එක තරමක් සංකීර්ණ වෙන්න පුළුවන්.

මේ ක්‍රමයේදී අවයව අතර ක්‍රියාකාරීත්වය ඉක්මන් කරන්න යොදාගන්නේ Event System එක. AC අවයව සිය කාර්යය අවසන් කර පසු, එනම් 1.8V වලට වඩා වැඩි volt අගයක් දුටු විට ලබා දෙන interrupt signal එක CPU එකට නොයවා එය ඍජුවම Timer එකට සම්ප්‍රේෂණය කර එය ක්‍රියාත්මක කරනවා. ඒ අයුරෙන්ම Timer එකෙන් 100us කාලය ගණන් කල විට ලැබෙන overflow interrupt එක මගින් ADC එක ක්‍රියාත්මක කරනවා. අවසානයේ දී ADC එක ලබා දෙන ප්‍රතිපලය අපේ උවමනාවට භාවිතා කරන්න පුළුවන්. පහත කාල ප්‍රස්ථාරයෙන් ඒ ක්‍රියාව වෙන හැටි දැකගන්න පුළුවන්.

මේ ක්‍රමය වඩා වේගවත් කියන එක කාල ප්‍රස්තාර දෙක සංසන්දනය කර පහසුවෙන්ම තීරණය කරන්න පුළුවන්.

දැන් ඔබට අවබෝධ වෙන්න ඕනේ අද පාඩමෙ තියෙන වැදගත්කම. අපි එහෙනම් මෙතැන් පටන් මේ event system එක හැදිලා තියෙන්නේ කොහොමද එය අවයව අතර signal හුවමාරු කරන්නේ කොහොමද කියලා ඉගෙන ගමු.

මේ පාඩම මින් ඉදිරියට කරගෙන යන්න කලින් interrupts සංකල්පය සහ AVR microcontroller වල තියෙන අනිත අවයව දෙකක් හෝ වැඩි ප්‍රමාණයක් (උදා- TCA, TCB, ADC, GPIO සහ AC ආදී අවයව) භාවිතා කරන හැටි ගැන හොඳ අවබෝධයක් ඔබට තිබිය යුතුයි. ඔබට ඒ ගැන විශ්වාසයක් නැතිනම් පළමුව ඒවා හොඳ හැටි භාවිතා කරන්න ඉගෙන ගන්න. ඉන්පසු මේ පාඩම කරගෙන යන්න. නැතිනම් අමාරුවේ වැටෙනවා කිරි ගහට ඇන්නා වගේ නියතයි!

Event ගැන වැඩි දුර ඉගෙන ගමු

සාමාන්‍ය භාවිතයේදී event එකක් කියන්නේ අපි අත්දකින විශේෂ අවස්ථාවක්. එය උපන් දින උත්සවයක්, විවාහ උත්සවයක් වගේ දෙයක් වෙන්න පුළුවන්. කෙසේ නමුත් අර්ථයෙන් හැගවෙන්නේ කලින් තිබුනට වඩා යම්කසි වෙනසක් සිදුවන මොහොතක් යන්නයි. Microntroller වල උනත් event එකක් ලෙස නම් කරන්නේ එහි ඇති අවයවයක වෙන්න පුළුවන් සැලකිය යුතු අවස්ථා වෙනසක්. උදාහරණ ලෙස Timer එකක් overflow වීම, GPIO pin එකකට ලැබෙන input අගය වෙනස් වීම, ADC එකෙන් පරිවර්තනයක් සම්පූර්ණ කිරීම වැනි අවස්ථා අපිට මේ සඳහා පෙන්වන්න පුළුවන්. Event System එකෙන් කරන්නේ එක් අවයවයක සෑදෙන මේ වැනි event තවත් අවයවයක දැනුම් දෙන එක. අපි මේ පාඩමේදී event නිෂ්පාදනය කරන අවයවය හදුන්වන්නේ event generator එක නමින්. ඒවා ලබා ගන්න අවයවය නම් කරන්නේ event user නමින්. අදාල event signal එක event generator එකේ ඉඳන් event user වෙත දැනුම්දෙන මාර්ගය නම් කරන්නේ Event Routing Network එක නමින්. පහත රූපයේ දැක්වෙන්නේ මේ කොටස් තුන එකට සම්බන්ධ වී ඇති සැටි පෙන්වන කැටි සටහනක්.

Event generator එකකට event එකක් නිෂ්පාදනය කරන්න පුළුවන් ආකාර ගොඩක් තියෙන්න පුළුවන්. එය හරියට එකම පුද්ගලයෙක්ට උපන් දින, විවාහය වැනි විශේෂ අවස්ථා ගොඩක් තියෙනවා හා සමානයි. රූපයේ event generator එක ලෙස පෙන්වා ඇති Timer/Counter එකටත් overflow, compare match හෝ error වැනි විවිධාකාරයේ event සාදන්න පුළුවන්. Event සාදන මූලයන් නිසා ඒවා හදුන්වන්නේ event sources යන නමින්. මෙසේ සෑදෙන event එකක් event usersට ලැබුන විට සිදු විය යුත්තේ කුමන ආකාරයේ ක්‍රියාවක්ද යන්න අපිට තෝරා දෙන්න පුළුවන්. ඒ ක්‍රියා අපි හදුන්වන්නේ event action නමින්. පෙර පරිදිම පෙළක් අවයව වල event action එකක් හෝ වැඩි ප්‍රමාණයක් දැකගන්න පුළුවන්.

AVR වල තියෙන ඇතැම් අවයව වලට event generator සහ event user කියන දෙආකාරයකටම ක්‍රියා කරන්න පුළුවන්. උදාහරණක් ලෙස TCA, TCB වැනි Timer අවයව වලට  event නිෂ්පාදනය කරන්න හෝ ලැබෙන ඒවාට අනුව ක්‍රියා කරන්න පුළුවන්. ඔබ තෝරාගත් AVR IC එකේ ඇති අවයව වලට ඇත්තේ කුමන හැකියාවක්ද යන්න අදාළ data sheet එක පරිශීලනය කරලා දැනගන්න ඕනේ වෙන්වා. මීළඟට event generator එකකින් සෑදෙන event signal එකක් තැනක ඉදන් තව තැනකට රැගෙන යන ආකාරය දැනගන්න අවශ්‍ය වෙනවා. ඒ සඳහා පහත රූපය ඔබට පිටුවල් වෙයි.

Event System එක සමඟ වැඩ කරමු.

තවම ලියමින් පවතී.

Project 01 : EVSYS භාවිතා කරලා ________ නිර්මාණය කරන හැටි.

තවම ලියමින් පවතී.

Hardware එක නිර්මාණය කිරීම.

තවම ලියමින් පවතී.

ලියමින් පවතී

Firmware එක නිර්මාණය කිරීම.

තවම ලියමින් පවතී.

Step 01 : ATmel Studio වලින් අලුත් Project එකක් හදා ගන්න හැටි

Atmel Studio එකේ File > New > Atmel Start Project තෝරා ගන්න

Step 02 : TCA Base Counter එකේ ක්‍රියාකාරීත්වය තේරුම් ගමු

Step 03 : අපේ watch එකට ඕනේ TCA settings හොයාගමු

Step 04 : අපේ code එක IC එකට program කරලා run කරලා බලමු