Semuanya bermula dengan pengarang membeli peranti yang menarik di pasaran sekunder - Smart Response XE (
Peranti ini telah dihentikan beberapa tahun yang lalu, dan apa yang dibeli oleh sekolah dengan harga $100-$200 setiap satu kini muncul di eBay dengan harga $10 atau kurang. Perkakasan di sana sangat sesuai untuk eksperimen geeky:
- 60 kekunci papan kekunci
- paparan dengan resolusi 384Γ136, 2 bit setiap piksel - serupa dengan BC, CGA, tetapi 4 bukan warna, tetapi penggredan kecerahan
- mikropengawal ATmega128RFA1 (memori kilat 128 kB, ROM 4 kB, RAM 16 kB, transceiver 802.15.4)
- luaran (berkaitan dengan mikropengawal, bukan keseluruhan peranti) 1 megabit (128 kilobait) memori kilat dengan antara muka SPI
- petak untuk 4 elemen AAA.
Dari nama mikropengawal itu jelas bahawa ia tergolong dalam keluarga AVR, yang bermaksud menjadikan peranti yang serasi dengan Arduino adalah tugas yang lebih daripada remeh...
Daripada berita itu
Tetapi penulis lebih berminat dengan peluang untuk tidak bermain pada peranti, tetapi untuk mengkaji:
- memori kilat dengan antara muka SPI bersiri
- pemuat but untuk AVR
- standard 802.15.4
Penulis memulakan dengan menulis
Ini cukup untuk memuat naik pemuat but Arduino, tetapi bukan lakaran - port bersiri tidak disambungkan di sana, jadi anda masih tidak boleh melakukannya tanpa membuka kes itu. Juga, garisan TX0 dan RX0 port bersiri pertama digabungkan dengan garis pengundian matriks papan kekunci, iaitu garisan yang mengundi kekunci fungsi pada sisi paparan. Tetapi apa yang boleh anda lakukan - pengarang membina ini:
Dia membawa talian JTAG ke sana, dan kini tidak perlu membuka petak bateri. Dan supaya lakaran boleh dimuat naik, saya menyambungkan kedua-dua port bersiri ke penyambung yang sama, juga menambah suis, kerana dengan bateri yang dipasang, secara fizikalnya mustahil untuk mematikan peranti dengan cara lain.
Ia mengambil masa yang agak lama untuk bekerja dengan besi pematerian, pisau utiliti dan pistol gam. Secara umum, memuat naik lakaran "melalui udara" adalah lebih mudah; kami perlu mencipta sesuatu untuk ini dengan segera.
Arduino IDE menggunakan program untuk memuat naik lakaran
Selepas mencuba pelbagai cara untuk mengatasi masalah ini, penulis datang dengan perkara berikut. Peranti ini mempunyai memori kilat 128 KB dengan antara muka SPI - kami menerima data melalui wayar (ingat bahawa pengarang sudah mempunyai satu peranti dengan penyambung di sisi), gunakan memori ini sebagai penimbal dan hantar data melalui radio saluran ke peranti lain. Salam dari Cybiko.
Selepas menulis kod untuk berfungsi dengan saluran radio, serta fon, pemuat menjadi lebih panjang daripada 4 kilobait. Oleh itu, nilai HFUSE terpaksa ditukar daripada 0xDA kepada 0xD8. Kini pemuat but boleh panjang sehingga 8 kilobait, dan alamat permulaan kini ialah 0x1E000. Ini ditunjukkan dalam Makefile, tetapi juga harus diambil kira semasa mengisi
Transceiver 802.15.4 dalam ATmega128RFA1 pada asalnya direka bentuk untuk beroperasi menggunakan protokol
Ternyata saluran 15 dan 26 paling kurang terdedah kepada gangguan daripada WiFi. Penulis memilih yang kedua daripadanya. Penafian: penterjemah tidak tahu sama ada ia dibenarkan untuk memudahkan ZigBee dengan cara ini. Mungkin kita perlu melakukan sedikit lagi pengaturcaraan dan melaksanakannya sepenuhnya?
Pada peranti pertama, adalah perlu untuk melaksanakan mesin keadaan terhingga yang menghantar data melalui protokol STK500. Untuk sebahagian besar, mesej yang dihantar dan diterima adalah mencukupi, tetapi ada yang terikat dengan mesej yang melalui saluran lebih awal. Penerangan tentang dialog diberikan
Komponen penting dalam dialog ini ialah penghantaran paket yang bertujuan untuk ditulis ke memori denyar peranti destinasi. Untuk mikropengawal mudah keluarga AVR, saiz halaman ialah 128 bait, tetapi untuk ATmega128RFA1 ialah 256. Dan untuk memori kilat yang disambungkan melalui protokol SPI, ia adalah sama. Program dalam peranti pertama, apabila memuat naik lakaran, tidak segera memindahkannya ke yang kedua, tetapi menulisnya ke memori ini. Apabila IDE Arduino menyemak ketepatan entri, ia dihantar apa yang ditulis di sana. Sekarang kita perlu menghantar data yang diterima melalui saluran radio ke peranti kedua. Pada masa yang sama, bertukar daripada menerima kepada menghantar dan kembali berlaku agak kerap. Protokol STK500 tidak peduli dengan kelewatan, tetapi tidak bertolak ansur dengan kehilangan data (pelik, tetapi dikatakan di atas bahawa kelewatan juga menjejaskan pemindahan data). Dan kerugian semasa penghantaran wayarles tidak dapat dielakkan. ATmega128RFA1 mempunyai pelaksanaan perkakasan terbina dalam permintaan berulang apabila terdapat keraguan tentang ketepatan pemindahan, tetapi pengarang memutuskan untuk melaksanakan perkara yang sama dalam perisian sendiri. Dia membangunkan protokol di mana lebih banyak data mengalir satu arah daripada yang lain.
Ia tidak sempurna, tetapi ia berfungsi. Halaman 256-bait dibahagikan kepada empat segmen, setiap satunya dihantar melalui udara sebagai satu paket. Satu paket boleh memuatkan sehingga 125 bait data ditambah satu bait untuk panjang dan dua bait untuk CRC. Jadi serpihan sepanjang 64 bait bersama dengan nombor halaman dan segmen (dari 0 hingga 3) diletakkan di sana. Peranti penerima mempunyai pembolehubah yang membolehkannya menjejaki bilangan segmen yang telah diterima dan apabila keempat-empatnya tiba, peranti penghantar menerima pengesahan bahawa keseluruhan halaman telah diterima. Tiada pengesahan (CRC tidak sepadan) - hantar semula keseluruhan halaman. Kelajuan lebih besar daripada semasa menghantar melalui kabel. Lihat:
Tetapi secara umum, adalah perlu untuk menyediakan cara yang mudah untuk menyambungkan kabel ke peranti untuk memuat naik lakaran dan melaluinya. Sebagai contoh, letakkan di dalam penukar antara muka sedemikian pada CP2102, seperti dalam foto, dan gamkannya pada papan supaya ia dapat menahan daya apabila menyambung dan memutuskan kabel USB Mikro.
Ia juga mempunyai penstabil 3,3 volt (dan cara menggunakannya dalam peranti dengan bekalan kuasa 6 volt - jika hanya ia mempunyai penstabil yang sama, dan anda boleh menambah dua diod untuk memilih secara automatik yang mana di antaranya akan menghidupkan peranti) . Ketiga-tiga LED mesti tidak dipateri dari papan penukar antara muka, jika tidak, ia akan memuatkan bateri tambahan apabila beroperasi padanya, dan juga mengganggu pengundian papan kekunci dan berfungsi dengan memori denyar dengan antara muka SPI.
Mengejar matlamat ternyata lebih menarik daripada mencapainya (dan tidak memerlukan jenaka tentang bas itu). Penulis belajar banyak tentang pemuat but AVR, memori kilat SPI, protokol STK500 dan standard 802.15.4.
Semua kod lain sebagai tambahan kepada perpustakaan yang diterangkan di atas ialah β
Sumber: www.habr.com