MODUL 02 Timer, Counter, Interrupt Tsaqif Alfatan Nugraha (13214036) Asisten: Violla Gunnova Tanggal Percobaan: 20/02/2017 EL3214-Praktikum Sistem Mikroprosessor
Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB Abstrak Praktikum modul dua sistem mikroprosesor akan menjelaskan mengenani fungsi dari board arudion yakni timer/counter dan interrupt. Timer/counter merupakan sebuah fungsi di dalam arduino untuk menghitung waktu yang telah ditempuh dari suatu proses. Sementara, interrupt adalah inputan eksternal yang dapat merubah jalannya program. Sama dengan seperti praktikum sebelumnya, praktikan akan menggunakan software WINAVR dengan menggunakan bahasa C.
Bit 7 – FOC0
: Force Output Compare
Bit 6, 3 – WGM01/0 Mode
: Waveform Generation
Bit 5,4 – COM01/0 Mode
: Compare Match Output
Bit 2,0 – CS02/0
: Clock Select
Konfigurasi Mode Operasi [1]
Kata kunci: timer, counter, interrupt 1.
PENDAHULUAN
Terdapat empat percobaan yang akan dilakukan oleh praktikan. Perta ma, praktikan akan melakukan percobaan terkait delay dengan mengiakan timer/counter. Percobaan ini tidak akan menggunakan fun gsi delay yang terdapat dalam AVR-gcc sehingga praktikan harus membuat prosedur dari fungsi delay terlebih dahulu. Kedua, praktikan akan melakukan percobaan terkait external clock sebagai counter. Dalam hal ini, program akan menggunakan interrupt dan interrupt yang masuk pada progra m akan dihitung dengan counter. Ketiga, pra ktikan akan mendesai program aplikasi interrupt dengan timer/counter. Jadi, program akan mengalami 2 fasa. Fasa pertama a kan berubah ke fasa kedua setelah ada interrupt. Program tidak akan menggunakan interrupt eksternal, tapi interrupt akan terjadi setelah coun ter menghitung waktu yang diinginkan. Terakhir, praktikan akan mendesain progra m external interrupt. Terdapat dua interrupt yang dimiliki oleh program ini yang dapat mengubah jalannya program.
2.
Pengaturan perilaku pin OCO (misalnya untuk mode non – PWM [1]
Pengaturan sumber clock [1]
STUDI PUSTAKA Register-register penting lain [1]
2.1 KONFIGURASI TIMER/COUNTER DAN INTERRUPT Deskripsi register Timer/Counter ( Timer/Counter 0 ) [1]
8
Bit
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
1
Bit 7 – INTF1: External Interrupt Flag 1 Bit 6 – INTF1: External Interrupt Flag 0 Bit 5 – INTF1: External Interrupt Flag 2
3.
METODOLOGI
ALAT DAN KOMPONEN Bit 1 – OCIE0 : Timer/Coun ter Compare Match Interrupt Enable Bit 0 – TOIE0 : Interrupt Enable
Timer/Counter
0 0
Output Overflow
-
Alat-alat yang digunakan selama prak-tikum ini: PC Desktop (1 unit) dengan software WinAVR Kit (ATmega8535, Trainer Board) Kabel DB9 (1 buah) Kabel serial (2 buah)
3.2. LANGKAH KERJA Langkah awal mengeset fuse
adalah
merangkai
alat
dan
Rangkai kit sesuai dengan petunjuk yang ada di modul
Bit 1 – OCF0
: Output Compare Flag 0
Bit 0 – TOV0
: Timer/Counter0 Overflow Flag Hubungkan kit dengan downloader lalu dengan PC
2.2 KONFIGURASI EKSTERNAL INTERRUPT
Membaca pengaturan fuse dengan Avrdude
Mengubah pengaturan fuse dengan Avrdude Lalu untuk semua percobaan konsep langkah kerjanya sama seperti diagram dibawah ini : Source code diketik pada WinAVR
Membuat makefile dengan menggunakan program MFile
Bit 7 – INT1: External Interrupt Request 1 Enable
Download program ke mikrokontroler
Bit 6 – INT0: External Interrupt Request 0 Enable Bit 5 – INT2: External Interrupt Request 2 Enable
Run program, lalu amati hasilnya pada trainer board
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
2
4.
HASIL DAN ANALISIS
Dengan kata lain, counter akan menghitun g sebanyak 28800 kali tiap detik. Maka nilai OCR1A diset bernilai
II.A Delay dengan Timer/Counter II.A.1 Pada percobaan ini, praktikan akan membuat progra m yang menggunakan Timber/counter untuk fun gsi delay. Berikut ini hasil percobaan dan Low chart dari program. 7
8
6
5
4
3
2
1
0
Berganti seletelah 1 detik kemudian 7
8
6
5
4
3
2
1
0
START
DDRA = 0xFF PORTA 0X00 TCCR1A = 0 TCCR1B =0b00001100
1 PORTA=0x0F; Delay(); PORTA = 0XF0; Delay();
2880010 = 708016 Setelah diset nilai compare match-nya (OCR1A) maka prosedur akan looping hingga menemui nilai OCR1A setelah itu program akan mematikan interrupt (disable). Satu hal yang perlu diperhatikan pada progra m ialah penggunaan prosedur delay dan bukan menggunakan fungsi delay bawaan. Jika kita perhatikan, terdapat perbedaan antara prosedur delay yang dibuat pada program dan fungsi bawaan gcc. Perbedaannya tersebut ialah penggunaan clock. Jika men ggunakan fungsi delay bawaan maka frekuensi clock yang digunakan ialah frekuensi CPU sementara untuk delay frekuensi yang digunakan bisa berbeda beda. Selain itu, fun gsi delay pada gcc bisa menghitun g delay pada waktu yang diberikan hanya dengan merubah variabel fungsi sementara untuk prosedur delay pengubahan waktu delay yang diinginkan tidak bisa di dalam main program karena itulah ia merupakan prosedur. II.A.2 Pada percobaan A yang kedua, praktikan akan membuat program yang akan menyalakan LED dari 0x0F ke 0xF0 setelah x detik di mana untuk kelompok kami x bernilai 3 detik. Berikut ini hasil percobaan dan low chart program
END
7 Perta ma-tama register DDRA akan di set bernilai 0xFF sehingga port A akan bertindak sebagai output. Selanjutnya, program akan menggunakan prescalar 256 sehingga TCCR1B di set untuk memiliki bit 0b00001100. Nilai TCCR1 juga diset initial condition bernilai nol sehingga TCCR1A benrnilai nol. Progra m akan bergantian menyalakan LED dengan bit 0b00001111 dan bit 0b11110000 dengan delay satu detik. Pra ktikan akan men ggunakan prosedur delay buatan sendiri dengan memanfaatkan fitur timer/counter. Pada algoritma prosedur delay, register TCNT 1 di set bernilai nol. TCNT merupakan register yang berfungsi untuk mencacah counter dari nilai nol hingga maksimum. Kemudian waktu yang diinginkan dalam delay adalah satu detik, maka nilai register OCR1A harus di set dengan banyaknya getaran yang dilakukan dalam satu detik di mana progra m menggunakan frekuensi 7372800Hz dan prescaler 256 𝑓𝑡𝑖𝑚𝑒𝑟 =
7372800 256
8
6
5
4
3
2
1
0
Berganti seletelah 3 detik kemudian 7
8
6
5
4
3
2
1
0
START
DDRA = 0xFF PORTA 0X00 TCCR1A = 0 TCCR1B =0b00001100
1 PORTA=0x0F; Delay(); PORTA = 0XF0; Delay();
END
= 28800 Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
3
Yang menjadi perbedaan dari progra m ini dengan progra m pada percobaan sebelumnya ialah nilai pengesetan OCR1A. OCR1A akan diset sebagai berikut. 𝑂𝐶𝑅1𝐴 =
7372800𝑥3 256
START
TCCR0 = 0b00000110; TIMSK = (0<<0C1E0); DDRA= 0XFF;
= 86400
Karena nilai OCR1A memiliki nilai hexadecimal yang lebih dari 4 digit maka nilai prescaler harus diubah menjadi 1024, sehingga nilai OCR1A yang sebenarnya ialah 𝑜𝐶𝑅1𝐴 =
7372800𝑥3 1024
END
= 2160010 = 546016
TCNT0 = 123; 0CR0 = 124;
dan nilai TCCR1B = 0b00001101 untuk mengeset prescaler yang bernilai 1024 Terlihat dari penjelasan di atas bahwa penggunaan prescaler dalam suatu progra m sangatlah penting. Nilai prescaler yang berbeda dapat menyebabkan nilai compare match yang berbeda. Prescaler sendiri memiliki fungsi membagi clock. Nilai hasil pembagian ini yang kemudian akan menjadi frekuensi dari timer. Dengan demikian, frekuensi timer tidak akan secepat frekuensi clock, namun lebih kecil dari frekuensi clock. II.B External Clock Sebagai Counter II.B.1 Pada percobaan kali ini, progra m akan dibuat dengan memanfaatkan clock sebagai timer. Tombol interrupt push button akan dijadikan acuan. Counter akan menghitung sebanyak beberapa kali tombol ini ditekan dan setelah penekanan tersebut progra m utama akan berubah. Berikut ini hasil percobaan dan flow chart program
7
8
6
5
4
3
2
1
0
Program Default
↑
Berganti seletelah 2 kali penekanan tombol INT Program saat OCR>TNT, berlangsung selama 0,5 detik
↓
7
8
6
5
4
3
2
1
0
1
bit_is_clear
PORTA= 0b10101010
TIFR |= _BV(OCF0); PORTA = 0b01010101 _delay_ms(500);
Perta ma-tama progra m ini akan mengeset agar clock yang digunakan ialah clock external. Bit TCCR0 di set bernilai 0b00000110. Hal ini menunjukkan bahwa sumber external clock diambil pada pin T0(yang dihubungkan dengan IS1). Clock berada pada keadaan falling edge. Hal ini berarti jika tombol interrupt selesai ditekan, progra m baru menganggap itu sebagai clock. Dengan kata lain, jika tombol ditekan tanpa dilepas, progra m tidak menganggap itu sebagai clock. Program ini akan membandingkan nilai TCNT0 dan 0CR0. Selama kondisi clear maka nilai port A akan selalu bernilai 0b10101010. Kondisi clear sendiri berarti bahwa nilai TCNT0 tidak melebihi dari nilai 0CR0. Ketika nilai TCNT0 membesar hingga melebihi 0CR0 yakni pada saat bernilai 125 maka kondisi tidak clear lagi sehingga PORTA a kan diset un tuk bernilai 0b01010101 dan nilai TNCT0 akan di reset. II.B.2 Pada percobaan B yang kedua, program akan dibuat sehingga LED menyala semua selama x detik telah tombol ditekan sela ma x kali. Kelompok kami akan menggunakan nilai x=3. Berikut ini hasil percobaan dan flow chart program.
7
8 ↑
6
5
4
3
2
1
0
Program Default
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
4
Berganti seletelah 3 kali penekanan tombol INT Program saat OCR>TNT, berlangsung selama 3 detik
↓
7
8
6
5
4
3
2
1
0
START
TCCR0 = 0b00000110; TIMSK = (0<<0C1E0); DDRA= 0XFF;
END
1
TCNT0 = 123; 0CR0 = 125;
bit_is_clear
PORTA= 0b10101010
TIFR |= _BV(OCF0); PORTA = 0b01010101 Delay;
Yang berbeda dari progra m B.2 ialah nilai compare 0CR0 yang diperlukan. Pra ktikan mengeset nilai 0CR0 menjadi 125 sehingga la mpu LED akan menyala selama 3 detik. Sementara , progra m ini juga menggunakan prosedur delay yang telah dibuat pada percobaan A di mana nilai 0CR1A bernilai 5460. II.C Aplikasi Interrupt dengan Timer/Counter Pada percobaan ini, program akan melakukan interrupt setelah timer/counter telah menghitun g waktu terten tu. Mode timer yang digunakan ialah mode normal. Den gan demikian, timer akan memberikan interrupt pada keadaan overflow.
Flowchart ISR (atas) & Flowchart program utama 7
II.C.1 Progra m ini akan memberikan interrupt setelah melampaui satu detik. Hasil percobaan dan flowchart dari program dapat dilihat sebagai berikut.
6 ↑
↓
7
6
↓
7
5
4
3
2
1
0
Berganti-gantian selama 100ms 5
4
3
2
1
0
Tiap 1 detik mengalami interupsi dan LED nyala semua selama 200ms 6
5
4
3
2
1
0
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
5
Pada algoritma program yang mengandung interrupt terdapat suatu prosedur ISR . ISR(Interrupt Service Routine) merupakan sebuah prosedur yang a kan dijalankan ketika terjadi interrupt. Program uta ma akan ditinggalkan sementara ISR akan dijalankan. Algoritma ISR baru dijalankan apabila TIMER1 mengalami overflow. Nilai cacah dari timer1 akan disimpan dalam TCNT1. Progra m diinginkan untuk interrupt terjadi selama 1 detik. Maka kita harus mengeset nilai awal dari TCNT sehingga timer akan mengalami interrupt setelah 1 detik. TCNT1(16bit) akan mengalami overflow setelah nilainya mencapai 0xFFFF (65335 10 ). Dengan nilai ini, kita dapat men getahui berapa nilai timer awal yang harus di set sehingga terjadi overflow pada saat 1 detik. 𝑇𝐶𝑁𝑇𝑎𝑤𝑎𝑙 = 𝐹𝐹𝐹𝐹16 + 1 −
1𝑑𝑒𝑡𝑖𝑘 ∙ 7372800𝐻𝑧 1024 (𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟)
𝑇𝐶𝑁𝑇𝑎𝑤𝑎𝑙 = 6553610 − 7200 = 58336 = 𝐸3𝐸016 Oleh karena itu, TCNT1H bernilai 0xE3 DAN TCNT1L bernilai 0xE0. Hal yang perlu diperhatikan kembali ialah TCNT1H dan TCNT1L tidak hanya diset di awal saja namun di akhir ISR juga sehingga ketika prosedur ISR selesai , TCNT1 sudah bernilai 0xE3E0 kembali. Pada percobaan ini menggunakan mode timer normal. Jika kita perhatikan terdapat perbedaan antara mode timer dan mode CTC. Pada mode CTC, dilakukan perbandingan antara nilai timer saat tertentu den gan suatu nilai pembanding. Interupsi terjadi ketika nilai timer (TCNT) sudah melebihi nilai pembanding itu (OCR). Sementara pada mode normal, interupsi terjadi ketika timer sudah mengalami overflow. Pada register TCNT, overflow terjadi saat nilainya sudah melebihi 0xFF. II.C.2 Pada percobaan II.C.2, program akan diminta untuk melakukan interrupt setelah x detik, di mana untuk kelompok ka mi x bernilai 3. Berikut ini hasil pengamatan dan flowchart dari program 7
6 ↑
↓
7
6
↓
7
5
4
3
2
1
0
𝑇𝐶𝑁𝑇𝑎𝑤𝑎𝑙 = 𝐹𝐹𝐹𝐹16 + 1 −
Berganti-gantian selama 100ms 5
4
3
2
1
5
4
3
2
1
0
0
3𝑑𝑒𝑡𝑖𝑘 ∙ 7372800𝐻𝑧 1024 (𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟)
𝑇𝐶𝑁𝑇𝑎𝑤𝑎𝑙 = 4393610 = 𝐴𝐵𝐴016
Tiap 5 detik mengalami interupsi dan LED nyala semua selama 200ms 6
Yang menjadi perbedaan antara program ini dengan program II.C.1 ialah nilai counter yang diperlukan untuk mengalami interrupt yakni bernilai 5 detik. Sehingga nilai TCNT1 awal harus diset kembali sebagai berikut.
Sehingga TCNT1H bernilai 0xAB dan TCNT1L bernilai 0xA0. II.D External Interrup Pada program ini, kita akan menggunakan external interrupt un tuk mengalihkan progra m utama. External interrupt yang akan digunakan ialah INT0 dan INT1. Beberapa register yang
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
6
dibutuhkan antara lain seperti MCUCR, GICR , GIFCR. 7
II.D.1 Progra m pada percobaan II.D.1 diharapkan dapat bergantian-gantian sela ma 250ms untuk menyalakan lampu LED 0b10101010 dan 0b01010101 pada progra m utama. Kemudian jika interrupt diberikan, lampu LED menyala berurutan satupersatu dari kanan ke kiri. Berikut ini hasil percobaan dan flowchart program.
START
MCUCR=0x02; MCUSCR = 0x00; GICR = 0x40 GIFR = 0X40;
sei(); DDRA = 0xFF
1 PORTA=0b10101010; _delay_ms(500); PORTA = 0b01010101; _delay_ms(500);
END
Flowchart program utama
6 ↑
↓
7
6
END
Flowchart program Interrupt
3
2
1
0
Berganti-gantian selama 500ms 5
4
3
2
1
0
Ketika INT0 aktif
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
Sumber interupsi yang digunakan ialah INT0 sehingga pada kurung kurawal ISR terisi (INT0_vect). Selain itu, ada beberapa register lain yang juga perlu diatur nilainya agar kita bisa menggunakan external interrupt. Nilai register yang perlu diatur nilainya adalah sebagai berikut.
GICR harus bernilai 0x40 atau 0b01000000. Dengan nilai ini, maka INT0 (bit 6 ) diaktifkan sebagai external interrupt.
MCUCR harus bernilai 0x02 atau 0b00000010. Dengan nilai ini, maka ISC01 (bit 1) bernilai 1 dan ISC00 (bit 0) bernilai 0. Pengaturan seperti ini menyebabkan interupsi dari INT0 akan aktif ketika INT0 mengalami falling edge.
GIFR harus bernilai 0x40 atau 0b01000000. Dengan nilai ini, maka interrupt flag dari INT0 (bit 6) akan aktif.
i=0x01; n=0;
n<8
4
↓
START
PORTA = i; _delay_ms(250); i=(i<<1)|(i>>7); n++;
5
Dengan pengaturan register demikian, maka setiap kali tombol IS1 ditekan (falling edge) akan terjadi interupsi dan algoritma pada ISR akan dijalankan. Selanjutnya jika analisis lebih dalam, apakah yang terjadi jika external interrupt dan timer interrupt aktif dalam keadaan yang sama ? Bila timer interrupt dan external interrupt terjadi secara bersamaan, maka mikrokontroler akan mendahulukan external interrupt. Hal ini dapat dilihat dari urutan prioritas yang ada pada Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
7
ATMega. Pada tabel prioritas ATMega, external interrupt memiliki prioritas yang lebih tinggi dibandingkan timer interrupt sehingga external interrupt-lah yang akan dieksekusi ketika timer interrupt dan external interrupt terjadi secara bersamaan.
START
PORTA = 0x99; _delay_ms(500); PORTA=0x66; _delay_ms(500);
II.D.2 Pada percobaan ini, external interrupt yang digunakan adalah dua buah, yakni dari INT0 dan INT1. INT0 dihubungkan den gan IS1 dan INT1 dihubungkan den gan IS3. Pada program uta ma, LED diharapkan berkedip (mati -menyala) secara bersamaan setiap 500 ms. Ketika ada interupsi dari INT0, maka nyala LED akan berkedip membentuk 0x99 dan 0x66 secara bergantian setiap 500 ms. Ketika ada interupsi dari INT1, maka nyala LED akan berkedip membentuk biner dari 2 digit terakhir NIM pra ktikan pertama dan biner dari 2 digit terakhir NIM praktikan kedua secara bergantian setiap 500 ms. 2 digit terakhir NIM praktikan perta ma adalah 18, maka nyala LED membentuk 0b00010010. NIM praktikan kedua adalah 19, maka nyala LED membentuk 0b00010011. Flowchart algoritma dan hasil percobaan ini adalah sebagai berikut.
END
Flowchart Program Interrupt INT0
START
PORTA = 0x24; _delay_ms(500); PORTA=0x25; _delay_ms(500);
END
Flowchart Program Interrupt INT1 7
START
MCUCR=0x0A; MCUSCR = 0x00; GICR = 0xC0 GIFR = 0XC0;
6 ↑
↓
7
6
6 ↓
DDRA = 0xFF
7
6
5
0
4
3
2
1
0
4
3
2
1
0
5
4
3
2
1
0
Ketika INT1 aktif 6
↑ 7
1
Berganti-gantian selama 500ms
↓ 7
2
Berganti-gantian selama 500ms
5
↑
1
3
Ketika INT0 aktif
sei();
END
4
↓ 7
PORTA=0b11111111; _delay_ms(500); PORTA = 0b00000000; _delay_ms(500);
5
5
3
2
1
0
Berganti-gantian selama 500ms
↓ 6
4
5
4
3
2
1
0
Flowchart Program Utama Pada tugas ini, modifikasi yang dilakukan terletak pada algoritma progra m uta ma, algoritma ISR untuk interupsi INT0, dan penambahan algoritma ISR untuk interupsi INT1. Pada progra m uta ma, nilai PORTA diisi 0xFF dan 0x00 yang diberi delay 500 ms di antaranya. Pada ISR INT0, PORTA diisi Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
8
dengan 0x99 dan 0x66 yang diberi delay 500 ms di antaranya. Pada ISR INT1, PORTA diisi dengan 0x12 dan 0x13 yang diberi delay 500 ms di antaranya. Selain itu, modifikasi juga dilakukan pada nilai register GICR, MCUCR, dan GIFR. Perubahan yang dilakukan adalah sebagai berikut.
GICR diubah menjadi 0xC0 atau 0b11000000. Dengan nilai ini, maka INT1 (bit 7) ikut diaktifkan (sebelumnya belum aktif). MCUCR diubah menjadi 0x0A atau 0b00001010. Dengan nilai ini, maka ISC10 (bit 2) bernilai 0 dan ISC 11 (bit 3) bernilai 1. Menurut datasheet, dengan pengaturan seperti ini, maka interupsi dari INT1 akan terjadi ketika INT1 falling edge. GIFR harus diubah menjadi 0xC0. Dengan nilai ini, maka flag dari INT1 (bit 7) juga ikut diaktifkan.
Mikrokontroller ATMega8535 mempunyai fasilitas timer/counter dan interrupt.
Terdapat beberapa register penting dalam penggunaan timer/counter yakni antara lain seperti TCCR, TCNT, OCR,TIMSK, dan TIFR
TCCR merupakan register timer yang sedang digunakan, apakah itu timer 0, timer 1, timer2.
TCNT merupakan register pencacah dari fungsi timer/counter
OCR merupakan register pembanding terhadap TCNT jika ingin dilakukan interrupt.
Terdapat dua mode timer ya kni mode CTC dan mode normal.
Selain itu, terdapat juga beberapa register penting dalam penggunaan interrupt yakni MCUCR, MCUSCR, GICR, GIFCR.
Dengan modifikasi seperti di atas, maka nyala LED akan sesuai dengan yang diharapkan.
DAFTAR PUSTAKA 5.
KESIMPULAN
Berdasarkan percobaan yang telah dilakukan praktikan, dapat disimpulkan beberapa poin penting sebagai berikut.
[1]
Jackstar H. S., Panduan Penulisan Laporan, Jacks Publishing, Bandung, 2008.
[2]
Laboratorium Dasar Teknik Elektro, Petunjuk Praktikum Sistem Mikroprosessor, ITB,Bandung, 2017.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
9
Lampiran TugasA1.c: #include
void init_tim(void); void Delay(void); int main() { DDRA = 0x00; init_tim(); while (1) { PORTA = 0x0F; Delay(); PORTA = 0xF0; Delay(); } return 0; } void init_tim(void) { // mode operasi CTC, sumber clock prescaller 256 TCCR1A = 0; TCCR1B = 0b00001100; // overflow interrupt disable TIMSK |= (0<
Tugas A2.c #include void init_tim(void); void Delay(void); int main() { DDRA = 0x00; init_tim(); while (1) { Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
1 0
PORTA = 0x0F; Delay(); PORTA = 0xF0; Delay(); } return 0; } void init_tim(void) { // mode operasi CTC, sumber clock prescaller 1024 TCCR1A = 0; TCCR1B = 0b00001101; // overflow interrupt disable TIMSK |= (0<
Tugas B1.c #include #include #define F_CPU 7372800UL void init_tim(void); int main() { DDRA = 0xFF; init_tim(); while (1) { // penentuan nilai awal timer TCNT0 = 123; // penentuan nilai compare OCR0 = 124; // menanti compare match while (bit_is_clear(TIFR, OCF0)) { PORTA = 0b10101010; } // meng-nol-kan flag TIFR |= _BV(OCF0); PORTA = 0b01010101; Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
11
_delay_ms(500); //_delay_ms(6000); } return 0; } void init_tim(void) { // mode operasi dan sumber clock TCCR0 = 0b00000110; // overflow interrupt disable TIMSK = (0<
TugasB2.c #include #include #define F_CPU 7372800UL void init_tim(void); int main() { DDRA = 0xFF; init_tim(); while (1) { // penentuan nilai awal timer TCNT0 = 123; // penentuan nilai compare hingga 3 kali pemencetan interrupt OCR0 = 125; // menanti compare match while (bit_is_clear(TIFR, OCF0)) { PORTA = 0b10101010; } // meng-nol-kan flag TIFR |= _BV(OCF0); PORTA = 0b01010101; _delay_ms(500); //_delay_ms(6000); } return 0; } void init_tim(void) { // mode operasi dan sumber clock TCCR0 = 0b00000110; // overflow interrupt disable TIMSK = (0<
12
} void Delay(void) { // overflow interrupt enable TIMSK |= _BV(TOIE1); // penentuan nilai awal timer TCNT1H = 0; TCNT1L = 0; // penentuan nilai compare untuk delay 3 detik OCR1AH = 0x54; OCR1AL = 0x60; // menunggu hingga compare match, nilai TCNT1 = OCR1A loop_until_bit_is_set(TIFR, OCF1A); // meng-nol-kan flag TIFR |= _BV(OCF1A); //overflow interrupt disable TIMSK |= _BV(TOIE1); }
TugasC1.c #include #include #include #define F_CPU 7372800UL // 8MHz void init_int(void); ISR(TIMER1_OVF_vect) { PORTA = 0xFF; _delay_ms(200); TIFR = (1<
13
}
TugasC2.c #include #include #include #define F_CPU 7372800UL // 8MHz void init_int(void); ISR(TIMER1_OVF_vect) { PORTA = 0xFF; _delay_ms(200); TIFR = (1<
TugasD1.c #include #include #include #define F_CPU 7372800UL // 8MHz void init_Ext_Int(void); ISR(INT0_vect) { unsigned char i = 0x01, n; for (n=0;n<8;++n) { PORTA = i; _delay_ms(250); i = (i<<1) | (i>>7); Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
14
} } int main() { init_Ext_Int(); sei(); DDRA = 0xFF; while (1) { PORTA = 0b10101010; _delay_ms(100); PORTA = 0b01010101; _delay_ms(100); } return 0; } void init_Ext_Int(void) { MCUCR = 0x02; MCUCSR = 0x00; GICR = 0x40; GIFR = 0x40; } TugasD2.c #include #include #include #define F_CPU 7372800UL // 8MHz void init_Ext_Int(void); ISR(INT0_vect) { PORTA = 0x99; _delay_ms(500); PORTA = 0x66; _delay_ms(500); } ISR(INT1_vect) { PORTA = 0x24; _delay_ms(500); PORTA = 0x27; _delay_ms(500); } int main() { init_Ext_Int(); sei(); DDRA = 0xFF; while (1) { PORTA = 0xFF; _delay_ms(500); PORTA = 0x00; _delay_ms(500); } return 0; } Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
15
void init_Ext_Int(void) { MCUCR = 0x0A; MCUCSR = 0x00; GICR = 0xC0; GIFR = 0xC0; }
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
16