Kamis, 28 Desember 2017

Serial

Interface Serial Communication

PIC 16F877A


1. Tujuan [Kembali]


Mempelajari bagaimana cara menggunakan modul komunikasi serial pada PIC 16F877A

2. Alat [Kembali]

2.1 Mikrokontroler PIC16F877A.

2.2 LCD

2.3 Virtual Terminal




3. Teori [Kembali]

3.1. Pengertian Mikrokontroler PIC 16F877A

PIC yang merupakan produk dari Microchip Technology, merupakan kepanjangan dari Peripheral Interface Controller memiliki arsitektur Harvard dan merupakan jenis RISC (Reduced Instruction Set Computing). Salah satu jenis mikrokontroler ini adalah PIC16F877A.

3.1.1 Fitur-Fitur PIC16F877A.

a. Memiliki Instruksi sebanyak 35 buah.
b. Masing-masing instruksi dieksekusi dalam satu siklus mesin kecuali untuk instruksi percabangan yaitu dua siklus.
c. Kecepatan operasi masukan clock dari DC hingga 20MHz.
d. Kapasitas memori program berukuran 8k x 14 words.
e. Kapasitas RAM 268 byte.
f. Kapasitas memory EEPROM berukuran 256 byte.

3.1.2 Pin Out PIC16F877A.

-Memiliki 5 PORT I/O (PORTA 6 pin, PORTB 8 pin, PORTC 8 pin, PORTD 8 pin, PORTE 3 pin).
-Memiliki 3 buat timer
-Memiliki 2 buah keluaran PWM.
-Komunikasi serial singkron menggunakan SPI dan I2C.
-Komunikasi USART.

3.1.3 Pemograman PIC16F877A.


Pemograman PIC ini diprogram menggunakan bahasa C dan dapat menggunakan kompiler MikroC for PIC yang dapat didownload di situs resminya.

3.1.4 Rangkaian Dasar Sistem Mikrokontroler PIC16F877A.

Rangkaian crystal sebagai clock atau oscilator eksternal sebagai jantung untuk memberikan kecepatan eksekusi dari mikrokontroler tersebut.

3.2. Pengertian LCD

Untuk Teori tentang LCD dapat dipahami pada Postingan tentang Interface LCD Menggunakan PIC16F877A.

3.3. Komunikasi Serial Teori Dasar

Komunikasi serial adalah komunikasi yang pengiriman datanya per-bit secara berurutan dan bergantian. Komunikasi ini mempunyai suatu kelebihan yaitu hanya membutuhkan satu jalur dan kabel yang sedikit dibandingkan dengan komunikasi paralel. Pada prinsipnya komunikasi serial merupakan komunikasi dimana pengiriman data dilakukan per bit sehingga lebih lambat dibandingkan komunikasi parallel, atau dengan kata lain komunikasi serial merupakan salah satu metode komunikasi data di mana hanya satu bit data yang dikirimkan melalui seuntai kabel pada suatu waktu tertentu. Pada dasarnya komunikasi serial adalah kasus khusus komunikasi paralel dengan nilai n = 1, atau dengan kata lain adalah suatu bentuk komunikasi paralel dengan jumlah kabel hanya satu dan hanya mengirimkan satu bit data secara simultan.Hal ini dapat disandingkan dengan komunikasi paralel yang sesungguhnya di mana n-bit data dikirimkan bersamaan, dengan nilai umumnya 8 ≤ n ≤ 128.

Komunikasi serial ada dua macam, asynchronous serial dan synchronous serial. Synchronous serial adalah komunikasi dimana hanya ada satu pihak (pengirim atau penerima) yang menghasilkan clock dan mengirimkan clock tersebut bersama-sama dengan data. Contoh pengunaan synchronous serial terdapat pada transmisi data keyboard. Asynchronous serial adalah komunikasi dimana kedua pihak (pengirim dan penerima) masing-masing menghasilkan clock namun hanya data yang ditransmisikan, tanpa clock. Agar data yang dikirim sama dengan data yang diterima, maka kedua frekuensi clock harus sama dan harus terdapat sinkronisasi. Setelah adanya sinkronisasi, pengirim akan mengirimkan datanya sesuai dengan frekuensi clock pengirim dan penerima akan membaca data sesuai dengan frekuensi clock penerima. Contoh penggunaan asynchronous serial adalah pada Universal Asynchronous Receiver Transmitter (UART) yang digunakan pada serial port (COM) komputer.


