MODUL 1 Pengenalan C untuk 8051 (Compile dan Download) Bahasa pemrograman C adalah sebuah bahasa 'mid-level', namun memiliki fitur 'high-level' (seperti support pada fungsi dan modul) dan juga memiliki fitur 'lowlevel' (seperti mengakses hardware melalui pointer). Dengan menggunakan bahasa C, kita dapat dengan mudah untuk pindah ke jenis mikrokontroler yang lain, lebih mudah dan cepat dalam menulis kode program, dan lebih mudah dimengerti, dan lebih mudah dalam melakukan debugging.
1. Tujuan ● Peserta mengetahui pembuatan program dengan menggunakan bahasa C ● Peserta mengetahui bagaimana proses kompilasi dan download program pada 8051
2. Dasar Teori Keil uVision2 Untuk menggunakan bahasa C pada mikrokontroler diperlukan compiler. Pada percobaan kali ini digunakan Keil uVision2 sebagai compiler untuk mikrokontroler 8051. Memulai membuat project: ● Pilih opsi project -> New Project...
● Atur pilihan device sesuai dengan device yang digunakan. Pada percobaan kali ini dipilih database Atmel -> 89S8252 untuk keluarga 8051.
Membuat file source code yang baru: ● Pilih opsi File -> New... ● Tulis source code C pada halaman baru tersebut dan simpan dengan ekstensi .c ● Klik kanan pada Source Group dan pilih opsi Add Files to Group 'Source Group 1' kemudian tambahkan file .c yang kita buat tadi ke Source Group tersebut.
Melakukan kompilasi: ● Tekan tombol F7 untuk melakukan proses build. Contoh tampilan hasil proses Build:
Agar program dapat di-download ke dalam mikrokontroler, kita memerlukan file berbentuk HEX-file dari program yang telah kita buat. Untuk menghasilkan HEXfile ini, dilakukan dengan cara: ● Pilih opsi Project -> Options for Target 'Target 1'
● Kemudian pada kolom Output, aktifkan pilihan Create HEX file
Dengan mengaktifkan opsi tersebut, maka ketika proses build program akan dihasilkan HEX-file dari program tersebut. SPI – Flash Programmer 3.7 Salah satu alternatif untuk mendownload HEX-file yang telah dibuat tadi adalah secara serial. Pada percobaan kali ini digunakan aplikasi SPI – Flash Programmer 3.7 buatan Asim Khan. Proses download program: ● Pilih opsi Open File kemudian pilih HEX-file yang kita buat tadi. ● Pilih jenis mikrokontroler yang digunakan. Pada praktikum digunakan jenis AT89S52. ● Kemudian pilih opsi Program.
kali
ini
● Jika program yang di-download ingin dibuat agar tidak bisa dibaca orang lain, maka digunakan opsi Lock Bit.
3. Petunjuk Praktikum Percobaan 1: Port I/O //#include <stdio.h> #include "AT898252.H" // Fungsi main
void main (void) { P0 = 0x55; while (1) { }
// set port 0 menjadi 0x55 // superloop // tidak ada yang dilakukan
}
Compile dan download program di atas ke board 8051 yang telah dibuat! Perhatikan apa yang terjadi! Analisis! Percobaan 2: Interupsi Eksternal #include "AT898252.H" // Interrupt eksternal 0, dipanggil saat ada interupsi EXT0 void isrExt0(void) interrupt 0 { P0 = 0x55; // set P0 ke 0x55 return; } // Interrupt eksternal 1, dipanggil saat ada interupsi EXT1 void isrExt1(void) interrupt 2 { P0 = 0xAA; // set P0 ke 0xAA return; } // Fungsi main void main (void) { EX0 = 1; EX1 = 1; EA = 1;
}
// enable interrupt EXT0 // enable interrupt EXT1 // enable interrupts
P0 = 0xFF;
// set P0 ke 0xFF
while (1) {
// superloop // tidak ada yang dilakukan
}
Compile dan download program di atas ke board 8051 yang telah dibuat! Perhatikan apa yang terjadi! Analisis!
Percobaan 3: RS232 (Komunikasi Serial) #include <stdio.h> #include "AT898252.H" // Interrupt eksternal 0, dipanggil saat ada interupsi EXT0 void isrExt0(void) interrupt 0 { printf("halo"); }
return;
// Interrupt eksternal 1, dipanggil saat ada interupsi EXT1 void isrExt1(void) interrupt 2 { printf("dunia"); }
return;
// Inisialisasi komunikasi serial void initSerialComm(void) { SCON = 0x40; // Setup serial port control register // Mode 1: 8-bit uart var. baud rate // REN: enable receiver disable // use 0x50 to enable receiver PCON &= 0x7F;
// Clear SMOD bit in power ctrl reg // This bit doubles the baud rate
TMOD &= 0xCF;
// Setup timer/counter mode register // Clear M1 and M0 for timer 1 // Set M1 for 8-bit autoreload timer
TMOD |= 0x20; TH1 = 0xFD;
// Set autoreload value for timer 1 // 9600 baud with 11.0592 MHz xtal
TR1 = 1;
// Start timer 1
TI = 1;
// Set TI to indicate ready to xmit
} // Fungsi main void main (void) { initSerialComm(); EX0 = 1; EX1 = 1; EA = 1; while (1) { } }
// // // //
inisialisasi Komunikasi Serial enable interrupt EXT0 enable interrupt EXT1 enable interrupts
// superloop // tidak ada yang dilakukan
Compile dan download program di atas ke board 8051 yang telah dibuat! Perhatikan apa yang terjadi! Analisis! Percobaan 4: Implementasi 7-Segment #include "AT898252.H" // variabel untuk menyimpan data waktu sekarang, waktu on, dan waktu off unsigned char cWaktuSekarang[4] = {1,2,3,4}; // 7 segment decoder (active low) // berikut merupakan gambaran mengenai decoder BCD to 7 segment: // ===================================================== // | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | o | n | f | // ===================================================== // a a => P0_0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | // ---b => P0_1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | // f | g | b c => P0_2 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | // ---d => P0_3 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | // e | | c e => P0_4 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | // ---f => P0_5 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | // d g => P0_6 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | // // unsigned char BCDTO7SEGMENTS[] = {0xC0, // 1100 0000b // 0 0xF9, // 1111 1001b // 1 0xA4, // 1010 0100b // 2 0xB0, // 1011 0000b // 3 0x99, // 1001 1001b // 4 0x92, // 1001 0010b // 5 0x82, // 1000 0010b // 6 0xF8, // 1111 1000b // 7 0x80, // 1000 0000b // 8 0x90, // 1001 0000b // 9 0xA3, // 1010 0011b // o 0xAB, // 1010 1011b // n 0x8E}; // 1000 1110b // f ////////////////////////////////////////////////////////////////////////////// // Unit Refresh Display - mux 7 segment - mulai ////////////////////////////////////////////////////////////////////////////// void refresh7Segment(char cDigitPos) { P2 = 0xFF; // clear data pada port 0 untuk mematikan semua lampu P0 = BCDTO7SEGMENTS[cWaktuSekarang[cDigitPos]];//keluarkan data 7 segment di P0 P2 // // // // }
= P2 P2 = P2 = P2 = P2 =
return;
^ (1 << cDigitPos); // nyalakan sebuah 7 segment 11111110 saat menyalakan 7 segment pertama 11111101 saat menyalakan 7 segment kedua 11111011 saat menyalakan 7 segment ketiga 11110111 saat menyalakan 7 segment keempat
////////////////////////////////////////////////////////////////////// // Unit Refresh Display - mux 7 segment - selesai ////////////////////////////////////////////////////////////////////// // Interrupt Timer2 setiap 2,5 ms void isrTimer2(void) interrupt 5 // Dipanggil setiap 2,5 ms { static unsigned int cCount = 0; TF2=0;
//clear interrupt
// tambah satu untuk nilai cCount cCount++; // refresh 7 Segment refresh7Segment(cCount & 0x3);//cCount & 0x3 = cCount%4.U/ mendptkan nilai 0-3. }
return;
// Inisialisasi Timer2 // asumsi clock 12 MHz => 12 // dalam hal ini, diinginkan // jadi jumlah hitungan yang void initTimer2(void) { T2MOD=0; // Timer 2 T2CON=0;
MHz/12 = 1.000.000 hitungan setiap detiknya periode Timer 2 sebesar 2,5 ms harus di-count adalah 2,5/1000*1000000 = 2500 hitungan : 16 bit autoreload
// agar timer2 dipanggil setiap 5 ms, counter sebanyak 2500 kali // 0x09C4=2500 RCAP2H=0xF6; RCAP2L=0x3C; TL2=RCAP2L; TH2=RCAP2H; PT2 = 1; ET2=1; TR2=1;
// 65536-2500=63036d=F63Ch // masukkan nilai reload di sini
// Set Timer2 menjadi prioritas tertinggi // enable interrupt // start timer2
return; } // Fungsi main void main (void) { initTimer2(); EA = 1;
// inisialisasi Timer2 // enable interrupts
while (1) // superloop { // tidak ada yang dilakukan } }
Compile dan download program di atas ke board 8051 yang telah dibuat! Perhatikan apa yang terjadi! Analisis!
4. Referensi ● Pardue, Joe. “C Programming For Microcontrollers”, Smiley Micros, 2005. ● AT89S52 Datasheet