ATmega128RFA1-rako OTA abiarazlea idazten ari gara (Smart Response XE gailuaren zati gisa)

ATmega128RFA1-rako OTA abiarazlea idazten ari gara (Smart Response XE gailuaren zati gisa)

Dena hasi zen egileak bigarren mailako merkatuan gailu interesgarri bat erosi zuela - Smart Response XE (deskribapen laburra). Ikastetxeei zuzenduta dago: gelako ikasle bakoitzak laurogeita hamarreko hamarkadako koaderno elektroniko edo itzultzaile baten antzeko gailu bat jasotzen du, irakasleak galdera bat egiten du, eta ikasleek gailuen teklatuetan idazten dituzte erantzunak, eta hauek baten bidez jasotzen dira. irrati katea (802.15.4) irakaslearen ordenagailura konektatutako hargailu batera.

Gailu hauek duela urte batzuk utzi zituzten, eta eskolak $ 100- $ 200-ren truke erositakoa orain eBay-n agertzen da 10 $ edo gutxiagoren truke. Hango hardwarea oso egokia da geek esperimentuetarako:

  • 60 teklatuko teklatua
  • 384 Γ— 136ko bereizmena duen pantaila, 2 bit pixel bakoitzeko - BC, CGA-ren antzekoa, baina 4 kolore ez, distira mailak baizik
  • ATmega128RFA1 mikrokontroladorea (128 kB flash memoria, 4 kB ROM, 16 kB RAM, 802.15.4 transceptor)
  • kanpoko (mikrokontroladoreari dagokionez, ez gailu osoari dagokionez) 1 megabit (128 kilobyte) flash memoria SPI interfazearekin
  • 4 AAA elementuentzako konpartimendua.

Mikrokontrolagailuaren izenetik argi dago AVR familiakoa dela, hau da, gailua Arduinorekin bateragarria egitea zeregin hutsala baino gehiago da...

Berritik aurrera Hackaday egileak jakin zuen zer den egin dute dagoeneko (esteka berak esaten dizu zer konektatu nondik), Arduboyrako jokoak exekutatzeko aukera izatea:


Baina egileari gehiago interesatzen zaio gailuan ez jolasteko aukera, aztertzea baizik:

  • flash memoria serie SPI interfazearekin
  • AVRrako abiarazleak
  • 802.15.4 estandarra

Egilea idazten hasi zen liburutegia (GPL v3), pantaila hasieratzeko, testua eta laukizuzenak ateratzeko eta SPI flash memoria atzitzeko aukera ematen duena. Orduan gailuaren erabilera praktikorako ideiak sortzen hasi zen: VT-100-rekin bateragarria den poltsikoko terminal bat, jokalari anitzeko jokoak. Hiru gailu berreraiki ondoren, zirriborroak "airez" jasotzen "irakastea" erabaki zuen. Interesgarria ez ezik, oso erosoa ere izango litzateke: gailuaren kutxa zaila da aldi bakoitzean irekitzea, eta bateriaren konpartimenduaren estalkiaren azpian JTAG programatzaile bat taulara konektatzeko aukera ematen duten zuloak baino ez daude.

ATmega128RFA1-rako OTA abiarazlea idazten ari gara (Smart Response XE gailuaren zati gisa)

Hau nahikoa da Arduino abiarazlea kargatzeko, baina ez zirriborroa - serieko ataka ez dago bertan konektatuta, beraz, oraindik ezin duzu kasua ireki gabe egin. Era berean, lehen serieko atakaren TX0 eta RX0 lerroak teklatuaren matrizeko galdeketa-lerroekin konbinatzen dira, hots, pantailaren alboetako funtzio-teklak galdetzen dituztenekin. Baina zer egin dezakezu - egileak hau eraiki zuen:

ATmega128RFA1-rako OTA abiarazlea idazten ari gara (Smart Response XE gailuaren zati gisa)

JTAG lineak ekarri zituen bertara, eta orain ez dago bateriaren konpartimendua ireki beharrik. Eta zirriborroak igo ahal izateko, serieko bi atakak konektore berean konektatu nituen, etengailu bat ere gehituz, bateriak instalatuta, fisikoki ezinezkoa baita gailua beste modu batean itzaltzea.

