menuju akhir
a. Mempelajari aplikasi output pada mikrokontroller PIC 16F877A
b. Mempelajari aplikasi input pada mikrokontroller PIC 16F877A
c. Mempelajari aplikasi I/O pada mikrokontroller PIC 16F877A
a. Module PIC 16F84A
b. LED
c. Jumper
d. Rangkaian reset
e. LCD
e. LCD
> Dasar Teori Mikrokontroler
Mikrokontroler
PIC16F877A merupakan salah satu mikrokontroler dari keluarga PICmicro
yang popular digunakan sekarang ini, mulai dari pemula hingga para
profesional. Hal tersebut karena PIC16F877A sangat praktis dan
menggunakan teknologi FLASH memori sehingga dapat di program-hapus
hingga seribu kali. Keunggulan mikrokontroler jenis RISC ini dibanding
dengan mikrokontroler 8-bit lain dikelasnya terutama terletak pada
kecepatan dan kompresi kodenya. Selain itu, PIC116F877A juga tergolong
praktis dan ringkas karena memiliki kemasan 40 pin dengan 33 jalur I/O.
Anggota
keluarga PICmicro buatan Microchip Inc. cukup banyak. Ada yang
menggunakan FLASH memori dan ada pula yang jenis OTP (One Time
Programmable). Mikrontroler dari keluarga PICmicro yang popular, antara
lain PIC2C08, PIC16C54, PIC16F84. Agar lebih mengenal PIC16F877A,
berikut ini diberikan fitur-fitur penting yang terdapat pada PIC16F877A.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnTcbNc9YZf4JFusk26xFr69Mg78u6pWVQcyJ0mF5Yhnr-4bTco5KcNRk3sZpmsTfgJy5CjRqgQa_v6Lh34ExojvNz_LWDpME1MlQ0kUroT7Ddmbk2xRb_ZqfDueIr7jGgsA-wwa7vD3s/s1600/pic1.jpg)
MIkrokontroller PIC16F877A
fitur fitur PIC RISC CPU yang mempunyai performance tinggi
- Hanya 35 jenis instruksi yang perlu dipelajari
- Semua instrujsi mempunyai siklus tunggal kecuali untuk instruksi percabangan.
- Kecepatan Instruksi: DC – 20 MHz clock input DC – 200 ns instruction cycle
- 8K x 14 words of FLASH Program Memory, 368 x 8 bytes of Data Memory (RAM) , 256 x 8 bytes of EEPROM Data Memory
- Pinout compatible dengan PIC16C73B/74B/76/77
- Interrupt (14 sumber interrupt)
- Delapan level hardware stack
- Direct, indirect dan relative addressing modes
- Power-on Reset (POR)
- Power-up Timer (PWRT) dan Oscillator Start-up Timer (OST)
- Watchdog Timer (WDT) dengan on-chip RC oscillator
- Programmable code protection dan Fully static design
- Power saving SLEEP mode
- Selectable oscillator options
- Low power, high speed CMOS FLASH/EEPROM technology
- In-Circuit Serial Programming (ICSP) hanya dengan dua pin
- Single 5V In-Circuit Serial Programming capability
- Processor read/write access to program memory
- Wide operating voltage range: 2.0V to 5.5V
- High Sink/Source Current: 25 mA
- Commercial, Industrial and Extended temperature ranges
Deskripsi pin pin
Mikrokontroler
PIC16F877A di produksi dalam kemasan 40 pin PDIP (Plastik Dual In Line)
maupun 40 pin SO (Small Outline). Namun yang banyak terdapat dipasaran
adalah kemasan PDIP. Pin-pin untuk I/O sebanyak 33 pin, yang terdiri
atas 6 pada Port A, 8 pada Port B, 8 pada Port C, 8 pada Port D, 3 pada
Port E. Ada pula beberapa Pin pada mikrokontroler yang memiliki fungsi
ganda.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK9pA8EUk03tNQIww34W2W_myFY9spMqkRbzUO25k7R9wi70fknK56MyqlGFGL-5zMv5E6L4nMbWXrlfNiRUMSTXTjOAMk3GzmxfEFDemHakQ82753sHWcQpzktCqagoO0P81jkkm_ZR0/s320/pic.jpg)
Organisasi Memori
Memori
pada PIC16F877A dapat dipisahkan menjadi dua blok memori, satu untuk
memori program dan satu untuk memori data. Memori EEPROM dan register
GPR didalam RAM merupakan memori data, sedangkan memori FLASH merupakan
memori program.
Pembangkit Clock-Oscilator
Suatu mikrokontroler tidak akan dapat bekerja jika tidak diberi
detak (clock) melalui suatu osilator. Osilator adalah rangkaian yang
akan memberikan pulsa pada mikrokontroler dan berguna untuk
mensinkronkan sistem dalam mikrokontroler tersebut. Untuk mengaktifkan
sumber clock ini cukup dengan menambahkan rangkaian pasif saja seperti
resistor dan kapasitor (RC Oscilator), kristal atau keramik resonator.
Salah satu keistimewaan mikrokontroler PIC16F84 adalah terdapatnya 4
pilihan penggunaan osilator. Untuk pemakaian yang tidak memerlukan
pewaktu kritis, bahkan dapat menggunakan sepasang resistor dan kapasitor
saja sebagai osilator.
Nilai kristal yang dapat dipakai maksimum adalah 4 MHz atau 10
MHz, hal ini karena mikrokontroler PIC16F84 dibuat dalam 2 versi
frekuensi kerja. Untuk menentukan frekuensi maksimumnya dapat dilihat
pada badan mikrokontroler. Jika terdapat tulisan PIC16F84-04/P berarti
frekuensi maksimum yang diijinkan adalah 4 MHz.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicZCi8E4p-H8p4WS_hn_ej2vf0UZn1rHJ1F9woyyQRzqnN3Htamu3jldXI05tP0J5n7Mzz-PIHyXqXNtoSnXFl5pecayf7aYTipxGVE46G7akhyth08ik2zYmESIhaYBAx2XYboFJfKz9W/s400/PIC.jpg)
Mikroprosesor PIC16F877A
4.6 Listing 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 & 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 & 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 & 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
}}
//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 & 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 & 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 & 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
}}
Tidak ada komentar:
Posting Komentar