3.3. Komunikasi Serial PIC 16F877A

PIC 16F877A dilengkapi dengan USART inbuilt yang dapat digunakan untuk komunikasi Synchronous / Asynchronous. Untuk mengaktifkan modul UART pada PIC ini, register yang berperan adalah ,

Konfigurasi bit-bit yang terdapat pada Register TXSTA,


Fungsi masing- masing bit pada register ini adalah,

CSRC: Sumber Clock

TX9: Transmit 9 bit
1 = Memilih transmisi 9 bit
0 = Memilih transmisi 8-bit

TXEN: Transmit Enable bit
1 = Transmit diaktifkan
0 = Transmit dinonaktifkan

SYNC: USART Mode
1 = Modus sinkron
0 = Mode asynchronous

BRGH: Tingkat Baud Tinggi Pilih bit
1 = Kecepatan tinggi
0 = Kecepatan rendah

TRMT: Transmit Shift Register Status bit
1 = TSR kosong
0 = TSR penuh

TX9D: bit ke-9 Transmit Data, bisa jadi Parity bit


Selanjutnya konfigurasi bit-bit pada register RCSTA,

Fungsi dari masing-masing bit pada register ini adalah,

SPEN: Serial Port
1 = Port serial diaktifkan (konfigurasikan pin RC7 / RX / DT dan RC6 / TX / CK sebagai pin port serial)
0 = Port serial dinonaktifkan

RX9: 9-bit Receive Enable bit
1 = Memilih penerimaan 9 bit
0 = Memilih penerimaan 8-bit

SREN: Single Receive Enable bit

CREN: Continuous Receive Enable bit
Asynchronous mode:
1 = Mengaktifkan continuous receive
0 = Menonaktifkan continuous receive

ADDEN: Address Detect Enable bit
Asynchronous mode 9-bit (RX9 = 1):
1 = Mengaktifkan deteksi alamat, memungkinkan interupsi dan beban buffer penerima saat RSR diset
0 = Menonaktifkan deteksi alamat, semua byte diterima dan bit kesembilan terjadi, digunakan sebagai paritas bit

FERR: Framing Error bit
1 = Framing error (dapat diupdate dengan membaca register RCREG dan menerima byte valid berikutnya)
0 = No framing error

OERR: Overrun Error bit
1 = Overrun error (dapat dihapus dengan cara membersihkan bit CREN)
0 = Tidak ada kesalahan overrun

RX9D: bit 9 Received Data (bisa parity bit tapi harus dihitung oleh user firmware)


Selain mengunakan akases register, komunikasi UART dapat dilakukan dengan memanfaatkan library UART MikroC PIC. yang harus dilakukan sebelum melakukan komunikasi, maka proses inisialisasi harus terlebih dahulu dilakukan. Instruksi yang digunakan adalah,

UART1_Init(nilai_baudrate)

Nilai baudrate yang diisikan adalah berupa bilangan integer seperti 9600, 4800, 2400, dan seterusnya.

Adapun masih banyak insrtuksi baku yang telah disediakan pada library MikroC PIC yang tidak dapat dijabarkan disini semuanya.

4. Rangkaian [Kembali]


Rangkaian ini merupakan penggunaan komunikasi serial PIC 16F877A yang komunikasinya dilakukan dengan virtual terminal. Ketika dapa diinputkan pada virtual terminal menggunakan keyboard maka data ini akan dikirimkan dari virtual terminal ke pin RX PIC. Kemudian data ini akan dituliskan ke LCD.

5. Program [Kembali]

// Koneksi LCD dengan PIC
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

