ATmega128RFA1 üçün OTA yükləyicisi yazırıq (Smart Response XE cihazının bir hissəsi kimi)

ATmega128RFA1 üçün OTA yükləyicisi yazırıq (Smart Response XE cihazının bir hissəsi kimi)

Hər şey müəllifin təkrar bazarda maraqlı bir cihaz alması ilə başladı - Smart Response XE (qısa təsvir). O, məktəblər üçün nəzərdə tutulub: sinifdəki hər bir şagird doxsanıncı illərin elektron dəftəri və ya tərcüməçisinə bənzər bir cihaz alır, müəllim sual verir, şagirdlər isə cihazların klaviaturasında cavabları yazır, hansı ki, onlar 802.15.4-cı illərdən alırlar. radio kanalı (XNUMX) müəllimin fərdi kompüterinə qoşulmuş qəbulediciyə.

Bu cihazların istehsalı bir neçə il əvvəl dayandırılmışdı və hər birinin 100-200 dollara aldığı məktəblər indi eBay-də 10 dollar və ya daha aşağı qiymətə açılır. Oradakı aparat geeky təcrübələr üçün çox uyğundur:

  • 60 düyməli klaviatura
  • 384×136 təsvir ölçülü displey, hər piksel üçün 2 bit - BC, CGA-ya bənzəyir, lakin 4 rəng deyil, parlaqlıq dərəcələri
  • mikrokontroller ATmega128RFA1 (128 kB fləş yaddaş, 4 kB ROM, 16 kB RAM, 802.15.4 ötürücü)
  • xarici (bütün cihaza deyil, mikrokontrollerə münasibətdə) SPI interfeysli 1 meqabit (128 kilobayt) fləş yaddaş
  • 4 AAA elementi üçün bölmə.

Mikrokontrolörün adından aydın olur ki, o, AVR ailəsinə aiddir, yəni cihazı Arduino-ya uyğunlaşdırmaq mənasız bir iş deyil...

Xəbərlərdən Hackday müəllif bunun nə olduğunu öyrəndi artıq etmişlər (eyni link sizə nəyin hara qoşulacağını söyləyir), Arduboy üçün oyunları idarə etmək imkanına malikdir:


Lakin müəllifi cihazda oynamaq deyil, öyrənmək imkanı daha çox maraqlandırır:

  • serial SPI interfeysi ilə flash yaddaş
  • AVR üçün yükləyicilər
  • standart 802.15.4

Müəllif yazmaqla başladı kitabxanalar (GPL v3), ekranı işə salmağa, mətn və düzbucaqlıları çıxarmağa və SPI flash yaddaşına daxil olmağa imkan verir. Sonra o, cihazın praktik istifadəsi üçün ideyalar irəli sürməyə başladı: VT-100-ə uyğun cib terminalı, çox oyunçu oyunları. Üç cihazı yenidən qurduqdan sonra onlara eskizləri "hava üzərindən" almağı "öyrətmək" qərarına gəldi. Nəinki maraqlı, həm də çox rahat olardı: cihazın qutusunu hər dəfə açmaq çətindir və batareya bölməsinin qapağının altında yalnız JTAG proqramçısını lövhəyə qoşmağa imkan verən deşiklər var.

ATmega128RFA1 üçün OTA yükləyicisi yazırıq (Smart Response XE cihazının bir hissəsi kimi)

Bu, Arduino yükləyicisini yükləmək üçün kifayətdir, lakin eskizi deyil - serial port orada qoşulmayıb, buna görə də işi açmadan hələ də edə bilməzsiniz. Həmçinin, ilk seriya portunun TX0 və RX0 sətirləri klaviatura matrisinin sorğu sətirləri ilə, yəni ekranın yan tərəflərindəki funksiya düymələrini sorğulayan xətlərlə birləşdirilir. Ancaq nə edə bilərsiniz - müəllif bunu qurdu:

ATmega128RFA1 üçün OTA yükləyicisi yazırıq (Smart Response XE cihazının bir hissəsi kimi)

O, JTAG xətlərini ora gətirdi və indi batareya bölməsini açmağa ehtiyac yoxdur. Eskizləri yükləmək üçün hər iki seriya portunu eyni konnektora bağladım, həmçinin bir keçid əlavə etdim, çünki quraşdırılmış batareyalarla cihazı başqa bir şəkildə söndürmək fiziki olaraq mümkün deyil.

