Kami sedang menulis bootloader OTA untuk ATmega128RFA1 (sebagai bagian dari perangkat Smart Response XE)

Kami sedang menulis bootloader OTA untuk ATmega128RFA1 (sebagai bagian dari perangkat Smart Response XE)

Semuanya dimulai dengan fakta bahwa penulis membeli perangkat menarik di pasar sekunder - Smart Response XE (Deskripsi Singkat). Hal ini ditujukan untuk sekolah: setiap siswa di kelas menerima perangkat yang mirip dengan buku catatan elektronik atau penerjemah dari tahun sembilan puluhan, guru mengajukan pertanyaan, dan siswa mengetik jawaban pada keyboard perangkat, yang diterima melalui a saluran radio (802.15.4) ke penerima yang terhubung ke PC guru.

Perangkat ini dihentikan produksinya beberapa tahun yang lalu, dan apa yang dibeli sekolah seharga $100-$200 masing-masing kini bermunculan di eBay dengan harga $10 atau kurang. Perangkat keras di sana sangat cocok untuk eksperimen culun:

  • papan ketik 60 tombol
  • tampilan dengan resolusi 384x136, 2 bit per piksel - mirip dengan BC, CGA, tetapi 4 bukan warna, tetapi gradasi kecerahan
  • mikrokontroler ATmega128RFA1 (memori flash 128 kB, ROM 4 kB, RAM 16 kB, transceiver 802.15.4)
  • eksternal (sehubungan dengan mikrokontroler, bukan seluruh perangkat) memori flash 1 megabit (128 kilobyte) dengan antarmuka SPI
  • kompartemen untuk 4 elemen AAA.

Dari namanya mikrokontroler terlihat jelas bahwa ia termasuk dalam keluarga AVR, yang berarti membuat perangkat yang kompatibel dengan Arduino bukanlah tugas yang sepele...

Dari berita seterusnya Hackaday penulis menemukan apa itu sudah melakukan (tautan yang sama memberi tahu Anda apa yang harus dihubungkan di mana), memiliki kesempatan untuk menjalankan game untuk Arduboy:


Namun penulis lebih tertarik pada kesempatan untuk tidak bermain di perangkat, tetapi untuk belajar:

  • memori flash dengan antarmuka serial SPI
  • bootloader untuk AVR
  • standar 802.15.4

Penulis memulai dengan menulis perpustakaan (GPL v3), yang memungkinkan Anda menginisialisasi tampilan, menampilkan teks dan persegi panjang, dan mengakses memori flash SPI. Kemudian dia mulai mendapatkan ide untuk penggunaan praktis perangkat tersebut: terminal saku yang kompatibel dengan VT-100, permainan multipemain. Setelah membangun kembali tiga perangkat, ia memutuskan untuk “mengajar” mereka untuk menerima sketsa “melalui udara.” Yang tidak hanya menarik, tetapi juga sangat nyaman: casing perangkat sulit dibuka setiap saat, dan di bawah penutup kompartemen baterai hanya ada lubang yang memungkinkan Anda menghubungkan programmer JTAG ke papan.

Kami sedang menulis bootloader OTA untuk ATmega128RFA1 (sebagai bagian dari perangkat Smart Response XE)

Ini cukup untuk mengunggah bootloader Arduino, tetapi bukan sketsanya - port serial tidak terhubung di sana, jadi Anda tetap tidak dapat melakukannya tanpa membuka casing. Selain itu, jalur TX0 dan RX0 pada port serial pertama digabungkan dengan jalur polling matriks keyboard, yaitu jalur yang melakukan polling tombol fungsi di sisi layar. Tapi apa yang bisa Anda lakukan - penulis membuat ini:

Kami sedang menulis bootloader OTA untuk ATmega128RFA1 (sebagai bagian dari perangkat Smart Response XE)

Dia membawa jalur JTAG ke sana, dan sekarang tidak perlu membuka tempat baterai. Dan agar sketsa dapat diunggah, saya menghubungkan kedua port serial ke konektor yang sama, juga menambahkan sakelar, karena dengan baterai terpasang, secara fisik tidak mungkin mematikan perangkat dengan cara lain apa pun.

Butuh waktu cukup lama untuk bekerja dengan besi solder, pisau serbaguna, dan lem. Secara umum, mengunggah sketsa “melalui udara” jauh lebih nyaman, kita perlu segera menciptakan sesuatu untuk ini.

Arduino IDE menggunakan program untuk mengunggah sketsa avrdude. Ia berinteraksi dengan mikrokontroler menggunakan protokol STK500, yang memungkinkan Anda mentransfer file di kedua arah. Ini kurang kompatibel dengan saluran yang memungkinkan adanya penundaan, distorsi, dan kehilangan data yang bervariasi. Jika ada yang lepas atau berdesir di saluran serial, Anda bisa gila-gilaan mencari penyebabnya. Suatu ketika penulis menderita selama setengah hari sampai dia menyadari bahwa masalahnya adalah kabel yang buruk, serta konverter antarmuka CP2102 yang berubah-ubah. Bahkan mikrokontroler dengan konverter antarmuka bawaan, misalnya ATmega32u4, terkadang dapat bertindak seperti ini. Setiap pengguna Arduino telah memperhatikan bahwa kesalahan saat mengunggah sketsa tidak jarang terjadi. Terkadang perekaman berjalan dengan baik, namun selama pengujian pembacaan, kesalahan terdeteksi. Ini tidak berarti ada kesalahan saat menulis - ada kegagalan saat membaca. Sekarang bayangkan ketika bekerja “over the air” hal yang sama akan terjadi, tetapi lebih sering.

Setelah mencoba berbagai cara untuk mengatasi masalah ini, penulis menemukan yang berikut ini. Perangkat ini memiliki memori flash 128 KB dengan antarmuka SPI - kami menerima data melalui kabel (ingat bahwa penulis sudah memiliki satu perangkat dengan konektor di sampingnya), gunakan memori ini sebagai buffer, dan kirim data melalui radio saluran ke perangkat lain. Halo dari Cybiko.

Setelah menulis kode untuk bekerja dengan saluran radio, serta font, ukuran loader menjadi lebih dari 4 kilobyte. Oleh karena itu, nilai HFUSE harus diubah dari 0xDA menjadi 0xD8. Sekarang bootloader bisa mencapai panjang 8 kilobyte, dan alamat awalnya sekarang 0x1E000. Hal ini tercermin dalam Makefile, tetapi juga harus diperhitungkan saat mengisi bootloader melalui avrdude.

Transceiver 802.15.4 di ATmega128RFA1 awalnya dirancang untuk beroperasi menggunakan protokol ZigBee, yang cukup rumit, sehingga penulis memutuskan untuk mengirimkan paket saja. Ini diimplementasikan pada perangkat keras di ATmega128RFA1, jadi sedikit kode yang diperlukan. Selain itu, untuk kesederhanaan, penulis memutuskan untuk menggunakan saluran tetap, tidak mengizinkan pemilihannya bahkan secara manual. Standar 802.15.4 mendukung 16 saluran dengan nomor 11 hingga 26. Cukup ramai, ada juga saluran WiFi yang tumpang tindih (merah adalah saluran ZigBee, biru, hijau dan kuning adalah WiFi).

Kami sedang menulis bootloader OTA untuk ATmega128RFA1 (sebagai bagian dari perangkat Smart Response XE)

Ternyata channel 15 dan 26 paling tidak rentan terhadap gangguan dari WiFi, Penulis memilih yang kedua. Penafian: penerjemah tidak mengetahui apakah diperbolehkan menyederhanakan ZigBee dengan cara ini. Mungkin kita harus melakukan lebih banyak pemrograman dan mengimplementasikannya sepenuhnya?

Pada perangkat pertama, perlu diimplementasikan mesin keadaan terbatas yang mengirimkan data melalui protokol STK500. Sebagian besar, pesan yang dikirim dan diterima bersifat mandiri, namun ada juga yang terikat dengan pesan yang melewati saluran sebelumnya. Deskripsi dialog diberikan di sini.

Komponen penting dari dialog ini adalah transmisi paket yang dimaksudkan untuk ditulis ke memori flash perangkat tujuan. Untuk mikrokontroler sederhana keluarga AVR, ukuran halamannya adalah 128 byte, tetapi untuk ATmega128RFA1 adalah 256. Dan untuk memori flash yang dihubungkan melalui protokol SPI sama saja. Program di perangkat pertama, saat mengunggah sketsa, tidak langsung mentransfernya ke perangkat kedua, tetapi menulisnya ke memori ini. Ketika Arduino IDE memeriksa kebenaran entri, maka dikirimkan apa yang tertulis di sana. Sekarang kita perlu mengirimkan data yang diterima melalui saluran radio ke perangkat kedua. Pada saat yang sama, peralihan dari penerimaan ke transmisi dan sebaliknya cukup sering terjadi. Protokol STK500 tidak mempedulikan penundaan, tetapi tidak mentolerir kehilangan data (aneh, tetapi disebutkan di atas bahwa penundaan juga mempengaruhi transfer data). Dan kerugian selama transmisi nirkabel tidak bisa dihindari. ATmega128RFA1 memiliki implementasi perangkat keras bawaan untuk permintaan berulang ketika ada keraguan tentang kebenaran transfer, tetapi penulis memutuskan untuk menerapkan hal yang sama dalam perangkat lunaknya sendiri. Dia mengembangkan sebuah protokol di mana lebih banyak data mengalir ke satu arah dibandingkan yang lain.

Itu tidak sempurna, tapi berhasil. Halaman 256-byte dibagi menjadi empat segmen, yang masing-masing ditransmisikan melalui udara sebagai sebuah paket. Sebuah paket dapat menampung hingga 125 byte data ditambah satu byte untuk panjangnya dan dua byte untuk CRC. Jadi fragmen sepanjang 64 byte beserta nomor halaman dan segmen (dari 0 hingga 3) ditempatkan di sana. Perangkat penerima memiliki variabel yang memungkinkannya melacak berapa banyak segmen yang telah diterima, dan ketika keempatnya tiba, perangkat pengirim menerima konfirmasi bahwa seluruh halaman telah diterima. Tidak ada konfirmasi (CRC tidak cocok) - kirim ulang seluruh halaman. Kecepatannya bahkan lebih besar dibandingkan saat transmisi melalui kabel. Melihat:


Namun secara umum, perlu disediakan cara yang nyaman untuk menghubungkan kabel ke perangkat untuk mengunggah sketsa dan melaluinya. Misalnya, tempatkan di dalam konverter antarmuka pada CP2102, seperti pada foto, dan rekatkan ke papan sehingga dapat menahan gaya saat menghubungkan dan melepaskan kabel Micro USB.

Kami sedang menulis bootloader OTA untuk ATmega128RFA1 (sebagai bagian dari perangkat Smart Response XE)

Ia juga memiliki stabilizer 3,3 volt (dan cara menggunakannya di perangkat dengan catu daya 6 volt - asalkan memiliki stabilizer yang sama, dan Anda dapat menambahkan dua dioda untuk secara otomatis memilih mana yang akan memberi daya pada perangkat) . Ketiga LED harus dilepas dari papan konverter antarmuka, jika tidak maka akan membebani baterai tambahan saat mengoperasikannya, dan juga mengganggu polling keyboard dan bekerja dengan memori flash dengan antarmuka SPI.

Mengejar suatu tujuan ternyata lebih menarik daripada mencapainya (dan tidak perlu lelucon tentang bus). Penulis belajar banyak tentang bootloader AVR, memori flash SPI, protokol STK500 dan standar 802.15.4.

Semua kode lain selain perpustakaan yang dijelaskan di atas adalah - di sini, dan itu juga di bawah GPL v3. Twitter Penulis - di sini.

Sumber: www.habr.com

Tambah komentar