char receive;                                       // Deklarasi variabel receive sebagai penyimpan data inputan
void main() {
UART1_Init(9600);                           // Inisialisasi Pin Serial pada PIC dengan nilai baudrate 9600
delay_ms(100);                                  // delay 100 ms
TRISB=0x00;                                    // Menyatakan PORTB sebagai output
PORTB=0x00;                                   // Nilai Awal PortB adalah low

UART1_Write_Text("Type Your Text Here");        // Mencetak tulisan pada Virtual terminal
UART1_Write(13);                            // Baris baru pada virtual Terminal
UART1_Write(13);

Lcd_Init();                                         // Inisialisasi LCD
Lcd_Cmd(_LCD_CLEAR);              // Bersihkan Layar LCD
Lcd_Out(1,1,"Your Text is :");          // Mencetak tulisan di baris 1 kolom 1 LCD
Lcd_Out(2,1,"");                               // Menempatkan cursor di baris kedua

while(1){                                          // Perulangan

 if(UART1_Data_Ready()){                        // Memantikan pin RX menerima data dari Virtual Terminal
 receive=UART1_Read();                           // Memasukkan data yang diinput ke variabel receive

 if(receive==13){                                        // Jika yang diinput adalah ENTER, Maka
 Lcd_Cmd(_LCD_CLEAR);                      // Bersihkan Layar LCD
 Lcd_Out(1,1,"Your Text is :");
 Lcd_Out(2,1,"");                                       // Menempatkan cursor di baris kedua
 }
 else if(receive==8){                        // Jika yang diinputkan adalah BACKSPACE (Delete), Maka

 Lcd_Cmd(_LCD_MOVE_CURSOR_LEFT);          // Di LCD Karakter sebelumnya dihapus
 Lcd_Chr_Cp(32);
 Lcd_Cmd(_LCD_MOVE_CURSOR_LEFT);
 }
 else {                                         // Jika yang diinputkan selain dua di atas, Maka
 Lcd_Chr_Cp(receive);                           // Mencetak karakter yang diinput ke LCD
 }

 }

}

}


6. Flowchart [Kembali]


7. Video Simulasi [Kembali]

 

8. Files Download Link [Kembali]

download bahan klik disini

 

Timer

Interface Timer 

PIC16F877A





1. Tujuan [Kembali]

Mempelajari bagaimana cara Menggunakan fitur Timer PIC 16F877A dengan rangkaian dan dengan programnya.

2. Alat [Kembali]

2.1 Mikrokontroler PIC16F877A.

2.2 LCD

3. Teori [Kembali]

3.1. Pengertian Mikrokontroler PIC 16F877A

PIC yang merupakan produk dari Microchip Technology, merupakan kepanjangan dari Peripheral Interface Controller memiliki arsitektur Harvard dan merupakan jenis RISC (Reduced Instruction Set Computing). Salah satu jenis mikrokontroler ini adalah PIC16F877A.

3.1.1 Fitur-Fitur PIC16F877A.

a. Memiliki Instruksi sebanyak 35 buah.
b. Masing-masing instruksi dieksekusi dalam satu siklus mesin kecuali untuk instruksi percabangan yaitu dua siklus.
c. Kecepatan operasi masukan clock dari DC hingga 20MHz.
d. Kapasitas memori program berukuran 8k x 14 words.
e. Kapasitas RAM 268 byte.
f. Kapasitas memory EEPROM berukuran 256 byte.

3.1.2 Pin Out PIC16F877A.

-Memiliki 5 PORT I/O (PORTA 6 pin, PORTB 8 pin, PORTC 8 pin, PORTD 8 pin, PORTE 3 pin).
-Memiliki 3 buat timer
-Memiliki 2 buah keluaran PWM.
-Komunikasi serial singkron menggunakan SPI dan I2C.
-Komunikasi USART.

3.1.3 Pemograman PIC16F877A.

Pemograman PIC ini diprogram menggunakan bahasa C dan dapat menggunakan kompiler MikroC for PIC yang dapat didownload di situs resminya.

3.1.4 Rangkaian Dasar Sistem Mikrokontroler PIC16F877A.

 

Rangkaian crystal sebagai clock atau oscilator eksternal sebagai jantung untuk memberikan kecepatan eksekusi dari mikrokontroler tersebut.

3.2. Pengertian LCD

Untuk teori LCD sudah dibahas pada Interface LCD Menggunakan PIC

3.3. Pengertian Timer PIC 16F877A

Pada rangkaian ini kami mengunakan timer TMR0 pada PIC. adapun fitur-fitur Timer0 ini adalah;