Denbora dezente behar izan zen soldadura batekin, labana erabilgarri batekin eta kola-pistolarekin lan egiteko. Oro har, zirriborroak "airean" igotzea askoz erosoagoa da; premiazkoa dugu horretarako zerbait asmatu.

Arduino IDEk programa erabiltzen du zirriborroak igotzeko avrdude. Mikrokontrolagailuarekin elkarreragin egiten du protokoloa erabiliz STK500, fitxategiak bi noranzkoetan transferitzeko aukera ematen duena. Gaizki bateragarria da atzerapen aldakorrak, distortsioak eta datu-galerak posible diren kanalekin. Zerbait askatzen bada edo serieko kanalean txirrindu egiten bada, zoratu zaitezke arrazoiaren bila. Behin egileak egun erdiz sufritu zuen arazoa kable txarra zela konturatu zen arte, baita CP2102 interfaze bihurgailu kapritxoso bat ere. Interfaze bihurgailu integratua duen mikrokontrolagailu batek ere, adibidez, ATmega32u4, batzuetan horrela jokatu dezake. Arduinoko erabiltzaile guztiek ikusi dute zirriborroak kargatzean akatsak ez direla hain arraroak. Batzuetan grabazioa ondo doa, baina irakurketa proba batean errore bat hautematen da. Horrek ez du esan nahi idazketan akatsik egon denik - irakurtzean hutsegite bat egon da. Orain imajinatu β€œairean” lan egitean gauza bera gertatuko dela, baina askoz gehiagotan.

Arazo hau gainditzeko modu desberdinak probatu ondoren, egileak honako hau bururatu zuen. Gailuak 128 KB-ko flash-memoria du SPI interfazearekin - datuak hableen bidez jasotzen ditugu (gogoratu egileak dagoeneko gailu bat duela alboan konektorea duena), memoria hau buffer gisa erabili eta datuak irratitik bidaltzen ditugu. kanala beste gailu batera. Kaixo Cybikoren partetik.

Irrati-kanalarekin lan egiteko kodea idatzi ondoren, baita letra-tipoarekin ere, kargatzailea 4 kilobyte baino luzeagoa izan zen. Hori dela eta, HFUSE balioa 0xDAtik 0xD8ra aldatu behar izan zen. Orain abiarazleak 8 kilobyteko luzera izan dezake eta hasierako helbidea 0x1E000 da orain. Hau Makefile-n islatzen da, baina betetzerakoan ere kontuan hartu behar da abio kargatzailea avrdude bidez.

ATmega802.15.4RFA128-eko 1 transceptor-a protokoloa erabiliz funtzionatzeko diseinatuta dago. ZigBee, nahiko konplikatua denez, egileak paketeak soilik transmititzea erabaki zuen. Hau ATmega128RFA1 hardwarean inplementatzen da, beraz, kode gutxi behar da. Gainera, sinpletasunagatik, egileak kanal finko bat erabiltzea erabaki zuen, eskuz ere hautatzeko aukera eman gabe. 802.15.4 estandarrak 16tik 11ra bitarteko zenbakiak dituzten 26 kanal onartzen ditu. Nahiko jendetsuak dira, batzuk WiFi kanalak ere gainjartzen dituzte (gorria ZigBee kanalak dira, urdina, berdea eta horia WiFia).

ATmega128RFA1-rako OTA abiarazlea idazten ari gara (Smart Response XE gailuaren zati gisa)

15. eta 26. kanalak WiFi-ren interferentziarik gutxien jasan ditzaketela ikusi zen. Egileak horietako bigarrena aukeratu zuen. Oharra: itzultzaileak ez daki ZigBee modu honetan sinplifikatzea baimenduta dagoen ala ez. Agian programazio apur bat gehiago egin eta erabat inplementatu beharko genuke?

Lehenengo gailuan, STK500 protokoloaren bidez datuak transmititzen dituen egoera finituko makina inplementatzea beharrezkoa da. Gehienetan, igorritako eta jasotako mezuak autosufizienteak dira, baina batzuk lehenago kanaletik igarotakoei lotuta daude. Elkarrizketaren deskribapena ematen da Hemen.

Elkarrizketa honen osagai garrantzitsu bat helmugako gailuaren flash memoriara idatzi nahi diren paketeen transmisioa da. AVR familiako mikrokontrolagailu soilentzat, orrialdearen tamaina 128 bytekoa da, baina ATmega128RFA1entzat 256koa da. Eta SPI protokoloaren bidez konektatzen den flash memoriarako, berdina da. Lehenengo gailuko programak, krokis bat kargatzean, ez du berehala bigarrenera transferitzen, baizik eta memoria honetan idazten du. Arduino IDEak sarreraren zuzentasuna egiaztatzen duenean, bertan idatzitakoa bidaltzen da. Orain jasotako datuak irrati-kanalaren bidez transmititu behar ditugu bigarren gailura. Aldi berean, sarritan gertatzen da jasotzetik transmititzera eta itzultzea. STK500 protokoloa atzerapenekiko axolagabea da, baina ez du datu-galera onartzen (arraroa, baina gorago esan zen atzerapenek datuen transferentzian ere eragina dutela). Eta hari gabeko transmisioan galerak saihestezinak dira. ATmega128RFA1-k behin eta berriz eskaeren hardware inplementazioa du transferentziaren zuzentasunari buruzko zalantzak daudenean, baina egileak bera softwarean ezartzea erabaki zuen. Protokolo bat garatu zuen, non modu batean bestean baino askoz datu gehiago isurtzen diren.

Ez da perfektua, baina funtzionatzen du. 256 byte-ko orria lau segmentutan banatuta dago, eta horietako bakoitza airez igortzen da pakete gisa. Pakete batek 125 byte datu gehi ditzake luzera byte bat eta CRC bi byte. Beraz, 64 byteko luzera duten zatiak orrialde eta segmentu zenbakiekin batera (0tik 3ra) jartzen dira bertan. Gailu hartzaileak zenbat segmentu jaso diren jarraitzeko aukera ematen duen aldagai bat du, eta laurak iristen direnean, bidaltzen duen gailuak orri osoa jaso duela berrespena jasotzen du. Berrespenik ez (CRC ez dator bat) - berriro bidali orri osoa. Abiadura kable bidez transmititzean baino are handiagoa da. Ikus:


Baina, oro har, beharrezkoa izango litzateke kablea krokisak igotzeko eta haren bidez konektatzeko gailuetara konektatzeko modu erosoa ematea. Adibidez, jarri horrelako interfaze-bihurgailu baten barruan CP2102-n, argazkian bezala, eta itsatsi plaka Micro USB kablea konektatzean eta deskonektatzean indarra jasan dezan.

ATmega128RFA1-rako OTA abiarazlea idazten ari gara (Smart Response XE gailuaren zati gisa)

3,3 voltioko egonkortzaile bat ere badu (eta nola erabili 6 voltioko elikadura-iturria duen gailu batean - egonkortzaile bera badu bakarrik, eta bi diodo gehi ditzakezu automatikoki hautatzeko zeinek gailua elikatuko duen) . Hiru LEDak interfaze bihurgailuaren plakatik dessoldatu behar dira, bestela bateriak ere kargatuko dituzte haiek funtzionatzerakoan, eta teklatuaren galdeketa oztopatzen dute eta SPI interfazearekin flash memoriarekin lan egingo dute.

Helburu bat erdiestea lortzea baino are interesgarriagoa izan da (eta ez da autobusari buruzko txantxa hori behar). Egileak asko ikasi zuen AVR abiarazleei, SPI flash memoriari, STK500 protokoloari eta 802.15.4 estandarrari buruz.

Goian deskribatutako liburutegiaz gain beste kode guztiak - dira Hemen, eta GPL v3 azpian dago ere. Egilearen Twitter - Hemen.

Iturria: www.habr.com

Gehitu iruzkin berria