Berikut ini adalah contoh-contoh program yang mengakses register-register fungsi khusus dari ATMega8535 sehingga kita dapat mempelajari bagaimana cara mengakses register-register tersebut
1. Mengambil data dari ADC dan mengirimkan ke Serial Port
Seringkali dalam suatu aplikasi kita ingin melihat nilai tegangan analog yang diterima oleh port ADC ATMega8535. Hal ini dapat kita lakukan dengan cara yang paling sederhana yaitu dengan mengirimkan nilai tersebut ke serial port agar dapat dilihat di PC.

Listing Program

Untuk menuliskan program ini terlebih dahulu kita harus mengenal register-register ADC, hal ini dapat dipelajari di Dasar Mikrokontroler AVR 3 Analog to Digital Converter ATMega8535 Pada listing di atas tampak register ADMux diberi nilai 0x60 atau dalam binary 0b01100000 Seperti yang dijelaskan pada artikel Dasar Mikrokontroler AVR 3 Analog to Digital Converter ATMega8535 dengan nilai binary 0b01100000 pada register ADMux maka:
- VREF akan diambil dari pin tegangan VREF
- Nilai ADC akan diambil dari left adjust
- Channel ADC yang diakses adalah channel 0


Kemudian pada instruksi ADCSRA = 0x04 atau 0b00000100 maka prescaler dari clock conversion ADC adalah 16x dari frekwensi kristal. Proses konversi ADC baru akan dimulai saat bit ADSC di set 1 dengan instruksi ADCSRA|=(1<<ADSC). Konversi terjadi dan baru selesai setelah Flag ADIF = 1. Nilai konversi akan tersimpan di register ADCH dan nilai ini dikirim ke port serial dengan instruksi USART_Transmit(ADCH); Apabila program ini dicompile dan download ke ATMega8535 maka nilai tegangan analog di channel 0 akan dikirim ke Port serial dan juga ke Port B setiap 2 detik. Listing Program ini dapat didownload di sini
2. Menulis dan membaca data pada EEPROM ATMega8535
Pada contoh berikut kita akan membahas bagaimana menulis dan membaca ke EEPROM ATMega8535. Di sini digunakan Port B untuk menampilkan data yang tersimpan dalam EEPROM mulai dari alamat 0 hingga 4 setiap detiknya. Untuk menampilkan data tersebut dapat digunakan 8 bit LED Logic Tester seperti berikut
Listing Program
unsigned char EEPROM_read(unsigned int uiAddress){
while (EECR&(1<<EEWE));//pastikan penulisan EEPROM sedang tidak berjalan
EEAR=uiAddress;//Isi Address Register
EECR|=(1<<EERE);//Mulai baca dengan SET EERE
return EEDR;
}
void EEPROM_write(unsigned int uiAddress,unsigned char ucData){
while(EECR&(1<<EEWE));//pastikan penulisan EEPROM sedang tidak berjalan
EEAR=uiAddress;//Isi Address Register
EEDR=ucData;//Isi Data Register
EECR|=(1<<EEMWE);//Aktifkan EEMWE
EECR|=(1<<EEWE);//Mulai tulis dengan SET EEWE
}
int main(void)
{
DDRB=0xFF;
DDRC=0x00;
int tabel_memory [5]={0,1,2,3,4}; //buat array sebanyak 5 byte dengan nilai 0 – 4
for (int i=0;i<5;i++){
EEPROM_write(i,tabel_memory[i]);
PORTB=tabel_memory[i];
}
for (int i=0;i<5;i++){
EEPROM_read(i);
PORTB=EEDR;
_delay_ms(1000);
}
while(1);
}
Untuk menuliskan program ini terlebih dahulu pertama kali kita harus mengetahui analogi penulisan data ke memori maupun pembacaan data dari memori. Berikut saya analogikan proses penulisan data ke memori seperti proses pengiriman barang di mana pada proses ini terdapat tahap-tahap
- Siapkan barang = Siapkan data yang akan ditulis, pada ATMega8535 kita gunakan Register EEDR sebagai penampung data
- Siapkan alamat pengiriman = Siapkan alamat lokasi memori yang akan ditulis, pada ATMega8535 kita gunakan Register EEAR sebagai penampung alamat memori di mana terdapat dua buah register yaitu EEARH untuk high byte dan EEARL untuk low byte
- Eksekusi pengiriman = Perintah eksekusi penulisan data, pada ATMega8535 kita gunakan Register EECR sebagai register yang berisi bit-bit yang mengatur proses penulisan dan pembacaan data
Sedangkan untuk proses pembacaan data kita analogikan seperti proses pengambilan barang oleh kurir di mana pada proses ini terdapat tahap-tahap:
- Siapkan alamat pengambilan = Siapkan alamat lokasi memori yang akan dibaca, yaitu Register EEAR pada ATMega8535
- Eksekusi pengambilan barang dari alamat yang sudah ditentukan = Perintah pembacaan data dari alamat memori yang sudah ditentukan, yaitu oleh bit EERE pada Register EECR