1. Memiliki Lebar data sebesar 8bit.
2. Dapat digunakan sebagai counter
3. Bersifat dibaca dan ditulis.
4. Dapat menggunakan clock internal maupun eksternal.
5. Interupsi terjadi ketika terjadi overflow dari FFh ke 00h.

Untuk Mengakses timer0, maka harus melibatkan register lainnya yaitu Register OPTION_REG 9 bit 0 hingga bit 5) dengan kegunaan masing masing dapat dilihat pada tabel dibawah ini.


Kombinasi bit pengaturan Nilai Prescalar dapat dilihat pada tabel berikut,

Setelah reset, register OPTION_REG akan berisi FFH. Register lain yang berhubungan dengan TIMER0 adalah register INTCON yaitu untuk pengaturan interupsi.
Adapun fungsi masing-masing bit pada register ini adalah,

4. Rangkaian [Kembali]

Rangkaian di atas merupakan rangkaian sederhana dari penggunaan Fungsi timer dari PIC 16F877a. pada rangkaian terdapat LCD yang akan menampilkan penambahan waktu. yang ditampilkan pada LCD adalah Waktu jam, menit dan detik yang akan berjalan jika simulasi dihidupkan.


5. Program [Kembali]

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

char a=0, jam=0, menit=0, detik=0;         // deklarasi dan isi variabel
char detikpul, detiksat, menitpul, menitsat, jampul, jamsat;     // deklarasi variabel
void PrintToDisplay(){                     // fungsi mencetak ke layar

jampul=jam/10;                             // mendapatkan nilai puluhan jam
jamsat=jam%10;                             // mendapatkan nilai satuan jam
menitpul=menit/10;                         // mendapatkan nilai puluhan menit
menitsat=menit%10;                         // mendapatkan nilai satuan menit
detikpul=detik/10;                         // mendapatkan nilai puluhan detik
detiksat=detik%10;                         // mendapatkan nilai satuan menit
Lcd_out(1,1,"Waktu: : : ");                // cetak ke layar
Lcd_Chr(1,7,jampul+48);                    // cetak nilai puluhan jam ke LCD
Lcd_Chr_Cp(jamsat+48);                     // cetak nilai satuan jam ke LCD
Lcd_Chr_Cp(':');                           // cetak ke LCD
Lcd_Chr_Cp(menitpul+48);                   // cetak nilai puluhan menit ke LCD
Lcd_Chr_Cp(menitsat+48);                   // cetak nilai satuan menit ke LCD
Lcd_Chr_Cp(':');                           // cetak ke LCD
Lcd_Chr_Cp(detikpul+48);                   // cetak nilai puluhan detik ke LCD
Lcd_Chr_Cp(detiksat+48);                   // cetak nilai satuan detik ke LCD
delay_ms(10);                              // delay 10 ms
}

void interrupt(){                             // aktifkan interrupt
if(a<125){                                    // jika a<125, maka
a++;INTCON=0xa0;TMR0=131;}                    //  tambah a, aktifkan TMR0, isi TMR0
else{                                         // jika tidak, maka
a=0;                                          // a diisi 0
if(detik<59){                                 // jika detik<59, maka
detik++;INTCON=0xa0;TMR0=131;}                // detik+1, aktifkan TMR0, isi TMR0

else {detik=0;                                // jika detik = 0, maka
if(menit<59)                                  // jika menit<59, maka
{menit++; INTCON=0xa0; TMR0=131;}             // menit+1, aktifkan TMR0, isi TMR0
else{menit=0;                                 // jika jika tidak,menit=0

if (jam<11){                                  // jika jam<59, maka
jam++; INTCON=0xa0; TMR0=131;}                // jam+1, aktifkan TMR0, isi TMR0

else{                                         // jika tidak
jam=0; INTCON=0xa0; TMR0=131;}                // jam=0 , aktifkan TMR0, isi TMR0
}
}
}
}

