Bagaimana angka dari sensor sampai ke memori? Coba simulatornya, lalu uji dirimu dengan latihan ujian dan kartu hafalan.
Peta Konsep
Setiap pengukuran berbasis komputer berakhir dengan masalah yang sama: angka dari instrumen harus masuk ke memori pada saat yang tepat, tanpa hilang dan tanpa terbaca dua kali.
Bayangkan komputer sebagai kantor kecil. CPU adalah satu-satunya pegawai, memori adalah lemari arsip bernomor, dan port I/O adalah kotak surat di pintu depan tempat instrumen menitipkan angkanya. Pertanyaannya: bagaimana surat di kotak itu masuk ke lemari arsip?
Programmed I/O
Bolak-balik mengecek kotak surat. Tidak ada surat yang terlewat, tetapi pegawai tidak sempat mengerjakan hal lain.
Chip: 8255 · Cocok untuk sensor lambat
Interupsi
Bel pintu. Pegawai bekerja di mejanya; saat bel berbunyi ia berhenti sebentar, mengambil surat, lalu kembali bekerja.
Chip: 8259A, 8254 · Laju sedang, waktu tepat
DMA
Kurir yang memegang kunci lemari arsip. Ia menyimpan setiap surat langsung; pegawai hanya diberi tahu saat satu kotak penuh.
Chip: 8237A · Data cepat dan terus-menerus
Rantai akuisisi data
Sensor → Pengondisi sinyal → ADC → Antarmuka I/O → CPU dan memori
Mata rantai terlemah ada di antara antarmuka I/O dan CPU, karena keduanya berjalan dengan detak dan kecepatan berbeda. Setiap metode transfer menjawab dua pertanyaan:
- Kapan data siap? (sinkronisasi)
- Siapa yang memindahkan data: CPU atau perangkat keras khusus?
Merekam tegangan superkapasitor elektroda karbon saat siklus pengisian–pengosongan, suhu tungku saat anil (annealing), beban pada uji tarik, atau emisi akustik dari sampel yang retak. Yang berbeda hanya seberapa cepat dan seberapa teratur angkanya datang, dan itulah yang menentukan metode transfernya.
Lomba Tiga Metode
Geser laju pencuplikan dan lihat berapa banyak waktu CPU yang habis untuk tiap metode. Inilah alasan instrumen cepat memakai DMA.
Bilah menunjukkan persentase waktu CPU (atau bus) yang terpakai untuk memindahkan data. Sisanya adalah waktu bebas untuk menggambar grafik, menyimpan berkas, atau berkomunikasi. Di atas 100 %, sistem tidak sanggup dan sampel hilang.
Asumsi: pada polling, CPU terkunci di loop selama konversi ADC; pada interupsi dan DMA, ADC dianggap cukup cepat. DMA memakai satu interupsi per blok (lama sama dengan waktu ISR). Angka-angka ini ilustratif untuk sistem kelas 8086; ukur sendiri di papan latihmu.
Coba empat titik ini
Rumus beban CPU untuk interupsi: beban = fs × tISR. Pada 1 kHz dan 20 µs: 1000 × 20 µs = 2 %.
Programmed I/O dan 8255
CPU mengendalikan setiap langkah transfer dengan instruksi IN dan OUT. Paling sederhana, tetapi CPU tidak bisa mengerjakan hal lain selama menunggu.
CPU terus bertanya kepada instrumen, “Sudah siap?”, seperti anak kecil di kursi belakang yang bertanya “Sudah sampai?”. Begitu jawabannya “ya”, CPU membaca angkanya. Lambat, tetapi sangat dapat diandalkan.
Transfer tanpa syarat
CPU membaca atau menulis port kapan pun program sampai di instruksi itu. Hanya cocok untuk perangkat yang selalu siap: saklar, tampilan LED.
Transfer bersyarat (polling)
CPU membaca bit status dalam loop, misalnya EOC (end of conversion), dan baru memindahkan data saat bit itu menyatakan siap. Bentuk yang biasa dipakai untuk ADC.
Jalankan program polling langkah demi langkah
8255 di alamat 80H–83H. Data ADC → Port A, EOC → PC0, SOC ← PC4. Program mengambil tiga sampel (CX = 3). Tekan Langkah dan perhatikan berapa kali CPU berputar di POLL.
Kata kendali 8255
Bit D7 menentukan arti seluruh byte: D7 = 1 berarti kata pengaturan mode, D7 = 0 berarti perintah bit set/reset (BSR) untuk satu bit Port C. Coba bentuk 91H untuk contoh polling di atas (Port A masuk, C atas keluar, B keluar, C bawah masuk).
Perakit kata kendali 8255 (D7 = 1)
Kata kendali
Perakit kata BSR (D7 = 0)
Pembaca kata kendali
Ketik satu byte heksadesimal; halaman ini menjelaskan artinya, entah kata mode atau kata BSR.
Tiga mode I/O
| Mode | Gambaran | Isi |
|---|---|---|
| 0 dasar | Pintu biasa | Tanpa jabat tangan; port mana pun bisa masuk atau keluar (16 kombinasi); keluaran di-latch, masukan tidak. |
| 1 strobe | Pintu dengan bel dan lampu “paket diterima” | Port A/B dengan jabat tangan dari Port C. Masuk: STB#, IBF. Keluar: OBF#, ACK#. INTR dapat menginterupsi CPU jika INTE = 1. |
| 2 dua arah | Pintu putar | Hanya Port A, dua arah, dengan lima jalur jabat tangan PC3–PC7. |
Interupsi dan 8259A
Perangkat memberi tahu CPU saat ia siap. CPU menjalankan program utamanya dan baru berhenti ketika ada permintaan interupsi.
8259A adalah resepsionis dengan delapan saluran telepon. Ia mengurutkan penelepon (IR0 paling penting), bisa membisukan saluran tertentu (mask), memberi tahu CPU siapa yang menelepon lewat nomor vektor, dan perlu diberi tahu saat panggilan selesai (EOI). Lupa EOI, dan resepsionis mengira kamu masih menelepon: saluran itu dan semua saluran yang lebih rendah tidak pernah disambungkan lagi.
Simulator 8259A (mode bersarang penuh)
Ketuk sel baris IRR untuk mengajukan permintaan, sel baris IMR untuk membisukan saluran. Lalu jadilah CPU: kirim INTA untuk melayani, dan EOI saat rutin layanan selesai.
Satu interupsi, enam langkah (mode 8086)
- Saluran IR naik dan menyetel bit IRR-nya.
- Resolver memeriksa mask dan prioritas, lalu menaikkan INT.
- CPU menyelesaikan instruksinya dan mengirim INTA# pertama (bus belum diisi).
- INTA# kedua: bit ISR disetel, bit IRR dihapus, nomor vektor dikirim lewat bus data.
- CPU menyimpan flag dan alamat kembali, lalu melompat lewat tabel vektor di alamat tipe × 4.
- Rutin layanan diakhiri EOI (menghapus bit ISR), lalu IRET.
Mode 8085: tiga pulsa INTA# yang menghasilkan opcode CALL, byte rendah, dan byte tinggi alamat rutin.
Kata perintah 8259A
| Kata | Ditulis dengan | Mengatur |
|---|---|---|
| ICW1 | A0 = 0, D4 = 1 | Mulai inisialisasi · IC4 (ICW4 menyusul) · SNGL (tunggal) · LTIM (tepi atau level) |
| ICW2 | A0 = 1 | Basis vektor T7–T3; tiga bit bawah diisi nomor IR |
| ICW3 | A0 = 1 | Hanya untuk kaskade: master = saluran yang punya slave; slave = ID 3 bit |
| ICW4 | A0 = 1 | µPM = 1 untuk 8086 · AEOI · BUF dan M/S · SFNM |
| OCW1 | A0 = 1 | Register mask: 1 = dibisukan |
| OCW2 | A0 = 0, D4 D3 = 00 | EOI (non-spesifik atau spesifik), rotasi, set prioritas |
| OCW3 | A0 = 0, D4 D3 = 01 | Baca IRR/ISR · perintah poll · special mask mode |
Timer 8254: Cuplikan dengan Selang Sama
Data yang baik diambil pada selang waktu yang sama. Loop tunda di perangkat lunak tidak bisa menjamin itu; pewaktu perangkat keras bisa.
8254 adalah metronom. Ia menghitung detak jam kristal yang cepat dan memberi satu pulsa setiap N detak. Pilih N, maka kamu memilih laju pencuplikan. Pulsa itu memulai konversi ADC, dan sinyal “selesai” dari ADC membunyikan bel interupsi.
Kalkulator hitungan 8254
Enam mode 8253/8254 (ringkas)
| Mode | Nama | Perilaku OUT |
|---|---|---|
| 0 | Interupsi saat hitungan habis | Rendah setelah diisi, naik dan tetap tinggi saat hitungan habis |
| 1 | One-shot yang dapat dipicu ulang | Turun setelah tepi naik GATE, naik lagi saat hitungan habis |
| 2 | Pembangkit laju (bagi N) | Rendah satu detak tiap N detak, lalu memuat ulang. Hitungan 1 tidak sah. |
| 3 | Gelombang persegi | Tinggi N/2, rendah N/2 (N ganjil: (N+1)/2 tinggi, (N−1)/2 rendah) |
| 4 | Strobe dipicu perangkat lunak | Rendah satu detak setelah hitungan habis |
| 5 | Strobe dipicu perangkat keras | Dipicu tepi naik GATE; rendah satu detak setelah hitungan habis |
8254 pencacah 0, detak 2 MHz, Mode 2 → N = 2000 = 07D0H (kata kendali 34H). EOC ADC → IR1 dari 8259A dengan ICW2 = 40H, jadi tipe 41H dan alamat rutin tersimpan di 41H × 4 = 104H. Kata yang ditulis: ICW1 = 13H, ICW2 = 40H, ICW4 = 01H, OCW1 = FDH (hanya IR1 aktif), dan OCW2 = 20H (EOI) di akhir rutin.
DMA dan 8237A
Pengendali khusus meminjam bus alamat, data, dan kendali dari CPU, lalu memindahkan data langsung antara perangkat I/O dan memori.
CPU cukup berkata sekali: “Simpan 4096 bacaan berikutnya ke laci 2000H dan seterusnya.” Kurir (8237A) lalu membawa setiap bacaan langsung ke memori. Karena koridornya (bus) hanya satu, kurir harus meminjamnya: HOLD = “boleh saya pinjam?”, HLDA = “silakan”.
Urutan satu permintaan DMA
- Perangkat menaikkan DREQ pada salurannya.
- Jika saluran tidak di-mask, 8237A menaikkan HRQ ke masukan HOLD CPU.
- CPU menyelesaikan siklus busnya, melepaskan bus, dan menaikkan HLDA.
- 8237A mengaktifkan DACK dan mengemudikan alamat serta IOR# dan MEMW#.
- Satu byte berpindah langsung dari perangkat ke memori; alamat +1, hitungan −1.
- Hitungan melewati 0000H ke FFFFH (TC): 8237A memberi pulsa EOP#, menurunkan HRQ, dan CPU mengambil kembali bus.
Perakit kata mode 8237A
Kata mode
Hitungan kata (ingat N − 1)
Tulis ke register hitungan
Batas laju DMA
Batas atas (tanpa wait state)
Laju ≈ fCLK ÷ detak per transfer. S1 hanya muncul sekali tiap 256 transfer saat byte alamat atas berubah.
Jenis dan mode transfer
| Jenis | Arah | Strobe |
|---|---|---|
| Write | I/O → memori (akuisisi data) | IOR# + MEMW# |
| Read | Memori → I/O (misalnya ke DAC) | MEMR# + IOW# |
| Verify | Uji saja: alamat dibuat, tanpa data | Tidak ada |
| Memori ke memori | Saluran 0 baca ke register sementara, saluran 1 tulis | MEMR#, lalu MEMW# |
“Read” dan “write” dinamai dari sisi memori. Mode: single (satu byte per permintaan), block (seluruh blok sampai TC), demand (selama DREQ aktif), cascade (menyambung 8237A lain).
Pilih Metode yang Tepat
Ajukan dua pertanyaan: berapa bacaan per detik? dan apakah datangnya acak, atau harus berjarak sama sementara komputer mengerjakan hal lain?
Skor kasus
Latihan Ujian
Dua cara berlatih. Mode latihan memberi umpan balik langsung untuk semua soal. Simulasi ujian mengambil soal acak dengan batas waktu, lalu memberi nilai dan pembahasan di akhir. Skor terbaikmu tersimpan di peramban ini.
Pilih salah satu tombol di atas untuk mulai. Soal dan urutan pilihan diacak setiap kali.
Kartu Hafalan
Ketuk kartu untuk membaliknya. Tandai kartu yang sudah kamu hafal; tandanya tersimpan di peramban ini.
Ringkasan dan Lembar Rumus
| Programmed I/O | Interupsi | DMA | |
|---|---|---|---|
| Tahu “siap” | CPU polling bit status | Perangkat menaikkan IR | Perangkat menaikkan DREQ |
| Memindahkan byte | CPU (IN, OUT) | CPU, di dalam ISR | 8237A, I/O ↔ memori |
| CPU bebas saat menunggu | Tidak | Ya | Ya (bus dipinjamkan) |
| Perangkat keras | 8255 | 8259A, sering + 8254 | 8237A + latch alamat |
| Beban | Seluruh loop tunggu | Per byte: simpan, ISR, EOI, IRET | Per blok: penyiapan, serah terima bus |
| Laju khas | Lambat, sesekali | Hingga sekitar 10 kHz | Puluhan kHz hingga MB/s |
| Sinyal kunci | STB#, IBF, OBF#, ACK# | INT, INTA#, IR0–IR7 | DREQ, DACK, HRQ, HLDA, EOP# |
Rumus yang perlu diingat
- Laju 8254: fs = fCLK ÷ N
- Beban CPU interupsi = fs × tISR
- Tipe vektor = basis ICW2 + nomor IR; alamat = tipe × 4
- Hitungan 8237A = jumlah transfer − 1
- Laju DMA maks ≈ fCLK ÷ detak per transfer
Kata yang sering muncul
- 8255 Mode 0, A masuk, C atas keluar, B keluar, C bawah masuk: 91H
- BSR set/reset PC4: 09H / 08H
- 8254 pencacah 0, LSB+MSB, Mode 2, biner: 34H
- EOI non-spesifik (OCW2): 20H
- 8237A saluran 1, single, naik, auto-init, write: 55H
Kesalahan klasik
- Lupa EOI di akhir ISR.
- Lupa menghapus flip-flop first/last sebelum menulis alamat 8237A.
- Menulis N, bukan N − 1, ke register hitungan DMA.
- Memakai hitungan 1 pada 8254 Mode 2.
- Lupa STI, sehingga CPU tidak pernah menerima interupsi.