membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

27
Membuat Stopwatch Menggunakan Mikrokontroler ATMega16 by Muhammad Kennedy Ginting A. Deskripsi Umum Bicara tentang stopwatch, benda ini adalah benda yang lumayan terkenal dibidang olahraga pada umumnya. Kali ini saya ingin berbagi bagaimana membuat stopwatch sederhana. Lebih tepatnya bisa di jadikan widget buatan kita sendiri atau bisa Anda jadikan sebagai bahan untuk belajar serta refrensi. Saya akan menggunakan LCD 16x2 dengan 3 switch button (Start, Stop, Reset) dengan mikrokontroller Atmega16. Compiler yang digunakan yakni Codevision AVR. B. Spesifikasi Teknis dan Karakteristik Aplikasi ini merupakan sebuah stopwatch sederhana yang dapat menghitung sampai satuan waktu terkecil yaitu 1/100 detik atau 10 ms. Untuk membangkitkan timer 10 ms saya menggunakan fitur timer0 mikrokontroller. C. Daftar Komponen 1. Sistem Minimum Atmega16 ATmega16 IC 7805 Crystal 12MHz Kapasitor 22pF (2), 100nF (4), 100uF(2) 2 Resistor 1KΩ 4 Switch Button 1x40 Female Header 1x40 Male Header 1N4002 2. LCD 16x2 3. Potensiometer 1KΩ 4. Battery 9V

Upload: muhammad-kennedy-ginting

Post on 22-Nov-2014

437 views

Category:

Engineering


11 download

DESCRIPTION

Membuat stopwatch menggunakan mikrokontroler ATmega16 by muhammad kennedy ginting. Dini akan diberikan penjelasan tentang timer0, timer1, counter0, counter1, skematik stopwatch dan list programnya.

TRANSCRIPT

Page 1: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

Membuat Stopwatch Menggunakan Mikrokontroler ATMega16 by Muhammad Kennedy Ginting

A. Deskripsi Umum Bicara tentang stopwatch, benda ini adalah benda yang lumayan terkenal dibidang olahraga pada umumnya. Kali ini saya ingin berbagi bagaimana membuat stopwatch sederhana. Lebih tepatnya bisa di jadikan widget buatan kita sendiri atau bisa Anda jadikan sebagai bahan untuk belajar serta refrensi.Saya akan menggunakan LCD 16x2 dengan 3 switch button (Start, Stop, Reset) dengan mikrokontroller Atmega16. Compiler yang digunakan yakni Codevision AVR.

B. Spesifikasi Teknis dan KarakteristikAplikasi ini merupakan sebuah stopwatch sederhana yang dapat menghitung sampai satuan waktu terkecil yaitu 1/100 detik atau 10 ms. Untuk membangkitkan timer 10 ms saya menggunakan fitur timer0 mikrokontroller.

C. Daftar Komponen1. Sistem Minimum Atmega16

ATmega16 IC 7805 Crystal 12MHz Kapasitor 22pF (2), 100nF (4), 100uF(2) 2 Resistor 1KΩ 4 Switch Button 1x40 Female Header 1x40 Male Header 1N4002

2. LCD 16x23. Potensiometer 1KΩ4. Battery 9V5. Downloader AVR

D. Prinsip Kerja dan RangkaianPada aplikasi ini terdapat 3 buah tombol (push button) yang terdiri dari tombol START, STOP dan RESET. Tombol START digunakan untuk memulai stopwatch, STOP digunakan untuk memberhentikan stowatch dan tombol RESET untuk me-reset (menset ulang kembali nilai stopwatch).

Untuk counter (pencacah/penghitung) berbeda dengan timer, perbedaan yang mendasar adalah pada sumber clocknya. Jika timer, sumber clocknya berasal dari internal mikrokontroler dalam hal ini berasal dari kristal.

Page 2: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

Sedangkan untuk counter sumber clocknya berasal dari luar mikrokontroler (eksternal). Sebagai contoh counter, jika kita ingin menghitung banyaknya barang yang lewat pada konveyor, maka sumber clocknya berasal dari sensor yang mendeteksi barang saat melewatinya.

Pada Atmega16 terdapat 3 buah timer, yaitu Timer0 (8 bit), Timer1 (16 bit) dan Timer2 (8 bit). Untuk perbedaan dan cara kerja masing-masing timer, teman-teman dapat membacanya pada datasheet. Disini saya akan coba membahas Timer0 dan Timer1 saja. Untuk lebih jelasnya silakan download datasheet ATmega8535 disini.