Lehimləmə dəmiri, köməkçi bıçaq və yapışqan tabancası ilə işləmək kifayət qədər vaxt apardı. Ümumiyyətlə, eskizləri "havada" yükləmək daha rahatdır, bunun üçün təcili olaraq bir şey icad etməliyik.

Arduino IDE eskizləri yükləmək üçün proqramdan istifadə edir avrdude. Protokoldan istifadə edərək mikro nəzarətçi ilə qarşılıqlı əlaqə qurur STK500, faylları hər iki istiqamətdə ötürməyə imkan verir. Dəyişən gecikmələrin, təhriflərin və məlumat itkisinin mümkün olduğu kanallarla zəif uyğun gəlir. Serial kanalında bir şey boşaldısa və ya xışıltıya səbəb olarsa, bunun səbəbini axtarırsınız. Bir dəfə müəllif problemin pis bir kabel, eləcə də şıltaq CP2102 interfeys çeviricisi olduğunu başa düşənə qədər yarım gün əziyyət çəkdi. Hətta daxili interfeys çeviricisi olan bir mikro nəzarətçi, məsələn, ATmega32u4, bəzən belə hərəkət edə bilər. Hər bir Arduino istifadəçisi qeyd etdi ki, eskizləri yükləyərkən səhvlər o qədər də nadir deyil. Bəzən qeyd yaxşı gedir, lakin test oxunması zamanı bir səhv aşkar edilir. Bu o demək deyil ki, yazı zamanı xəta olub – oxuyarkən nasazlıq olub. İndi təsəvvür edin ki, "havada" işləyərkən eyni şey baş verəcək, lakin daha tez-tez.

Bu problemi aradan qaldırmaq üçün müxtəlif yollar sınadıqdan sonra müəllif aşağıdakıları ortaya qoydu. Cihaz SPI interfeysli 128 KB fleş yaddaşa malikdir - biz məlumatları naqillər vasitəsilə qəbul edirik (yadda saxlayın ki, müəllifin artıq yan tərəfində konnektoru olan bir cihazı var), bu yaddaşdan bufer kimi istifadə edin və məlumatları radio vasitəsilə göndərin. başqa cihaza kanal. Cybikodan salam.

Radio kanalı, eləcə də şriftlə işləmək üçün kodu yazdıqdan sonra yükləyici 4 kilobaytdan artıq oldu. Buna görə də, HFUSE dəyəri 0xDA-dan 0xD8-ə dəyişdirilməli idi. İndi yükləyicinin uzunluğu 8 kilobayta qədər ola bilər və başlanğıc ünvanı indi 0x1E000-dir. Bu Makefile-də öz əksini tapıb, lakin doldurarkən də nəzərə alınmalıdır yükləyici avrdude vasitəsilə.

ATmega802.15.4RFA128-dəki 1 qəbuledicisi əvvəlcə protokoldan istifadə etməklə işləmək üçün nəzərdə tutulmuşdur. ZigBee, bu olduqca mürəkkəbdir, buna görə də müəllif əvəzinə paketləri ötürmək qərarına gəldi. Bu, ATmega128RFA1-də aparatda həyata keçirilir, ona görə də az kod tələb olunur. Ayrıca, sadəlik üçün müəllif sabit bir kanaldan istifadə etmək qərarına gəldi, hətta onu əl ilə seçməyə imkan vermədi. 802.15.4 standartı 16-dən 11-ya qədər rəqəmləri olan 26 kanalı dəstəkləyir. Onlar kifayət qədər sıxdır, bəziləri WiFi kanallarını da üst-üstə düşür (qırmızı ZigBee kanalları, mavi, yaşıl və sarı - WiFi).

ATmega128RFA1 üçün OTA yükləyicisi yazırıq (Smart Response XE cihazının bir hissəsi kimi)

Məlum oldu ki, 15 və 26-cı kanallar WiFi-dən müdaxiləyə ən az həssasdırlar.Müəllif onlardan ikincisini seçib. İmtina: tərcüməçi ZigBee-ni bu şəkildə sadələşdirməyə icazə verilib-verilmədiyini bilmir. Bəlkə bir az daha çox proqramlaşdırma edib, onu tamamilə həyata keçirək?

