Proses manufaktur
| × | 1 |
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?
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:
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:
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:
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:
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:
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.
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:
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:
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:
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!
Proses manufaktur
Komponen dan persediaan Arduino Due dari http://www.arduino.cc × 1 3.2 Modul Sentuh TFT 400*240 SD Dengan Perisai untuk Arduino Jatuh tempo Saya menggunakan yang dari Elechouse × 1 RTC DS3231 Jam waktu nyata dari Ebay × 1 GPS uBlox Neo 6M Modul GPS dari Ebay × 1
Komponen dan persediaan Arduino Mega 2560 × 1 Alat dan mesin yang diperlukan Jigsaw Aplikasi dan layanan online Arduino IDE Tentang proyek ini Ini adalah lift 5 lantai yang berfungsi. Tingginya 3 kaki. Kami bekerja keras untuk ini. Mari kita mu
Komponen dan persediaan Arduino UNO × 1 Sensor Pencari Jangkauan ToF SparkFun - VL6180 VL53L0X untuk jarak jauh dan VL6180X untuk jarak dekat. disini saya menggunakan VL6180X × 1 motor servo × 1 Aplikasi dan layanan online Arduino IDE Memproses
Prototyping adalah bagian besar dari proses desain dan pengembangan. Ini penting sebelum pindah ke fase yang lebih maju dalam proyek PCB. Oleh karena itu, jika Anda adalah pengembang elektronik digital, papan tempat memotong roti Arduino adalah cara yang tepat. Sebelum Arduino, pemula mengalami kes