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

Pemrogram Komputer Breadboard

Komponen dan persediaan

Arduino UNO
× 1

Tentang proyek ini

Apa proyek ini?

Ini adalah perpanjangan dari proyek komputer papan tempat memotong roti 8-bit Ben Eater. Saya sangat menikmati mengikuti video Ben tentang cara membuat komputer papan tempat memotong roti dan membuat versi saya sendiri. Jika Anda belum mengikuti Ben, saya sangat merekomendasikan untuk menonton videonya sebelum membaca - proyek ini tidak akan berarti apa-apa tanpa konteks.

Setelah membangun komputer, dengan cepat menjadi jelas bahwa jika saya harus secara manual mengaktifkan program melalui sakelar DIP setiap kali saya menyalakannya, maka itu tidak akan berguna sama sekali. Bahkan beralih hanya dalam 16 byte berulang-ulang menjadi tua dengan sangat cepat. Saya juga berencana untuk menambah memori hingga 256 byte dan itu hanya akan berguna jika entah bagaimana program dapat dimuat dan disimpan.

Apa yang bisa saya lakukan dengannya?

  • Menyimpan program dari RAM komputer papan tempat memotong roti
  • Memuat program ke dalam RAM komputer papan tempat memotong roti
  • Jalankan program yang disimpan secara otomatis saat komputer papan tempat memotong roti dimulai
  • Periksa dan ubah isi memori melalui koneksi serial
  • Program komputer papan tempat memotong roti dalam bahasa rakitan
  • Membongkar isi memori
  • Petunjuk satu demi satu
  • Setel breakpoint dan jalankan hingga breakpoint

Berikut adalah video yang menunjukkan fitur-fitur ini. Maafkan kualitas videonya - Saya sama sekali bukan pembuat konten video profesional:

Bagaimana cara kerjanya?

Saya memiliki beberapa tujuan dalam pikiran saat membuat proyek ini:

  • Hardware yang dibutuhkan sesedikit mungkin untuk membuatnya
  • Sesedikit mungkin mengubah komputer papan tempat memotong roti itu sendiri

Pada awalnya saya berpikir tentang menggunakan EEPROM untuk menyimpan program dan kemudian semacam logika untuk mentransfer program dari EEPROM ke RAM komputer papan tempat memotong roti. Namun, menghasilkan logika transfer terbukti lebih rumit daripada yang bisa saya tangani (saya lebih menyukai perangkat lunak meskipun saya sangat menikmati bekerja dekat dengan perangkat keras). Saya kebetulan adalah penggemar berat Arduino sehingga pada titik tertentu saya mulai berpikir untuk mengganti logika transfer dengan Arduino. Butuh beberapa waktu untuk meyakinkan diri sendiri bahwa menggunakan Arduino tidak curang (setelah semua bahkan Arduino UNO jauh lebih kuat daripada komputer papan tempat memotong roti itu sendiri) tapi saya senang dengan hasilnya jadi saya berdamai.

Jadi apa yang Arduino harus bisa lakukan? Nah, itu harus bisa membaca data dari memori dan menulis data ke memori. Cara termudah dan paling tidak mengganggu (ke komputer papan tempat memotong roti) untuk melakukannya adalah dengan menggunakan antarmuka yang sama yang sudah dimiliki modul memori:sinyal bus dan kontrol. Pin I/O digital Arduino bersifat dua arah, sehingga menghubungkan 8 pin secara langsung ke bus memungkinkan Arduino untuk membaca dan menulis ke bus. Untuk membuat modul RAM membaca atau menulis ke bus, yang diperlukan hanyalah mengatur sinyal MI/RI/RO yang sesuai. Sekarang sinyal tersebut biasanya didorong oleh EEPROM logika kontrol sehingga Arduino yang mengontrolnya juga akan menyebabkan konflik dan kemungkinan situasi korsleting. Namun, EEPROMS AT28C16 yang digunakan oleh Ben memiliki input Chip Enable (CE) yang menempatkan semua output data ke status z tinggi - yang kemudian memungkinkan Arduino untuk memanipulasi sinyal. Untuk membaca RAM, Arduino perlu melakukan hal berikut:

  • mengatur sinyal CE EEPROM menjadi tinggi (yaitu menonaktifkan logika kontrol)
  • menampilkan alamat pertama yang akan dibaca ke dalam bus
  • atur sinyal MI tinggi dan tunggu transisi jam rendah-tinggi
  • atur MI rendah dan RO tinggi dan tunggu transisi jam rendah-tinggi
  • membaca byte data dari bus
  • ulangi dari langkah 2 untuk semua 16 alamat
  • mengatur sinyal CE EEPROM ke rendah (yaitu mengaktifkan kembali logika kontrol)

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

Perubahan apa yang perlu saya lakukan pada komputer papan tempat memotong roti?

