Pada aplikasi counter 0000-9999 saya menggunakan fitur timer/counter1 yang dapat menghitung sampai 65536 (16 bit). Untuk lebih jelasnya mengenai timer dan counter AVR, dapat membaca postingan saya di tutorial timer dan counter AVR.
Dikarenakan saya menggunakan 4 buah seven segment tipe CA (common anoda), maka hanya dapat menampilkan maksimal 9999 penghitungan. Untuk mendapatkan datasheet penampil seven segment silakan download disini. Metode yang saya gunakan untuk menampilkan di seven segment adalah metode scanning, untuk lebih jelasnya tentang seven segment silakan baca tutorial seven segment. Jika penghitungan telah mencapai 10000 maka akan saya set kembali menjadi 0000. Berikut adalah schematic rangkaiannya.
Input timer/counter1 berasal dari pin PB1 (T1), dimana untuk aplikasi ini saya menggunakan sebuah push button sebagai inputnya. Pada program yang saya buat, jika terjadi perubahan logika dari high ke low (falling edge) maka akan dideteksi sebagai input counter. Untuk input yang berupa push button di atas dapat diganti menggunakan sensor yang sesungguhnya. Berikut adalah listing program lengkapnya:
#include <mega16.h>
#include <delay.h>
#include <delay.h>
char ribuan, ratusan, puluhan, satuan, ubah;
void ambil_data_counter()
{
if (TCNT1==10000){TCNT1=0;}//jika counter bernilai 10000 maka kembali lagi ke 0000
data=TCNT1;//nilai dari register counter1 diumpankan ke data
}
void tampil_7segment()
{
PORTC=ribuan;//mengirimkan data ribuan
PORTD=0b11110111;//menyalakan digit1
delay_ms(5);
PORTC=ratusan;//mengirimkan data ratusan
PORTD=0b11111011;//menyalakan digit2
delay_ms(5);
PORTC=puluhan;//mengirimkan data puluhan
PORTD=0b11111101;//menyalakan digit3
delay_ms(5);
PORTC=satuan;//mengirimkan data satuan
PORTD=0b11111110;//menyalakan digit4
delay_ms(5);
//lamanya waktu scanning ditentukan oleh intruksi delay
}
void ubah_ke_format7segment()//fungsi untuk mengubah kedalam format 7segment
{
if (ubah==0){ubah=0xc0;}
if (ubah==1){ubah=0xf9;}
if (ubah==2){ubah=0xa4;}
if (ubah==3){ubah=0xb0;}
if (ubah==4){ubah=0×99;}
if (ubah==5){ubah=0×92;}
if (ubah==6){ubah=0×82;}
if (ubah==7){ubah=0xf8;}
if (ubah==8){ubah=0×80;}
if (ubah==9){ubah=0×90;}
}
void ambil_nilai_tiap_digit()
{
data_temp=data;
satuan=data_temp%10;//sisa dari pembagian disimpan di variabel satuan
ubah=satuan;
ubah_ke_format7segment();//panggil fungsi mengubah kedalam format 7segment
satuan=ubah;
data_temp=data_temp/10;
puluhan=data_temp%10;
ubah=puluhan;
ubah_ke_format7segment();
puluhan=ubah;
data_temp=data_temp/10;
ratusan=data_temp%10;
ubah=ratusan;
ubah_ke_format7segment();
ratusan=ubah;
data_temp=data_temp/10;
ribuan=data_temp%10;
ubah=ribuan;
ubah_ke_format7segment();
ribuan=ubah;
}
void main(void)
{
PORTC=0xff;
DDRC=0xff;
PORTD=0x0f;
DDRD=0x0f;
// Timer/Counter 1 initialization
// Clock source: T1 pin Falling Edge
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0×00;
TCCR1B=0×06;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;
while (1)
{
ambil_data_counter();
ambil_nilai_tiap_digit();
tampil_7segment();
};
}
Untuk mendapatkan file program dalam bentuk CodeVision AVR dapat didownload pada link dibawah ini.
Semoga bermanfaat…
Tidak ada komentar:
Posting Komentar