Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Programmer Komputer Breadboard Arduino UNO – Bangun dan Kode Sistem 8-bit Anda

Komponen dan Perlengkapan

Programmer Komputer Breadboard Arduino UNO – Bangun dan Kode Sistem 8-bit Anda
Arduino UNO
×1

Tentang Proyek Ini

Apa itu proyek ini?

Ini adalah ekstensi dari proyek komputer breadboard 8-bit milik Ben Eater. Saya sangat menikmati mengikuti video Ben tentang cara membangun komputer breadboard dan membuat versi sendiri. Jika Anda belum mengikuti Ben, saya sangat menonton video-nya sebelum membaca – proyek ini akan sangat sulit dipahami tanpa konteks tersebut.

Setelah membangun komputer, segera terlihat bahwa jika saya harus memasukkan program secara manual melalui switch DIP setiap kali menyala, komputer tersebut tidak akan terlalu berguna. Bahkan memasukkan hanya 16 byte berulang kali menjadi membosankan sangat cepat. Saya juga berencana memperluas memori menjadi 256 byte, yang hanya akan berguna jika program dapat dimuat dan disimpan.

Apa yang bisa dilakukan dengan ini?

  • Menyimpan program dari RAM komputer breadboard
  • Memuat program ke RAM komputer breadboard
  • Menjalankan otomatis program yang disimpan saat komputer breadboard menyala
  • Memeriksa dan memodifikasi isi memori melalui koneksi serial
  • Memprogram komputer breadboard dalam bahasa assembly
  • Mengurai isi memori
  • Langkah demi langkah instruksi per instruksi
  • Mengatur breakpoint dan menjalankan hingga breakpoint

Berikut adalah video yang mendemonstrasikan fitur-fitur ini. Mohon maaf kualitas video – saya bukan pembuat konten video profesional:

Bagaimana cara kerjanya?

Saya memiliki beberapa tujuan saat membuat proyek ini:

  • Hardware yang dibutuhkan sebanyak mungkin sedikit untuk membangunnya
  • Perubahan sebanyak mungkin sedikit pada komputer breadboard itu sendiri

Awalnya saya memikirkan menggunakan EEPROM untuk menyimpan program dan kemudian beberapa macam logika untuk mentransfer program dari EEPROM ke RAM komputer breadboard. Namun, merancang logika transfer ternyata lebih rumit dari yang saya tangani (saya lebih berbakat dalam perangkat lunak meskipun saya sangat menikmati bekerja dekat dengan hardware). Saya merupakan penggemar Arduino yang besar, jadi pada suatu titik saya mulai memikirkan mengganti logika transfer dengan Arduino. Membutuhkan waktu untuk meyakinkan diri bahwa menggunakan Arduino bukan merupakan penipuan (setelah tutto Arduino UNO jauh lebih powerful daripada komputer breadboard itu sendiri) tetapi saya senang dengan hasilnya jadi saya telah melakukannya.

Jadi apa yang perlu dilakukan Arduino? Nah, perlu dapat membaca data dari memori dan menulis data ke memori. Cara termudah dan paling tidak mengganggu (untuk komputer breadboard) adalah menggunakan antarmuka yang sudah dimiliki modul memori: bus dan sinyal kontrol. Pin I/O digital Arduino adalah dua arah, jadi menghubungkan 8 pin secara langsung ke bus memungkinkan Arduino membaca dari dan menulis ke bus. Agar modul RAM membaca dari atau menulis ke bus, yang diperlukan adalah mengatur sinyal MI/RI/RO sesuai. Sinyal-sinyal ini biasanya dihasilkan oleh EEPROM logika kontrol, jadi Arduino mengontrolnya juga akan menyebabkan konflik dan kemungkinan cortoil. Namun, EEPROM AT28C16 yang digunakan Ben memiliki input Chip Enable (CE) yang mengubah semua output data ke keadaan high-z – yang kemudian memungkinkan Arduino memanipulasi sinyal. Untuk membaca RAM, Arduino perlu melakukan hal berikut:

  • atur sinyal CE EEPROM ke tinggi (yaitu nonaktifkan logika kontrol)
  • eluarkan alamat pertama yang akan dibaca ke bus
  • atur sinyal MI ke tinggi dan tunggu transisi clock rendah-tinggi
  • atur MI ke rendah dan RO ke tinggi dan tunggu transisi clock rendah-tinggi
  • baca byte data dari bus
  • ulangi dari langkah 2 untuk semua 16 alamat
  • atur sinyal CE EEPROM ke rendah (yaitu aktifkan kembali logika kontrol)