Ada dua perubahan yang perlu dilakukan:

  • Letakkan resistor pull-down pada logika kontrol output data EEPROM
  • Menonaktifkan (atau terus menyetel ulang) penghitung dering saat EEPROM dinonaktifkan

Resistor pull-down

Resistor pull-down diperlukan karena setelah EEPROM dinonaktifkan, resistor pull-up dari gerbang logika yang dihubungkan dengan sinyal kontrol (seperti AO/AI/EO...) akan menarik sinyal tersebut tinggi. Itu berarti bahwa beberapa register akan menulis ke bus, menyebabkan konflik.

Resistor pull-up pada input gerbang 74LS sekitar 10k. Jadi resistor pull-down harus cukup kecil untuk menurunkan tegangan ke wilayah rendah. Untuk sebagian besar jalur sinyal saya menggunakan resistor 3,3 kOhm. Namun, ada dua pengecualian:pertama, sinyal "SU" terhubung ke 8 gerbang OR eksklusif, artinya resistor pull-up efektif adalah 10kOhm/8 =1,25kOhm. Sebuah resistor pull-down harus secara signifikan kurang dari 1k untuk menarik ini rendah. Untungnya, sinyal SU (kurangi) tidak mengontrol interaksi apa pun dengan bus sehingga kita dapat mengabaikannya dan tidak memiliki resistor pull-down. Kedua, CE (pengaktifan penghitung) membutuhkan resistor pull-down 1k - nilai yang lebih besar menyebabkan perilaku penghitung program acak dalam beberapa kasus.

Saya merasa paling mudah untuk menambahkan resistor pull-down pada papan tempat memotong roti yang menampung semua LED biru, yaitu antara anoda LED (yang terhubung ke output EEPROM) dan GND.

[Saya tidak dapat memasukkan resistor di sini untuk sinyal HLT/MI/RI, jadi saya menambahkannya di lokasi lain di papan tempat memotong roti]

Setel ulang penghitung dering

Modifikasi lainnya adalah mengatur ulang penghitung dering. Secara teknis ini tidak benar-benar diperlukan untuk memungkinkan penyimpanan/pemuatan program tetapi memungkinkan transfer kontrol yang mulus dari Arduino kembali ke logika kontrol. Intinya adalah untuk menjaga penghitung cincin pada 0 selama CE tinggi (yaitu logika kontrol dinonaktifkan). Ketika Arduino mengubah CE kembali ke rendah (mengaktifkan logika kontrol), penghitung cincin akan menjadi nol dan komputer papan tempat memotong roti mulai mengeksekusi instruksi berikutnya.

Untuk build saya, saya tidak perlu melakukan apa pun untuk ini karena saya menggunakan satu output EEPROM untuk mengatur ulang penghitung dering. Ini meningkatkan kinerja dengan mengatur ulang penghitung dering segera setelah instruksi selesai. Ini juga secara otomatis memberi saya reset penghitung dering ketika logika kontrol EEPROM dinonaktifkan:resistor pull-down pada output EEPROM akan menarik sinyal rendah yang menyetel ulang penghitung dering.

Jika Anda menggunakan implementasi Ben dari penghitung cincin 5 langkah tetap, saya pikir ekstensi berikut untuk rangkaian resetnya harus mengatur ulang penghitung ketika jika CE tinggi (klik panah kiri/kanan di bawah untuk beralih antara sirkuit asli Ben dan versi diperpanjang):

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

Modifikasi ini tidak mutlak diperlukan - Anda dapat mengabaikannya di awal. Memuat dan menyimpan serta monitor/assembler/disassembler akan tetap berfungsi dengan baik. Namun, tindakan apa pun yang memerlukan transfer kontrol dari Arduino ke logika kontrol tidak akan berfungsi. Terutama yang menjalankan program tersimpan secara otomatis saat startup serta satu langkah dan berjalan di debugger.

Bagaimana cara mengatur Arduino?

Unggah sketsa dari arsip GIT ke Arduino dan sambungkan Arduino ke komputer papan tempat memotong roti sebagai berikut:

  • Pin Arduino 5V (tidak Vin!) ke rel 5V di papan tempat memotong roti
  • Sematkan GND Arduino ke pin GND di papan tempat memotong roti
  • Pin digital Arduino 2-9 ke bus 0-7
  • Arduino digital pin 10 untuk mengontrol logika output EEPROM yang mengontrol RO
  • Arduino digital pin 11 untuk mengontrol logika output EEPROM yang mengontrol RI
  • Arduino digital pin 12 untuk mengontrol logika output EEPROM yang mengontrol MI
  • Pin analog Arduino 0 ke sinyal JAM
  • Pin analog Arduino 3 ke CE (pin 18) dari semua mengontrol logika EEPROM dan melalui resistor 10k ke +5v

Selain itu, Anda perlu menyambungkan pin input analog 1 dan analog Arduino 2 ke sakelar DIP dan tombol tekan seperti yang ditunjukkan dalam skema (untuk lebih jelasnya lihat file Fritzing terlampir).

Untuk versi minimal (tetapi tetap berfungsi), Anda dapat melakukan hal berikut:

  • Tambahkan resistor pull-down 3.3kOhm ke pin output EEPROM yang mengontrol AO, CO, EO, IO, RO
  • Lewati petunjuk "Reset penghitung dering" di atas
  • Lakukan pengkabelan komputer Arduino ke papan tempat memotong roti seperti yang ditunjukkan di atas (Anda dapat mengabaikan resistor 10k di langkah terakhir jika Anda mau)
  • Hubungkan pin analog 1 dan pin analog 2 ke GND

Untuk menggunakan tombol muat/simpan, Anda hanya perlu menghubungkan tombol, sakelar DIP, dan resistor terkait ke pin analog 1 dan 2 sesuai skema.

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

Bagaimana cara memuat dan menyimpan program?

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

  • Nyalakan komputer papan tempat memotong roti
  • Hubungkan PC ke Arduino melalui kabel USB
  • Mulai program terminal dan konfigurasikan ke 9600 baud, 8 bit, tanpa paritas, 1 stop bit
  • Tekan ESC di jendela terminal untuk masuk ke mode Monitor
  • Anda akan 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 konten memori, memodifikasi konten memori, dan memuat serta menyimpan program.

Untuk menyimpan atau memuat program melalui tombol:

  • Matikan jam komputer papan tempat memotong roti
  • Setel sakelar DIP untuk memilih nomor file tempat data harus disimpan.
  • Tekan tombol "simpan" atau "muat". LED yang terhubung ke CE akan menyala, menandakan bahwa Arduino telah mengambil alih
  • Nyalakan jam komputer papan tempat memotong roti. Anda akan melihat Arduino berputar melalui alamat (perhatikan LED register alamat memori)
  • Tunggu sampai LED bus berhenti berkedip dan LED register alamat memori dan menunjukkan 1111
  • Matikan jam komputer papan tempat memotong roti. 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 sirkuit yang diperlukan), cukup atur sakelar DIP ke nomor file tempat program disimpan dan nyalakan komputer papan tempat memotong roti (atau tekan tombol reset). Ada dua kasus khusus:Jika semua sakelar DIP mati, maka komputer akan menyala secara teratur, tanpa mulai otomatis. Jika semua sakelar DIP aktif maka Arduino langsung masuk ke mode Monitor saat startup.

Bagaimana cara menggunakan assembler dan disassembler?

Untuk menggunakan fitur assembler/disassembler dan debugger, Anda harus terlebih dahulu 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 alamat awal {".BY ", B11111111, 0, true}, // tentukan satu byte data {NULL, 0, 0, false} }; 

Setiap baris menentukan satu opcode:

  • Bidang pertama adalah mnemonic ("LDA"). Untuk pengalamatan langsung, sertakan "#" di mnemonic. Jadi apa yang Ben sebut "LDI" akan disebut "LDA #" di sini. Bisakah Anda memberi tahu saya bahwa saya dibesarkan dengan pemrograman 6510 assembler di C64?
  • Bidang kedua adalah opcode itu sendiri. Empat bit bawah harus selalu 0. (kecuali untuk opcode khusus .OR dan .BY, lihat di bawah)
  • Bidang ketiga adalah jumlah siklus yang diperlukan opcode untuk dieksekusi (ini merupakan tambahan untuk siklus pengambilan). Misalnya, dalam implementasi saya, LDA memiliki opcode 0001 dan membutuhkan total empat siklus untuk dieksekusi, dua di antaranya adalah siklus pengambilan. Jika Anda mengikuti instruksi Ben (di mana semua opcode menggunakan 5 siklus) maka ini harus selalu 3.
  • Bidang terakhir menentukan apakah opcode ini memerlukan argumen. Misalnya LDA memerlukan argumen tetapi OUT tidak.

Anda perlu menyesuaikan daftar ini untuk mencerminkan opcode yang telah Anda terapkan untuk komputer papan tempat memotong roti Anda. Dua baris terakhir adalah opcode khusus yang digunakan oleh assembler dan harus dibiarkan apa adanya.

Setelah memasukkan semua opcode Anda, unggah perangkat lunak ke Arduino. Hubungkan terminal Anda dan masuk ke mode Monitor (baik dengan menekan ESC di jendela terminal atau dengan mengatur semua sakelar DIP ke on). Anda sekarang harus dapat membongkar program Anda. Mengetik "d" saja di monitor akan mulai membongkar di alamat 0.

Assembler minimal tetapi bekerja dengan cukup baik. Ketik "a" untuk mulai merakit di alamat 0. Konvensinya adalah:

  • Jika sebuah baris dimulai tidak diawali dengan spasi, maka harus dimulai dengan definisi label. Label harus dimulai dengan karakter alfabet diikuti dengan karakter alfanumerik, maksimal 3 karakter dan peka huruf besar/kecil.
  • Setelah spasi putih pertama dalam satu 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 perakitan di alamat baru.
  • Jika sebuah argumen dimulai dengan karakter alfabet, maka argumen tersebut dianggap sebagai label.
  • Argumen numerik apa pun diharapkan berupa angka desimal. Untuk menentukan heksadesimal, awali argumen dengan "$". Misalnya, untuk memuat nomor FF heksadesimal ke dalam register A, gunakan "LDA #$FF".
  • Apa pun setelah ";" dianggap sebagai komentar dan diabaikan.

Misalnya, kode Fibonacci dapat dimasukkan sebagai berikut:

LDA pertama #0; x =0 STA x LDA #1; y =1 STA y lp TAMBAHKAN x; z =y + x STA z JC pertama; restart jika meluap OUT; cetak 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 batasannya?

Untuk menghemat ruang RAM di Arduino, assembler bekerja sebagai assembler 1-pass (jika tidak, Arduino harus buffer semua kode sumber). Assembler menulis opcode ke memori komputer papan tempat memotong roti saat dimasukkan. Ini berarti perakitan diperlambat oleh kecepatan clock komputer papan tempat memotong roti. Jika Anda menyalin dan menempelkan teks ke jendela terminal, itu dapat menyebabkan hilangnya karakter karena Arduino tidak dapat mengikuti karakter yang masuk pada 9600 baud (karena menghabiskan terlalu banyak waktu untuk menunggu jam komputer papan tempat memotong roti). Untuk mengatasinya, kurangi baud rate atau gunakan TeraTerm yang menyediakan pengaturan untuk menentukan penundaan antara karakter yang dikirim. Solusi lainnya adalah meningkatkan kecepatan jam pada komputer papan tempat memotong roti. Jam saya naik hingga 160kHz dan pada kecepatan itu saya dapat menyalin dan menempelkan kode pada 9600 baud tanpa masalah.

Dalam konfigurasi default, sketsa Arduino dapat menangani frekuensi clock pada komputer papan tempat memotong roti hingga sekitar 1-2kHz (mungkin sedikit lebih). Perhatikan bahwa jam Ben dalam konfigurasi defaultnya tidak lebih cepat dari 500Hz. Jika jam Anda lebih cepat, cari #ifdef FAST_IO beralih dalam kode. Mengaktifkan FAST_IO akan membuat Arduino bekerja dengan kecepatan clock hingga 250kHz. Saya telah mengujinya hingga 160kHz. Mungkin akan mungkin untuk mendukung kecepatan yang lebih tinggi dengan menerapkan loop kritis waktu secara langsung di assembler tetapi sejujurnya kecepatan clock 160kHz sudah terasa terlalu cepat di komputer papan tempat memotong roti dengan kemampuannya yang terbatas. Pastikan untuk membaca komentar terkait dalam kode sebelum mengaktifkan FAST_IO.

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

Ini terlihat agak berantakan. Bisakah kamu merapikannya?

Ya! Dalam versi terakhir saya di sini, saya sebenarnya hanya menggunakan chip Atmega 328P (bersama dengan kristal dan kapasitor 16MHz) alih-alih Arduino UNO. Regulator tegangan pada UNO tidak diperlukan di sini karena Arduino langsung menggunakan 5V dari catu daya kami. Satu-satunya kerugian adalah bahwa kita sekarang harus menggunakan konverter USB-to-serial terpisah (FTDI atau serupa) untuk berbicara dengan Atmega. Tampilan keseluruhannya jauh lebih cocok dengan komputer papan tempat memotong roti lainnya:

Optimalisasi lainnya adalah menghapus bootloader dari Arduino/Atmega. Itu menghilangkan penundaan 2 detik saat bootloader Arduino dimulai. Saya akan memposting instruksi tentang cara melakukannya jika orang tertarik. Beri tahu saya di komentar!

Kode

Pemrogram komputer papan tempat memotong roti
Sketsa Arduino untuk Programmer Komputer Breadboardhttps://github.com/dhansel/programmer

Skema

drive_pD8k28E85v.fzz

Proses manufaktur

  1. Mouse Komputer
  2. Mengontrol Efek dengan Sensor Nyata
  3. Arduino Spybot
  4. FlickMote
  5. TV Buatan Sendiri B-Gone
  6. Jam Master
  7. Temukan Saya
  8. Arduino Power
  9. Tech-TicTacToe
  10. Arduino Quadruped