void main(){
Lcd_init();                                   // Inisialisasi LCD
Lcd_Cmd(_LCD_CLEAR);                          // bersihkan layar LCD
Lcd_Cmd(_LCD_CURSOR_OFF);                     // matikan cursor LCD
TRISB=0x00;                                   // PORTB sebagai output
OPTION_REG=0x86;                              // Input clock internal 8Mhz, Prescalar 1:128
TMR0=131;                                     // isi nilai TMR0
INTCON=0xa0;                                  // aktifkan TMR0;
do{
PrintToDisplay();                             // panggil fungsi
}
while(1);                                     // loop

}

6. Flowchart [Kembali]

7. Video Simulasi [Kembali]

 

download bahan klik disini

Suhu LM35

  Interface Sensor Suhu LM35  

PIC 16F877A





1. Tujuan [Kembali]

Mempelajari bagaimana cara merangkai suatu Sensor Suhu (LM35) menggunakan mikrokontroler PIC dengan programnya.

2. Alat [Kembali]

2.1 Mikrokontroler PIC16F877A.


2.2 LCD


2.3 Sensor Suhu LM35

3. Teori [Kembali]

3.1. Pengertian Mikrokontroler PIC 16F877A

PIC yang merupakan produk dari Microchip Technology, merupakan kepanjangan dari Peripheral Interface Controller memiliki arsitektur Harvard dan merupakan jenis RISC (Reduced Instruction Set Computing). Salah satu jenis mikrokontroler ini adalah PIC16F877A.

3.1.1 Fitur-Fitur PIC16F877A.

a. Memiliki Instruksi sebanyak 35 buah.
b. Masing-masing instruksi dieksekusi dalam satu siklus mesin kecuali untuk instruksi percabangan yaitu dua siklus.
c. Kecepatan operasi masukan clock dari DC hingga 20MHz.
d. Kapasitas memori program berukuran 8k x 14 words.
e. Kapasitas RAM 268 byte.
f. Kapasitas memory EEPROM berukuran 256 byte.

3.1.2 Pin Out PIC16F877A.


-Memiliki 5 PORT I/O (PORTA 6 pin, PORTB 8 pin, PORTC 8 pin, PORTD 8 pin, PORTE 3 pin).
-Memiliki 3 buat timer
-Memiliki 2 buah keluaran PWM.
-Komunikasi serial singkron menggunakan SPI dan I2C.
-Komunikasi USART.

3.1.3 Pemograman PIC16F877A.

Pemograman PIC ini diprogram menggunakan bahasa C dan dapat menggunakan kompiler MikroC for PIC yang dapat didownload di situs resminya.

3.1.4 Rangkaian Dasar Sistem Mikrokontroler PIC16F877A.

Rangkaian crystal sebagai clock atau oscilator eksternal sebagai jantung untuk memberikan kecepatan eksekusi dari mikrokontroler tersebut.

3.2. Pengertian Sensor Suhu LM35

Sensor suhu IC LM 35 merupkan chip IC produksi Natioanal Semiconductor yang berfungsi untuk mengetahui temperature suatu objek atau ruangan dalam bentuk besaran elektrik, atau dapat juga di definisikan sebagai komponen elektronika yang berfungsi untuk mengubah perubahan temperature yang diterima dalam perubahan besaran elektrik. Sensor suhu IC LM35 dapat mengubah perubahan temperature menjadi perubahan tegangan pada bagian outputnya. Sensor suhu IC LM35 membutuhkan sumber tegangan DC +5 volt dan konsumsi arus DC sebesar 60 µA dalam beroperasi.



Karakteristik Sensor suhu IC LM35 adalah :

1. Memiliki sensitivitas suhu, dengan faktor skala linier antara tegangan dan suhu 10 mVolt/ºC, sehingga dapat dikalibrasi langsung dalam celcius.
2. Memiliki ketepatan atau akurasi kalibrasi yaitu 0,5ºC pada suhu 25 ºC
3. Memiliki jangkauan maksimal operasi suhu antara -55 ºC sampai +150 ºC.
4. Bekerja pada tegangan 4 sampai 30 volt.
5. Memiliki arus rendah yaitu kurang dari 60 µA.
6. Memiliki pemanasan sendiri yang rendah (low-heating) yaitu kurang dari 0,1 ºC pada udara diam.
7. Memiliki impedansi keluaran yang rendah yaitu 0,1 W untuk beban 1 mA.
8. Memiliki ketidaklinieran hanya sekitar ± ¼ ºC.

