Monthly Archives: April 2013

Timer/Counter Pada ATmega8535

Pada kali ini saya akan membahas tentang timer/counter untuk memberi waktu tunda pada setiap pengolahan mikrokontroller

1. Prescaler
Timer pada dasarnya hanya menghitung pulsa clock. Frekuensi pulsa clock yang dihitung tersebut bisa sama dengan frekuensi crystal yang dipasang atau dapat diperlambat menggunakan prescaler dengan faktor 8, 64, 256 atau 1024. Berikut penjelasannya : Sebuah AVR menggunakan crystal dengan frekuensi 8 MHz dan timer yang digunakan adalah timer 16 bit, maka maksimum waktu timer yang bisa dihasilkan adalah :
TMAX = 1/fCLK x (FFFFh+1)
= 0.125uS x 65536
= 0.008192 S

Untuk menghasilkan waktu timer yang lebih lama dapat digunakan prescaler, misalnya 1024, maka maksimum waktu timer yang bisa dihasilkan adalah :
TMAX = 1/fCLK x (FFFFh+1) x N
= 0.125uS x 65536 x 1024
= 8.388608 S

Ketika presacaler digunakan, waktu timer dapat diperpanjang namun tingkat ketelitiannya menjadi turun. Misalnya dengan prescaler 1024 nilai timer akan bertambah 1 setiap kelipatan 1024 pulsa dan membutuhkan waktu 1/fCLK x 1024 = 0.125uS x 1024 = 128 uS bandingkan tingkat resolusi ini jika tanpa precsaler (0.125uS).

2. Timer 16 Bit Normal Mode
Pada mode normal, TCNT1 akan menghitung naik dan membangkitkan interrupt Timer/Counter 1 ketika nilainya berubah dari 0xFFFF ke 0x0000. Seringkali kita menganggap untuk menggunakan timer cukup dengan memasukkan nilai yang diinginkan ke TCNT1 dan menunggu sampai terjadi interrupt. Ini menjadi benar pada timer yang menghitung mundur, tetapi untuk timer yang menghitung maju, maka anda harus memasukkan nilai 65536-(timer value) ke dalam TCNT1.

3

3. Register Timer 16 Bit
• TCNT1
Timer/Counter1 Register digunakan untuk menyimpan nilai timer yang diinginkan. TCNT1
dibagi menjadi 2 register 8 bit yaitu TCNT1H dan TCNT1L.

4

• TIMSK & TIFR
Timer Interrupt Mask Register (TIMSK) dan Timer Interrupt Flag (TIFR) Register digunakan
untuk mengendalikan interrupt mana yang diaktifkan dengan cara melakukan setting pada
TIMSK dan untuk mengetahui interrupt mana yang sedang terjadi.

12• TCCR1B
Timer/Counter1 Control Register B digunakan untuk mengatur mode timer, prescaler dan pilihan lainnya.

5CS12..10: Clock Select bits ;
Tiga bit pemilih prescaler timer/counter 1 dan hubungannya dengan clock eksternal pada
pin T1.

6

7

5. Maksimum Waktu Timer
Timer 16 bit AVR8535 dapat menghasilkan waktu tunda maksimum sebesar 6,068055555 detik pada frekuensi 11,0592MHz

8

7. Mengaktifkan Timer
Setelah tahu nilai yang harus dituliskan ke TCNT1 maka anda harus mengaktifkan bit interrupt terkait dan global interrupt enable. Berikut adalah flowchart apa yang terjadi pada timer :

9

Langkah yang perlu dilakukan adalah :
• Aktifkan TOIE1 pada TIMSK
• Masukkan nilai timer ke TCNT1 misalnya : D5D0h
• Set prescaler pada 1024 ( set bit CS12 dan CS10 pada TCCR1B)
• Aktifkan bit global interrupt pada SREG
• Tunggu. Atau lakukan hal yang lain. Semua perhitungan dan pengecekan flag dilakukan
oleh hardware.

Contoh Program :
.include "m8535def.inc"
.equ timer_value = 0xD5D0
.org 0x0000
rjmp mulai
mulai:
   ldi r16,low(RAMEND)
   out SPL,r16
   ldi r16,high(RAMEND)
   out SPH,r16
ulang:
   ldi r16,0xff
   out ddra,r16
   out PortA,r16
   rcall timer1d
   ldi r16,0x00
   out PortA,r16
   rcall timer1d
   rjmp ulang
timer1d:
   ldi r16,0b00000100 ;aktifkan enable interupt
   out TIMSK,r16
   ldi r16,high(timer_value) ;masukkan nilai timer
   out TCNT1H,r16
   ldi r16,low(timer_value)
   out TCNT1L,r16
   ldi r16,0b00000101 ;masukkan prescaler 1024
   out TCCR1B,r16
looptimer:
   in r17,TIFR
   sbrs r17,TOV1 ;tunggu sampai timer1 overflow set
   rjmp looptimer
   ldi r16,0b00000100 ;TOV1 dinolkan dengan memberi logika 1
   out TIFR,r16
ret

Nah sekian dulu untu materi mengenai timer/counter, selamat mencoba 😀

KOMUNIKASI ATTiny2313 UART(RS232)

Kali ini kita akan membahas lebih dalam tentang Komunikasi UART melalui AVR

Apakah itu UART?

UART adalah mode komunikasi serial secara asynchronous, dimana data dikirim secara satu persatu melalui kabel ganda ( twisted pair Tx & Rx)

UART memiliki kecepatan transfer data yg ditentukan oleh pihak pengirim & penerima yg dinamakan BAUDRATE

