Kadangkala dalam perancangan sebuah sistem berbasis mikrokontroler, masukan informasi yang akan diolah tidak selamanya dalam bentuk digital, bahkan lebih sering ditemui dalam bentuk analog. Untuk menjembatani antara mikrokontroler dengan dunia analog, maka sinyal informasi yang berbentuk analog tersebut harus terlebih dahulu dikonversi menjadi digital, sehingga mikrokontroler dapat memanipulasi data tersebut. Untuk mengubah sinyal analog tersebut menjadi digital, maka diperlukan perangkat yang dinamakan ADC (Analog to Digital Conversion).
Dipasaran sendiri terdiri macam2 ADC mulai dari 8 bit dengan kecepatan konversi yang relatif cukup untuk aplikasi2 dasar seperti pembacaan suhu, sampai dengan ADC yang memiliki kecepatan konversi yang cepat, untuk menuntut sistem yang real time. Dalam mikrokontroler AVR pada varian tertentu, seperti pada ATTiny15, ATMega8535,ATMega128 didalamnya terdapat fasilitas ADC sebesar 10 bit. Dengan ADC ini, maka seorang perancang dapat membuat sistem tanpa melakukan tambahan rangkaian eksternal. Dengan demikian maka, sistem hardware yang akan dirancang akan lebih minimalis, dan juga tentunya menghemat energi. ADC pada mikrokontroler AVR menyatu pada port mikrokontroler, sehingga bila kita ingin memanfaatkan fasilitas ADC, maka kita tidak bisa menggunakan port yang bersangkutan untuk port I/O. Untuk mengaktifkan fasilitas ADC, maka kita harus mengeset register2 yang ada pada ADC. Pada mikrokontroler AVR, referensi untuk tegangan ADC dapat dipilih sesuai dengan yang kita inginkan (dengan tegangan referensi maksimum 5 volt). Dengan referensi yang bisa dipilih ini, maka kita bisa mendapatkan data konversi ADC dengan ketelitian yang tinggi. Berikut gambar untuk memilih tegangan referensi yang diinginkan:
Dari gambar kita bisa memilih tegangan referensi yaitu sebesar 2.56 volt yang sudah ada dalam mikrokontroler tersebut atau kita bisa memakai tegangan referensi sesuai keinginan kita melalui pin AREF. Untuk memilih tegangan referensi tersebut, kita mengeset bit REFS1,REFS0 pada register ADLAR. Selain memilih tegangan referensi yang akan dipilih, kita juga bisa memilih pin mana yang akan digunakan sebagai ADC, karena pada mikrokontroler AVR tidak hanya ada 1 pin yang bisa digunakan sebagai ADC. Pada ATMega8535 misalnya, ADC yang tersedia bahkan sampai 8 pin. Untuk jelasnya dapat dilihat pada gambar dibawah:
Untuk memilih ADC yang ingin dipilih, maka kita mengeset bit MUX4…MUX0 pada register ADMUX. Selain mengeset register ADMUX, kita juga perlu untuk mengeset register pada ADCSRA.
ADEN=ADC enable, 1=mengaktifkan ADC
ADSC=ADC Start Conversion, 1= memulai konversi
ADFR=ADC free running, memilih mode ADC, 1=mode free running
ADIF=ADC interrupt flag, 1 ketika terjadi interupsi pada ADC
ADIE= ADC interrupt enable, 1=mengaktifkan interupsi ADC
ADPS2..0=ADC prescaller
Setelah kita mengeset register2 kendali pada ADC, hasil konversi ADC dapat diambil diregister ADCL dan ADCH (2 register). Berikut contoh potongan program untuk mengeset ADC, dan mengambil data hasil konversi pada single mode.
mulaiadc:
Idi r16, ObOllOOOOl ; rreferensi dari AVCC, left adj, channel 1
out ADMUX, r16
Idi r16, ObllOOOlll ; enable, start, single conv, prescaier 128
out ADCSRA, r16
tungguselesai: ; tunggu adc tegangan selesai
sbic ADCSRA, ADSC
rjmp tungguselesai
in r17, ADCH ; ambil data, hanya ADCH, abaikan 2 bit LSB
cbi ADCSRA, 7 ; matikan ADC, untuk menghemat daya
out PORTC, r17 ; tampilkan bit-bit ADCH di LED
rcall tunggu ; tunggu sebentar
rjmp mulaiadc ; aktifkan ADC lagi
tunggu: ; subrutin tunggu
Idi r19, $FF
tunggulagi:
Idi r20, $FF
lagi:
dec r20
brne lagi
dec r19
brne tunggulagi
ret