Perhitungan untuk Timero dan Timer1 adalah sebagai berikut:Ttimer0 = Tosc*(256-TCNT0)*N → (8 bit = 256)Ttimer1 = Tosc*(65536-TCNT1)*N → (16 bit = 65536)

Tosc = 1/Fosc → pada aplikasi ini saya menggunakan kristal 12 MHz, sehingga:Tosc = 1/12Mhz = 0,0000000833 detik

Dimana:Ttimer0 = lamanya periode Timer0Ttimer1 = lamanya periode Timer1TCNT0 = Register Timer0TCNT1 = Register Timer1N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)Tosc = periode clockFosc = frekuensi clock kristal

TimerSekarang saya akan membuat aplikasi timer yang ditampilkan pada LCD, cara kerjanya pada LCD akan menampilkan nilai awal yaitu 0 kemudian setelah 1 detik (menggunakan timer) nilai tersebut akan naik menjadi 1, kemudian 2 dan seterusnya, jika sudah sampai 100 maka akan diset kembali menjadi 0. Berikut adalah skematiknya:

Page 3: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

Gambar 1. Skematik Untuk Timer1 dan Timer0

Menggunakan Timer1:Ttimer1 = Tosc*(65536-TCNT1)*NPada aplikasi diatas diinginkan lamanya timer adalah 1 detik (Ttimer1 = 1 detik) dan jika saya menggunakan kristal 12 MHz dan menggunakan skala clock N = 1024, maka didapat:1 = 0,0000000833*(65536-TCNT1)*1024TCNT1= 53818 = D23A (dalam hexa)

Dari perhitungan diatas didapat nilai 53818 atau dalam hexa D23A, nilai tersebut harus diisikan pada register TCNT1 agar Timer 1 bernilai 1 detik.Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:

Gambar 2. Setting Pada Timer1

Page 4: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat dari Fosc/N atau 12 Mhz/1024. Berikut adalah listing program lengkapnya:

/*****************************************************This program was produced by theCodeWizardAVR V2.05.3 StandardAutomatic Program Generator© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.com

Project : TImer1Version : v.1Date : 07/08/2014Author : Muhammad Kennedy GintingCompany : Apartment 57Comments:

Chip type : ATmega16Program type : ApplicationAVR Core Clock frequency: 12,000000 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*****************************************************/

unsigned char temp[6];int data;

#include <mega16.h>#include <stdlib.h>

// Alphanumeric LCD functions#include <alcd.h>

// Timer1 overflow interrupt service routineinterrupt [TIM1_OVF] void timer1_ovf_isr(void)// Reinitialize Timer1 valueTCNT1H=0xD23A >> 8;TCNT1L=0xD23A & 0xff;// Place your code heredata++;

// Declare your global variables here

void main(void)

Page 5: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

// 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=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 PORTD=0x00;DDRD=0x00;

// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: Timer 0 Stopped// Mode: Normal top=0xFF// OC0 output: DisconnectedTCCR0=0x00;TCNT0=0x00;OCR0=0x00;

// Timer/Counter 1 initialization// Clock source: System Clock// Clock value: 11,719 kHz// Mode: Normal top=0xFFFF// OC1A output: Discon.// OC1B output: Discon.

Page 6: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

// Noise Canceler: Off// Input Capture on Falling Edge// Timer1 Overflow Interrupt: On// Input Capture Interrupt: Off// Compare A Match Interrupt: Off// Compare B Match Interrupt: OffTCCR1A=0x00;TCCR1B=0x05;TCNT1H=0xD2;TCNT1L=0x3A;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;

// Timer/Counter 2 initialization// Clock source: System Clock// Clock value: Timer2 Stopped// Mode: Normal top=0xFF// OC2 output: DisconnectedASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;

// External Interrupt(s) initialization// INT0: Off// INT1: Off// INT2: OffMCUCR=0x00;MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x04;

// USART initialization// USART disabledUCSRB=0x00;

// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: OffACSR=0x80;SFIOR=0x00;

// ADC initialization// ADC disabledADCSRA=0x00;

Page 7: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

// SPI initialization// SPI disabledSPCR=0x00;

// TWI initialization// TWI disabledTWCR=0x00;