Itu saja. Menulis isi RAM sangat mirip, Arduino hanya perlu menulis ke bus dan mengatur RI ke tinggi alih-alih RO. Tentu ada beberapa masalah teknis yang harus diselesaikan tetapi mekanisme dasar di atas adalah inti dari proyek ini.

Apa perubahan yang perlu saya buat pada komputer breadboard?

Ada dua perubahan yang perlu dilakukan:

  • Pasang resistor pull-down pada output data EEPROM logika kontrol
  • Nonaktifkan (atau reset terus-menerus) ring counter saat EEPROM dinonaktifkan

Resistor pull-down

Resistor pull-down diperlukan karena saat EEPROM dinonaktifkan, resistor pull-up pada gerbang logika yang sinyal kontrol (seperti AO/AI/EO...) terhubung akan menarik sinyal-sinyal itu ke tinggi. Itu akan berarti beberapa register menulis ke bus secara bersamaan, yang menyebabkan konflik.

Resistor pull-up pada input gerbang 74LS sekitar 10k. Jadi resistor pull-down perlu cukup kecil untuk menurunkan tegangan ke daerah rendah. Untuk sebagian besar garis sinyal saya menggunakan resistor 3.3 kOhm. Namun, ada dua pengecualian: pertama, sinyal "SU" terhubung ke 8 gerbang XOR eksklusif, yang berarti resistor pull-up efektif adalah 10kOhm/8 = 1.25kOhm. Resistor pull-down harus jauh lebih kecil dari 1k untuk menariknya ke rendah. Untungnya, sinyal SU (kurang) tidak mengontrol interaksi apa pun dengan bus jadi kita bisa mengabaikannya dan tidak memasang resistor pull-down. Kedua, CE (counter enable) membutuhkan resistor pull-down 1k – nilai yang lebih besar menyebabkan perilaku program counter acak dalam beberapa kasus.

Saya menemukan paling mudah menambahkan resistor pull-down pada breadboard yang menahan semua LED biru, yaitu antara anoda LED (yang terhubung ke output EEPROM) dan GND.

Programmer Komputer Breadboard Arduino UNO – Bangun dan Kode Sistem 8-bit Anda

[Saya tidak dapat menempatkan resistor di sini untuk sinyal HLT/MI/RI jadi saya menambahkannya di lokasi lain pada breadboard]

Reset ring counter

Modifikasi lain adalah mereset ring counter. Secara teknis ini tidak benar-benar diperlukan untuk menyimpan/memuat program tetapi memungkinkan transfer kontrol yang lancar dari Arduino kembali ke logika kontrol. Tujuannya adalah menjaga ring counter pada 0 selama CE tinggi (yaitu logika kontrol dinonaktifkan). Saat Arduino mengubah CE kembali ke rendah (mengaktifkan logika kontrol), ring counter akan berada pada nol dan komputer breadboard mulai mengeksekusi instruksi berikutnya.

Untuk pembangunanku, saya tidak perlu melakukan apa-apa untuk ini karena saya menggunakan satu output EEPROM untuk mereset ring counter. Ini meningkatkan kinerja dengan mereset ring counter segera setelah instruksi selesai. Ini juga secara otomatis memberikan reset ring counter saat logika kontrol EEPROM dinonaktifkan: resistor pull-down pada output EEPROM akan menarik sinyal ke rendah yang mereset ring counter.

Jika Anda menggunakan implementasi Ben dari ring counter tetap 5 langkah, saya pikir ekstensi berikut pada rangkaian resetnya akan mereset counter saat CE tinggi (klik panah kiri/kanan di bawah untuk beralih antara rangkaian asli Ben dan versi yang diperluas):

Programmer Komputer Breadboard Arduino UNO – Bangun dan Kode Sistem 8-bit Anda
Programmer Komputer Breadboard Arduino UNO – Bangun dan Kode Sistem 8-bit Anda

Seperti yang Anda lihat, ini memerlukan 3 gerbang NAND lagi, yaitu satu chip 74LS00 lagi. Perhatikan bahwa saya belum menguji pendekatan ini tetapi seharusnya bekerja sejauh yang saya lihat.

Modifikasi ini tidak mutlak diperlukan – Anda bisa melakukannya nanti. Memuat dan menyimpan serta monitor/assembler/disassembler akan tetap berjalan dengan baik. Namun, tindakan apa pun yang memerlukan transfer kontrol dari Arduino ke logika kontrol tidak akan bekerja. Yang paling terkenal adalah menjalankan otomatis program yang disimpan saat startup serta single-stepping dan menjalankan dalam debugger.