Yang kedua adalah mengenal register-register EEPROM ATMega8535 yang saya tulis di artikel Dasar Mikrokontroler AVR 2 Struktur Memori ATMEGA8535. Dalam listing program di atas, proses penulisan data ke EEPROM dilakukan oleh procedure EEPROM_write dan pembacaan data dari EEPROM dilakukan oleh procedure EEPROM_read.
Pada procedure EEPROM_write terlebih dahulu dilakukan pemeriksaan apakah penulisan program sedang berjalan dengan melihat kondisi bit EEWE, karena penulisan program hanya dapat dilakukan pada saat penulisan yang sebelumnya sudah selesai yaitu saat kondiwi bit EEWE = 0. Kemudian alamat penulisan yang tersimpan di variabel uiAddress diisi ke Register EEAR dan data yang akan ditulis dari variabel ucData diisikan ke Register EEDR. Kemudian bit EEMWE dan EEWE diaktifkan dengan memberi logika 1 agar proses penulisan data mulai diproses.
Sedangkan pada procedure EEPROM_read, seperti pada procedure EEPROM_write terlebih dahulu dilakukan pemeriksaan apakah penulisan program sedang berjalan dengan melihat kondisi bit EEWE sebelum proses pembacaan data dimulai. Kemudian alamat pembacaan data yang tersimpan di uiAddress diisikan ke Register EEAR. Perintah pembacaan data mulai dilakukan dengan mengaktifkan bit EERE yaitu dengan memberi logika 1 pada bit tersebut. Pada akhir proses pembacaan data maka data yang terbaca dari alamat memori EEPROM akan tersimpan dalam Register EEDR. Pada main program diawali dengan mengubah direction Port B sebagai output agar dapat digunakan untuk mengaktifkan LED.
Selanjutnya disiapkan array data sebanyak 5 byte dengan data 0,1,2,3 dan 4. Data inilah yang akan dituliskan ke EEPROM pada alamat 0 hingga 4. Kemudian dilanjutkan dengan pembacaan data dari alamat EEPROM 0 hingga 4 setiap detik di mana setiap pembacaan data akan ditampilkan pada LED yang terhubung pada Port B sehingga pada saat program ini dijalankan, data 0,1,2,3 dan 4 yang dituliskan ke EEPROM akan terbaca pada output LED setiap detiknya.
Listing program ini dapat didownload di sini
3. Akses Serial Port – mengirimkan data dalam tabel memori ke serial port
Beberapa aplikasi kadang-kadang membutuhkan proses pengiriman paketan data ke serial port. Contohnya mengirimkan sederetan angka agar ditampilkan ke layar terminal PC yang terhubung ke serial port.

Listing Program
#define FOSC 20000000
#define BAUD 115200
#define MYUBRR FOSC/8/BAUD-1
#define RXD_OUT 0
#define TXD_OUT 1
#define TXD_HIGH PORTD|=(1<<TXD_OUT)
#define TXD_LOW PORTD&=~(1<<TXD_OUT)
#define RXD_HIGH PORTD|=(1<<RXD_OUT)
#define RXD_LOW PORTD&=~(1<<RXD_OUT)
void USART_INIT(unsigned int baud){
UBRRH=(unsigned char)(baud>>8);
UBRRL=(unsigned char)(baud);
UCSRA=0x02;
UCSRB=(1<<RXEN|1<<TXEN);
UCSRC=(1<<USBS|3<<UCSZ0|1<<URSEL);
}
void USART_Transmit(unsigned char data){
while(!(UCSRA&(1<<UDRE)));
UDR=data;
}
unsigned char USART_Receive (void){
while(!(UCSRA&(1<<RXC)));
return(UDR);
}
int main (void){
unsigned char data_serial;
USART_INIT(MYUBRR);
int tabel_memory [5]={0,1,2,3,4};
for (int i=0;i<5;i++){
USART_Transmit(tabel_memory[i]);
_delay_ms(100);
}
}
Sebelum menuliskan program untuk serial port terlebih dahulu kita harus mengenal register-register serial yang dibahas pada artikel berikut Dasar Mikrokontroler AVR 5 Serial Port ATMega8535. Setelah kita mengenal register tersebut maka listing program diawali dengan menuliskan procedure-procedure serial seperti inisialisasi serial (USART_Init), pengiriman serial (USART_Transmit) dan penerimaan serial (USART_Receive).
Pada procedure USART_Init diawali dengan mengatur nilai baudrate dengan memberikan nilai baudrate pada register UBRRH dan UBRRL. Di sini baudrate diatur pada 115200 bps. Kemudian bit U2x pada register UCSRA diset 1 agar kecepatan baudrate meningkat 2x lipat dengan memberi nilai 0x2 pada register ini. Bit RXEN dan TXEN pada Register UCSRB juga diset untuk mengaktifkan fungsi RX dan TX.
Untuk procedure USART_Transmit cukup dilakukan dengan mengirim data ke Register UDRE dengan memastikan bahwa bit RXEN pada Register UCSRA tidak aktif.
Sedangkan procedure USART_Receive dilakukan dengan mengambil data pada Register UDRE pada saat bit RXC di Register UCSRA aktif. Bit RXC (Receive Complete) ini aktif sebagai indikasi bahwa ada data yang telah diterima dengan lengkap pada Register UDRE.
Setelah procedure-procedure disiapkan maka main program mulai dapat dituliskan dengan terlebih dahulu melakukan inisialisi serial port dengan procedure USART_Init. Selanjutnya disiapkan array 5 byte dengan data 0 – 4 dengan nama array tabel_memory. Dengan melakukan Perulangan For sebanyak 5x dan mengirimkan data pada array ke serial port maka 5 byte data yang disiapkan pada serial port akan terkirim ke layar terminal PC. Data yang dikirimkan ke layar terminal melalu serial port dapat diubah-ubah dengan mengubah isi array tabel_memory.
Listing program ini dapat didownload di sini
4. Akses Serial Port – menerima data dari serial port dan ditampilkan di Port B
Pada listing program berikut berfungsi untuk menerima data dari serial port dan menampilkan pada LED-LED yang terhubung pada Port B. Sama dengan yang dilakukan pada contoh mengirimkan paket data ke serial port, pada bagian ini juga harus disiapkan procedure-procedure serial seperti yang telah dijelaskan sebelumnya.