// Alphanumeric LCD initialization// Connections are specified in the// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:// RS - PORTC Bit 0// RD - PORTC Bit 1// EN - PORTC Bit 2// D4 - PORTC Bit 4// D5 - PORTC Bit 5// D6 - PORTC Bit 6// D7 - PORTC Bit 7// Characters/line: 16lcd_init(16);

// Global enable interrupts#asm("sei")

while (1) // Place your code here if (data==100) lcd_clear(); data=0; lcd_gotoxy(0,0); lcd_putsf("Uji Coba Timer1"); itoa(data,temp); //menampilkan di LCD lcd_gotoxy(0,1); lcd_puts(temp);

Menggunakan Timer0:Ttimer0 = Tosc*(256-TCNT0)*NDengan menggunakan Timer0, untuk aplikasi yang sama seperti diatas, sebenarnya timer0 ini tidak dapat menghasilkan periode timer selama 1 detik dikarenakan keterbatasan jumlah bit yaitu hanya 8 bit (256) saja. Tetapi kita masih dapat memanupulasi program agar dapat menghasilkan timer selama 1

Page 8: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

detik, caranya dengan membuat timer selama 10 ms kemudian dilakukan pengulangan sebanyak 100 kali, maka akan dihasilkan timer selama 1 detik.

10 ms * 100= 1 detik

Pada aplikasi ini diinginkan lamanya timer adalah 10 ms (Ttimer0=10 ms=0.01 s) dan jika saya menggunakan kristal 12 MHz dan menggunakan skala clock N = 1024, maka didapat:

0.01 = 0,0000000833*(256-TCNT0)*1024TCNT0= 138 = 8A (dalam hexa)

Dari perhitungan diatas didapat nilai 138 atau dalam hexa 8A, nilai tersebut harus diisikan pada register TCNT0 agar Timer 0 bernilai 10 mili detik. Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:

Gambar 3. Setting Pada Timer0

Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat dari Fosc/N atau 12 Mhz/1024. Berikut adalah listing program lengkapnya:

/*****************************************************This program was produced by theCodeWizardAVR V2.05.3 StandardAutomatic Program Generator© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.com

Project : Timer0

Page 9: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

Version : v.1Date : 07/08/2014Author : Muhammad Kennedy GintingCompany : Apartment 57Comments:

Chip type : ATmega16Program type : ApplicationAVR Core Clock frequency: 12,000000 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*****************************************************/

unsigned char temp[6], loop=0;int data;

#include <mega16.h>#include <stdlib.h>

// Alphanumeric LCD functions#include <alcd.h>

// Timer 0 overflow interrupt service routineinterrupt [TIM0_OVF] void timer0_ovf_isr(void)// Reinitialize Timer 0 valueTCNT0=0x8A;// Place your code hereloop++;if (loop>=100) data++; loop=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;

Page 10: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

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=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 PORTD=0x00;DDRD=0x00;

// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: 11,719 kHz// Mode: Normal top=0xFF// OC0 output: DisconnectedTCCR0=0x05;TCNT0=0x8A;OCR0=0x00;

// Timer/Counter 1 initialization// Clock source: System Clock// Clock value: Timer1 Stopped// Mode: Normal top=0xFFFF// OC1A output: Discon.// OC1B output: Discon.// Noise Canceler: Off// Input Capture on Falling Edge// Timer1 Overflow Interrupt: Off// Input Capture Interrupt: Off// Compare A Match Interrupt: Off// Compare B Match Interrupt: OffTCCR1A=0x00;TCCR1B=0x00;TCNT1H=0x00;

Page 11: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;

// Timer/Counter 2 initialization// Clock source: System Clock// Clock value: Timer2 Stopped// Mode: Normal top=0xFF// OC2 output: DisconnectedASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;

// External Interrupt(s) initialization// INT0: Off// INT1: Off// INT2: OffMCUCR=0x00;MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x01;

// USART initialization// USART disabledUCSRB=0x00;

// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: OffACSR=0x80;SFIOR=0x00;

// ADC initialization// ADC disabledADCSRA=0x00;

// SPI initialization// SPI disabledSPCR=0x00;

// TWI initialization// TWI disabledTWCR=0x00;

Page 12: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

// Alphanumeric LCD initialization// Connections are specified in the// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:// RS - PORTC Bit 0// RD - PORTC Bit 1// EN - PORTC Bit 2// D4 - PORTC Bit 4// D5 - PORTC Bit 5// D6 - PORTC Bit 6// D7 - PORTC Bit 7// Characters/line: 16lcd_init(16);

// Global enable interrupts#asm("sei")

while (1) // Place your code here if (data==100) lcd_clear(); data=0; lcd_gotoxy(0,0); lcd_putsf("Uji Coba Timer0"); itoa(data,temp); //menampilkan di LCD lcd_gotoxy(0,1); lcd_puts(temp);

CounterUntuk aplikasi counter lebih mudah dibandingkan dengan timer, karena kita tidak harus lagi menghitung untuk mendapatkan nilai dari register TCNT, tetapi secara otomatis register TCNT yang akan mencacah jika ada input yang masuk.Berikut adalah aplikasi counter untuk menghitung dan ditampilkan pada LCD, input yang digunakan berasal dari pushbutton. Berikut adalah schematicnya:

Page 13: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

Gambar 4. Skematik Untuk Counter0 dan Counter1

Counter0Input untuk counter0 berasal dari pin T0 atau PB0. Counter0 hanya mampu mencacah sampai dengan nilai 256 dikarenakan counter 8 bit. Berikut adalah setting pada CodeVision CodeWizard AVR:

Gamabar 5. Setting Pada Counter0

Berikut adalah listing program lengkap:

/*****************************************************This program was produced by theCodeWizardAVR V2.05.3 StandardAutomatic Program Generator© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.com

Project : Counter0

Page 14: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

Version : v.1Date : 07/08/2014Author : Muhammad Kennedy GintingCompany : Apartment 57Comments:

Chip type : ATmega16Program type : ApplicationAVR Core Clock frequency: 12,000000 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*****************************************************/

unsigned char temp[6];int data;

#include <mega16.h>#include <stdlib.h>

// Alphanumeric LCD functions#include <alcd.h>

// 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

Page 15: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

// 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=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 PORTD=0x00;DDRD=0x00;

// Timer/Counter 0 initialization// Clock source: T0 pin Falling Edge// Mode: Normal top=0xFF// OC0 output: DisconnectedTCCR0=0x06;TCNT0=0x00;OCR0=0x00;

// Timer/Counter 1 initialization// Clock source: System Clock// Clock value: Timer1 Stopped// Mode: Normal top=0xFFFF// OC1A output: Discon.// OC1B output: Discon.// Noise Canceler: Off// Input Capture on Falling Edge// Timer1 Overflow Interrupt: Off// Input Capture Interrupt: Off// Compare A Match Interrupt: Off// Compare B Match Interrupt: OffTCCR1A=0x00;TCCR1B=0x00;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;

// Timer/Counter 2 initialization// Clock source: System Clock// Clock value: Timer2 Stopped// Mode: Normal top=0xFF

Page 16: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

// OC2 output: DisconnectedASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;

// External Interrupt(s) initialization// INT0: Off// INT1: Off// INT2: OffMCUCR=0x00;MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x00;

// USART initialization// USART disabledUCSRB=0x00;

// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: OffACSR=0x80;SFIOR=0x00;

// ADC initialization// ADC disabledADCSRA=0x00;

// SPI initialization// SPI disabledSPCR=0x00;

// TWI initialization// TWI disabledTWCR=0x00;

// Alphanumeric LCD initialization// Connections are specified in the// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:// RS - PORTC Bit 0// RD - PORTC Bit 1// EN - PORTC Bit 2// D4 - PORTC Bit 4// D5 - PORTC Bit 5// D6 - PORTC Bit 6// D7 - PORTC Bit 7// Characters/line: 16lcd_init(16);

Page 17: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

while (1) // Place your code here data=TCNT0;//hasil counter (TCNT0) dipindah ke data if (data>=256) lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("Uji Coba Counter0"); itoa(data,temp); //menampilkan di LCD lcd_gotoxy(0,1); lcd_puts(temp);

Counter1Counter1 tidak jauh berbeda dengan counter0, hanya saja maksimum pencacahan counter1 sampai 65536 dikarenakan counter 16 bit, dan input untuk counter1 berasal dari pin T1 atau PB1. Untuk settingan dan program pada CodeVision AVR hampir sama dengan counter0, jadi tidak akan saya jelaskan lagi disini.

