Penjelasan Register Microcontroller Progam Dasar

Posted on

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
Dari produsen tersebut mengeluarkan mikrokontroller berbeda berdasarkan arsitekturnya. Ada 2 arsitektur yang paling umum digunakan yaitu:
  1. CISC
  2. 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.

Penjelasan Register Microcontroller Dasar dan  Progam
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:

Penjelasan Register Microcontroller Dasar dan  Progam
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
Nah, register itu ada didalam memori Data (SRAM). Perhatikan gambar berikut:
 
Penjelasan Register Microcontroller Dasar dan  Progam
Type of memory in ATmega328 Arduino
 
Karena register ada didalam blok SRAM, maka jika sumber tegangan terputus dari sumber tegangan, maka data-data yang ada didalam register akan terhapus dan  menjadi 0 kembali.
 
Mengapa terjadi? Silahkan baca perbedaan memori dis.
 

B. Cara Access Register Mikrokontroller

Karena ada 3 blok register didalam ATMega328, maka kita akan belajar cara akses ke I/O Register saja untuk akses I/O Port, karena yang akan bayak digunakan dalam projek nantinya.
 

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
Contoh Output:
  • Menghidupkan LED
  • Mengeluarkan sinyal PWM
  • Mengirimkan sinyal komunikasi serial, I2C
  • dll
 
Lalu, bagaimana caranya kita dapat meng-akses atau dengan kata lain “memanipulasi” port yang ada pada mikrokontroller sebagai input atau output?

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:

Penjelasan Register Microcontroller Dasar dan  Progam

 

 

  • 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.

Perhatikan pada gambar berikut untuk memberikan pemahaman blok dari register I/O tersebut.
 
PinOut ATmega328, Penjelasan Register Microcontroller Dasar dan  Progam
Pembagian PORT pada PinOut ATmega328
 
Untuk contoh selanjutnya, kita coba berfokus pada  PORT D saja.
 
Untuk penjelasan mengatur PORT dan arah data masuk atau keluar, perhatikan gambar berikut. Klik untuk perbesar.
 
Penjelasan Register Microcontroller Dasar dan  Progam
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;

Penjelasan Register Microcontroller Dasar dan  Progam
Hasil Pemrograman Register Mikrokontroller Arduino

Sekian dibuat. Jika anda merasa bermanfaat, silahkan bagikan dengan tombol share yang ada dibawah.

Semoga bermanfaat.
 

Sumber:

  1. Sparkfun (YT), Level Up Your Arduino Code: Registers
  2. AVR basics: reading and writing GPIO pins