6. Register Khusus ADC pada ATmega328p
6.1 ADMUX — ADC Multiplexer Selection Register
ADMUX adalah register 8-bit yang mengatur konfigurasi dasar ADC: sumber tegangan referensi, format penyimpanan data, dan pin analog channel mana yang akan dibaca.

Fungsi masing-masing field:
a) REFS1:REFS0 — Reference Selection
Memilih sumber tegangan referensi ADC:
| REFS1 | REFS0 | Tegangan Referensi |
|---|---|---|
| 0 | 0 | Pin AREF (eksternal) |
| 0 | 1 | AVcc (tegangan supply, biasanya 5V) |
| 1 | 0 | Tidak digunakan |
| 1 | 1 | Internal 2.56V |
b) ADLAR — ADC Left Adjust Result
Menentukan posisi penyimpanan hasil 10-bit di dalam dua register 8-bit (ADCH + ADCL):
| ADLAR | ADCH (8-bit) | ADCL (8-bit) |
|---|---|---|
| 1 (Left-justified) | D9 D8 D7 D6 D5 D4 D3 D2 | D1 D0 (unused 6-bit) |
| 0 (Right-justified) | (unused 6-bit) D9 D8 | D7 D6 D5 D4 D3 D2 D1 D0 |
- Right-justified (ADLAR=0): ADCL menyimpan 8-bit bawah, ADCH menyimpan 2-bit atas. Biasanya digunakan untuk membaca nilai penuh 10-bit.
- Left-justified (ADLAR=1): ADCH menyimpan 8-bit atas dari hasil. Berguna bila hanya perlu presisi 8-bit (cukup baca ADCH saja).
c) MUX3:MUX0 — Analog Channel Selection
Memilih pin analog input mana yang akan dikonversi:
| MUX3 | MUX2 | MUX1 | MUX0 | Pin Analog |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | ADC0 / A0 |
| 0 | 0 | 0 | 1 | ADC1 / A1 |
| 0 | 0 | 1 | 0 | ADC2 / A2 |
| 0 | 0 | 1 | 1 | ADC3 / A3 |
| 0 | 1 | 0 | 0 | ADC4 / A4 |
| 0 | 1 | 0 | 1 | ADC5 / A5 |
| 0 | 1 | 1 | 0 | ADC6 / A6 |
| 0 | 1 | 1 | 1 | ADC7 / A7 |
6.2 ADCSRA — ADC Control and Status Register A
ADCSRA adalah register 8-bit yang berfungsi sebagai pusat kontrol dan pemantauan status proses ADC.

Fungsi masing-masing bit:
| Bit | Nama | Fungsi |
|---|---|---|
![]() |
ADC Enable | Set ke 1 untuk mengaktifkan ADC. Jika 0, ADC tidak akan berjalan dan pin analog tidak dikonversi. |
| ADSC | ADC Start Conversion | Set ke 1 untuk memulai satu siklus konversi. Bit ini tetap bernilai 1 selama konversi berlangsung, lalu kembali ke 0 secara otomatis. |
| ADATE | ADC Auto Trigger Enable | Jika 1, konversi dimulai otomatis oleh trigger tertentu (misalnya timer overflow, perubahan pin eksternal, dll.). |
| ADIF | ADC Interrupt Flag | Diset ke 1 oleh hardware ketika konversi selesai (End of Conversion). Di-reset dengan menulis nilai 1 ke bit ini secara manual. |
| ADIE | ADC Interrupt Enable | Jika 1, program akan melakukan jump ke ISR (Interrupt Service Routine) saat konversi selesai. Berguna agar CPU tidak harus menunggu (polling). |
| ADPS2:ADPS0 | ADC Prescaler Select | 3-bit yang menentukan pembagi clock untuk ADC (lihat tabel prescaler di atas). |
6.3 ADCL dan ADCH — ADC Data Registers
ADCL dan ADCH adalah dua register 8-bit tempat hasil konversi ADC 10-bit disimpan setelah konversi selesai.
Karena ATmega328p menggunakan ADC 10-bit, hasilnya (0–1023) tidak muat dalam satu register 8-bit, sehingga dibagi ke dalam dua register:

PENTING: ADCL harus dibaca lebih dulu sebelum ADCH. Pembacaan ADCL akan me-lock ADCH agar tidak berubah hingga ADCH selesai dibaca, sehingga data yang dibaca tetap konsisten.
Cara membaca nilai ADC 10-bit penuh (right-justified):
// Dalam C:
uint16_t adc_value = ADC; // atau:
uint8_t low = ADCL;
uint8_t high = ADCH;
uint16_t adc_value = (high << 8) | low;
; Dalam Assembly:
LDS R18, ADCL ; baca low-byte dulu
LDS R19, ADCH ; baru baca high-byte

No comments to display
No comments to display