electronic sinhalen

සිංහල භාෂාවෙන් විද්‍යා හා තාක්ෂණ කරුණු ලබාදෙන, SENRO-TECH යුගයේ අපූර්වතම විද්‍යා හා තාක්ෂණ ගෙව්ශණය. SENROTECH is all about connecting you to the Technologies ©Copyrighted

Thursday, March 19, 2020

Arduino සිංහලෙන් - 15


Interrupts - 2
Arduino හි ඇති Interrupts යොදාගෙන වැඩ සටහන් ගොඩනැගීම



Interrupts යනු ක්ෂුද්‍ර පාලක, ක්ෂුද්‍ර සකසන ආදීයෙන් යුක්ත පද්ධති ගොඩ නැගීමේදී යොදාගැනෙන අත්‍යවශ්‍ය ඒකකයක් බවත්, Interrupts ක්‍රියාත්මක වන ආකාරය හා ඒවා යොදාගන්නා ආකාරය පිළිබදවත් මීට පෙර පැහැදිලි කරන ලදී.ඒ අනුව මෙම කොටස තුලින්ද පැහැදිලි කිරීමට බලාපොරොත්තු වන්නේ Arduino Uno පරිපථ පුවරුව යොදාගෙන Interrupts යොදාගන්නා ආකාරය පිළිබදව විමසා බැලීමයි. 

Arduino Uno පරිපථ පුවරුවේ ද යොදාගනු ලබන්නේ AVR මයික්‍රොකොන්ට්‍රෝලරයක් වන ATmega168P මයික්‍රොකොන්ට්‍රෝලරය වේ.එම නිසා පෙරදී මයික්‍රොකොන්ට්‍රෝලර වල යොදාගැනෙන Interrupts පිළිබදව විස්තර කරන ලද සියලු කාරනා Arduino සදහාද අදාල වන අතර මෙම කොටස තුලින් තවදුරටත්  Interrupts පිළිබදව කරුනු අධ්‍යනය කර බලමු.


Arduino ද අභ්‍යන්තරව හෝ බාහිරව ඇතිවන Interrupts වලට ෂණිකව ප්‍රතිචාර දැක්වීමට ප්‍රොසෙසරයට ඉඩ සලසයි.ඒ අනුව ප්‍රධාන වැඩසටහන ක්‍රියාත්මක වන විට Interrupts එකක් ඇති වූ විට එම Interrupt එකට අදාල වැඩසටහනට ෂනිකව යොමු වී නැවත ප්‍රධාන වැඩසටහනට පැමිණේ.එනම් Interrupts එකක් ඇති වූ විට සිදු වන්නේ program memory යේ Interrupts සදහා වෙන් කර ඇති memory location එක කර ෂනිකව ගමන් කිරීමයි. (PIC16f877A මයික්‍රොකොන්ට්‍රෝලරයේ නම් 0004h වෙත ගමන් කරනු ලබයි.)

උසස් ක්‍රියාකාරිත්වයෙන් යුක්තව වැඩසටහන් කාර්යක්ෂම සිදු කර ගැනීම සදහා , Interrupts ඇති වූ විට ගමන් කිරීම සදහා memory location කිහිපයක් වෙන් කර ඇති මයික්‍රොකොන්ට්‍රෝලර නිර්මාණය කර ඇත. Arduino හී යොදාගැනෙන ATmega168 මයික්‍රොකොන්ට්‍රෝලරයද එලෙස Interrupts සදහා memory location කිහිපයක් වෙන් කර ඇති මයික්‍රොකොන්ට්‍රෝලරයකි.

පහත දැක්වෙන්නේ ATmega168 හි Interrupt  සදහා වෙන්කර ඇති memory location වේ. 


ඒ අනුව ඉහත දක්වා ඇති සක්‍රීය Interrupts එකක් සිදු වූ විට, CPU විසින්  ඇති වූ Interrupt එකට අදාල memory location එකට ෂණිකව ගමන් කරනු ලබන අතර එම ස්ථානයේ Interrupt වැඩසටහනට ගමන් කිරීමට අදාල උපදෙස් අඩංගු කරනු ලබයි. 

Arduino හී යොදාගැනෙන Interrupts  


Arduino වලද Interrupts ප්‍රධාන ආකාර දෙකකට වෙන්කර දැක්විය හැක.

1.External Interrupt
2.internal Interrupt

External Interrupt
Arduino පරිපථ පුවරුවට පිටතින් ඇති කරන බාධා කිරීමක් External Interrupt එකක් ලෙස හදුන්වන බව අප දනිමු.ඒ අනුව Arduino තුලදී ද External Interrupt එකක් ලෙස ගත හැකි ප්‍රධානම Interrupt එක වන්නේ Pin Change Interrupt එක වේ. ඒ සදහා ඩිජිටල් පින් භාවිතා කරයි. කෙසේ වෙතත්, Arduino හි පවතින සියලුම ඩිජිටල් පින් ඒ සදහා භාවිතා කළ නොහැක. ඒ අනුව  Arduino Uno තුලදී External Interrupt ලබා දීම සදහා ක්‍රියාකාරීත්වය සක්‍රීය කල හැක්කේ  පින් දෙකක් පමණි.