Bagaimana cara mengatur Arduino?

Unggah sketsa dari arsip GIT ke Arduino dan hubungkan Arduino ke komputer breadboard sebagai berikut:

  • Pin 5V Arduino (bukan Vin!) ke rel 5V pada breadboard
  • Pin GND Arduino ke pin GND pada breadboard
  • Pin digital Arduino 2-9 ke bus 0-7
  • Pin digital Arduino 10 ke output EEPROM logika kontrol yang mengontrol RO
  • Pin digital Arduino 11 ke output EEPROM logika kontrol yang mengontrol RI
  • Pin digital Arduino 12 ke output EEPROM logika kontrol yang mengontrol MI
  • Pin analog Arduino 0 ke sinyal CLOCK
  • Pin analog Arduino 3 ke CE (pin 18) dari semua EEPROM logika kontrol dan melalui resistor 10k ke +5v

Selain itu Anda perlu menyambungkan pin input analog 1 dan analog 2 Arduino ke switch DIP dan tombol push seperti yang ditunjukkan dalam skematik (untuk detail lebih lanjut lihat file Fritzing yang dilampirkan).

Programmer Komputer Breadboard Arduino UNO – Bangun dan Kode Sistem 8-bit Anda
Programmer Komputer Breadboard Arduino UNO – Bangun dan Kode Sistem 8-bit Anda

Untuk versi minimal (tetapi masih fungsional), Anda dapat melakukan hal berikut:

  • Tambahkan resistor pull-down 3.3kOhm pada pin output EEPROM yang mengontrol AO, CO, EO, IO, RO
  • Lewati instruksi "Reset ring counter" di atas
  • Lakukan penyambungan Arduino ke komputer breadboard seperti yang ditunjukkan di atas (Anda dapat menghapus resistor 10k pada langkah terakhir jika Anda ingin)
  • Sambungkan pin analog 1 dan analog 2 ke GND

Untuk menggunakan tombol simpan/muat, yang perlu Anda lakukan adalah menyambungkan tombol, switch DIP dan resistor terkait ke pin analog 1 dan 2 sesuai skematik.

Untuk menggunakan fitur autostart, Arduino perlu menjaga program counter dan ring counter pada 0 selama reset dan saat program ditransfer. Resistor pull-up antara pin analog 3 dan +5V menjaga logika kontrol tetap dinonaktifkan (dan oleh karena itu program counter pada 0) saat Arduino me-reset. Untuk ring counter, ikuti instruksi "Reset ring counter" di atas.

Bagaimana cara memuat dan menyimpan program?

Pengaturan minimal di atas akan memungkinkan Anda mengontrol Arduino melalui antarmuka serial. Untuk berkomunikasi dengan Arduino Anda akan memerlukan program terminal seperti Putty atau TeraTerm. Monitor serial dalam perangkat lunak Arduino juga akan bekerja tetapi pemisahan antara area input dan output dalam monitor serial membuatnya sedikit rumit dalam skenario ini.

  • Nyalakan komputer breadboard
  • Sambungkan PC ke Arduino melalui kabel USB
  • Mulai program terminal dan konfigurasikan ke 9600 baud, 8 bit, tidak ada parity, 1 stop bit
  • Tekan ESC di jendela terminal untuk masuk ke mode Monitor
  • Anda harus melihat "." sebagai prompt perintah
  • Ketik "h" dan tekan enter untuk mendapatkan daftar perintah yang didukung

Dengan pengaturan minimal, Anda seharusnya dapat menggunakan perintah "m", "M", "C", "l" dan "s". Ini memungkinkan Anda untuk melihat isi memori, memodifikasi isi memori dan memuat serta menyimpan program.

Untuk menyimpan atau memuat program melalui tombol:

  • Matikan clock komputer breadboard
  • Atur switch DIP untuk memilih nomor file di mana data akan disimpan.
  • Tekan tombol "save" atau "load". LED yang terhubung ke CE akan menyala, menunjukkan bahwa Arduino telah mengambil kontrol
  • Nyalakan clock komputer breadboard. Anda harus melihat Arduino melalui alamat-alamat (perhatikan LED dari register alamat memori)
  • Tunggu hingga LED bus berhenti berkedip dan LED register alamat memori menunjukkan 1111
  • Matikan clock komputer breadboard. LED yang terhubung ke CE akan mati, menunjukkan bahwa kontrol telah dikembalikan ke logika kontrol

