Register Microcontroller
Penjelasan Register Mikrokontroller Dasar & Progam – akan membahas apa itu register dan disertai gambar. Namun, sebelum itu, mari kita sedikit memberi batasan tentang apa saja yang akan dibahas.
Mikrokontroller dan Mikroprosessor sangat banyak jenisnya, mulai dari produsennya seperti:
- NXP
- Infineon
- Panasonic
- On Semiconductor
- Microchip
- Atmel
- STMicroelectronics
- Texas Instruments
- 3PEAK
- AIC(Analog Integrations)
- AME
- Allianc
- AnaSem
- Anachip
- Analog Devices
- Axelite TechBL(Shanghai Belling)
- Corebai Microelectronics
- DIOO
- Daily Silver Imp Microelectronics
- Diodes Incorporated
- FUJITSU
- HK
- HTC Korea TAEJIN Tech
- HX(hengjiaxing)
- Holtek Semicon
- Intersil(Renesas Electronics)
- KEC Semicon
- Kodenshi AUK
- LOWPOWER
- LRC
- MICRONE(Nanjing Micro One Elec)
- MaxLinear
- dll
- CISC
- RISC
Dari itu, akan fokus belajar register pada mikrokontroller ATMega328 saja untuk dasar-dasarnya.
A. Apa itu Register?
Register adalah sebuah wadah yang dapat menyimpan data-data biner (0 dan 1).
Untuk memberikan gambaran tentang wadah tersebut, saya ilustrasikan bahwa 1 wadah sama dengan sebuah kardus dan data adalah sebuah bola.
Perhatikan gambar berikut.
Ilustrasi Register Mikrokontroller |
1 kardus jika kita istilahkan ke dalam sistem memori adalah 1 bit.
Jika 1 kardus berisi bola, maka nilai bit adalah 1.
Jika 1 kardus tidak berisi bola, maka nilai bit adalah 0.
Pada gambar diatas, terdiri dari 8 kardus, mulai dari urutan ke 0 hingga 7. Karena jumlah kardus adalah 8, maka disebut dengan 8-bit.
8-bit adalah sama dengan 1 byte. Artinya 1 baris register berisi 1 byte.
Bila 3 bola dimasukkan ke dalam kardus urutan 1, 2 dan 5. Maka nilai binernya adalah 00100110 atau dalam nilai desimal adalah 38 hasil dari 32+4+2.
Setiap 1 Register memiliki alamat dan sering ditulis dengan angka Hexadesimal seperti 0x00, 0x1A dan sebagainya.
Didalam sebuah mikrokontroller, berisikan register-register yang banyak jumlahnya.
Setiap register terkoneksi kedalam jalur bus yang sama untuk dapat menyimpan data pada alamat tertentu.
Jika di “ilustrasikan”, register-register tersebut didalam sebuah mikrokontoller adalah seperti berikut:
Ilustrasi register didalam sebuah mikrokontroller |
Karena register dapat menyimpan data-data, maka register juga disebut dengan memori.
Register yang merupakan bagian memori khusus dari sebuah mikrokontroller tersimpan kedalam blok memori tersendiri.
Didalam ATmega328, ada 3 tipe memori atau 3 blok memori utama yaitu:
- Memori Progam (Flash)
- Memori Data (SRAM)
- Memori EEPROM
Type of memory in ATmega328 Arduino |
B. Cara Access Register Mikrokontroller
Setiap mikrokontroller pasti memiliki PIN (kaki).
Setiap pin memiliki fungsi tersendiri.
Salah satunya adalah sebagai Input dan Output (I/O).
Apa contohnya?
Contoh Input:
- Membaca
Tombol - Membaca Tegangan
- Membaca ADC
- dll
- Menghidupkan LED
- Mengeluarkan sinyal PWM
- Mengirimkan sinyal komunikasi serial, I2C
- dll
Pada lembar atmega328 datasheet, halaman 59 disebutkan, ada 3 register (dari blok I/O Register) untuk dapat memanipulasi port yaitu dengan nama DDxn, PORTxn, and PINxn. Perhatikan pada gambar berikut:
- DDxn adalah Data Direction Register. Fungsi nya untuk menentukan arah data masuk atau keluar.
- PORTxn, adalah PORT register. Fungsi nya untuk menentukan port mana yang ingin digunakan (B, C, atau D) .
- PINxn, adalah PIN register. Fungsi nya adalah menentukan pin (0, 1, 2, 3, 4, 5, 6, 7 atau 8) dari PORT tertentu yang akan digunakan.
*xn menunjukkan bahwa “x adalah nama PORT” dan “n adalah urutan bit”.
Misalnya, DDD1. Bacanya adalah Data Direct pada Port D bit ke 1.
Pembagian PORT pada PinOut ATmega328 |
Contoh pengaturan bit pada Register |
C. Contoh Program Akses I/O Port Mikrokontroller ATmega328
Sekarang mari kita praktek kan tutorial diatas.
Pertama, kita akan membuat program menghidupkan sebuah LED di pin 0 pada PORTD.
Kedua, kita akan membuat program membaca sebuah TOMBOL di pin 1 pada PORTD.
Ketiga, kita akan membuat progam yang akan menggabungkan kedua program diatas. Jadi, ketika TOMBOL ditekan, maka LED akan hidup dan sebaliknya.
1. Menghidupkan LED
Sekarang, kita sudah tahu untuk dapat membuat pin menjadi OUTPUT atau INPUT adalah dengan merubah data bits 1 atau 0.
Karena LED adalah komponen yang harus di hidupkan menggunakan tegangan dari mikrokontroller, maka kita harus atur pin ke-0 pada PORTD menjadi OUTPUT.
Caranya adalah:
>> Set biner DDRD menjadi B00000001
Kemudian, untuk dapat membuat pin mengeluarkan tegangan 5V (HIGH) yang akan menghidupkan LED, maka kita harus atur bit PORTD pada pin ke-0 menjadi bernilai 1.
>> Set biner PORTD menjadi B00000001
Untuk mengeluarkan tegangan 0V (LOW) untuk mematikan LED, maka kita harus atur bit PORTD pada pin 0 menjadi bernilai 0 lagi.
>> Set biner PORTD menjadi B00000000
Progamnya Arduino IDE:
void setup() {
DDRD = B00000001; //set pin 0 of PORTD to OUTPUT
}
void loop() {
PORTD = B00000001; // turn the LED on (5V)
delay(1000); // wait for a second
PORTD = B0000000; // turn the LED off (0V)
delay(1000); // wait for a second
}
2. Membaca Tombol
Sekarang kita akan membaca tombol pada pin 1 dari PORTD. langkah yang dilakukan adalah mengatur DDRD sebagai INPUT.
>> Set biner DDRD menjadi B00000000
Di contoh , kita tidak mengatur PORTD, karena kita akan menggunakan resistor pull-down secara eksternal.
Untuk mendapatkan nilai high atau low pada pin 1 dari PORTD, kita harus membaca agar nilai biner menjadi B00000010 dan cara membacanya adalah menambahkan perintah AND pada program seperti:
>> PIND & (1 << PIND1);
Sampai dis, kita akan mendapatkan kodisi high atau low ketika tombol ditekan atau tidak ditekan.
Namun, dis masalahny
a adalah mikrokontroller tidak memberikan logika high dengan nilai 1 atau low dengan nilai 0, melainkan dengan nilai desimal dari urutan bitnya.
- Jika pin yang digunakan adalah PIN 0, maka nilai high adalah 0.
- Jika pin yang digunakan adalah PIN 1, maka nilai high adalah 2.
- Jika pin yang digunakan adalah PIN 2, maka nilai high adalah 4.
- Jika pin yang digunakan adalah PIN 3, maka nilai high adalah 8.
- Jika pin yang digunakan adalah PIN 4, maka nilai high adalah 16.
- Jika pin yang digunakan adalah PIN 5, maka nilai high adalah 32.
- Jika pin yang digunakan adalah PIN 6, maka nilai high adalah 64.
- Jika pin yang digunakan adalah PIN 7, maka nilai high adalah 128.
Didalam program kita atau umumnya, kita hanya ingin nilai tersebut berlogika high (1) dan low (0) saja, karena dengan dua logika tersebut kita dapat dengan mudah membandingkan suatu kondisi.
Agar kondisi tersebut dapat dibaca high adalah 1 dan low adalah 0, maka kita perlu menambah operator Binary Right Shift “>>” seperti berikut:
>> (PIND & (1 << PIND1)) >> PIND1;
Penjelasan:
(PIND & (1 << PIND1)), ketika tombol di tekan akan menghasilkan nilai 2 dan PIND1 memiliki nilai 1.
Jika (00000010) >> 1, dibaca “geser tiap data per-bit ke kanan 1 langkah. Jadi nilai akhirnya adalah 00000001.
Nah, dis kita sudah mendapatkan kondisi dimana jika tombol ditekan, maka akan berlogika high dengan nilai 1 dan tombol tidak ditekan, nilai akan berlogika low dengan nilai 0.
Untuk programnya adalah sebagai berikut. Gunakan serial monitor untuk melihat data yang dihasilkan ketika tombol ditekan atau dilepas.
void setup() {
Serial.begin(9600);
DDRD = B00000000; //set pin 0 of PORTD to INPUT
}
void loop() {
uint8_t con = (PIND & (1<<PIND1)) >> PIND1;
Serial.println(con);
}
3. Membaca Tombol Untuk Menghidupkan LED
Sekarang, mari kita gabung dua program diatas. Ketika tombol ditekan, maka LED akan hidup dan ketika tombol dilepas, maka LED akan mati.
adapun programnya adalah sebagai berikut:
void setup() {
Serial.begin(9600);
DDRD = B00000001; //set pin 0 of PORTD to INPUT
}
void loop() {
uint8_t con = (PIND & (1<<PIND1)) >> PIND1;
Serial.println(con);
if (con == 1){
PORTD = B00000001;
}
else {
PORTD = B00000000;
}
}
Hasilnya adalah sebagai berikut;
Hasil Pemrograman Register Mikrokontroller Arduino |
Sekian dibuat. Jika anda merasa bermanfaat, silahkan bagikan dengan tombol share yang ada dibawah.
Sumber:
- Sparkfun (YT), Level Up Your Arduino Code: Registers
- AVR basics: reading and writing GPIO pins