Modul4 - AVR Mikrokontroler
Modul4 - AVR Mikrokontroler
DI SUSUN OLEH :
JAENAL ARIFIN, ST
A. PENDAHULUAN
Perkembangan teknologi elektronika digital telah berkembang dengan pesatnya, diberbagai
bidang. Pengunaan mikrokontroller sangat luas, mulai dari mainan elektronika sampai dengan
modul-modul rangkaian digital lainnya. Teknologi ini dirasakan masih cukup ampuh dalam
menyelesaikan permasalahan elektronika digital, dikarenakan memiliki kemudahan dalam hal
pemrograman untuk mengendalikan input-output dan biaya murah. Lahirnya mikrokontroler
telah menimbulkan suatu revolusi dalam membuat system berbasis digital yang kompleks.
Sebuah chip mikrokontroler yang relatif `murah' dapat bekerja sesuai dengan keinginan
programmer. Sebagai contoh seperti pada sistem pengontrolan maupun sistem otomasi
maupun pada sistem robot. Mikrokontroller type CISC clan RISC saat ini berkembang pesat. Hal
ini didasarkan pada arsitektur processor dan set instruksinya. Tipe AVR (Alfand Vegard's Risc
processor) merupakan jenis RISC, yang hamper semua instruksi dikerjakan 1 siklus, sehingga
lebih cepat waktu eksekusinya. AVR keluaran ATMEL saat ini dikelompokan menjadi 4 group :
keluarga AT90Sxx, keluarga ATMega, keluarga ATtiny dan keluarga AT89RFxx. Tidak ada
perbedaan mendasar pada keempatnya, baik arsitektur maupun instruksinya. Kapasitas
memori, peripheral dan fungsi adalah yang menjadikan masing – masing keluarga AVR memiliki
keunikan tersendiri.
Konfigurasi Hardware
Mikrokontroler ATmega16 memiliki konfigurasi pin 40 kaki yang terdiri dari masing-masing pin
I/O (32 pin) serta mempunyai fungsi khusus tergantung penggunaannya.
STRUKTUR MEMORI
Secara khusus Mikrokontroller AVR ATmega16 mempunyai ruang memori data dan memori
program
yang terpisah. Memori data terdiri 3 bagian :
- 32 buah General Purspose Register (GPR) / register umum
- 64 buah register I/O
- 512 byte SRAM Internal
Memori program sebesar 8 Kbyte dalam Flash PEROM dengan alamat 000H - FFFH.
A. Gambar rangkaian
1. Satu set modul AVR trainer versi 1.0 atau versi 2.0
2. PC dekstop
PERCOBAAN II.
Mengeluarkan Output ke PORTB (8xled merah) dan buzzer
- Led terhubung dengan PORTB
- Buzzer terhubung dengan PORTA.7
//===========================================
#define F_CPU 11059200
#include "avr/io.h"
#include "util/delay.h"
#define led PORTB
#define buzzer_hi PORTA|=(1<<7)
#define buzzer_lo PORTA&=~(1<<7)
//===========================================
void init_devices()
{
DDRB=255;
DDRA|=(1<<7);
}
//==========================================program utama
int main()
{
init_devices();
for(;;)
{
led=255;
buzzer_hi;
_delay_ms(1000);
buzzer_lo;
led=0;
_delay_ms(1000);
}
}
//===========================================
PERCOBAAN III.
Membaca input push button untuk mengontrol 8 x led
- Led terhubung dengan PORTB
- push button terhubung dengan pind.2 dan pind.3
#define F_CPU 11059200
#include "avr/io.h"
#include "util/delay.h"
#define led PORTB
#define tombol PIND
#define satu 2
#define dua 3
//===========================================
void init_devices()
{
DDRB=255; //LED OUTPUT
DDRD&=~(1<<2); //INPUT
DDRD&=~(1<<3); //INPUT
PORTD|=(1<<2); //PULL UP INTERNAL AKTIF
PORTD|=(1<<3);
}
//==========================================program utama
int main()
{
init_devices();
led=0;
for(;;)
{
if(bit_is_clear(tombol,satu)) led=255;
if(bit_is_clear(tombol,dua)) led=0;
}
}
//===========================================
TIMER COUNTER
Timer/counter dalam mikrokontroler merupakan fasilitas yang salah satu fungsinya sebagai
pewaktu atau hitungan. Sumber clock atau trigger dapat dibangkitkan dari sinyal eksternal atau
internal. Jika sumber sinyal berasal dari internal maka di sebut sebagai TIMER dan jika sumber
sinyal berasal dari luar maka disebut sebagai COUNTER. Mikrokontroler ATMega16 memiliki 3
buah timer yaitu Timer0, Timer1, dan Timer2. Timer0 dan Timer2 memiliki kapasitas 8-bit
sedangkan Timer1 memiliki kapasitas 16-bit. Apa yang dimaksud timer 8 bit dan 16 bit?
timer 8 bit adalah timer yg bisa mencacah/menghitung sampai maksimal nilai 0xFF heksa
(dalam biner = 11111111). Klo yg 16 bit nilai maksimalnya 0xFFFF. Untuk dapat menjalankan
timer/counter1 harus dipelajari dulu mengenai register timer/counter1 karena di register itulah
tempat setting Timer/Counter1 agar bisa bekerja. Register tersebut terdiri dari :
-TCCR1B
-TCNT1
-TIMSK
-TIFR
Register TCCR1B merupakan tempat setting clock yang intinya agar timer/counter1 bisa bekerja
maka register ini jangan sampai diisi dengan 0×00 (dikosongkan). Sumber clock bisa berasal dari
internal mulai dari no prescaler sampai 1024 prescaler dan bisa juga dari sumber external.
Register TCNT1 merupakan register pencacah setiap ada trigger bisa tepi naik atau tepi turun,
tapi kalo sumbernya dari dalam (internal) pencacahan dilakukan pada saat tepi naik. Register ini
akan mencacah naik dari 0×00 sampai nilai max 0xFFFF kemudian di reset kembali lagi ke 0×00.
Pada saat overflow yaitu kondisi dari 0xFFFF ke 0×00 maka bit TOV1 dari register TIFR akan di
set 1. Keadaan overflow juga bisa digunakan untuk menjalankan interrupt. Register TIMSK
merupakan register tempat setting interrupt timer/counter1 overflow diaktifkan atau tidak.
Dengan memberikan logika satu pada bit TOIE1 maka interrupt timer/counter1 aktif dengan
catatan global interrupt diaktifkan (terdapat di Status register). Sedangkan register TIFR
(Timer/Counter Interrupt Flag Register) digunakan sebagai penanda apakah sudah terjadi
overflow. Pada timer/counter1 overflow ditandai dengan logika 1 pada bit TOV1 pada register
ini.
rumus yang digunakan adalah :
TCNT = (1+0xFFFF) - (waktu *( XTAL / prescaler) )
waktu --> waktu yg kita inginkan
XTAL --> frekuensi xtal yg dipakai
prescaler --> nilai prescaler
PERCOBAAN IV
Mengeluarkan Output ke PORTB (8xled merah) dengan interval waktu on
dan off led 1 detik menggunakan timer 1
Nah sebelumnya kita cari nilai TCNT1?
- XTAL 11.0592
- PRESCALER 1024
- WAKTU YANG DIINGINKAN 1 DETIK
inget rumus: TCNT1 = (1+0xFFFF) - (waktu *( XTAL / prescaler) )
Jadi,...............
TCNT1= (1+65535)-(1detik * (11059200/1024))
=65536 - (1detik*10800)
=65536-10800
=54736 (desimal)
= D5D0 (heksadesimal)
PERCOBAAN V
Mengeluarkan Output ke PORTB (8xled merah) dengan interval waktu on
dan off led 1 detik menggunakan timer 2
#define F_CPU 11059200
#include "avr/io.h"
#include "util/delay.h"
#define led PORTB
//===========================================
void init_devices()
{
DDRB=255;
}
void delay10ms()
{
TCCR2=0B00000111;
TCNT2=0x94;
while(!(TIFR&(1<<TOV2)));
TIFR=64;
TCCR2=0B00000000;
}
void delay1detik()
{
unsigned char ulang;
for(ulang=0;ulang<100;ulang++)
{
delay10ms();
}
}
//==========================================program utama
int main()
{
init_devices();
for(;;)
{
led=255;
//_delay_ms(1000);
delay1detik();
led=0;
//_delay_ms(1000);
delay1detik();
}
}
//===========================================
PERCOBAAN VI
Mengeluarkan Output ke PORTB (8xled merah) dengan interval waktu on
dan off led 1 detik menggunakan timer 0
Display karakter pada LCD diatur oleh pin EN, RS dan RW: Jalur EN dinamakan Enable. Jalur ini
digunakan untuk memberitahu LCD bahwa anda sedang mengirimkan sebuah data. Untuk
mengirimkan data ke LCD, maka melalui program EN harus dibuat logika low “0” dan set pada
dua jalur kontrol yang lain RS dan RW. Ketika dua jalur yang lain telah siap, set EN dengan logika
“1” dan tunggu untuk sejumlah waktu tertentu (sesuai dengan datasheet dari LCD tersebut) dan
berikutnya set EN ke logika low “0” lagi. Jalur RS adalah jalur Register Select. Ketika RS berlogika
low “0”, data akan dianggap sebagi sebua perintah atau instruksi khusus (seperti clear screen,
posisi kursor dll). Ketika RS berlogika high “1”, data yang dikirim adalah data text yang akan
ditampilkan pada display LCD. Sebagai contoh, untuk menampilkan huruf “T”
pada layar LCD maka RS harus diset logika high “1”. Jalur RW adalah jalur kontrol Read/ Write.
Ketika RW berlogika low (0), maka informasi pada bus data akan dituliskan pada layar LCD.
Ketika RW berlogika high ”1”, maka program akan melakukan pembacaan memori dari LCD.
Sedangkan pada aplikasi umum pin RW selalu diberi logika low ”0”. Pada akhirnya, bus data
terdiri dari 4 atau 8 jalur (bergantung pada mode operasi yang dipilih oleh user). Pada kasus bus
data 8 bit, jalur diacukan sebagai DB0 s/d DB7.
Pada aplikasi ini, pin RW selalu diberi logika low ”0” (GND) karena kita hanya melakukan operasi
write saja, data bus yang digunakan cukup 4 saja yakni D4-D7,selain itu pin control juga
dihubungkan ke μC (pin RS dan E).
PERCOBAAN VII
Menulis karakter ke LCD
void lcd_clrscr()
{
LCD_RS_LO;
lcd_write(0x1);
_delay_ms(2);
}
while ( (c = *s++) ) {
lcd_putc(c);
}
}
void lcd_puts_pp(const char *progmem_s)
{
register char c;
for(;;)
{
c = pgm_read_byte(progmem_s++);
if(c==0) break;
lcd_putc(c);
}
}
void lcd_goto(unsigned char poslcd)
{
LCD_RS_LO;
lcd_write(0x80 + poslcd);
}
void init_lcd()
{
LCD_RS_LO;
_delay_ms(15);
LCD_D4_HI;
LCD_D5_HI;
LCD_STROBE();
_delay_ms(5);
LCD_STROBE();
_delay_us(100);
LCD_STROBE();
_delay_ms(5);
LCD_D4_LO;
LCD_STROBE();
_delay_us(40);
lcd_write(0x28);
lcd_write(0x0C);
lcd_write(0x06);
lcd_write(0x01);
_delay_ms(10);
}
//==================================================
void init_devices()
{
DDRB=255; //LED OUTPUT
DDRD&=~(1<<2); //INPUT
DDRD&=~(1<<3); //INPUT
PORTD|=(1<<2); //PULL UP INTERNAL AKTIF
PORTD|=(1<<3);
DDRC=255;
}
//==========================================program utama
int main()
{
_delay_ms(100);
init_devices();
init_lcd();
led=0;
for(;;)
{
lcd_goto(line1);
lcd_puts("hallo lcd");
lcd_goto(line2);
lcd_puts("lcd lcd ");
for(;;)
{
}
}
}
//=========================================================
Bit 7 (REFS1) dan bit 6(REFS0) digunakan untuk menentukan tegangan referensi ADC.
Bit 7 6 5 4 3 2 1 0
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 ADCSRA
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial
Value 0 0 0 0 0 0 0 0
USART AVR
USART atau yang lebih dikenal dengan Universal Syncronous and Asyncronous Receiver Transmitter
sangat handal dan berguna dalam berbagai project yang berhubungan dengan interface PC, misalnya
program monitoring suhu ruangan menggunakan delphi, dan lain-lain.
USART dipisahkan menjadi 3 bagian yaitu clock generator, Transmit, dan Receive. Mari kita
bahas satu persatu:
1. Clock Generator Clock generator tergantung pada mode data transfer, terdapat empat mode
clock generator yang berbeda,yaitu:
Normal asynchronous;
Double speed asynchronous;
Master synchronous;
Slave synchronous.
Kebanyakan yang digunakan adalah asynchronous internal clock generator. Register Baud Rate
(UBBR) digunakan dimana nilai yang diberikan untuk down counter. Setiap kali nilai down-
counter mendekati nol, maka sebuah clock dibangkitkan. Kamu dapat menghitung berapa nilai
UBRR yang akan kamu tulis tergantung dari baudrate yang kamu inginkan dan kecepatan dari
MCU clock. Nilai UBBR dapat dihitung menggunakan formula:
BAUD = fck/(16(UBBR+1)). Formula ini digunakan untuk Asynchronous normal mode jika
menggunakan mode double speed maka formula yang digunakan adalah BAUD =
fck/(8(UBBR+1)). Untuk lebih jelasnya mengenai double speed bias dilihat sendiridi datasheet
AVRMisalkan digunakan kecepatan MCU = 8 MHz dan baudrate yang diinginkan 9600, setelah
dihitung menggunakan rumus diatas diperoleh nilai UBBR = 51.083333333, kita bulatkan
UBBR = 51. Dengan nilai UBBR =51, maka nilai aktual boudrate adalah 9615, jika dibagi
dengan 9600 diperoleh 1.0016 dan karena itu errornya adalah 0.16 %. Dengan error tersebut
USART masih dapat bekerja tetapi tidak sempurna. Oleh karena itu biasanya digunakan kristal
7.3728 MHz sehingga akan memberikan nilai UBBR = 47 dan no error. Table yang
menunnukkan variasi clock/baud dapat kamu temukan di datasheet AVR. Untuk mode
Synchronous dan clock external melalui pin XCK dapat dilihat di datasheet
2. USART Transmission
USART dapat melakukan transmit data dengan memberikan logika satu di bit TXEN ayng
terdapat dalam register UCSRB. Operasi normal port akan diabaikan oleh USART. Ketika
transmit sudah diaktifkan maka pin yang bersangkutan yaitu pinD1 tidak bisa digunakan dalam
mode normal. Adapun program pada WinAVR yang menangani USART transmit sebagai
berikut:
void USART_SendByte(uint8_t Data)
{
// Wait if a byte is being transmitted
while((UCSRA&(1<<UDRE)) == 0);
// Transmit data
UDR = Data;
}
3. USART Reception
USART Receiver dapat diaktifkan dengan memberikan logika satu pada bit RXEN yang terdapat
dalam register UCSRB. Ketika USART receiver diaktifkan maka pin yang bersangkutan tidak
bisa dioperasikan sebagai normal mode, pin yang dimaksud adalah pinD0. Berikut ini program
WinAVR yang menangani USART Receive:
uint8_t USART_vReceiveByte()
{
// Wait until a byte has been received
while((UCSRA&(1<<RXC)) == 0) ;
// Return received data
return UDR;
}
Sebelum melakukan transfer data, maka ada beberapa hal yang perlu dipersiapkan yaitu baud
rate, mode operasi dan format frame data yang akan dikirim. Antara receiver dan transmitter
harus mempunyai setting yang sama. Data frame dari USART biasnya dimulai dengan bit
START lalu di ikuti dengan data mulai dari 5 data sampai 9 data dan diakhiri dengan bit STOP
bisa 1 atau 2 bit. Diantara data dan bit STOP biasanya ditambahkan parity sebanyak 1 bit. Parity
berfungsi sebagai error cek dengan pilihan no parity, even, or odd parity. Berikut ini diberikan
contoh program init USART, dan subrutin kirim serial:
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1
//==============================================
void initserial( unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
while ( (c = *s++) ) {
uart_putc(c);
}
}
void enter()
{
uart_putc(13);
uart_putc(10);
}
INTERRUPT
Ketika power off atau reset maka program akan menuju ke alamat $000 untuk menjalankan
program reset.
Pada bahasa C program akan menuju ke fungsi main(). Pada C untuk dapat mengakses interrupt
diperlukan sebuah library interrupt.h adapun penuisannya sebagai berikut :
#include <avr/interrupt.h>
Semua program interrupt dapat dideskripsikan menggunakan macro command ISR(), seperti
ISR(INT0_vect)
{
//program yang akan ditulis
}
EEPROM INTERNAL
Mikrokontroller jenis AVR mempunyai fitur EEPROM (Electronically Erasable Read Only
Memory) dengan kapasitas yang berbeda-beda tergantung dari jenis mikrokontrollernya.
ATMega16 memiliki EEPROM internal dengan kapasitas 512 Byte. Memory jenis ini
mengijinkan para pengguna untuk menyimpan parameter program, konstanta, data string dan
lain-lain. EEPROM merupakan memori dari jenis ROM yang mempunyai kemampuan baca-tuis
dan apabila catu daya tidak ada, data mesih tersimpan di dalam memori, data tidak akan hilang.
Hal ini akan berbeda dengan memori dari jenis RAM.
Untuk mengakses EEPROM terlebih dahulu harus mengetahui register-register EEPROM, yakni:
EEAR – EEPROM Address Register, EEDR – EEPROM Data Register, dan EECR – EEPROM
Control Register.
- EEAR adalah register yang berfungsi menyimpan alamat EEPROM yang akan diakses.
- EEDR adalah register yang berfungsi menyimpan data yang akan ditulis ke EEPROM dan data
yang dibaca dari EEPROM.
- EECR adalah register yang berfungsi untuk mengontrol sinyal-sinyal kontrol untuk proses
akses EEPROM.
Demikian juga halnya dengan proses membaca data dari EEPROM, berikut langkah-langkahnya:
1. tunggu bit EEWE=0
2. Letakkan alamat EEPROM yang akan diakses dalam register EEAR
3. Set bit EERE
4. Baca data dari EEDR dan simpan di register
Berikut subrutin tulis ke eeprom internal, dan fungsi baca dari eeprom internal
//==================================================
//baca tulis eeprom internal
//==================================================
//=========================================================
void writeeeprom(unsigned int alamat, unsigned char datana)
{
loop_until_bit_is_clear(EECR,EEWE);
EEAR = alamat;
EEDR = datana;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
}
unsigned char readeeprom(unsigned int alamat)
{
unsigned char dataeeprom;
loop_until_bit_is_clear(EECR,EEWE);
EEAR = alamat;
EECR |= (1<<EERE);
dataeeprom=EEDR;
return dataeeprom;
}
WATCHDOG
Pewaktu watchdog merupakan piranti pewaktuan perangkat keras yang bisa memicu reset
sistem pada saat program utama, karena ada beberapa keasalahan, seperti hang, mengabaikan
layanan rutin ke watchdog (biasanya seperti pemberian pulsa secara rutin), atau gampangannya
kalo Anda punya anjing atau kucing kemudian lupa memberikan makan, apa yang terjadi? Ya
jegog atau ngeong khan?? Dalam hal ini, saat jegog atau ngeong, pewaktu watchdog akan
mereset sistem. Intinya, mengembalikan sistem ke awal mula (kondisi normal) karena telah
terjadi kesalahan atau hang tadi…,Pada C untuk dapat mengakses WATCHDOG diperlukan
sebuah library #include "avr/wdt.h"
Untuk mengaktifkan WDT, pengguna harus menuliskan lama waktu watchdog ke subrutin missal
kita mau memilih watchdog dengan waktu 2.1 detik maka. Niilai yang harus di isikan adalah 7,
bisa dilihat di table dibawah ini :
#define WDTO_2S 7
wdt_enable(WDTO_2S);
Saat Watchdog diaktifkan, nilainya akan selalu dinaikkan setiap siklus mesin selama osliator
juga bekerja. Timeout pada Watchdog bergantung pada frekuensi kristal atau detak yang
digunakan. Tidak ada jalan lain untuk menonaktifkan Watchdog kecuali melalui RESET (baik
reset secara perangkat keras atau reset karena WDT melimpah atau overflow). Pada saat WDT
melimpah, maka akan menghasilkan luaran pulsa RESET HIGH pada pin RST.
Berikut perintah untuk mereset watchdog
wdt_reset();
RTC DS 1307
RTC yang kita bahas kali ini adalah RTC dengan antarmuka I2C, yaitu DS1307. fitur dari
DS1307:
Real-time clock (RTC) meyimpan data-data detik, menit, jam, tanggal, bulan, hari dalam
seminggu, dan tahun valid hingga 2100;
56-byte, battery-backed, RAM nonvolatile (NV) RAM untuk penyimpanan;
Antarmuka serial Two-wire (I2C)
Sinyal luaran gelombang-kotak terprogram (Programmable squarewave);
Deteksi otomatis kegagalan-daya (power-fail) dan rangkaian switch;
Konsumsi daya kurang dari 500nA menggunakn mode baterei cadangan dengan
operasional osilator;
Tersedia fitur industri dengan ketahana suhu: -40°C hingga +85°C
Tersedia dalam kemasa 8-pin DIP atau SOIC
Sedangkan daftar pin DS1307:
VCC - Primary Power Supply
X1, X2 - 32.768kHz Crystal Connection
VBAT - +3V Battery Input
GND - Ground
SDA - Serial Data
SCL - Serial Clock
SQW/OUT - Square Wave/Output Driver
Gambar diagram PIN: