ATmega128RFA1 için bir OTA önyükleyici yazıyoruz (Smart Response XE cihazının bir parçası olarak)

ATmega128RFA1 için bir OTA önyükleyici yazıyoruz (Smart Response XE cihazının bir parçası olarak)

Her şey yazarın ikincil piyasada ilginç bir cihaz satın almasıyla başladı - Smart Response XE (Kısa Açıklama). Okullara yöneliktir: sınıftaki her öğrenciye doksanlı yıllardan kalma elektronik not defterine veya tercümana benzer bir cihaz verilir, öğretmen bir soru sorar ve öğrenciler cevapları bir elektronik cihaz aracılığıyla alınan cihazların klavyelerine yazarlar. öğretmenin bilgisayarına bağlı bir alıcıya radyo kanalı (802.15.4).

Bu cihazlar birkaç yıl önce üretimden kaldırıldı ve okulların her biri 100 ila 200 dolar arasında satın aldığı cihazlar şimdi eBay'de 10 dolar veya daha düşük bir fiyatla karşınıza çıkıyor. Oradaki donanım meraklı deneyler için çok uygun:

  • 60 tuşlu klavye
  • 384×136 çözünürlüklü, piksel başına 2 bitlik ekran - BC, CGA'ya benzer, ancak 4 renk değil, parlaklık dereceleri
  • mikrodenetleyici ATmega128RFA1 (128 kB flash bellek, 4 kB ROM, 16 kB RAM, 802.15.4 alıcı-verici)
  • harici (cihazın tamamı değil, mikro denetleyiciyle ilgili olarak) SPI arayüzlü 1 megabit (128 kilobayt) flash bellek
  • 4 adet AAA elemanı için bölme.

Mikrodenetleyicinin isminden AVR ailesine ait olduğu anlaşılıyor, bu da cihazın Arduino uyumlu hale getirilmesinin önemsiz bir görevden daha fazlası olduğu anlamına geliyor...

Şuradaki haberden Hackaday yazar ne olduğunu buldu zaten yapıldı (aynı bağlantı neyi nereye bağlayacağınızı da söylüyor), Arduboy için oyun çalıştırma fırsatına sahip olmak:


Ancak yazar, cihazda oynama değil, çalışma fırsatıyla daha çok ilgileniyor:

  • seri SPI arayüzlü flash bellek
  • AVR için önyükleyiciler
  • standart 802.15.4

Yazar yazmaya başladı Kütüphane (GPL v3), ekranı başlatmanıza, metin ve dikdörtgenlerin çıktısını almanıza ve SPI flash belleğe erişmenize olanak tanır. Daha sonra cihazın pratik kullanımına yönelik fikirler üretmeye başladı: VT-100 uyumlu bir cep terminali, çok oyunculu oyunlar. Üç cihazı yeniden inşa ettikten sonra, onlara "havadan" taslak almayı "öğretmeye" karar verdi. Sadece ilginç değil, aynı zamanda çok kullanışlı olan şey: cihazın kasasının her seferinde açılması zordur ve pil bölmesi kapağının altında yalnızca JTAG programlayıcısını karta bağlamanıza izin veren delikler vardır.

ATmega128RFA1 için bir OTA önyükleyici yazıyoruz (Smart Response XE cihazının bir parçası olarak)

Bu, Arduino önyükleyicisini yüklemek için yeterlidir, ancak taslağı değil - seri bağlantı noktası oraya bağlı değil, bu nedenle kasayı açmadan yine de yapamazsınız. Ayrıca, ilk seri bağlantı noktasının TX0 ve RX0 hatları, klavye matrisinin yoklama satırlarıyla, yani ekranın yanlarındaki işlev tuşlarını yoklayanlarla birleştirilir. Ama ne yapabilirsiniz - yazar bunu yaptı:

ATmega128RFA1 için bir OTA önyükleyici yazıyoruz (Smart Response XE cihazının bir parçası olarak)

JTAG hatlarını oraya getirdi ve artık pil bölmesini açmaya gerek kalmadı. Taslakların yüklenebilmesi için her iki seri bağlantı noktasını da aynı konektöre bağladım ve bir anahtar da ekledim, çünkü piller takılıyken cihazı başka bir şekilde kapatmak fiziksel olarak imkansızdır.

Havya, maket bıçağı ve tutkal tabancasıyla çalışmak oldukça zaman aldı. Genel olarak eskizleri "havadan" yüklemek çok daha uygundur; bunun için acilen bir şeyler icat etmemiz gerekiyor.

Arduino IDE, eskizleri yüklemek için programı kullanıyor Avrdude. Protokolü kullanarak mikrodenetleyici ile etkileşime girer. STK500Dosyaları her iki yönde de aktarmanıza olanak tanır. Değişken gecikmelerin, bozulmanın ve veri kaybının mümkün olduğu kanallarla pek uyumlu değildir. Seri kanalda bir şey gevşer veya hışırdarsa, bunun nedenini aramak için delirebilirsiniz. Yazar, sorunun kötü bir kablo ve kaprisli bir CP2102 arayüz dönüştürücüsü olduğunu anlayana kadar yarım gün boyunca acı çektikten sonra. ATmega32u4 gibi yerleşik bir arayüz dönüştürücüye sahip bir mikro denetleyici bile bazen bu şekilde davranabilir. Her Arduino kullanıcısı, eskizleri yüklerken oluşan hataların o kadar da nadir olmadığını fark etmiştir. Bazen kayıt iyi gidiyor ancak test okuması sırasında bir hata algılanıyor. Bu, yazma sırasında bir hata olduğu anlamına gelmez; okuma sırasında bir başarısızlık vardı. Şimdi "havadan" çalışırken aynı şeyin olacağını, ancak çok daha sık olacağını hayal edin.

Bu sorunun üstesinden gelmek için farklı yollar denedikten sonra yazar aşağıdaki sonuca ulaştı. Cihazın SPI arayüzlü 128 KB flash belleği var - kablolar üzerinden veri alıyoruz (yazarın zaten yan tarafta konnektörü olan bir cihazı olduğunu unutmayın), bu belleği arabellek olarak kullanıyoruz ve verileri radyo üzerinden gönderiyoruz başka bir cihaza kanal açın. Cybiko'dan merhaba.

Radyo kanalıyla çalışacak kodun yanı sıra yazı tipini de yazdıktan sonra yükleyici 4 kilobayttan daha uzun hale geldi. Bu nedenle HFUSE değerinin 0xDA'dan 0xD8'e değiştirilmesi gerekti. Artık önyükleyicinin uzunluğu 8 kilobayta kadar olabilir ve başlangıç ​​adresi artık 0x1E000'dir. Bu Makefile'a yansıtılmıştır ancak doldururken de dikkate alınmalıdır. önyükleyici Avrdude aracılığıyla.

ATmega802.15.4RFA128'deki 1 alıcı-verici, orijinal olarak protokolü kullanarak çalışacak şekilde tasarlanmıştır. ZigBeebu oldukça karmaşık olduğundan yazar bunun yerine yalnızca paketleri aktarmaya karar verdi. Bu, ATmega128RFA1'deki donanımda uygulanır, dolayısıyla çok az kod gerekir. Ayrıca, basitlik açısından yazar, manuel olarak bile seçmenize izin vermeyecek şekilde sabit bir kanal kullanmaya karar verdi. 802.15.4 standardı, sayıları 16'den 11'ya kadar olan 26 kanalı destekler. Oldukça kalabalıktırlar, bazıları WiFi kanallarıyla da örtüşür (kırmızı ZigBee kanallarıdır, mavi, yeşil ve sarı WiFi'dir).

ATmega128RFA1 için bir OTA önyükleyici yazıyoruz (Smart Response XE cihazının bir parçası olarak)

Yazar, 15 ve 26 numaralı kanalların Wi-Fi parazitinden en az etkilendiği ortaya çıktı. Yasal Uyarı: Çevirmen ZigBee'nin bu şekilde basitleştirilmesine izin verilip verilmediğini bilmiyor. Belki biraz daha programlama yapıp tamamen uygulamalıyız?

İlk cihazda STK500 protokolü üzerinden veri aktaran bir sonlu durum makinesinin uygulanması gerekmektedir. Çoğunlukla iletilen ve alınan mesajlar kendi kendine yeterlidir, ancak bazıları kanaldan daha önce geçen mesajlara bağlıdır. Diyalogun açıklaması verilmiştir burada.

Bu diyaloğun önemli bir bileşeni, hedef cihazın flash belleğine yazılması amaçlanan paketlerin iletilmesidir. AVR ailesinin basit mikrodenetleyicileri için sayfa boyutu 128 bayttır, ancak ATmega128RFA1 için 256'dır. SPI protokolü aracılığıyla bağlanan flash bellek için de aynıdır. İlk cihazdaki program, bir çizimi yüklerken onu hemen ikinciye aktarmaz, ancak bu belleğe yazar. Arduino IDE girişin doğruluğunu kontrol ettiğinde orada yazılanlar gönderilir. Şimdi aldığımız verileri radyo kanalı üzerinden ikinci cihaza aktarmamız gerekiyor. Aynı zamanda, alımdan iletime ve geri dönüşe geçiş oldukça sık meydana gelir. STK500 protokolü gecikmelere karşı kayıtsızdır, ancak veri kaybını tolere etmez (tuhaf, ancak yukarıda gecikmelerin veri aktarımını da etkilediği söylendi). Kablosuz iletim sırasında kayıplar da kaçınılmazdır. ATmega128RFA1, aktarımın doğruluğu konusunda şüpheler olduğunda tekrarlanan isteklerin yerleşik bir donanım uygulamasına sahiptir, ancak yazar aynısını yazılımın kendisi içinde uygulamaya karar vermiştir. Bir yönden diğerine çok daha fazla verinin aktığı bir protokol geliştirdi.

Mükemmel değil ama işe yarıyor. 256 baytlık sayfa dört bölüme ayrılmıştır ve bunların her biri kablosuz olarak paket olarak iletilir. Bir paket 125 bayta kadar verinin yanı sıra uzunluk için bir bayt ve CRC için iki bayt tutabilir. Yani 64 bayt uzunluğundaki parçalar, sayfa ve bölüm numaraları (0'dan 3'e kadar) ile birlikte buraya yerleştirilir. Alıcı cihaz, kaç bölümün alındığını takip etmesine olanak tanıyan bir değişkene sahiptir ve dördü de geldiğinde gönderen cihaz, sayfanın tamamının alındığına dair onay alır. Onay yok (CRC eşleşmedi) - sayfanın tamamını yeniden gönderin. Hız, kabloyla iletimden bile daha yüksektir. Görmek:


Ancak genel olarak, kabloyu eskizlerin yüklenmesi için cihazlara bağlamanın uygun bir yolunu sağlamak gerekli olacaktır. Örneğin, fotoğraftaki gibi CP2102'nin üzerine böyle bir arayüz dönüştürücüyü yerleştirin ve Mikro USB kablosunu bağlarken ve çıkarırken kuvvete dayanabilmesi için panoya yapıştırın.

ATmega128RFA1 için bir OTA önyükleyici yazıyoruz (Smart Response XE cihazının bir parçası olarak)

Aynı zamanda 3,3 voltluk bir dengeleyiciye sahiptir (ve 6 voltluk güç kaynağına sahip bir cihazda nasıl kullanılacağı - yalnızca aynı dengeleyiciye sahipse ve hangisinin cihaza güç vereceğini otomatik olarak seçmek için iki diyot ekleyebilirsiniz) . Her üç LED'in de arayüz dönüştürücü kartından lehimlenmemiş olması gerekir, aksi takdirde bunlar üzerinde çalışırken pilleri ek olarak yükleyecekler ve ayrıca klavye sorgulamasını engelleyecek ve SPI arayüzü ile flash bellekle çalışacaklar.

Bir hedefi takip etmenin, ona ulaşmaktan daha ilginç olduğu ortaya çıktı (ve otobüsle ilgili o şakaya da gerek yok). Yazar, AVR önyükleyicileri, SPI flash belleği, STK500 protokolü ve 802.15.4 standardı hakkında çok şey öğrendi.

Yukarıda açıklanan kitaplığa ek olarak diğer tüm kodlar: buradave aynı zamanda GPL v3 altındadır. Yazarın Twitter'ı - burada.

Kaynak: habr.com

Yorum ekle