Untuk menjalankan program secara otomatis saat startup (pastikan Anda memiliki semua rangkaian yang diperlukan), cukup atur switch DIP ke nomor file di mana program disimpan dan nyalakan komputer breadboard (atau tekan tombol reset). Ada dua kasus khusus: jika semua switch DIP mati maka komputer menyala secara teratur, tanpa autostart. Jika semua switch DIP nyala maka Arduino langsung masuk ke mode Monitor saat startup.

Bagaimana cara menggunakan assembler dan disassembler?

Untuk menggunakan fitur assembler/disassembler dan debugger Anda perlu mengubah program pada Arduino agar sesuai dengan pengaturan spesifik Anda. Temukan bagian dalam kode sumber yang mendefinisikan struktur opcodes_4bit:

struct opcodes_struct opcodes_4bit [] = { {"NOP ", B00000000, 0, false}, {"LDA ", B00010000, 2, true}, ... {".OR ", B11111110, 0, true}, // set start address {".BY ", B11111111, 0, true}, // define one byte of data {NULL, 0, 0, false} }; 

Setiap baris menentukan satu opcode:

  • Kolom pertama adalah mnemonic ("LDA"). Untuk addressing segera, sertakan "#" dalam mnemonic. Jadi apa yang Ben sebut "LDI" akan disebut "LDA #" di sini. Apakah Anda bisa melihat bahwa saya tumbuh memprogram assembler 6510 di C64?
  • Kolom kedua adalah opcode itu sendiri. Empat bit bawah harus selalu 0. (kecuali untuk opcode khusus .OR dan .BY, lihat di bawah)
  • Kolom ketiga adalah jumlah siklus yang diambil opcode untuk dieksekusi (ini ditambah siklus fetch). Misalnya, dalam implementasiku LDA memiliki opcode 0001 dan membutuhkan total empat siklus untuk dieksekusi, dua di antaranya adalah siklus fetch. Jika Anda mengikuti instruksi Ben (di mana semua opcode menggunakan 5 siklus) maka ini harus selalu 3.
  • Kolom terakhir menentukan apakah opcode ini membutuhkan argumen. Misalnya LDA membutuhkan argumen tetapi OUT tidak.

Anda perlu menyesuaikan daftar ini untuk mencerminkan opcode yang Anda implementasikan untuk komputer breadboard Anda. Dua baris terakhir adalah opcode khusus yang digunakan oleh assembler dan harus dibiarkan seperti semula.

Setelah memasukkan semua opcode Anda, unggah perangkat lunak ke Arduino. Sambungkan terminal Anda dan masuk ke mode Monitor (baik dengan menekan ESC di jendela terminal atau dengan menyetel semua switch DIP ke nyala). Anda sekarang seharusnya dapat mengurai program Anda. Mengetik hanya "d" di monitor akan memulai penguraian dari alamat 0.

Assembler minimal tetapi bekerja cukup baik. Ketik "a" untuk memulai assembly dari alamat 0. Konvensinya adalah:

  • Jika baris tidak dimulai dengan spasi putih maka harus dimulai dengan definisi label. Label harus dimulai dengan karakter alfabet diikuti oleh karakter alfanumerik, paling panjang 3 karakter dan peka huruf besar/kecil.
  • Setelah spasi putih pertama dalam baris, assembler mengharapkan mnemonic (LDA, STA, OUT...).
  • Mnemonic khusus ".BY" secara langsung menentukan byte data yang akan disimpan di lokasi saat ini.
  • Mnemonic khusus ".OR" memberitahu assembler untuk melanjutkan assembly di alamat baru.
  • Jika argumen dimulai dengan karakter alfabet maka diasumsikan sebagai label.
  • Argumen numerik apa pun diharapkan berupa bilangan desimal. Untuk menentukan heksadesimal, awali argumen dengan "$". Misalnya, untuk memuat bilangan heksadesimal FF ke register A, gunakan "LDA #$FF".
  • Apa pun setelah ";" diasumsikan sebagai komentar dan diabaikan.

Misalnya, kode Fibonacci dapat dimasukkan sebagai berikut:

rst LDA #0 ; x = 0 STA x LDA #1 ; y = 1 STA y lp ADD x ; z = y + x STA z JC rst ; restart if overflow OUT ; print z LDA y ; x = y STA x LDA z ; y = z STA y JMP lp ; loop x .BY 0 y .BY 0 z .BY 0 

Apa keterbatasannya?

Untuk menghemat ruang RAM pada Arduino, assembler bekerja sebagai assembler satu lus (selain itu Arduino harus men-buffer semua kode sumber). Assembler menulis opcode ke memori komputer breadboard saat dimasukkan. Ini berarti assembly memperlambat oleh kecepatan clock komputer breadboard. Jika Anda menyalin dan menempel teks ke jendela terminal, itu dapat menyebabkan karakter hilang karena Arduino tidak dapat menahan karakter yang masuk dengan 9600 baud (karena itu menghabiskan terlalu banyak waktu menunggu clock komputer breadboard). Untuk mengatasi hal itu kurangi laju baud atau gunakan TeraTerm yang menyediakan pengaturan untuk menentukan penundaan antara karakter yang dikirim. Penyelesaian lainnya adalah meningkatkan kecepatan clock pada komputer breadboard. Clock saya hingga 160kHz dan pada kecepatan itu saya dapat menyalin dan menempel kode pada 9600 baud tanpa masalah.

Dalam konfigurasi default, sketsa Arduino dapat menangani frekuensi clock pada komputer breadboard hingga sekitar 1-2kHz (mungkin sedikit lebih). Perhatikan bahwa clock Ben dalam konfigurasi default tidak lebih cepat dari 500Hz. Jika clock Anda lebih cepat, cari switch #ifdef FAST_IO dalam kode. Menyalakan FAST_IO seharusnya membuat Arduino bekerja dengan kecepatan clock hingga 250kHz. Saya telah mengujinya hingga 160kHz. Kemungkinan besar untuk mendukung kecepatan yang lebih tinggi dengan mengimplementasikan loop yang penting waktu secara langsung dalam assembler tetapi jujurnya kecepatan clock 160kHz sudah terasa terlalu cepat pada komputer breadboard dengan kemampuan yang terbatas lainnya. Pastikan untuk membaca komentar yang sesuai dalam kode sebelum menyalakan FAST_IO.

Arduino memiliki 1k EEPROM dan oleh karena itu dapat menampung 1024/16=64 program yang berbeda. Sebenarnya itu 63 karena 16 byte disimpan untuk menyimpan data konfigurasi. Itu tidak banyak tetapi mungkin cukup untuk menampung semua program yang bisa Anda pikirkan. Hanya program nomor 0-15 yang dapat dipilih melalui switch DIP (1-14 untuk autostart) tetapi perintah "s" dan "l" akan bekerja dengan rentang penuh 0-62.

Tampilan agak acak. Bisakah Anda merapikannya?

Ya! Dalam versi akhir saya di sini sebenarnya hanya menggunakan chip Atmega 328P utuh (bersama dengan kristal 16MHz dan kapasitor) alih-alih Arduino UNO. Regulator tegangan pada UNO tidak diperlukan di sini karena Arduino secara langsung menggunakan 5V dari sumber daya kita bagaimanapun. Kerugian satu-satunya adalah sekarang kita harus menggunakan konverter USB-to-serial terpisah (FTDI atau sejenis) untuk berbicara dengan Atmega. Tampilan secara keseluruhan cocok jauh lebih baik dengan sisa komputer breadboard:

Programmer Komputer Breadboard Arduino UNO – Bangun dan Kode Sistem 8-bit Anda
Programmer Komputer Breadboard Arduino UNO – Bangun dan Kode Sistem 8-bit Anda

Optimasi lain adalah menghapus bootloader dari Arduino/Atmega. Ini menghilangi penundaan 2 detik saat bootloader Arduino dimulai. Saya akan memposting instruksi cara melakukannya jika orang tertarik. Beritahu saya di komentar!

Kode

Programmer komputer breadboard
Sketsa Arduino untuk Programmer Komputer Breadboardhttps://github.com/dhansel/programmer

Skematik

drive_pD8k28E85v.fzz

Proses manufaktur

  1. Evolusi Mouse Komputer: Desain, Manufaktur, dan Tren Masa Depan
  2. Membangun Efek Audio Berbasis Sensor dengan Kit Satellite CCRMA
  3. Membuat Spybot Arduino yang Dikontrol melalui Bluetooth
  4. FlickMote: Remote IR Kendali Gestur untuk Rumah Cerdas
  5. DIY Arduino TV B-Gone: Remote Universal untuk Semua TV
  6. Bangun Jam Master LED Kustom dengan Alarm – Terlihat dari Jarak 12 Meter
  7. Find Me: Pelacak Item Cerdas dengan Arduino dan Bluetooth
  8. Solusi Daya Teroptimasi untuk Proyek Arduino
  9. Tic Tac Toe Arduino dengan Matriks LED MAX7219 dan Kotak Kardus
  10. Membuat Robot Quadruped Arduino Cerdas: Panduan Langkah demi Langkah