Pengirim akan mengirimkan data secara serial, dan penerima akan mengolah data BIT (umumnya 8bit) menjadi data 1byte yg digunakan sesuai keperluan

UART memiliki level TTL 5 volt, dan menggunakan 2 buah I/O port (Tx & Rx)

 

Apakah itu RS232 ?

RS 232 adalah standar signaling dari sebuah komunikasi serial. Pada umumnya PC keluaran sebelum 2010-an akan memiliki sebuah port serial/RS232. Komunikasi RS232 terbatas hanya untuk beberapa meter saja, dan jika membutuhkan jarak lebih maka membutuhkan protokol laen seperti RS485
Tegangan dari RS232 tidak mengikuti level TTL/5V tetapi seperti gambar

Bagaimana Mengubah level UART ke RS232 ?

untuk mengubahnya diperlukan level converter sejenis MAX-232
Prinsipnya adalah dengan menggunakan charge pump capasitor

 

menuju ke Skematik

rangkaianavrcom

 

KLIK GAMBAR UNTUK MEMPERJELAS

PART LIST :

ATTiny2313
Max232
Xtal7.3278 MHz
Led
Push button
beberapa capasitor/resistor
DB-9 Female

input yang digunakan sebanyak 9 input, dan masih menggunakan cara pooling aja…alat ini bisa dihubungkan ke PC lewat rs232/serial dan Hyperterminal baud rate 9600 , untuk mengetahui status koneksi tekan keyboard “0” dan untuk melihat status port tekan “1” dan alat akan merespon ke layar hyperterminal

codingnya sebagai berikut:

// Fuse SUT_CKSEL dirubah jadi internal clock 8MHZ , err com= 0,2%
#define F_CPU 8000000UL  
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/iotn2313.h>
#include <avr/pgmspace.h> 
#include <string.h>
#include <stdlib.h>

// definisi port yg digunakan
#define INPUT1 PIND2
#define INPUT2 PIND3
#define INPUT3 PIND4
#define INPUT4 PIND5
#define INPUT5 PIND6
#define INPUT6 PINB0
#define INPUT7 PINB1
#define INPUT8 PINB2
#define INPUT9 PINB3

//definisi baud rate usart/serial

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 

const char awal[] PROGMEM = " * AVR ATTiny2313-RS232  Remote Sensing * \n\n\r";  

const char ok[] PROGMEM ="[11]"; //jika com OK

char kondisi[11];

void USART_Tx(unsigned char data)
{   

   while (!(UCSRA & (1<<UDRE)));{} // wait till transmit Data register is empty
    UDR = data; // Send data to the computer
}

void kirim_text(const char *data)
{
   while (pgm_read_byte(data) != 0x00)
     USART_Tx(pgm_read_byte(data++));
} 

void init_usart(void)
{

cli();

   UCSRB |= (1 << RXEN) | (1 << TXEN);   
   UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); 
   UBRRL = BAUD_PRESCALE; 
   UBRRH = (BAUD_PRESCALE >> 8);
   UCSRB |= (1 << RXCIE);  //interupt serial usart
sei();
  }

void checkport(void) // cek kondisi port
{

  kondisi[0]='[';

  if(bit_is_set(PIND, INPUT1)) kondisi[1]='1';
  else if(bit_is_clear(PIND, INPUT1)) kondisi[1]='0';

  if(bit_is_set(PIND, INPUT2)) kondisi[2]='1';
  else if(bit_is_clear(PIND, INPUT2)) kondisi[2]='0';

  if(bit_is_set(PIND, INPUT3)) kondisi[3]='1';
  else if(bit_is_clear(PIND, INPUT3)) kondisi[3]='0';

  if(bit_is_set(PIND, INPUT4)) kondisi[4]='1';
  else if(bit_is_clear(PIND, INPUT4)) kondisi[4]='0';

  if(bit_is_set(PIND, INPUT5)) kondisi[5]='1';
  else if(bit_is_clear(PIND, INPUT5)) kondisi[5]='0';

  if(bit_is_set(PINB, INPUT6)) kondisi[6]='1';
  else if(bit_is_clear(PINB, INPUT6)) kondisi[6]='0';

  if(bit_is_set(PINB, INPUT7)) kondisi[7]='1';
  else if(bit_is_clear(PINB, INPUT7)) kondisi[7]='0';

  if(bit_is_set(PINB, INPUT8)) kondisi[8]='1';
  else if(bit_is_clear(PINB, INPUT8)) kondisi[8]='0';

  if(bit_is_set(PINB, INPUT9)) kondisi[9]='1';
  else if(bit_is_clear(PINB, INPUT9)) kondisi[9]='0';

  kondisi[10]=']';

}

ISR(USART_RX_vect)
{ 
 char databyte;
 uint8_t a;

	 databyte = UDR; 	 

     switch (databyte)        

		{

        case '1' : {       // jika PC kirim karakter '1'
             checkport();   
	     //reply status port ke PC		 
            for(a=0;a<11;a++) {USART_Tx(kondisi[a]); _delay_ms(10);}
			 break;		 

			}     
	    case '0' : {    // jika PC kirim karakter '0'
		 	 kirim_text(ok);  //reply text ok
			 break; }
        }  
}  

int main(void)
{

 DDRD &= ~_BV(PD2) & ~_BV(PD3) & ~_BV(PD4) & ~_BV(PD5) & ~_BV(PD6) ;
 DDRB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) ;

 init_usart();

 kirim_text(awal);   

	while(1)
	 {

	 }

}

Selamat mencoba , apabila kurang jelas silahkan mampir kesini

Dilain kali saya akan membahasnya menggunakan bahasa assembler AVR.