Interrupts - 2
Arduino හි ඇති Interrupts යොදාගෙන වැඩ සටහන් ගොඩනැගීම
Interrupts යනු ක්ෂුද්ර
පාලක, ක්ෂුද්ර සකසන
ආදීයෙන් යුක්ත පද්ධති ගොඩ නැගීමේදී යොදාගැනෙන අත්යවශ්ය ඒකකයක් බවත්, Interrupts ක්රියාත්මක වන ආකාරය
හා ඒවා යොදාගන්නා ආකාරය පිළිබදවත් මීට පෙර පැහැදිලි කරන ලදී.ඒ අනුව මෙම කොටස
තුලින්ද පැහැදිලි කිරීමට බලාපොරොත්තු වන්නේ Arduino Uno පරිපථ පුවරුව යොදාගෙන Interrupts යොදාගන්නා ආකාරය
පිළිබදව විමසා බැලීමයි.
Arduino Uno පරිපථ පුවරුවේ ද යොදාගනු ලබන්නේ AVR මයික්රොකොන්ට්රෝලරයක් වන ATmega168P මයික්රොකොන්ට්රෝලරය වේ.එම නිසා පෙරදී මයික්රොකොන්ට්රෝලර වල යොදාගැනෙන Interrupts පිළිබදව විස්තර කරන ලද සියලු කාරනා Arduino සදහාද අදාල වන අතර මෙම කොටස තුලින් තවදුරටත් 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 එක වෙත දැනුම් දීම සිදු කල යුතුය.
Volatile variables
යම් විචල්යයක් Interrupt එකක් තුල පමණක් වෙනස් කරන්නේ නම්, එම විචල්යය අස්ථාවර ලෙස ප්රකාශ කළ යුතුය.ඒ සදහා Volatile නම් keyword එක යොදාගනු ලබයි.මෙය compiler එකට ලබා දෙන විධානයකි.මෙසේ කිරීමට හේතු වන්නේ, compiler එක විසින් විචල්ය ප්රකාශයක් දුටුවද, විචල්යය කේතයේ කොතැනකවත් භාවිතා නොකෙරේ නම් (බාධා කිරීම් හැර), එය එම විචල්යය compile කිරීමේදී නොසලකා හරිනු ලබයි.එම නිසා Interrupt මගින් පමණක් වෙනස්වන variables නම් කිරීමේදී Volatile keyword එක යොදාගෙන එය compiler එක වෙත දැනුම් දීම සිදු කල යුතුය.