Semua Akan Digital Pada Akhirnya... Dari Audio, Video, TV, Kontrol, Keuangan, Kesehatan dan Sebagainya. Blog Ini Ditujukan Buat Kamu Yang Ingin Belajar Dasar Digital Dan Yang selalu Bertanya, Kenapa Bisa Begini Dan Harus Begitu ?

Jumat, 17 September 2021

Penjelasan Proses Input Output Dan Register I/O Pada Microcontroller AVR

 



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 : 

  1. 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.
  2. R1 mutlak diperlukan sebagai pengaman LED, nilai berkisar 100 s/d 470 ohm.
  3. 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.
  4. 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


Bagaimana Flow Chart untuk menghidupkan dan mematikan ( Led Kedip)  LED di PortB#0 ?


Catatan :

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


	}
	
}

Penjelasan :

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


Lalu bagaimana jika Output LED saya tempatkan pada port 5 dan 6 ? Sebaiknya harus membaca penjelasan operasi geser byte disini : https://www.aisi555.com/2012/06/operasi-geser-byte-pada-win-avr-gcc.html. Jadi untuk melakukan blink atau kedip bergantian pada 2 buah LED secara simplenya scriptnya seperti berikut:



#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 Output
DDRB |= (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
} }


Penjelasan :

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


 
Bagaimana Flow Chart untuk menerima input pada PIN B#1 dan berinteraksi dengan LED di PORT B#0 ?




Scriptnya sederhana saja seperti berikut :


#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 Output
        DDRB &= ~(1<<PB1) ;  //Pin B#1 Input
while(1)      { if (PINB & (1 << PINB1)) PORTB |=(1 << PB0); // PB#0 Nyala else PORTB &= ~(1 << PB0); //Port B#0 Mati     }  
             }


Penjelasan :

  • 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 


Untuk berikutnya silahkan dicoba menjalankan script berikut dan perhatikan apa yg terjadi :



#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);
	


	}
	
}


Script diatas menggunakan variabel boolean   bool pencet =false;  merupakan jenis variabel yg bernilai 1 atau TRUE dan 0 atau FALSE.  Silahkan cari di google atau di blog ini pun sudah dibahas bagaimana cara men - "toogle" atau merubah kondisi dari state BIT sebelumnya dengan teknik yg lebih cepat.  


Selamat Mencoba !
Share:

0 komentar:

Posting Komentar

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (15) android (12) antares (3) arduino (21) artikel (11) attiny (3) attiny2313 (19) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (45) digital (1) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (44) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (16) komputer (3) komunikasi (1) kontrol (7) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroller (12) mikrotik (5) mqtt (1) ninmedia (3) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (78) pcb (2) power (1) praktek (2) project (33) proyek (1) python (3) radio (15) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (145) television (28) transistor (2) troubleshoot (3) tulisan (83) tutorial (80) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika