adc
TRANSCRIPT
Praktikum Teknik Interface dan Peripheral
Modul #4: Antarmuka ADC
Deskripsi:
Mengkonversikan nilai tegangan analog dari luar menjadi bilangan digital
serta menampilkan nilai digitalnya ke LED. Sinyal masukan adalah berupa
tegangan analog dengan besar tegangan bervariasi (mulai dari 0V s/d 5V, dengan
stepping 5V/256 = ~20mV). Nilai sinyal tegangan masukan ini akan ditampilkan
konversi nilai digital desimalnya di LED dari 0 sampai 255
Program ini bertujuan melakukan antarmuka sistem analog ke sistem digital menggunakan
IC ADC0804 (8-bit uP compatible A/D Converter) dari National Semiconductor
1. Antarmuka mikrokontroler/prosesor sebagai perangkat digital ke chip ADC sebagai
jembatan dari analog ke digital
2. Teknik kontrol dan transaksi data antara ukontroler dengan ADC secara paralel
3. Teknik interupsi eksternal dan pengesetan sampling rate untuk sinyal analog masukan
4. Melakukan profiling chip ADC yang digunakan, yaitu grafik konversi nilai digital
dari besar tegangan analognya
Program menggunakan rutin-rutin seperti modul#2 (LED termultipleks)
Alat dan Bahan
1. Hardware:
1. Board praktikum interface
2. 2-buah kabel paralel (10-pin) untuk data_LED, select_LED
3. 1 buah kabel paralel (8-pin) untuk data_ADC
4. 4 buah kabel tunggal untuk kontrol_ADC: nRead (R), nEnable (E), nWrite (W) dan
nInterrupt (I)
board pembagi tegangan dengan potensiometer sebagai emulator dari sensor, dll.
Keluaran tegangan minimal 0V, maksimal 5V
5. Alat ukur: multitester
2. Software:
a. MCU8051IDE untuk editor kode sumber *.asm berbasis GUI beserta assemblernya
b. NGProg33 programmer serial untuk upload kode *.hex ke board
Dasar Teori
1. Prinsip kerja ADC
2. Antarmuka mikrokontroler dengan ADC
- koneksi ADC dengan mikrokontroler
3. Teknik antarmuka ADC
- diagram timing
- teknik pemrograman untuk protokol dan transaksi data di antarmuka ADC tersebut
- interupsi eksternal dan pengaturan sampling rate untuk sinyal analog
Referensi:
1. http://www.kmitl.ac.th/~kswichit/lecture47/index.html
2. 8051 Instruction Set. http://www.kmitl.ac.th/~kswichit/lecture47/8051instruction.pdf
3. Tutorial 8051. http://www.zntu.edu.ua/base/lection/rpf/lib/zhzh03/8051_tutorial.pdf
4. MCS@51 MICROCONTROLLER FAMILY USER MANUAL. Intel.
http://pmik.imio.pw.edu.pl/pliki/8051_Manual.pdf
5. ADC0804 Datasheet. National Semi. http://www.national.com/ds/DC/ADC0801.pdf
Cara Kerja:
1. Pastikan board praktikum terdeteksi dengan baik dari NGProg33
2. Hubungkan port P0 dengan jalur data_LED dan P2 dengan jalur select_LED
menggunakan kabel paralel 10-kabel
3. Hubungkan port P1 dengan jalur data_ADC menggunakan paralel 8-kabel
4. Hubungkan port kontrol_ADC:
1. P3.2 dengan adc_int (I)
2. P3.6 dengan adc_wr (W)
3. P3.7 dengan adc_rd (R)
4. adc_en dengan ground, gnd (P1,- atau P3,- atau Gnd lainnya)
5. Program kode sumber, kompile dan upload ke board
6. Sambungkan keluaran board pembagi tegangan ke masukan ADC (adc_in).
Hubungkan juga multitester untuk mengukur tegangan tersebut dengan referensi
ground
7. Run program
8. Putar potensiometer sampai tegangan terukur mendekati 0V atau tampilan LED 000.
9. Putar berlahan-lahan dengan step seperti yang diminta dalam lembar kegiatan.
10. Amati besar tegangan terukur di multitester dan nilai keluaran LED
11. Buat tabel, gambar grafik dan analisis profile dari ADC (fungsi transfer)
Tugas praktikum
1. Buat subprogram untuk mengubah tampilan LED dari nilai digital menjadi kode
tegangan (4 digit, digit 4 untuk tegangan satuan, sisanya untuk pecahan).
Misalnya: 0V menjadi 0000, 40mV menjadi 0040. Nilai tegangan diperoleh dari
pembacaan multitester dan nilai digital konversinya
2. Edit program untuk sampling tegangan 1ms. Jelaskan solusi Anda
; -----------------------
; Include file
; -----------------------
include "delay.asm" ; Fungsi-fungsi delay
include "led_matrik.asm" ; Fungsi dan makro untuk matriks LED
; -----------------------
; Vector
; -----------------------
org 0 ; Reset vector
jmp start
org 03h ; External0 vector
jmp EX0_int
org 0Bh ; Interrupt vector - T0
sjmp T0_int
; -----------------------------
; Konstanta dan Definisi
; -----------------------------
;; Konfigurasi pin di P1
; P1: port DAC
; P3.6: port strobe nWrite
adc_port equ P1 ; port DAC
adc_int equ P3.2 ; Pin interrupt ADC
adc_wr equ P3.6 ; Kontrol Write/WR ADC
adc_rd equ P3.7 ; Kontrol Read/RD ADC
data_led data 20h ; Sama dengan alamat data_ptr di led_matrik.asm
adc_data data 30h ; Menyimpan data DAC
adc_count data 31h ; Alamat untuk menyimpan counting DAC
adc_rate equ 200 ; 200us * 200 = 40ms sampling
;; Macro assert & deassert
; Assert: activate
; Deassert: deactivate
assert macro bit
;setb bit ; active-high
clr bit ; active-low
endm
deassert macro bit
;clr bit ; active-high
setb bit ; active-low
endm
; ------------------------------------------
; Subprogram
; ------------------------------------------
;
;; Handle interrupt from TF0
T0_int:
push ACC ; Protect register Acc dan B
push B
; Tampilkan bilangan ke display LED
call display_number
inc adc_count ; Increment adc_count, used in EX0_int
mov A, adc_count
cjne A, #adc_rate, t0_noops
mov adc_count, #0
call start_conversion ; Start conversion dg rate adc_rate
t0_noops:
pop B
pop ACC
reti
;; Handle interrupt from External0
EX0_int:
push ACC ; Protect register Acc dan B
push B
assert adc_rd
; Get data dari ADC
mov adc_data, adc_port
call extract_num ; Ekstrak bilangan desimal, tampilkan di LED
deassert adc_rd
pop B
pop ACC
reti
start_conversion:
assert adc_wr
deassert adc_wr
ret
;; extract_num
; Ekstrak bilangan desimal menjadi unit, puluhan dan ratusan
extract_num:
; ekstrak ratusan
mov A, adc_data
mov B, #100d
div AB
mov data_led+2, A
; ekstrak puluhan
mov A, B ; Ambil reminder
mov B, #10d
div AB
mov data_led+1, A
mov data_led, B
ret
start:
; Inisialisasi data ke 0h
init_led data_ptr, #0h
mov R0, #data_led+data_len
; Inisialisasi nilai masukan dac
mov adc_count, #0
mov P0, adc_count
; Interrupt setting
mov IE, #0h ; disable all interrupts
setb ET0 ; Aktifkan interrupt timer
setb EX0 ; Aktifkan interrupt EX0
setb EA
;; Inisialisasi Timer0
mov TMOD, #03h ; Mode 3 timer: separated timer 8-bit
mov TL0, #185d ; 200us timer at 11.059MHz
; 12*TL0/11.059M
setb TR0 ; Turn on Timer0
call start_conversion ; Initiate ADC conversion
sjmp main
main: ; Main loop
jmp main
;-------------
; Program End
;-------------
end