Proses Input dan Output pada sebuah microcontroller dapat dipastikan melibatkan perubahan dan akses pembacaan dari REGISTER I/O . Ini tentu saja bertujuan untuk memudahkan pengaksesan dari semua Port atau Pin I/O pada microcontroller, dengan cara menautkannya secara hardware pada sebuah alamat memory tertentu. Inilah memory khusus yang dinamakan Register I/O. Perhatikan datasheet dari IC kesayangan saya dibawah ini ATTiny 2313 dimana saya mencuplik Register I/O untuk Port B.
- PORTB (0x18) : Merupakan Register untuk merubah nilai dari port B ketika berfungsi sebagai output
- DDRB (0x17) : Merupakan Register untuk merubah arah data tiap Pin pada Port B apakah akan menjadi input atau output
- PINB (0x19) : Merupakan Register untuk membaca (walau menulis bisa namun jarang) data yg didapatkan pada tiap tiap Pin B apakah bernilai 1 (5Volt) atau 0
Jadi ke 8 buah kaki yang diberi nama PORTB pada microcontroller ATTiny 2313 secara hardware terkoneksi pada 3 buah Register input output seperti gambar diatas. Perhatikan gambar rangkaian berikut ini dimana saya akan menempatkan sebuah LED pada Port B#0 dan sebuah Switch / Tombol (kalau beli di online namanya Tactile Switch) pada Port B#1
Penjelasan Rangkaian :
- Vcc terhubung ke tegangan catuan 5 Volt, untuk ATTiny 2313 bisa menggunakan catuan baterai 3 volt atau menggunakan tegangan 5volt yg didapatkan dari downloader USB ASP.
- R1 mutlak diperlukan sebagai pengaman LED, nilai berkisar 100 s/d 470 ohm.
- Switch diberikan Resistor Pull Down 10Kohm agar mendapatkan default tegangan 0 volt atau Logic LOW saat tidak ada penekanan tombol, dan ketika terjadi penekanan tombol maka PIN microcontroller yg terhubung akan tersambung dengan VCC (5 volt) dan berarti mendapatkan logic HIGH.
- AVRISP merupakan header standar menuju programmer ISP seperti yg saya jelaskan sebelumnya disini : https://www.aisi555.com/2021/08/usb-asp-isp-programmer-untuk-avr.html
Delay merupakan fungsi / routine khusus yg pada compiler atau IDE programming microcontroller yg sudah tersedia dan siap pakai. Pada intinya delay merupakan timer yg BLOCKING yang artinya menghentikan semua proses dan menunggu sampai counternya selesai sesuai nilai waktu yg diberikan. Jadi ingat delay ini sangat tidak disarankan untuk proses yang kompleks karena akan mengehentikan semua proses pada microcontroller.
Scriptnya seperti ini :
#define F_CPU 1000000UL // frekuensi clock internal 1Mhz #include <avr/io.h> // definisi library standar IO port #include <util/delay.h> // definisi include untuk delay int main(void) { DDRB=0b00000001 ; // Inisialisasi bahwa port B#0 Output while(1) { PORTB=0b1; //port B#0 = 1 atau nyala _delay_ms(1000); //delay 1 detik PORTB=0b0; //port B#0 = 0 atau mati _delay_ms(1000); //delay 1 detik } }
- Langkah pertama adalah menentukan arah data dari PORT B#0 menjadi output dengan perintah DDRB=0b00000001. Ini oleh compiler GCC akan diterjemahkan menjadi menuliskan ke alamat memory Register 0x17 dengan nilai berupa 0b00000001
- Untuk menyalakan LED di PORT B#0 maka dilakukan penulisan di alamat register PORTB (0x16) dengan nilai 0b00000001. Agar lebih menyingkat dan lebih bergaya bahasa C yg benar dapat ditulis sebagai : PORTB = 0x1.
- Untuk mematikan LED cukup memberikan nilai 0 pada PORTB .
#define F_CPU 1000000UL // frekuensi clock internal 1Mhz #include <avr/io.h> // definisi library standar IO port #include <util/delay.h> // definisi include untuk delay int main(void) {// Inisialisasi bahwa port B#5, B#6 OutputDDRB |= (1<<PB5) | (1<<PB6) ; while(1) { PORTB |=(1 << PB5) ; //port B#5 nyala PORTB &=~(1 << PB6); //Port B#6 Mati _delay_ms(1000); //delay 1 detik
PORTB |=(1 << PB6) ; //port B#6 nyala PORTB &=~(1 << PB5); //Port B#5 Mati_delay_ms(1000); //delay 1 detik} }
- Untuk melakukan SET BIT pada bit tertentu pada sebuat BYTE, maka bisa melakukan operasi geser Byte seperti contoh diatas DDRB |= (1<<PB5) | (1<<PB6) dimana nilai yg dirubah pada bit ke 5 dan ke 6 saja dengan nilai bit = 1.
- Jika susah untuk memahami, cukup dengan mengikuti polanya saja, dimana ketika ingin meng "CLEAR" ataui memberikan nilai 0 pada bit tertentu bisa menggunakan pola penulisan PORTB &= ~(1<<PB5) & ~(1<<PB6) , dimana artinya Port B#5 dan Port B#6 diberikan nilai 0 pada masing-masing bit, tanpa merubah nilai bit disebelahnya yang tidak ikut dalam proses.
#define F_CPU 1000000UL // frekuensi clock internal 1Mhz #include <avr/io.h> // definisi library standar IO port #include <util/delay.h> // definisi include untuk delay int main(void) {DDRB |= (1<<PB0) ; //Port B#0 Outputwhile(1) { if (PINB & (1 << PINB1)) PORTB |=(1 << PB0); // PB#0 Nyala else PORTB &= ~(1 << PB0); //Port B#0 Mati } }DDRB &= ~(1<<PB1) ; //Pin B#1 Input
- if (PINB & (1 << PINB1)) , script ini berarti melihat apakah PIN pada microcontroller diberikan nilai 1 atau SETBIT. Ini merupakan macro standar pada basa GCC - Winavr, yang kemudian disempurnakan lagi menjadi : bit_is_set(PINB, PINB1) untuk nilai logic 1 dan bit_is_clear(PINB, PINB1) untuk nilai logic 0.
- Kita tidak perlu dipusingkan dengan proses pembacaan pada Register dengan alamat 0x16, ini sudah dipermudah dengan bahasa GCC-Winavr yg sudah menterjemahkan semua nama Mnemonic menjadi alamat registernya.
- Ingat pada bahasa GCC WINAVR , istilah PORT untuk output, sedangkan PIN untuk input
#define F_CPU 1000000UL // frekuensi clock internal #include <avr/io.h> // definisi standar io port #include <util/delay.h> // definisi include untuk delay int main(void) { DDRB |= (1<<PB0) ; //Port B#0 Output DDRB &= ~(1<<PB1) ; //Pin B#1 Input bool pencet =false; while(1) { if (bit_is_set(PINB,PINB1) ) { if(pencet == false) pencet = true; else pencet = false; _delay_ms(200); } if(pencet == true) PORTB |= (1<<PB0); else PORTB &= ~(1<<PB0); } }
0 komentar:
Posting Komentar