Listing Program
int main (void){
DDRB=0xFF;
unsigned char data_serial;
USART_INIT(MYUBRR);
for (int i=0;i<5;i++){
PORTB=USART_Receive();
_delay_ms(100);
}
}
Pada main program ini diawali dengan inisialisasi Port B sebagai output, lalu inisialisasi serial port dan kemudian dilakukan perulangan For di mana setiap data yang diterima dari serial port (procedure USART_Receive) akan ditampilkan ke Port B. Dengan listing program seperti ini, maka setiap data yang diterima pada serial port akan langsung ditampilkan pada output LED di Port B
Listing Program ini dapat didownload di sini
- Akses Timer – membangkitkan signal PWM resolusi 10 bit di OC1A
Program berikut ini adalah membangkitkan signal PWM pada port OC1A atau PD5 dari ATMega8535. Signal PWM biasanya dibutuhkan untuk fungsi-fungsi mengendalikan kecepatan motor, dimmer lampu atau mengatur kecerahan LED.
Listing Program
int main(void){
DDRD=0xFF;
TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);
TCCR1B=(0<<ICNC1) |(0<<ICES1) |(0<<WGM13) |(0<<WGM12) |(1<<CS12) |(0<<CS11) | (0<<CS10);
TCNT1=0;
OCR1A=0x0180;
}
Untuk menuliskan listing program di atas, terlebih dahulu kita harus mengenali register-register Timer ATMega8535 yang dibahas pada artikel Dasar Mikrokontroler AVR 4 Timer dan Counter ATMega8535

Pada Register TCCR1A kita atur mode OC1A clear pada saat output OCR1A match dengan Register TCNT1. Dan WGM13:0 pada mode PWM Resolusi 10 bit.

Kemudian Register TCNT1 direset terlebih dahulu.

Nilai 0x180 adalah nilai tengah pada PWM resolusi 10 bit oleh karena itu akan diperoleh sinyal duty cycle 50% pada output PWM. Dengan memperbesar nilai OCR1A maka level high akan semakin besar dan level low semakin kecil.
Listing Program ini dapat didownload di sini
- Akses Timer – menghitung jumlah pulsa yang masuk di ICP1
Program ini berfungsi menghitung jumlah pulsa yang muncul di pin ICP1 atau PD6. Fungsi ini biasanya digunakan untuk aplikasi counter di mana pin ICP1 bisa dihubungkan ke sensor seperti proximity, limit switch atau one shot multivibrator.
Listing Program
#include<avr/io.h>
int main(void){
DDRD=0b101111;
DDRB=0b111111;
TCCR1B=(1<<ICNC1) |(0<<ICES1) |(0<<WGM13) |(0<<WGM12) |(1<<CS12) |(0<<CS11) | (0<<CS10);
while(1)
PORTB=ICR1;
}
Dengan mengaktifkan bit ICNC1 pada Register TCCR1B maka setiap pulsa yang masuk pada ICP1 akan menambah nilai yang ada pada Register ICR1. Oleh karena itu dengan selalu menampilkan nilai ICR1 pada PortB maka setiap pulsa yang diterima oleh ICP1 akan selalu menambah nilai yang tampil pada LED yang terhubung pada PortB. Apabila anda mencoba menghubungkan ICP1 ini ke push button switch, mungkin tampilan LED akan bertambah dengan nilai yang melompat-lompat. Hal ini disebabkan karena penekanan saklar push button biasanya menimbulkan efek mechanical bounce yang menyebabkan pulsa yang diterima oleh ICP1 tidak hanya sekali. Agar tidak terjadi bouncing, bisa ditambahkan IC One Shot Multivibrator seperti 74LS123 yang akan mengubah signal bounce tersebut menjadi sebuah pulsa dengan lebar yang dapat ditentukan oleh nilai R dan C yang terhubung padanya.
Listing Program ini dapat didownload di sini
DELTA ELECTRONIC
Paulus Andi Nalwan, ST