3.3. Pengertian ADC pada PIC 16F877A

Untuk Mengkonversi data analog yang diinputkan oleh sensor digunakan rangkaian ADC PIC. Rangkaian ADC ini sudah dipelajari di Interface ADC Menggunakan PIC 16F877A

3.3. Pengertian LCD

LCD disini digunakan untuk menampilkan berapa suhu yang diukur oleh sensor. Teori LCD sudah dijelaskan pada Interface LCD Menggunakan PIC 16F877A

4. Rangkaian [Kembali]



Rangkaian diatas merupakan rangkaian sederhana dari pengunaan PIC yang dihubungkan dengan sensor suhu. Sensor suhu LM35 dihubungkan dengan sumber tegangan dan ouput dari sensor dimasukkan ke pin Analog dari PIC. kemudian data ini dikonversikan oleh PIC dan kemudian ditampilkan besarapa suhu terukur oleh sensor pada layar LCD.


5. Program [Kembali]

// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections

int t;                                  // deklarasi variabel t
char a;                                 // deklarasi variabel a
char lcd[] = "111 Degree";              // deklarasi array lcd dan diisi

void main()
{
ADCON0.ADCS0=0;                                  // ADCS0, ADCS1 &amp; ADCS2 bersama sama menentukan kecepatan clock
ADCON0.ADCS1=1;                                  // jika 0 1 1 maka kecepatannya  Fosc/64
ADCON1.ADCS2=1;
ADCON0.CHS0=0;                                   // CHS0, CHS1 &amp; CHS2 bersama-sama menentukan pin
ADCON0.CHS1=0;                                   // jika 0 0 0  maka pin yang digunakan adalah RA0/AN0
ADCON0.CHS2=0;
ADCON0.ADON=1;                                   // mengaktifkan konverter A/D
ADCON1.ADFM=1;                                   // menyatakan 10 bit terdiri dari 8 bit ADRESL dan 2 bit ADRESH
ADCON1.PCFG0=0;                                  // PCFG0, PCFG1, PCFG2 &amp; PCFG3 bersama sama menetukan
ADCON1.PCFG1=0;                                  // apakah pin digunakan sebagai input analog atau input digital
ADCON1.PCFG2=0;                                  // jika 0000 maka semua pin sebagai input Analog
ADCON1.PCFG3=0;

  Lcd_Init();                                    // inisialisasi LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);                      // matikan cursor LCD

  do
  {
    Lcd_Cmd(_LCD_CLEAR);                         // bersihkan layar LCD
    Lcd_out(1,1, "Temperature:");                // cetak "Temperature" di layar LCD
    t = ADC_Read(0);                             // mendapatkan nilai input analog
 
    t = t * 0.4887;                              // menyesuaikan nilai derjat dengan input analog
    a = t%10;                                    // mendapatkan nilai satuan suhu
    lcd[2] = a + '0';                            // mengganti nilai satuan array
 
    t = t/10;
    a = t%10;                                    // mendapatkan nilai puluhan suhu
    lcd[1] = a + '0';                            // mengganti nilai puluhan array
 
    t = t/10;
    a = t%10;                                    // mendapatkan nilai ratusan suhu
    lcd[0] = a + '0';                            // mengganti nilai ratusan array
 
    Lcd_out(2,1,lcd);                            // mencetak nilai suhu pada layar LCD
    Delay_ms(100);                               // delay 100 ms
  }while(1);                                     // looping

}

6. Flowchart [Kembali]

 

7. Video Simulasi [Kembali]

 

download bahan klik disini

Interrupt

Interface ADC 

PIC16F877A



1. Tujuan [Kembali]

Mempelajari bagaimana cara merangkai suatu rangkaian ADC menggunakan mikrokontroler PIC dengan programnya.

2. Alat [Kembali]

2.1 Mikrokontroler PIC16F877A.

2.2 LCD


2.3 Potensiometer


3. Teori [Kembali]

3.1. Pengertian Mikrokontroler PIC 16F877A

PIC yang merupakan produk dari Microchip Technology, merupakan kepanjangan dari Peripheral Interface Controller memiliki arsitektur Harvard dan merupakan jenis RISC (Reduced Instruction Set Computing). Salah satu jenis mikrokontroler ini adalah PIC16F877A.

3.1.1 Fitur-Fitur PIC16F877A.

a. Memiliki Instruksi sebanyak 35 buah.
b. Masing-masing instruksi dieksekusi dalam satu siklus mesin kecuali untuk instruksi percabangan yaitu dua siklus.
c. Kecepatan operasi masukan clock dari DC hingga 20MHz.
d. Kapasitas memori program berukuran 8k x 14 words.
e. Kapasitas RAM 268 byte.
f. Kapasitas memory EEPROM berukuran 256 byte.

3.1.2 Pin Out PIC16F877A.


-Memiliki 5 PORT I/O (PORTA 6 pin, PORTB 8 pin, PORTC 8 pin, PORTD 8 pin, PORTE 3 pin).
-Memiliki 3 buat timer
-Memiliki 2 buah keluaran PWM.
-Komunikasi serial singkron menggunakan SPI dan I2C.
-Komunikasi USART.

3.1.3 Pemograman PIC16F877A.

Pemograman PIC ini diprogram menggunakan bahasa C dan dapat menggunakan kompiler MikroC for PIC yang dapat didownload di situs resminya.

3.1.4 Rangkaian Dasar Sistem Mikrokontroler PIC16F877A.

rangkaian crystal sebagai clock atau oscilator eksternal sebagai jantung untuk memberikan kecepatan eksekusi dari mikrokontroler tersebut.

3.2. Pengertian ADC

Analog To Digital Converter (ADC) adalah pengubah input analog menjadi kode – kode digital. ADC banyak digunakan sebagai pengatur proses industri, komunikasi digital dan rangkaian pengukuran/pengujian. Umumnya ADC digunakan sebagai perantara antara sensor yang kebanyakan analog dengan sistim komputer seperti sensor suhu, cahaya, tekanan/berat, aliran dan sebagainya kemudian diukur dengan menggunakan sistim digital (komputer).

3.2. Pengertian ADC pada PIC 16F877A

Hanya ada EMPAT register yang perlu Anda pahami untuk mengkonfigurasi ADC. Mereka adalah ADCON0, ADCON1, ADRESH dan ADRESL. Dua yang paling penting adalah ADCON0 dan ADCON1 . ADRESH dan ADRESL hanyalah register dimana ADC menyimpan hasil konversi.

Register ADCON0


Bit-ADCS0-ADCS1-ADCS2
Bit ini untuk menentukan kecepatan clock bitnya.



Bit-CHS
Bit ini digunakan untuk menentukan channel analog yang digunakan.



Register ADCON1




3.3. Pengertian Potensiometer

Potensiometer merupakan komponen elektronika yang memiliki nilai resistansi yang dapat diubah nilai resistansinya sesuai range yang berbeda beda seperti 1k,10k,100k dst.Potensiometer memiliki 3 kaki seperti di bawah ini :




Fungsi Potensiometer :

Pada gambar di atas dapat disimpulkan bahwa fungsi potensiometer adalah untuk menghasilkan nilai resistansi yang bervariasi tergantung dari putaran penyapu/wiper .Karena kelebihan itulah maka transistor banyak digunakan untuk pengatur volume,pengatur tegangan,switch triac dll.

Cara kerja potensiometer :

Jika yang digunakan hanya 2 terminal,1 ujung dan 1 nya wiper maka ia bekerja sebagai resistor variabel atau rheostat.Jika digunakan 3 terminal maka kaki no 2 bekerja sebagai V out sebagai sinyal keluaran.

3.4. Pengertian LCD

Untuk teori dari LCD dapat dilihat atau dipelajari pada postingan Interface LCD Menggunakan PIC 16F877A

4. Rangkaian [Kembali]


 Rangkaian diatas merupakan rangkaian sederhana dari pengunaan PIC untuk penggunaan sebagai ADC. Pada rangkaian tersebut input ADCnya digunakan potensiometer dan nilai analognya ditampilkan pada layar LCD

5. Program [Kembali]

//Penyambungan Modul LCD
sbit LCD_RS at RB7_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB7_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