පහත දැක්වෙන්නේ නිර්මාණය කර ඇති ප්‍රධාන Arduino පුවරුවල External Interrupt ලබා දීම සදහා වෙන් කර ඇති  digital පින් වේ.
 
වඩා කාර්යක්ෂම වැඩසටහන් නිර්මාණය කිරීම සදහා යොදාගනු ලබන ක්‍රමය වන්නේ Interrupt මත වැඩසටහන් ගොඩ නැගීම වේ.එම නිසා අප විසින් නිර්මාණය කරන වැඩසටහන අනුව වැඩි Interrupt ප්‍රමාණයක් භාවිතා කිරීමට ඔබට අවශ්‍ය නම්,ඒ සදහා සුදුසු Arduino පුවරු යොදාගත හැක.



Arduino යොදාගෙන Interrupt සහිත වැඩසටහන් ගොඩ නැගීම පුරුදු පුහුනු වීම සදහා Arduino Uno පරිපථ පුවරුව යොදාගෙන මේ පිළිබදව සලකා බලමු.


Interrupt Service Routine (ISR)


ISR ලෙස හදුන්වනු ලබන්නේ Interrupt එකක් ඇති වූ විට ඊට අදාල වැඩසටහනට යොමු කිරීමේ ක්‍රියාවලිය වේ. Arduino හි දී Interrupt එකක් ඇති වූ විට, එම Interrupt එකට අදාල memory location එකට ෂණිකව යොමු වේ.එම memory location එක තුල ඇති වූ Interrupt එකට අදාල වැඩසටහනට ගමන් කිරීම සදහා ISR කේතයන් ලියනු ලබයි. 
 

ඒ අනුව Interrupt එකක් සිදු වූ විට, ප්‍රොසෙසරය විසින්  එකවරම memory location තුල ඇති මෙම  ISR කේතය ක්‍රියාත්මක කරනු ලබයි. එවිට සාමාන්‍ය ක්‍රියාකාරිත්වයෙන් ඉවත් වී Interrupt වැඩසටහන ක්‍රියාත්මක කර ඉන් පසු නැවත පෙර සාමාන්‍ය වැඩසටහන නවත්වපු තැන සිට ක්‍රියාත්මක කරනු ලබයි. 

External Interrupt එකකට යොමු කිරීමට අදාල ISR ලිවීම  

පහත දැක්වෙන්නේ Arduino තුලදී, Pin Change Interrupt එකක් ඇති වූ විට ඊට අදල වැඩසටහනට ගමන් කිරීමට අදාල  ISR එක ලිවීමට අදාල Arduino IDE හී නිර්මාණය කර ඇති කේතයන් වේ.



Syntax in Arduino:

attachInterrupt ( digitalPinToInterrupt (pin) , ISR, mode ) ;

digitalPinToInterrupt (pin) :- මෙහි පින් ලෙස සදහන් ස්ථානයේ Pin Change Interrupt එක ලබා දෙන පින් එක ඇතුලත් කල යුතුය. Arduino Uno තුලදී නම් මේ සදහා යොදාගත හැක්කේ 2 වන හා 3 වන පින් දෙක පමණි.

ISR :-  Interrupt එක ඇති වූ විට ක්‍රියාත්මක කල යුතු වැඩසටහනට අදාල උපදෙස්  අඩංගු Function එකේ නම මෙහි ලියනු ලබයි.

Mode :- digitalPin එකක් ගත් කල එහි තත්වය වෙනස් විය හැකි අවස්ථාවන් කිහිපයක් පවතී.ඒ අනුව පහත දැක්වෙන්නේ Interrupt එකක් ලෙස ගනු ලබන එම අවස්ථාවන් වේ.


RISING: පින් එක මත වෝල්ටීයතාවය අඩු වෝල්ටීයතාවයේ සිට වැඩි වෝල්ටීයතාවය දක්වා ගමන් කිරීම
FALLING: පින් එක මත වෝල්ටීයතාවය වැඩි වෝල්ටීයතාවයේ සිට අඩු වෝල්ටීයතාවය දක්වා ගමන් කිරීම
CHANGE: පින් එක මත වෝල්ටීයතාවය වෙනස් වීම (LOW to HIGH or HIGH to LOW)
LOW: පින් එක මත වෝල්ටීයතාවය අඩු වෝල්ටීයතාවය පෙන්වීම. 

interrupt on Arduino Uno  with an LED and a button

 



Volatile variables 


යම් විචල්‍යයක් Interrupt එකක් තුල පමණක්  වෙනස් කරන්නේ නම්, එම විචල්‍යය අස්ථාවර ලෙස ප්‍රකාශ කළ යුතුය.ඒ සදහා Volatile නම් keyword එක යොදාගනු ලබයි.මෙය compiler එකට ලබා දෙන විධානයකි.මෙසේ කිරීමට හේතු වන්නේ, compiler එක විසින්  විචල්‍ය ප්‍රකාශයක් දුටුවද, විචල්‍යය කේතයේ කොතැනකවත් භාවිතා නොකෙරේ නම් (බාධා කිරීම් හැර), එය එම විචල්‍යය compile කිරීමේදී නොසලකා හරිනු ලබයි.එම නිසා Interrupt මගින් පමණක් වෙනස්වන variables නම් කිරීමේදී Volatile keyword එක යොදාගෙන එය compiler එක වෙත දැනුම් දීම සිදු කල යුතුය.