TEORI
Port I/O pada mikrokontroler AVR dapat dikonfigurasi sebagai input atau ouput dengan cara merubah isi Data Direction Register (DDRx). Pada bit DDRx menentukan arah pin pada port I/O yang akan digunakan nantinya. Jika diinginkan Port D dikonfigurasi sebagai output maka DDRC harus di-set sebagai 0xFFh. Dan jika difungsikan sebagai input maka nilainya pada DDRC adalah 0x00h Contoh :
Untuk contoh kasus ini DDRC = 0 apabila konfigurasi hardware input (push button) terhubung pada VCC (bukan pada ground). Setiap pin I/O mikrokontroler AVR memiliki internal pull-up. Misalnya Port C terkonfigurasi sebagai input dimana sisi hardware input (push button) terhubung dengan ground (bukan VCC), maka internal pull-up harus diaktifkan. Contoh :
Dan ketika port-port yang lainnya tidak digunakan, ada baiknya port tersebut di jadikan mode input dengan aktif internal pull-up. Namun jika projek dari pengguna mikrokontroler AVR tidak bermasalah dengan penggunan sumber daya, port yang tidak digunakan bisa dijadikan mode input yang bersifat floating point atau kondisi default. Kondisi pasif tersebut dibuat sedemikian rupa, jika ada insiden masuknya sumber daya ke salah satu port secara tidak sengaja masih bisa ditoleransi jika port tersebut pada mode input.
taufiq[at]eepis[minus]its[dot]edu
1. Secara keseluruhan beberapa percobaan dibawah ini menggunakan wizard sehingga kode digenerate secara otomatis. 2. Atur semua kode program yang ada kemudian diletakkan sesuai pada bagian-bagian kode hasil generate wizard. 3. Pastikan hasil compile tidak menghasilkan error dengan menekan F9. 4. Selanjutnya download program tersebut ke MS-16 via USB dengan menekan Shift-F9 dan tekan tombol Program the chip. 5. Amati dan analisa hasilnya kemudian catat hasil tersebut sebagai laporan sementara.
Prosedur Khusus
Rangkaian skematik Digital Input dan Output yang terdapat pada modul Interface (IF-01) adalah sebagai berikut : Input DIP Switch dan Push Button
Input DIP Switch dan Push Button terhubung dengan PORTC, dimana pada skematik setiap saklar terhubung pada GROUND. Serta sebanyak 4-bit LSB terhubung parallel pada DIP Switch 8-bit. Sehingga ketika mendefinisikan PORTC sebagai input menggunakan mode Input dengan Internal Pull-up. Dengan tujuan ketika tombol tidak aktif mendapatkan kondisi yang pasti yaitu mendapatkan logika 1 dan aktif mendapatkan logika 0. Syarat skematik ini tidak bisa digunakan jika menggunakan mode input tipe Tri-state (Hi-Z) atau istilah lainnya floating input
taufiq[at]eepis[minus]its[dot]edu
Dari skematik diatas, tiap BarLED terhubung dengan Resistor Pack sebesar 1K ohm.dan tiap LED akan aktif jika diberikan keluaran logika 0 dari PORTD. Sehingga ketika PORTD di-inisialisasi sebagai Output yaitu DDRD=0xff dan PORTD=0x00 maka BarLED tidak akan pernah menyala. Berikut ini setting persiapan awal untuk mengakes AVR ATMega16 menggunakan CodeWizard AVR dimana penggunaan Chip=ATmega16 dan Clock=11.059200, serta mengaktifkan PORTC sebagai Input dengan Internal Pull-up dan PORTD sebagai Output, tampilan dari CodeWIzardAVR adalah sebagai berikut :
taufiq[at]eepis[minus]its[dot]edu
Chip type : ATmega16 Program type : Application Clock frequency : 11.059200 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega16.h> #include <math.h> #include <delay.h> // Declare your global variables here void main(void) { // Declare your local variables here int i,a; // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 PORTD=0xFF; DDRD=0xFF;
taufiq[at]eepis[minus]its[dot]edu
taufiq[at]eepis[minus]its[dot]edu
Chip type : ATmega16 Program type : Application Clock frequency : 11.059200 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega16.h> // Declare your global variables here void kiri() { unsigned char b=0x7f; int i; for(i=0;i<8;i++){ b=((b<<1)|(b>>7)); // instruksi geser bit ke kiri PORTD=b; delay_ms(200); } } void delay(int n){ int i; for(i=0;i<n;i++) { int b; for(b=0;b<=10;i++); } } void main(void) {
taufiq[at]eepis[minus]its[dot]edu
taufiq[at]eepis[minus]its[dot]edu
taufiq[at]eepis[minus]its[dot]edu
taufiq[at]eepis[minus]its[dot]edu
TEORI
Jenis timer yang diberikan oleh AVR ada dua yaitu timer dengan resolusi 8-bit dan 16-bit. Sedangkan fitur timer dari masing-masing resolusi tersebut adalah sebagai berikut : 1. TIMER 0 dan 2 (resolusi 8-bit) Features a. Single Compare Unit Counter b. Clear Timer on Compare Match (Auto Reload) c. Glitch-free, Phase Correct Pulse Width Modulator (PWM) d. Frequency Generator e. External Event Counter f. 10-bit Clock Prescaler (1, 8, 64, 256, 1024) g. Overflow and Compare Match Interrupt Sources
(TOV0
and
OCF0)
taufiq[at]eepis[minus]its[dot]edu
10
taufiq[at]eepis[minus]its[dot]edu
11
Dari mode CTC ini, terdapat istilah pembagi clock (prescaller = N) yang harus diketahui dalam menghitung waktu atau frekuensi yang akan ditentukan nantinya, rumusan tersebut yaitu :
atau
taufiq[at]eepis[minus]its[dot]edu
12
Dimana :
Fclk = nilai frekuensi kristal yang digunakan. = nilai bit timer yang digunakan, bisa 8-bit atau 16-bit. jika 8-bit maka = 255 jika 16-bit maka = 65535
N = Prescaller, faktor pembagi mulai 8, 64, 256 1024. Contoh : Diketahui Fclk = 11.059200 Mhz dan menggunakan TIMER 0/2, maka = 255 Hitung waktu maksimum timer tersebut dengan prescaller 1. Jawab :
Sehingga jika ingin didapatkan waktu maksimum dari timer 1 yang memiliki resolusi 16 bit dengan prescaller =1 didapatkan
Gunakan rumus berikut ini untuk menentukan Timer Value berdasarkan Interval Timer yang diinginkan :
Dimana : Interval Timer = Waktu yang diinginkan Clock Value= Frekuensi kristal per prescaler, Timer Value = besaran waktu yang akan ditanamkan pada mikrokontroler = nilai bit timer yang digunakan, bisa 8-bit atau 16-bit.
taufiq[at]eepis[minus]its[dot]edu
1. Secara keseluruhan beberapa percobaan dibawah ini menggunakan wizard sehingga kode digenerate secara otomatis. 2. Atur semua kode program yang ada kemudian diletakkan sesuai pada bagian-bagian kode hasil generate wizard. 3. Pastikan hasil compile tidak menghasilkan error dengan menekan F9. 4. Selanjutnya download program tersebut ke MS-16 via USB dengan menekan Shift-F9 dan tekan tombol Program the chip. 5. Amati dan analisa hasilnya kemudian catat hasil tersebut sebagai laporan sementara.
Prosedur Khusus
Percobaan ke :
1. Generate delay 1 detik TIMER1 menggunakan mode normal
taufiq[at]eepis[minus]its[dot]edu
14
Chip type : ATmega16 Program type : Application Clock frequency : 11.059200 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega16.h> #define BarLED PORTD
int kondisi=0; // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // Reinitialize Timer 1 value TCNT1H=0xD5; TCNT1L=0xD0; // Place your code here if(kondisi){ BarLED=0xff; kondisi=0; }else{ BarLED=0x00; kondisi=1; } } // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
taufiq[at]eepis[minus]its[dot]edu
15
taufiq[at]eepis[minus]its[dot]edu
16
2. Generate delay 1 detik TIMER0 menggunakan mode normal match compare output
dengan cara yang sama seperti percobaan 1, buat interval waktu sebesar 100S didapatkan nilai Compare = 76H
taufiq[at]eepis[minus]its[dot]edu
17
Chip type : ATmega16 Program type : Application Clock frequency : 11.059200 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega16.h> #define BarLED PORTD int kondisi=0,looping=0; // Timer 0 output compare interrupt service routine interrupt [TIM0_COMP] void timer0_comp_isr(void) { // Place your code here TCNT0 = 0x00; //jika sudah compare match maka set awal lagi (autoreload) if(looping++ == 10000){ if (kondisi){ BarLED=0xAA; kondisi=0; }else{ BarLED=0x55; kondisi=1; } looping=0; } } // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
taufiq[at]eepis[minus]its[dot]edu
18
taufiq[at]eepis[minus]its[dot]edu
19
3. Generate delay 1 detik TIMER1 menggunakan mode CTC (Clear Timer on Compare Match Interrupt)
Mekanisme berikut ini adalah membuat delay 1 detik pada timer 1. Agar memperoleh waktu yang lebih presisi, didapatkan nilai Compare A = 2A2FH
taufiq[at]eepis[minus]its[dot]edu
20
Chip type : ATmega16 Program type : Application Clock frequency : 11.059200 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega16.h> #define LED_DETIK PORTD
// Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { // Place your code here LED_DETIK=~LED_DETIK; } // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
taufiq[at]eepis[minus]its[dot]edu
21
taufiq[at]eepis[minus]its[dot]edu
22
TUGAS
1. Hitung konstanta prescaler tiap percobaan. 2. Hitung waktu sesungguhnya setiap nilai heksa yang dihasilkan untuk tiap mode timer berdasarkan rumus yang ada. 3. Cuplik register pada timer hasil generator program 4. Catat pemakaian memory flash yang dipakai dari masing-masing percobaan. 5. Kemudian jelaskan setiap baris terhadap syntax dari semua percobaan diatas kemudian tarik kesimpulan. 6. Buat laporan resmi berdasarkan hasil pengamatan.!
taufiq[at]eepis[minus]its[dot]edu
23