void PrintToDisplay(char x, char y, float in1)   //fungsi cetak ke LCD
{
     char ch;                                    // deklarasi variabel ch
     int tint;                                   // deklarasi variabel tint
     tint=(int)(in1*1000);                       // mendapatkan nilai integer dari input analog
     ch=tint/1000;                               // mendapatkan bilangan pertama dari nilai analog
     Lcd_Chr(x,y,ch+48);                         // cetak bilangan pertama ke LCD
     Lcd_Chr_Cp('.');                            // cetak titik yang menjadi koma desimal
     ch=(tint%1000)/100;                         // mendapatkan bilangan kedua dari nilai analog
     Lcd_Chr_Cp(ch+48);                          // cetak bilangan kedua ke LCD
     ch=((tint%1000)%100)/10;                    // mendapatkan bilangan ketiga dari nilai analog
     Lcd_Chr_Cp(ch+48);                          // cetak bilangan ketiga ke LCD
     ch=((tint%1000)%100)%10;                    // mendapatkan bilangan keempat nilai analog
     Lcd_Chr_Cp(ch+48);                          // cetak bilangan keempat ke LCD
     Lcd_Out_Cp("Volt");                         // cetak satuan Volt ke LCD
     Delay_ms(10);                               // delay 10 ms
     }

     int vadc;                                   // deklarasi variabel vadc
     float vin, vinb;                            // deklarasi variabel vin dan vinb

void main() {
TRISB=0x00;                                      // PORTB sebagai output
TRISA=0xff;                                      // PORTA sebagai Input

Lcd_Init();                                      // Inisialisasi LCD
Lcd_Cmd(_LCD_CLEAR);                             // bersihkan layar LCD
Lcd_Cmd(_LCD_CURSOR_OFF);                        // matikan cursor LCD

ADCON0.ADCS0=0;                                  // ADCS0, ADCS1 &amp; ADCS2 bersama sama menentukan kecepatan clock
ADCON0.ADCS1=1;                                  // jika 0 1 1 maka kecepatannya  Fosc/64
ADCON1.ADCS2=1;
ADCON0.CHS0=0;                                   // CHS0, CHS1 &amp; CHS2 bersama-sama menentukan pin
ADCON0.CHS1=0;                                   // jika 0 0 0  maka pin yang digunakan adalah RA0/AN0
ADCON0.CHS2=0;
ADCON0.ADON=1;                                   // mengaktifkan konverter A/D
ADCON1.ADFM=1;                                   // menyatakan 10 bit terdiri dari 8 bit ADRESL dan 2 bit ADRESH
ADCON1.PCFG0=0;                                  // PCFG0, PCFG1, PCFG2 &amp; PCFG3 bersama sama menetukan
ADCON1.PCFG1=0;                                  // apakah pin digunakan sebagai input analog atau input digital
ADCON1.PCFG2=0;                                  // jika 0000 maka semua pin sebagai input Analog
ADCON1.PCFG3=0;

for(;;) {                                        // looping
        ADCON0.Go_Done=1;                        // melakukan pengukuran konversi A/D
        while(ADCON0.Go_Done)                    // memastikan konversi aktif
        { }
        vadc=ADRESL+(ADRESH*256);


    /* Mengambil nilai digital, dengan ADRESL bit low hanya dapat menghitung
                                    hingga 256 dan meluap. sehingga jika 256 telah terpenhui maka nilai
                                    ADRESH akan bertambah 1 point. sehingga hasil digital yang didapatkan
                                    dapat dicari dengan ADRESL terakhir ditambah dengan ADRESH*256. dengan
                                    kolaborasi ini ADC dapat menghitung hingga 10bit.
                                 */

        vin=vadc*5/1024;                       // konversi nilai digital yang didapat ke nilai analog
                                               // dengan tegangan maksimum 5 volt
        PrintToDisplay(1,1,vin);                 // panggil fungsi  untuk mencetak ke layar LCD
        delay_ms(50);                                         // delay 50ms
        Lcd_Cmd(_LCD_CLEAR);                   // bersihkan layar LCD
        }

}


6. Flowchart [Kembali]


7. Video Simulasi [Kembali]

 

download bahan klik disini