අපි අද කතා කරන්න යන්නේ registers ගැන. ඕනෑම CPU එකක තියෙනවා registers. මේ register එකක් කියන්නේ මතකයක් එහෙමත් නැත්නම් memory එකක්. ඒ වගේම මේ එක එක registers වලට විශේෂ රාජකාරී පැවරිලා තියෙනවා. අපි කතාකරන ATmega328 එහෙමත් නැත්නම් Arduino UNO/Nano board වල තියෙන microcontroller එකේ අපිට පාලනය කරන්න පුලුවන් මේවගේ registers එහෙමත් නැත්නම් General purpose registers 32 ක තියෙනවා.
මේ registers වලින් වැඩ ගන්න හැටි ඉගෙන ගන්න කලින් මේ registers හැදිලා තියෙන්නේ කොහොමද කියලා දැනගෙන ඉන්න එක වැදගත්.
Register එකක් හැදිලා තියෙන්නේ කොහොමද ?
කලිනුත් කිව්වා වගේ register කියන්නේ memory එකක්. ඒ කියන්නේ මේකේ data store කරලා තියෙනවා. data කියන්නේ 1 සහ 0. ඒ අනුව බලන කොට memory එකක්දී වෙන්නේ මේ 1/0 කියන data අපේ අවශ්යතාව store කිරීමයි.
දැන් අපි බලමු single bit එකක් මේ memory එකේ store කරන්නේ කොහොමද කියලා.
ඉහලින් තියෙන Logic circuit එක සලකන්න. මෙතනදී OR gate එකේ output එක සම්බන්ධ කරලා තියෙනවා එම OR gate එකේම B input එකට.
- ආරම්භයේදී OR gate එකේ input දෙකම 0 අවස්ථාවෙ තියෙනවා කියල සලකන්න.
- දැන් අපි A input එකට 1 ඇතුලු කරමු. (A=1 සහ B=0)
- ඒ අනුව output එකත් 1 වෙනවා.
- output එක 1 වෙනවත් සමගම B input එකත් 1 වෙනවා.
- දැන් අපි අයෙමත් A input එක 0 කරමු. දැන් A=0 සහ B=1 අවස්ථාව.
- මෙතනදී B=1 නිසා A වලට මොන විදිහක බලපෑමක් කලත් output එක වෙනස් නොවී පවතිනවා.
- ඒ කියන්නේ අපි කලින් කරපු වෙනස් කම, A=1 කිරිම්ම තවදුරට logic circuit එකේ සේව් වෙලා තියෙනවා.
- නමුත් මෙතනදී තියෙන අවාසිය තමා එක් වරක් A=1 කරාට පස්සේ නැවත output එක 0 කරන්න බෑ.
දැන් අපි බලමු ඉහල logic circuit එකම AND gate එක යොදාගෙන නිර්මාණය කරලා.
- ආරම්භයේදී AND gate එකේ input දෙකම 1 අවස්ථාවෙ තියෙනවා කියල සලකන්න.
- දැන් අපි A input එකට 0 ඇතුලු කරමු. (A=0සහ B=1)
- ඒ අනුව output එකත් 0 වෙනවා.
- output එක 0 වෙනවත් සමගම B input එකත් 0 වෙනවා.
- දැන් අපි අයෙමත් A input එක 1 කරමු. දැන් A=1 සහ B=0 අවස්ථාව.
- මෙතනදී B=0 නිසා A වලට මොන විදිහක බලපෑමක් කලත් output එක වෙනස් නොවී පවතිනවා.
- ඒ කියන්නේ අපි කලින් කරපු වෙනස් කම, A=0 කිරිම්ම තවදුරට logic circuit එකේ සේව් වෙලා තියෙනවා.
මේ logic circuit දේකේම තියෙන අවාසිය තමා එක වරක් සිදුකරන ලද වෙනස් කමක් circuit එක තුල දිගටම save වෙලා තිබීම. ඒ කියන්නේ එක් වරක් save කරාට පසුව නැවත update කරන්න බෑ.
මේ හේතුව නිසා මේ logic circuit 2 කම එකතු කරලා වෙනත් circuit එකක් හදලා මේ අපහසුතාව මග ඇරගන්න පුලුවන් !
මේ විදිහට නිර්මාණය කරගන්න logic circuit එකකට කියනවා AND-OR Latch එකක් කියලා.
මෙතන්දී SET = 1 කිරීම මගින් OUTPUT එක 1 කරන්නත් RESET = 1 කිරීම මගින් OUTPUT එක 0 කරන්නත් පුලුවන්.
ඒ අනුව අපිට පුලුවන් අපි කැමති විදිහට single bit data එකක් store කරල තියන්න. ඒ අනුව මේක තමා single bit memory එකක මුලාකෘතිය.
මේ ක්රමයෙදී එහෙමත් නැත්නම් AND-OR Latch එකක තියෙන දුරවල කමක් තමා output එක 1 කරන්න එක input එකකුත්, output එක 0 කරන්න තව input එකකුත් භාවිතා කිරීම.
මේ අපහසුතාව මග ඇරගන්න AND-OR Latch එකම තවත් වැඩිදියුණු කරලා Gated Latch එක නිර්මාණය කරලා තියෙනවා.
Gated Latch එකේත් input දෙකක් තියෙනවා DATA input සහ Write enable වශයෙන්. මෙතනදී අපිට මොනව හරි data එකක් memory එකේ write කරන්න ඕනෙ උනාම මුල්නම් කරන්න ඕන write enable =1 කරන එක. ඊට පස්සේ අපිට ඕන data එක input කරලා. නැවත write enable = 0 කරන්න්න ඕන.
මේ විදිහට තමා single bit data එකක් අපි memory එකක් save කරන්නේ !
මේ ආකාරයට ක්රියාත්මක වෙන latch group එකකට අපි කියනවා REGISTER එකක් කියලා. ඒවගේම මේ register එකක තියෙන bit ගානට අපි කියනවා width එක කියලා.
සාමාන්යයෙන් අපි computer එකක 32-bit, 64-bit කියලා අදහස් කරන්නේ මේ register එකක් width එක.
CPU වල මූලික අවදියේදි මේ register width එක 8-bit වලින් පටන් ගෙන 64-bit දක්වා විකාශනය වෙලා තියෙනවා.
Why registers
register එකක් සාමාන්යයෙන් RAM එකකට වඩා ඉතාමත් වේගයෙන් ක්රියාකරනවා. අනිත් විශේෂ දේ තමා CPU එකේ program/task එකක් execute වීමට අදාල data තියෙන්නෙත් registers වලමයි. උදාහරණයක් විදිහට කියනවනම් ACR, IR, PCR දක්වන්න පුලුවන්.
Arduino program කරන්න register දැනුම ඕනෙ ඇයි?
Arduino කියන්නේ platform එකක්. ඒ කියෙන්නේ අපි භාවිතා කරන Arduino Mega/Nano/UNO කියන development boards වලට නෙමේ Arduino කියන්නේ. ඒවා Arduino platform එක compatible development board.
සාමාන්යයෙන් arduino board වල තියෙන්නේ Atmel microcontroller එකක්. මේ Atmel microcontroller එකක් program කරන්න තියෙන default language එක තමයි assembly/C වගේ language. ඉතින් මේ වගේ language එකක් use කරලා low level program කරන්න හොද දැනුමක් තියෙන්න ඕන. ඉතින් මේ අපහසු තාව මග ඇරගන්න තමා arduino හදුන්වා දෙන්නේ. ඒක නිසා තමා අද පොඩි ළමයෙකුට උනත් microcontroller එකක් program කරන්න ලේසි වෙලා තියෙන්නේ.
කොහොම උනත් මේ විදිහට arduino වලින් program කරන්න ගියාම අපිට වැඩ කරන්න වෙන්නේ arduino වල තියෙන සීමා මායිම් වලට යටත් වෙලා. එහෙම උනාම සමහර අවස්තා වල අපිට microcontroller එකේ තියෙන full features use කරන්නත් බැරි වෙනවා. ඒ වගේම සමහර අවස්ථාවල code එකත් අනවශ්ය විදිහට complex වෙන්න පුලුවන්.
උදාහරණයක් විදිහට කිව්වොත් හිතන්න, අපිට ඕනෙ D8-D13 තියෙන pin ටික ඔක්කොම HIGH කරන්න. අපි මේක කරන්න සාම්ප්රදායික විදිහ,
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
මේ විදිහයි නමුත් අපි register පිළිබඳ දැනුම තියෙනවනම් කලින් code line 6 කින් කරපු දේ තනි පේළියෙන් කරන්න පුලුවන් පහල තියෙන විදිහට.
PORTD |= B00111111; // sets digital pins 8,9,10,11,12,13 HIGH
දැන් ඔයාලට තේරුම් ගන්න පුලුවන් register පිළිබද දැනුම තියෙනවනම් අපේ වැඩ කොච්චර ලේසි කරගන්න පුලුවන්ද කියලා!
General purpose registers in ATmega328
සාමාන්යයෙන් CPU එකක් තුල registers කිහිපයක් තියෙනවා. මේ තියෙන registers ප්රමාණය තීරණය වෙන්නේ ඒ ඒ CPU එකේ හැකියාව මත.
ATmega328 කියන්නේ AVR microcontroller පව්ලේ 8-bit microcongtroller එකක්. ඒකියන්නේ මේ ATmega328 එකේ තියෙන CPU එකේ register එකක් width එක 8 ක්. තවත් විදිහකට කියනවනම් මේ register එකේ bit 8 ක් වෙන වෙනම store කරන්න පුලුවන්.
කලිනුත් කිව්වා වගේ ATmega328 microcontroller එකෙ Register වර්ග 32 ක් තියෙනවා. පහල තියෙන්නේ එයින් කොටසක්. atmega328 datasheet එක බැලුවොත් ඔක්කොම බලාගන්න පුලුවන්.
Register Name |
Description |
EEARH |
The EEPROM Address Register |
EEARL |
The EEPROM Address Register |
EEDR |
The EEPROM Data Register |
EECR |
The EEPROM Control Register |
GPIOR2 |
General Purpose I/O Register 2 |
GPIOR1 |
General Purpose I/O Register 1 |
GPIOR0 |
General Purpose I/O Register 0 |
OSCCAL |
Oscillator Calibration Register |
CLKPR |
Clock Prescale Register |
SMCR |
Sleep Mode Control Register |
PRR |
Power Reduction Register |
MCUCR |
MCU Control Register |
MCUSR |
MCU Status Register |
WDTCSR |
Watchdog Timer Control Register |
EICRA |
External Interrupt Control Register A |
EIMSK |
External Interrupt Mask Register |
EIFR |
External Interrupt Flag Register |
PCICR |
Pin Change Interrupt Control Register |
PCIFR |
Pin Change Interrupt Flag Register |
PCMSK2 |
Pin Change Mask Register 2 |
PCMSK1 |
Pin Change Mask Register 1 |
PCMSK0 |
Pin Change Mask Register 0 |
PORTB |
The Port B Data Register |
DDRB |
The Port B Data Direction Register |
PINB |
The Port B Input Pins Address |
PORTC |
The Port C Data Register |
DDRC |
The Port C Data Direction Register |
PINC |
The Port C Input Pins Address |
PORTD |
The Port D Data Register |
DDRD |
The Port D Data Direction Register |
PIND |
The Port D Input Pins Address |
ඊළඟ පාඩමෙන් මේ registers කොහොමද පාවිච්චි කරන්නේ කියලා බලමු !
Share කරගෙනම යන්න !!
Source : CrashCourse [Youtube Channel]