Hər şey müəllifin təkrar bazarda maraqlı bir cihaz alması ilə başladı - Smart Response XE (
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
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ı
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:
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
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
ATmega802.15.4RFA128-dəki 1 qəbuledicisi əvvəlcə protokoldan istifadə etməklə işləmək üçün nəzərdə tutulmuşdur.
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
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.
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
Mənbə: www.habr.com