Senin, 15 Agustus 2011

Counter Up/Down

Pada aplikasi counter 0000-9999 saya menggunakan fitur timer/counter1 yang dapat menghitung sampai 65536 (16 bit).
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>

int data, data_temp;
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();
      };
}

Sumber : elektro-kontrol.blogspot.com

0 komentar:

Posting Komentar

 
Copyright (c) 2010 AkabriUdara and Powered by Blogger.