Birinci cihazda STK500 protokolu vasitəsilə məlumatları ötürən sonlu dövlət maşını tətbiq etmək lazımdır. Əksər hallarda, ötürülən və qəbul edilən mesajlar öz-özünə kifayət edir, lakin bəziləri daha əvvəl kanaldan keçənlərə bağlıdır. Dialoqun təsviri verilir burada.

Bu dialoqun mühüm komponenti təyinat cihazının fləş yaddaşına yazılması nəzərdə tutulan paketlərin ötürülməsidir. AVR ailəsinin sadə mikrokontrollerləri üçün səhifə ölçüsü 128 baytdır, lakin ATmega128RFA1 üçün bu 256-dır. SPI protokolu ilə qoşulan fləş yaddaş üçün isə eynidir. Birinci cihazdakı proqram eskizi yükləyərkən onu dərhal ikinciyə köçürmür, onu bu yaddaşa yazır. Arduino IDE girişin düzgünlüyünü yoxladıqda, orada yazılanlar göndərilir. İndi radio kanalı vasitəsilə alınan məlumatları ikinci cihaza ötürməliyik. Eyni zamanda, qəbuldan ötürməyə və geriyə keçid olduqca tez-tez baş verir. STK500 protokolu gecikmələrə biganədir, lakin məlumat itkisinə dözmür (qəribədir, lakin yuxarıda gecikmələrin məlumat ötürülməsinə də təsir etdiyi deyilirdi). Və simsiz ötürmə zamanı itkilər qaçılmazdır. ATmega128RFA1, köçürmənin düzgünlüyünə dair şübhələr olduqda təkrar sorğuların daxili aparat tətbiqinə malikdir, lakin müəllif eyni şeyi proqram təminatında həyata keçirməyə qərar verdi. O, bir şəkildə daha çox məlumatın digərindən daha çox axdığı bir protokol hazırladı.

Mükəmməl deyil, amma işləyir. 256 baytlıq səhifə dörd seqmentə bölünüb, hər biri paket şəklində hava vasitəsilə ötürülür. Bir paket 125 bayta qədər məlumat üstəgəl uzunluğa görə bir bayt və CRC üçün iki bayt tuta bilər. Beləliklə, orada səhifə və seqment nömrələri (64-dan 0-ə qədər) ilə birlikdə 3 bayt uzunluğunda fraqmentlər yerləşdirilir. Qəbul edən cihazda neçə seqmentin qəbul edildiyini izləməyə imkan verən dəyişən var və dördü də gələndə göndərən cihaz bütün səhifənin qəbul edildiyini təsdiqləyir. Təsdiq yoxdur (CRC uyğun gəlmir) - bütün səhifəni yenidən göndərin. Sürət kabel vasitəsilə ötürüləndən daha yüksəkdir. Görmək:


Ancaq ümumiyyətlə, kabeli eskizləri yükləmək üçün cihazlara və onun vasitəsilə birləşdirmək üçün rahat bir yol təqdim etmək lazımdır. Məsələn, fotoşəkildə olduğu kimi CP2102-də belə bir interfeys çeviricisinin içərisinə yerləşdirin və onu lövhəyə yapışdırın ki, Micro USB kabelini qoşduqda və ayırarkən gücə tab gətirə bilsin.

ATmega128RFA1 üçün OTA yükləyicisi yazırıq (Smart Response XE cihazının bir hissəsi kimi)

O, həmçinin 3,3 voltluq stabilizatora malikdir (və onu 6 voltluq enerji təchizatı olan bir cihazda necə istifadə etmək olar - əgər eyni stabilizator varsa və onlardan hansının cihazı gücləndirəcəyini avtomatik seçmək üçün iki diod əlavə edə bilərsiniz) . Hər üç LED interfeys çevirici lövhəsindən lehimlənməlidir, əks halda onlar işləyərkən batareyaları əlavə yükləyəcək, həmçinin klaviatura sorğusuna mane olacaq və SPI interfeysi ilə flash yaddaşla işləyəcək.

Məqsədin arxasınca getmək ona nail olmaqdan daha maraqlı oldu (və avtobusla bağlı bu zarafat lazım deyil). Müəllif AVR yükləyiciləri, SPI fləş yaddaşı, STK500 protokolu və 802.15.4 standartı haqqında çox şey öyrənib.

Yuxarıda təsvir edilən kitabxanaya əlavə olaraq bütün digər kodlar −-dir burada, və o, həmçinin GPL v3 altındadır. Müəllifin Twitteri - burada.

Mənbə: www.habr.com

Добавить комментарий