Kirjutame OTA alglaadurit ATmega128RFA1 jaoks (seadme Smart Response XE osana)

Kirjutame OTA alglaadurit ATmega128RFA1 jaoks (seadme Smart Response XE osana)

Kõik sai alguse sellest, et autor ostis järelturult huvitava seadme - Smart Response XE (lühike kirjeldus). See on mõeldud koolidele: klassi iga õpilane saab üheksakümnendatest pärit elektroonilise vihiku või tõlkija sarnase seadme, õpetaja esitab küsimuse ning õpilased tippivad seadmete klaviatuuridel vastused, mis saadakse raadiokanali (802.15.4) õpetaja arvutiga ühendatud vastuvõtjasse.

Nende seadmete tootmine lõpetati mitu aastat tagasi ja koolid, mille igaüks ostsid 100–200 dollari eest, ilmuvad nüüd eBays 10 dollari või vähema hinnaga. Sealne riistvara sobib väga hästi nörditavateks katseteks:

  • 60 klahviga klaviatuur
  • ekraan eraldusvõimega 384 × 136, 2 bitti piksli kohta - sarnane BC-le, CGA-le, kuid 4 mitte värvi, vaid heleduse gradatsiooni
  • mikrokontroller ATmega128RFA1 (128 kB välkmälu, 4 kB ROM, 16 kB RAM, 802.15.4 transiiver)
  • väline (mikrokontrolleri, mitte kogu seadme suhtes) 1-megabitine (128 kilobaiti) välkmälu koos SPI-liidesega
  • sahtel 4 AAA elemendi jaoks.

Mikrokontrolleri nimest selgub, et see kuulub AVR perekonda, mis tähendab, et seadme Arduino-ühilduvaks muutmine on enam kui triviaalne ülesanne...

Alates uudistest Hackaday autor sai teada, mis see on on juba teinud (sama link ütleb teile, mida kuhu ühendada), millel on võimalus Arduboy jaoks mänge käivitada:


Kuid autorit huvitab rohkem võimalus mitte seadmes mängida, vaid õppida:

  • välkmälu koos jadaliidesega SPI
  • AVR-i alglaadurid
  • standard 802.15.4

Autor alustas kirjutamisega raamatukogud (GPL v3), mis võimaldab kuva lähtestada, teksti ja ristkülikuid väljastada ning pääseda juurde SPI-välkmälule. Siis hakkas ta välja mõtlema ideid seadme praktiliseks kasutamiseks: VT-100-ga ühilduv taskuterminal, mitme mängijaga mängud. Pärast kolme seadme ümberehitamist otsustas ta "õpetada" neid visandeid vastu võtma "üle õhu". Mis poleks mitte ainult huvitav, vaid ka väga mugav: seadme korpust on iga kord raske avada ning akupesa kaane all on ainult augud, mis võimaldavad plaadiga ühendada JTAG programmeerija.

Kirjutame OTA alglaadurit ATmega128RFA1 jaoks (seadme Smart Response XE osana)

Sellest piisab Arduino alglaaduri üleslaadimiseks, kuid mitte eskiisi - jadaport pole seal ühendatud, nii et ilma korpuse avamiseta ei saa ikkagi hakkama. Samuti on esimese jadapordi read TX0 ja RX0 kombineeritud klaviatuurimaatriksi pollimisliinidega, nimelt nendega, mis küsivad ekraani külgedel olevaid funktsiooniklahve. Aga mis sa teha saad - autor ehitas selle:

Kirjutame OTA alglaadurit ATmega128RFA1 jaoks (seadme Smart Response XE osana)

Ta tõi sinna JTAGi liinid ja nüüd pole akupesa avamist vaja. Ja et sketše saaks üles laadida, siis ühendasin mõlemad jadapordid samasse pesasse, lisades ka lüliti, sest paigaldatud patareidega on seadet muul viisil välja lülitada füüsiliselt võimatu.

Jootekolvi, tarbenoa ja liimipüstoliga töötamine võttis päris palju aega. Üldiselt on visandite "üle õhu" üleslaadimine palju mugavam, selleks peame kiiresti midagi leiutama.

Arduino IDE kasutab programmi visandite üleslaadimiseks avrdude. See suhtleb mikrokontrolleriga protokolli kasutades STK500, mis võimaldab faile mõlemas suunas edastada. See ühildub halvasti kanalitega, kus on võimalikud muutuvad viivitused, moonutused ja andmekadu. Kui jadakanalis midagi lahti tuleb või sahiseb, võib põhjust otsides hulluks minna. Kord kannatas autor pool päeva, kuni sai aru, et probleemiks on halb kaabel, aga ka kapriisne CP2102 liidesemuundur. Isegi sisseehitatud liidesemuunduriga mikrokontroller, näiteks ATmega32u4, võib mõnikord nii toimida. Iga Arduino kasutaja on märganud, et vead visandite üleslaadimisel polegi nii haruldased. Mõnikord läheb salvestamine hästi, kuid testloe käigus tuvastatakse viga. See ei tähenda, et kirjutamisel tekkis viga – lugemisel tekkis tõrge. Kujutage nüüd ette, et "üle õhu" töötades juhtub sama, kuid palju sagedamini.

Olles proovinud erinevaid viise sellest probleemist üle saada, jõudis autor järgmiseni. Seadmel on 128 KB välkmälu koos SPI liidesega - saame andmeid üle juhtmete (pidage meeles, et autoril on juba üks seade, mille küljes on pistikupesa), kasutame seda mälu puhvrina ja saadame andmed raadio teel kanalit teise seadmesse. Tere Cybikolt.

Pärast raadiokanaliga töötamiseks mõeldud koodi ja fondi kirjutamist muutus laadija pikemaks kui 4 kilobaiti. Seetõttu tuli HFUSE väärtus 0xDA-lt 0xD8-ks muuta. Nüüd võib alglaadur olla kuni 8 kilobaiti pikk ja algusaadress on nüüd 0x1E000. See kajastub Makefile'is, kuid seda tuleks arvestada ka täitmisel alglaadur avrdude kaudu.

ATmega802.15.4RFA128 1 transiiver on algselt loodud töötama protokolli abil ZigBee, mis on üsna keeruline, nii et autor otsustas selle asemel lihtsalt pakette edastada. See on ATmega128RFA1 riistvaras rakendatud, seega on vaja vähe koodi. Samuti otsustas autor lihtsuse huvides kasutada fikseeritud kanalit, mis ei võimalda teil seda isegi käsitsi valida. 802.15.4 standard toetab 16 kanalit numbritega 11 kuni 26. Need on üsna ülerahvastatud, mõned kattuvad ka WiFi-kanalitega (punane on ZigBee kanal, sinine, roheline ja kollane on WiFi).

Kirjutame OTA alglaadurit ATmega128RFA1 jaoks (seadme Smart Response XE osana)

Selgus, et WiFi-st tulenevatele häiretele on kõige vähem vastuvõtlikud kanalid 15 ja 26. Autor valis neist teise. Vastutusest loobumine: tõlkija ei tea, kas ZigBee on lubatud sel viisil lihtsustada. Võib-olla peaksime natuke rohkem programmeerima ja selle täielikult juurutama?

Esimeses seadmes on vaja rakendada lõpliku oleku masin, mis edastab andmeid protokolli STK500 kaudu. Enamasti on edastatud ja vastuvõetud sõnumid isemajandavad, kuid mõned on seotud kanali varem läbinud sõnumitega. Antakse dialoogi kirjeldus siin.

Selle dialoogi oluline komponent on sihtseadme välkmällu kirjutamiseks mõeldud pakettide edastamine. Lihtsate AVR-perekonna mikrokontrollerite puhul on lehe suurus 128 baiti, aga ATmega128RFA1 puhul 256. Ja SPI-protokolli kaudu ühendatud välkmälu puhul on see sama. Esimeses seadmes olev programm visandi üleslaadimisel ei kanna seda kohe teise, vaid kirjutab sellesse mällu. Kui Arduino IDE kontrollib kirje õigsust, siis saadetakse sinna, mis seal kirjas oli. Nüüd peame edastama vastuvõetud andmed raadiokanali kaudu teisele seadmele. Samal ajal toimub üsna sageli ümberlülitumine vastuvõtmiselt saatmisele ja tagasi. STK500 protokoll on viivituste suhtes ükskõikne, kuid ei talu andmekadu (kummaline, aga eespool öeldi, et viivitused mõjutavad ka andmeedastust). Ja kaod traadita edastuse ajal on vältimatud. ATmega128RFA1-l on sisseehitatud riistvaraline korduvate päringute realiseerimine, kui on kahtlusi ülekande õigsuses, kuid autor otsustas sama tarkvara ise juurutada. Ta töötas välja protokolli, milles ühes suunas liigub palju rohkem andmeid kui teises suunas.

See pole täiuslik, kuid see töötab. 256-baidine leht on jagatud neljaks segmendiks, millest igaüks edastatakse õhu kaudu paketina. Pakett mahutab kuni 125 baiti andmeid, millele lisandub üks bait pikkuseks ja kaks baiti CRC jaoks. Nii paigutatakse sinna 64 baiti pikkused fragmendid koos lehe- ja segmendinumbritega (0 kuni 3). Vastuvõtval seadmel on muutuja, mis võimaldab jälgida, mitu segmenti on vastu võetud ja kui kõik neli saabuvad, saab saatev seade kinnituse, et kogu leht on vastu võetud. Kinnitust pole (CRC ei ühti) – saada terve leht uuesti. Kiirus on isegi suurem kui kaabli kaudu edastamisel. Vaata:


Aga üldiselt oleks vaja ette näha mugav viis juhtme ühendamiseks sketšide üleslaadimiseks ja selle kaudu seadmetega. Näiteks asetage CP2102-le selline liidesemuundur, nagu fotol, ja liimige see plaadile, et see taluks Micro USB-kaabli ühendamisel ja lahtiühendamisel tekkivat jõudu.

Kirjutame OTA alglaadurit ATmega128RFA1 jaoks (seadme Smart Response XE osana)

Sellel on ka 3,3-voldine stabilisaator (ja kuidas seda kasutada 6-voldise toiteallikaga seadmes - kui ainult sellel on sama stabilisaator ja saate lisada kaks dioodi, et automaatselt valida, kumb neist seadet toidab) . Kõik kolm LED-i peavad olema liidese muunduri plaadilt lahti joodetud, vastasel juhul koormavad nad nendega töötades täiendavalt akusid ning segavad ka klaviatuuri pollimist ja tööd SPI-liidesega välkmäluga.

Eesmärgi poole püüdlemine osutus veelgi huvitavamaks kui selle saavutamine (ja seda nalja bussi kohta pole vaja). Autor sai palju teada AVR alglaadurite, SPI välkmälu, STK500 protokolli ja 802.15.4 standardi kohta.

Kõik muud koodid lisaks ülalkirjeldatud teegile on − siin, ja see on ka GPL v3 alla. Autori Twitter – siin.

Allikas: www.habr.com

Lisa kommentaar