Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Jumat, 17 September 2021

Lanjutan Praktek Dasar Input / Output - 7 Segmen Serta Penjelasan Blocking Delay

 



7-segmen Display , atau indikator tujuh-segmen, adalah suatu bentuk perangkat tampilan elektronik untuk menampilkan angka desimal. 7-segmen display yang banyak digunakan dalam jam digital, meter elektronik, dan perangkat elektronik lainnya untuk menampilkan informasi numerik. Pada umumnya 7 segmen merupakan kumpulan Led yang disusun sehingga terbentuk rangkaian yg dapat dipilih secara elektronik untuk menampilkan suatu digit desimal.



Dalam penjelasan praktek kali ini kita akan menggunakan 7 segmen komon anoda / positif dengan susunan rangkaian yang saya pakai masih menyambung dari praktek sebelumnya.




Untuk menampilkan angka digit 0 - 9 saat terjadi penekanan tombol, pola pikir yang digunakan sesuai dengan flowchart berikut ini :





Penjelasan:

  • Input tetap berupa tombol, posisi di PIN B#1.
  • 7 segmen dihubungkan pada output PORT D#0 sampai D#6.
  • Tiap segmen dihubungkan dengan kondisi nyala mati sedemikian rupa sehingga menampilkan digit angka 0,1,2,3,4,5,6,7,8,9 .
  • Tiap digit desimal segmen di masukkan kedalam Array Segmen[10] yang isinya susunan segmen penyusun digit dan kemudian ditampilkan sesuai variabel angka.
  • Ketika ada penekanan tombol maka variabel angka akan increment / nambah sampai kondisi angka >9 di reset kembali menjadi 0.


Scriptnya seperti berikut 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



//susunan segmen dari portD = GFEDCBA
//7 segmen common ANODA


uint8_t segmen[10]= {0b1000000, // 0
		     0b1111001, // 1
		     0b0100100, // 2
		     0b0110000, // 3
		     0b0011001, // 4
		     0b0010010, // 5
		     0b0000010, // 6
		     0b1111000, // 7
		     0b0000000, // 8
		     0b0010000}; // 9
int main(void)
{
   
   DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ; // 7 seg
   DDRB &= ~(1<<PB1);  //tombol
   
   uint8_t a =0;
   
    while (1) 
    {
		
		
		if(bit_is_set(PINB,PINB1)) { 
		      a++;	
		      if(a==10) a=0;
		      _delay_ms(300);
		    }
		
       PORTD = segmen[a]; //Tampilkan segmen
    }      }

Penjelasan :

  • Hal yang mungkin cukup spesial adalah array segmen[10] dengan 10 buah anggota, yang merupakan susunan segmen yang jumlahnya 7, sehingga sedemikian rupa untuk menampilkan digit 6, maka PORT D#0, D#2, D#3, D#4, D#5, D#6 diberikan logika 0 (ingat komonnya anoda /positif) sehingga segmen ini menyala. Sedangkan PORT D#1 diberikan logika HIGH (5 volt ) alias sama dengan commonnya dan menyebabkan LED segmennya mati.




  • Saat ada penekanan tombol pada PIN B#1 maka variabel angka akan berubah dan PORTD nilainya diubah sesuai angka binary yang diwakilkan oleh array segmen[angka], yang artinya jika angka bernilai 6, maka PORTD bernilai 0b0000010.  


Bagaimana jika saya ingin membuat perubahan digit berjarak 1 detik ? Kita akan bandingkan 2 tipe, yaitu dengan Blocking Delay serta dengan Timer Register.


BLOCKING DELAY

#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



//susunan segmen dari portD = GFEDCBA
//7 segmen common ANODA


uint8_t segmen[10]= {0b1000000, // 0
		     0b1111001, // 1
		     0b0100100, // 2
		     0b0110000, // 3
		     0b0011001, // 4
		     0b0010010, // 5
		     0b0000010, // 6
		     0b1111000, // 7
		     0b0000000, // 8
		     0b0010000}; // 9

int main(void)
{
   
   DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ;
   DDRB |= (1<<PB0); //led
   DDRB &= ~(1<<PB1);  //tombol
   
   uint8_t angka;
   
    while (1) 
    {
		
		
		for(angka=0 ; angka<10 ; angka++){
			
	                 PORTD=segmen[angka];
			_delay_ms(1000);
		}
		
		if(bit_is_set(PINB,PINB1)) PORTB |=(1<<PB0);
		else PORTB &= ~(1<<PB0);
		
		
    }
}

Penjelasan :

  • Loop for(angka=0 ; angka<10 ; angka++)  merupakan cara untuk melakukan pengulangan dan penambahan variabel angka secara satu persatu dari 0 sampai nilai maksimum 9. 
  • Delay 1000 mili second diberikan setiap loop for dan ini merupakan blocking delay atau menghentikan semua jalannya program mikrokontroller selama 1 detik.
  • Perintah dibawah loop For merupakan proses menunggu penekanan tombol dan perubahan LED pada Port B#0, dan karena terjadi blocking delay, maka penekanan tombol kadang tidak terbaca seperti animasi berikut.


 

  • Untuk mengatasi blocking delay maka dapat memanfaatkan fasilitas timer pada microcontroller.


Non Blocking Delay Menggunakan Timer



#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
#include <avr/interrupt.h> // library interupt timer



//susunan segmen dari portD = GFEDCBA
//7 segmen common ANODA


uint8_t segmen[10]= {0b1000000, // 0
		     0b1111001, // 1
		     0b0100100, // 2
		     0b0110000, // 3
		     0b0011001, // 4
		     0b0010010, // 5
		     0b0000010, // 6
		     0b1111000, // 7
		     0b0000000, // 8
		     0b0010000}; // 9

uint8_t angka=0;


ISR(TIMER1_COMPA_vect) // interupt jalan independen tiap selang 1 detik

{
 PORTD = segmen[angka];
 angka++;
 if(angka==10) angka=0;

}


int main(void)
{
   
   DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ;
   DDRB |= (1<<PB0);
   DDRB &= ~(1<<PB1);  
   
      TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
      TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
      OCR1A  = 15625; //compare the CTC A for 1 second
      TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64
   
    sei();  //mulai membaca interupt
    while (1) 
    {
		//penekanan tombol
		
		if(bit_is_set(PINB,PINB1)) PORTB |=(1<<PB0);
		else PORTB &= ~(1<<PB0);
	
		
    }
}


   

Penjelasan :

  • Mikrokontroler memiliki fasilitas counter & timer internal, dan akan berjalan secara independen.
  • Tiap tick/clock akan diatur sedemikian rupa sehingga counter didalamnya dapat melakukan delay sesuai nilai yang ditentukan, semisal contoh diatas tiap 1 detik atau clock counter 15625 maka akan men-trigger fungsi interupt  ISR(TIMER1_COMPA_vect).
  • Hasilnya pada loop utama saat penekanan tombol tidak akan terpengaruh seperti pada animasi berikut ini.




Selamat Mencoba ...
Share:

0 komentar:

Posting Komentar

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (26) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (7) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (24) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) 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 (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika