Mikrosha. Bab satu. Pengontrol kartu SD



Banyak orang mengingat PC yang luar biasa ini. Saya mendapatkan ini ketika saya berusia 11 tahun. Butuh 28 tahun dan sekarang saya memutuskan untuk membuat perangkat ekspansi, yang saya benar-benar tidak miliki, sebagai hobi.

Ide


Di jaringan, saya melihat beberapa opsi untuk pengunduh SD untuk PC seperti itu, saya tidak suka kehadiran mikrokontroler di dalamnya, saya ingin menggunakan sirkuit "vintage, warm DIP", itulah sebabnya saya memutuskan untuk menggunakan "KR1533" pada logika domestik.

Sebagai tambahan. RAM saya menerapkan UT62256. Ini adalah satu-satunya chip yang diimpor dalam proyek ini. Tentu saja, adalah mungkin untuk menginstal KP537RU10 atau KP537RU25A, tetapi pertama-tama, mereka harus diinstal bukan hanya satu tetapi dua (saya merencanakan RAM tambahan 4 KB), dan kedua saya memiliki UT62256, tetapi saya tidak memiliki KR537, dan saya tidak perlu memesan Aku ingin. Oleh karena itu, saya memberikan kebebasan pada diri saya untuk mengimpor, dan kemudian muncul ide untuk menggunakan semua 32kB RAM tambahan, dengan pergantian halaman.


Untuk ROM saya memilih KR573RF5, hanya ada dua yang bersih.

Diagram alir


Setelah duduk sambil minum teh, saya menggambar diagram blok seperti itu.



Ini adalah chip RAM, chip ROM, dan blok PORT. Blok PORT memiliki antarmuka paralel yang memiliki 8 input dan 8 output. Saat menulis ke alamat EFFF, kode tertulis ditetapkan pada output, dan ketika membaca dari alamat yang sama, nilai baca sesuai dengan status input. Tiga dari output dan satu input dihubungkan ke kartu SD melalui konverter level.

RAM diwakili oleh chip UT62256 dan memiliki memori 32kB. Karena kisaran alamat E000-EFFE hampir 4kB (4095 byte), kami mendapatkan 8 halaman yang dipilih oleh blok PORT, bit 1,2 dan 3. Artinya, menulis ke alamat EFFF mengatur halaman sesuai dengan tiga bit ini. Juga membaca dari port ini menunjukkan halaman mana yang saat ini dipilih (dalam bit yang sama). Total, kami memiliki 32760 byte RAM tambahan (4095x8str).

Chip ROM adalah KR573RF5. Itu terhubung ke ruang alamat F000-F7FF, dan berisi kode BSVV (BIOS), tugas kode ini adalah menginisialisasi kartu SD, memuat OS dari itu dan mentransfer kontrol untuk itu.

Dengan demikian, setelah menyalakan PC, kami mengetik Monitor Sistem GF000 dan tekan VK.

Di masa mendatang, ada ide untuk memodifikasi ROM asli dari Monitor Sistem untuk secara otomatis mem-boot OS dari kartu SD, dan PC akan pergi ke prompt Monitor standar jika unduhan gagal atau terganggu, misalnya, dengan menekan beberapa tombol.
Saya akan memikirkannya lagi.

Skema


Sekitar 2-3 jam di depan komputer, dan saya menggambar diagram berikut di EAGLE.


Zoom yang

saya gambar berdasarkan pada sirkuit mikro yang saya miliki. Ada kemungkinan bahwa jumlah chip logika dapat dikurangi jika gerbang lain digunakan, tetapi saya hanya punya satu. Dan di masa depan, saya kemungkinan besar akan mengoptimalkan sirkuit.

Penguraian sirkuit tingkat rendah ...

... dihapus di bawah spoiler, saya pikir beberapa orang tertarik pada hutan ini.
V3/1, A14 A15 , N3 , .1. V1/2 G, IC2. A B, A12 A13 . , , A14 A15, A12 A13. — 1110,
A15-1; A14-1; A13-1; A12-0. N2. , 5 11, - , , . 1 5, 2 11. , 1C , 2C , .1 5, .0 — 11.

: Exxx =1, «PORT», Exxx C=0, «RAM».

«C» , (A0-A11). xFFF, =1, =0. : «PORT» EFFF, «RAM» E000-EFFE.

«RAM» CS IC3, , , E000-EFFE . E000-EFFE . EFFF IC4, . «PORT» «WR» c V1/5, V1/6 V3/4.

EFFF IC5,
B0-B7.

. « » CS3 CS .

Perakitan tata letak


Sekarang saya tidak punya kesempatan untuk meracuni papan di rumah, dan saya, mengambil sepotong PCB dua sisi berlapis foil, melihat keluar persegi yang diperlukan dari itu.

Kotak ini dimasukkan dengan kuat ke dalam slot "antarmuka internal" PC, tidak hang out dan tidak bergerak. Selanjutnya, saya menggaruk bantalan di bagian belakang dan depan. Ternyata cukup baik. Kemudian susunan kasar dari sirkuit mikro dan pengintaian lubang. Di sisi depan, saya mengebornya dengan bor besar sehingga terminal sirkuit mikro tidak bersentuhan dengan foil depan. Di sisi sebaliknya, saya menggores perimeter setiap baris kontak dan membaginya menjadi bantalan kontak.

Langkah selanjutnya saya meletakkan semua microcircuits (dan soket) dan menghilang dari belakang. Butuh banyak waktu instalasi, yang saya lakukan dengan MGTF yang tipis. Dia memimpin kabel di kedua sisi, dari depan dia menyolder langsung ke kaki dari sirkuit mikro, dari belakang ke situs.



Ketika proses penyolderan selesai, saya memutuskan untuk memperhatikan konverter level sinyal. Faktanya adalah bahwa kartu SD bekerja dengan tegangan 3.3V, dan chip KR1533AP6 dan KR1533IR22 TTL 5v. Oleh karena itu, saya harus membuat syal adaptor kecil, yang levelnya terbatas pada dioda zener.

Sinyal yang datang dari kartu SD ke controller saya baru saja menarik ke sumber 3.3v. 10k resistor. Seperti yang telah ditunjukkan oleh praktik, sinyal ini tidak perlu dikonversi.



Meskipun dalam versi final saya mungkin akan membuat inverter berdasarkan komparator.

Saya menggunakan adaptor microSD ke SD sebagai tempat kartu.

Secara umum, tidak ada masalah khusus dalam merakit tata letak, meskipun saya takut bahwa beberapa microcircuits mungkin tidak berfungsi.

Tes Tata Letak


Pertama-tama, saya memeriksa operasi RAM, menulis pola "AA", "55", "F0" dan "0F" ke area E000-EFFE menggunakan arahan System Monitor "F" dan memeriksanya menggunakan arahan "D". Segalanya menjadi normal.

Lebih lanjut, dengan arahan “M”, saya mulai menulis nilai yang berbeda ke alamat EFFF, dan menonton perubahan pada kaki register 153322 dengan multimeter, negara-negara terkait dengan kode yang direkam. Juga, ketika membaca dari port ini, kode tersebut berisi halaman yang dipilih, sesuai dengan rencana, dan bahkan ketika sinyal MISO ditutup ke tanah dalam bit rendah, ternyata menjadi 0, dan ketika dibuka 1.

Itu bahkan entah bagaimana curiga bahwa semua sirkuit mikro bekerja dan instalasi berhasil tidak ada kesalahan.

BSVV


Tentu saja, saya tidak punya alat khusus untuk menulis program untuk 58080. Saya harus menulis sebuah program di notebook (notepad), kemudian menerjemahkannya ke dalam kode secara manual.
Membuat file di editor di bawah DOS "HIEW" dan mulai mengisinya dengan kode. Untuk dasar-dasarnya, saya mengambil proyek saya di bawah AVR, di mana ada inisialisasi standar kartu SD. Proyek ini sudah tua, dan tidak menggunakan sistem file apa pun, hanya logger.

Pertama saya menulis fungsi level rendah dari antarmuka pemrograman SPI, dan kemudian rutin inisialisasi kartu SD tingkat tinggi.

Ternyata algoritma seperti ini ...

... yang diletakkan di bawah spoiler, saya pikir itu sudah diketahui semua orang.
1. () 90;
2. CS .1 10 FF;
3. CS .0;
4. CMD0;
5. 01, 7;
6. . =0, , 2;
7. CMD8;
8. ACMD41;
9. 00, 11
10. . =0, , 8;
11. CMD58.
12. 2 EFFE.
13. .

Register kartu OCR juga dibaca dalam rutin inisialisasi, dan byte kedua di dalamnya ditulis ke alamat EFFE. Ini diperlukan untuk menentukan jenis kartu.

Dalam kasus SDSC - 80h, dan dalam kasus SDHC - C0h.

Jika inisialisasi tidak lulus, maka pesan "SD CARD ERROR" ditampilkan dan kemudian monitor keluar tanpa reset.

Saya mengonversi BSVV ini menjadi WAV dan mengunduhnya ke PC melalui input rekaman, kemudian men-debug, memperbaiki kode sumber dan mengunduhnya lagi.

Jembatan


Sekarang saya memiliki RAM tambahan, berukuran 32.760 byte, dibagi menjadi 8 halaman. Tetapi bagaimana cara menavigasi antar halaman? Bagaimana program yang berjalan pada halaman pertama menjalankan rutin yang terletak pada halaman keempat?

Untuk mengatasi masalah ini, saya telah menyediakan jembatan perangkat lunak. Bridge adalah area kecil dalam ROM yang memediasi transfer kendali.

Misalnya, kode pelaksana harus mentransfer kontrol ke halaman nomor 3, ke alamat E4B5. Kemudian, kode pelaksana menempatkan 12 bit yang lebih rendah (4B5) di pasangan register prosesor HL, dan di atas empat bit menempatkan nilai 3 - nomor halaman. Sekarang dalam pasangan register HL nilai 34B5 ditulis. Dan kode melompat (JMP) ke area ROM, yang disebut JMP-Bridge, itu hanya akan ke alamat tetap di ROM. Kode di area ini mengekstrak nomor halaman dari bit tinggi pasangan register HL dan menuliskannya ke register blok PORT di alamat EFFF. Halaman ketiga RAM sekarang ditampilkan di area E000-EFFE. Program JMP-Bridge me-reset empat bit tinggi dari pasangan register HL dan menulis "E" di sana. Sekarang di pasangan register HL sudah ada alamat fisik E4B5, dan di sini program JMP-Bridge mentransfer kontrol ke sana.

Ini mentransfer kontrol antar halaman.

Ada CALL-Bridge, diperlukan untuk memanggil subrutin dengan return, dan berbeda dari JMP-Bridge dengan menyimpan halaman saat ini di stack, dan prosedur sebaliknya untuk kembali.

Dua jembatan berikutnya adalah STA-Bridge dan LDA-Bridge. Seperti namanya, yang pertama menulis register Baterai ke alamat logis (dalam HL), dan yang kedua membaca data dari alamat logis ke dalam register ini.

Berkat dua jembatan ini, program yang dijalankan dari satu halaman dapat menyimpan data di halaman lain.

Pemuatan OS


Jika Anda melihat sektor boot kartu SD, Anda dapat melihat bahwa teks “Kesalahan disk, tekan tombol apa saja untuk memulai kembali” terletak di alamat 1AC-1D4.



Ya, sangat aneh tampilannya di foto, karena pengodean karakter Mikroshi tidak sesuai dengan ASCII.

Saya memutuskan untuk menggunakan area ini untuk menempatkan data di sana untuk mengunduh PC.

Pertama-tama, saya meletakkan kode 00 di posisi 1BA, dan dengan demikian memotong catatan. Sekarang, hanya "Disk error" yang harus ditampilkan dan hanya itu. Byte yang tersisa adalah milikku. Prinsipnya sederhana, 6 byte tanda tangan Mikros, dan 4 byte alamat pada kartu SD dari awal file dengan OS. Dalam BSVV saya menulis, setelah menerima sektor boot dari kartu SD, tanda tangan diperiksa, dan jika ada, kemudian ambil 4 byte berikutnya dan gunakan sebagai alamat sektor untuk memuat OS.

Jika tidak ada tanda tangan, pesan “OS DOWNLOAD ERROR” ditampilkan dan Monitor Sistem padam tanpa reset.

Total


Dan sekarang, akhirnya, semuanya bekerja. BSVV ditulis, tetapi saya masih perlu menulisnya ke ROM.



Dan untuk ini, saya perlu mengedit semua alamat panggilan subrutin dan melompat, karena prosesor ini memiliki pengalamatan absolut. Dan saya menulis BSVV untuk wilayah 6000-67FF untuk dimuat dalam RAM. Tapi sekarang kita perlu mengubah semua 6xxx ke Fxxx.

Selain itu, saya dalam kondisi "popanetsky". Saya memiliki pemrogram ROM, tetapi yang lama, di bawah port LPT. Dan tidak ada satu komputer dengan LPT. Tapi ada sepasang Atmega32A, dalam paket PDIP40 dan papan tempat memotong roti. Anda mungkin perlu meniru LPT menggunakan AVR. Tapi mungkin itu semua akan berhasil ...

Itu saja untuk saat ini. Terimakasih atas perhatiannya! Bersambung…

All Articles