Ini adalah pertama kalinya saya menulis blog mengenai keprofesian saya (maklum masih amateur. hehe)
Baiklah, kali ini saya akan menjelaskan cara membuat stopwatch menggunakan ATMega 16 yang akan diprogram melalui CVAVR serta akan disimulasikan melalui ISIS Proteus.
Langkah pertama, sudah pasti, ayo kita buat dulu project pada CVAVR!!!
Sehingga tampil kotak dialog lain... Kemudian untuk mempermudah kodingan kita, maka kita pilih OK pada konfirmasi penggunaan Code Wizard.
Kemudian di kotak dialog selanjutnya, kita pilih chip ATMega. Kemudian akan muncul :
Setelah muncul kotak dialog tersebut, kita atur clock sesuai yang kita inginkan, dan atur chip yang digunakan menjadi ATMega 16. Selain itu, atur pula Port yang digunakan (disini kita hanya mengubah PORT C menjadi output direction), External IRQ untuk penambahan fitur interupt, serta pada submenu Alphanumeric LCD. Langkah-langkahnya seperti gambar di bawah ini :
Lalu kita lakukan generate and save project kita. Gunakanlah hanya satu folder untuk tempat penyimpanan file-file ini.
Kemudian akan muncul, source code kosong yang belum ada algoritma untuk program utamanya.
Untuk mempermudah tuliskanlah code pada source code tersebut seperti kode di bawah ini :
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
// Alphanumeric LCD functions
#include <alcd.h>
char tampung[16]; // array tempat kita memunculkan kata2 pada LCD
int ms1,ms2,s1,s2,m1,m2; // variabel2 parameter waktu milidetik, detik, dan menit
int p,r; // variabel state untuk pause dan reset
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
p = p + 1;
r = 0;
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
r = 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
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C 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
PORTC=0x00;
DDRC=0xFF;
// 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: Disconnected
TCCR0=0x00;
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: Off
TCCR1A=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: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
// INT2: Off
GICR|=0xC0;
MCUCR=0x0A;
MCUCSR=0x00;
GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=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: 16
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
delay_ms (4);
if (r == 0)
{
if (p == 0)
{
ms1 = ms1;
}
else if (p == 1)
{
ms1 = ms1 + 1;
}
else if (p == 2)
{
p = 0;
}
}
else if (r == 1)
{
ms1 = 0; ms2 = 0; s1 = 0; s2 = 0; m1 = 0; m2 = 0;
}
if (ms1 == 10)
{
ms1 = 0;
ms2 = ms2 + 1;
}
if (ms2 == 6)
{
ms2 = 0;
s1 = s1 + 1;
}
if (s1 == 10)
{
s1 = 0;
s2 = s2 + 1;
}
if (s2 == 6)
{
s2 = 0;
m1 = m1 + 1;
}
if (m1 == 10)
{
m1 = 0;
m2 = m2 + 1;
}
lcd_gotoxy(0,0); //menampilkan data di kolom 0 baris ke-0
lcd_puts("stopwatch");
sprintf(tampung,"%i%i : %i%i : %i%i ",m2,m1,s2,s1,ms2,ms1 ); // simpan data integer ke array tampung[16]
lcd_gotoxy(0,1); //menampilkan data di kolom 0 baris ke-2
lcd_puts(tampung); //menampilkan array tampung bertype char
}
}
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
// Alphanumeric LCD functions
#include <alcd.h>
char tampung[16]; // array tempat kita memunculkan kata2 pada LCD
int ms1,ms2,s1,s2,m1,m2; // variabel2 parameter waktu milidetik, detik, dan menit
int p,r; // variabel state untuk pause dan reset
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
p = p + 1;
r = 0;
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
r = 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
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C 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
PORTC=0x00;
DDRC=0xFF;
// 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: Disconnected
TCCR0=0x00;
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: Off
TCCR1A=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: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
// INT2: Off
GICR|=0xC0;
MCUCR=0x0A;
MCUCSR=0x00;
GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=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: 16
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
delay_ms (4);
if (r == 0)
{
if (p == 0)
{
ms1 = ms1;
}
else if (p == 1)
{
ms1 = ms1 + 1;
}
else if (p == 2)
{
p = 0;
}
}
else if (r == 1)
{
ms1 = 0; ms2 = 0; s1 = 0; s2 = 0; m1 = 0; m2 = 0;
}
if (ms1 == 10)
{
ms1 = 0;
ms2 = ms2 + 1;
}
if (ms2 == 6)
{
ms2 = 0;
s1 = s1 + 1;
}
if (s1 == 10)
{
s1 = 0;
s2 = s2 + 1;
}
if (s2 == 6)
{
s2 = 0;
m1 = m1 + 1;
}
if (m1 == 10)
{
m1 = 0;
m2 = m2 + 1;
}
lcd_gotoxy(0,0); //menampilkan data di kolom 0 baris ke-0
lcd_puts("stopwatch");
sprintf(tampung,"%i%i : %i%i : %i%i ",m2,m1,s2,s1,ms2,ms1 ); // simpan data integer ke array tampung[16]
lcd_gotoxy(0,1); //menampilkan data di kolom 0 baris ke-2
lcd_puts(tampung); //menampilkan array tampung bertype char
}
}
Kemudian kita save, lalu lakukan build all pada file ini. Dan kita buat file .hex dengan cara memilih menu tools, dan pihih chip programmer. maka akan muncul kotak dialog :
Kita pilih menu file pada kotak dialog tadi, dan pilih save Flash. Dan gunakanlah ekstensi filenya .hex.
Akhirnya, source code telah berhasil dibuat. Sekarang ayo kita lakukan simulasi pada ISIS Proteus!!!
Buatlah design rangkaian seperti dibawah ini :
Lalu, kita save terlebih dahulu, di folder yang sama seperti source code. Kemudian kita downloadkan file.hex tadi dengan cara melakukan double klik pada chip ATMega 16, sehingga muncul :
Dan akhirnya, Stopwatch pun dapat kita simulasikan!!!
(gunakan PORTD.2 untuk play atau pause dan PORTD.3 untuk reset)
Sekian aja tutorial pembuatan stopwatch dengan ATMega 16 melalui CVAVR dan Simulasi ISIS.
SEMOGA BERMANFAAT (^o^)
(aku sangat membutuhkan kritik dan saran anda!)
nji, setau gua milisecond itu ampe 100 bukan 60. CMIIW, PRIKITIW, MIWMIW
BalasHapusKomunikatif banget ji, makasih ya!
BalasHapusthanks gan ,,, saya liat tutorial ini pas ada uts di kampus , dan berhasil ,,,, terimakasih banyak gan ,,, cuman ini blok yg tutorial nya paling lengkap untuk pemula ,,,,
BalasHapus