Langsung saja ke skematik rangkaian stopwatch.

Gambar 6. Rangkaian Untuk Stopwatch

Berikut adalah listimg program lengkapnya:

Page 18: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

/*****************************************************This program was produced by theCodeWizardAVR V2.05.3 StandardAutomatic Program Generator© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.com

Project : Stopwatch Version : v.1Date : 06/08/2014Author : Muhammad KennedyCompany : Apartment 57Comments:

Chip type : ATmega16Program type : ApplicationAVR Core Clock frequency: 12,000000 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*****************************************************/

unsigned char count, temp[16], indeks=0, detik=0, menit=0, jam=0;#include <mega16.h>#include <stdio.h>#include <stdlib.h>#include <delay.h>// Alphanumeric LCD functions

#include <alcd.h>#asm .equ __lcd_port=0x15 ;PORTC#endasm

// Timer 0 overflow interrupt service routineinterrupt [TIM0_OVF] void timer0_ovf_isr(void)// Reinitialize Timer 0 valueTCNT0=0x8A;count++;// Place your code here

void hitung_waktu()if (count>=100)

Page 19: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

lcd_clear(); detik++; count=0; if (detik>=60) menit++; detik=0; if (menit>=60) jam++; menit=0;

void detek_tombol()if (PINA.0==0 && (indeks==0 || indeks==2))//start timer indeks=1; TIMSK=0x01;//memulai timer lcd_clear(); if (PINA.1==0 && indeks==1)//stop timer indeks=2; TIMSK=0x00;//menstop timer lcd_clear(); if (PINA.2==0 && indeks==2)//reset timer indeks=0;//semua data direset count=0; detik=0; menit=0; jam=0; lcd_clear();

void tampil_lcd()lcd_gotoxy(0,0);sprintf(temp,"Timer %d:%d:%d:%d",jam,menit,detik,count);lcd_puts(temp);//tampilkan waktu di LCD baris pertamaif (indeks==0) lcd_gotoxy(0,1); lcd_putsf("START");

Page 20: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

if (indeks==1) lcd_gotoxy(0,1); lcd_putsf("STOP"); if (indeks==2) lcd_gotoxy(0,1); lcd_putsf("START RESET");

// 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=0x0f;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=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

Page 21: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

PORTD=0x00;DDRD=0x00;

// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: 11,719 kHz// Mode: Normal top=0xFF// OC0 output: DisconnectedTCCR0=0x05;TCNT0=0x8A;OCR0=0x00;

// Timer/Counter 1 initialization// Clock source: System Clock// Clock value: Timer1 Stopped// Mode: Normal top=0xFFFF// OC1A output: Discon.// OC1B output: Discon.// Noise Canceler: Off// Input Capture on Falling Edge// Timer1 Overflow Interrupt: Off// Input Capture Interrupt: Off// Compare A Match Interrupt: Off// Compare B Match Interrupt: OffTCCR1A=0x00;TCCR1B=0x00;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;

// Timer/Counter 2 initialization// Clock source: System Clock// Clock value: Timer2 Stopped// Mode: Normal top=0xFF// OC2 output: DisconnectedASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;

// External Interrupt(s) initialization// INT0: Off// INT1: Off// INT2: OffMCUCR=0x00;

Page 22: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x00;

// USART initialization// USART disabledUCSRB=0x00;

// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: OffACSR=0x80;SFIOR=0x00;

// ADC initialization// ADC disabledADCSRA=0x00;

// SPI initialization// SPI disabledSPCR=0x00;

// TWI initialization// TWI disabledTWCR=0x00;

// Alphanumeric LCD initialization// Connections are specified in the// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:// RS - PORTC Bit 0// RD - PORTC Bit 1// EN - PORTC Bit 2// D4 - PORTC Bit 4// D5 - PORTC Bit 5// D6 - PORTC Bit 6// D7 - PORTC Bit 7// Characters/line: 16lcd_init(16);

// Global enable interrupts#asm("sei")

while (1) // Place your code here detek_tombol(); hitung_waktu(); tampil_lcd();

Page 23: Membuat stopwatch menggunakan mikrokontroler atmega16 by muhammad kennedy ginting

*Sistem Minimum Atmega16

*Skematik LCD 16x2

Selamat Mencoba GOOD LUCK !!!

Thank’s to Elektro Kontrolhttp://elektro-kontrol.blogspot.com