Tunaandika bootloader ya OTA ya ATmega128RFA1 (kama sehemu ya kifaa cha Smart Response XE)

Tunaandika bootloader ya OTA ya ATmega128RFA1 (kama sehemu ya kifaa cha Smart Response XE)

Yote ilianza na mwandishi kununua kifaa cha kupendeza kwenye soko la sekondari - Smart Response XE (maelezo mafupi) Imekusudiwa shule: kila mwanafunzi darasani anapokea kifaa sawa na daftari la elektroniki au mfasiri kutoka miaka ya tisini, mwalimu anauliza swali, na wanafunzi huandika majibu kwenye kibodi za vifaa, ambavyo hupokelewa kupitia kituo cha redio (802.15.4) kwa kipokezi kilichounganishwa na Kompyuta ya mwalimu.

Vifaa hivi vilikatishwa miaka kadhaa iliyopita, na shule ambazo zilinunuliwa kwa $100-$200 kila moja sasa zinajitokeza kwenye eBay kwa $10 au chini ya hapo. Vifaa huko vinafaa sana kwa majaribio ya kijinga:

  • 60 muhimu keyboard
  • onyesho na azimio la 384 Γ— 136, bits 2 kwa pixel - sawa na BC, CGA, lakini 4 sio rangi, lakini viwango vya mwangaza
  • kidhibiti kidogo ATmega128RFA1 (kumbukumbu ya flash ya kB 128, ROM 4 kB, RAM ya kB 16, kipitishi sauti 802.15.4)
  • nje (kuhusiana na kidhibiti kidogo, si kifaa kizima) 1 megabit (kilobaiti 128) kumbukumbu ya flash na kiolesura cha SPI
  • chumba cha vipengele 4 vya AAA.

Kutoka kwa jina la microcontroller ni wazi kuwa ni ya familia ya AVR, ambayo ina maana kufanya kifaa Arduino-patanifu ni kazi zaidi ya ndogo ...

Kutoka kwa habari Hackaday mwandishi aligundua ni nini tayari wamefanya (kiungo sawa kinakuambia nini cha kuunganisha), kuwa na fursa ya kuendesha michezo kwa Arduboy:


Lakini mwandishi anavutiwa zaidi na fursa ya sio kucheza kwenye kifaa, lakini kusoma:

  • kumbukumbu ya flash na interface ya serial ya SPI
  • bootloaders kwa AVR
  • kiwango cha 802.15.4

Mwandishi alianza kwa kuandika maktaba (GPL v3), ambayo hukuruhusu kuanzisha onyesho, maandishi ya pato na mistatili, na kufikia kumbukumbu ya flash ya SPI. Kisha akaanza kuja na mawazo ya matumizi ya vitendo ya kifaa: terminal ya mfukoni inayoendana na VT-100, michezo ya wachezaji wengi. Baada ya kuunda tena vifaa vitatu, aliamua "kuwafundisha" kupokea michoro "hewani." Nini haitakuwa ya kuvutia tu, lakini pia ni rahisi sana: kesi ya kifaa ni vigumu kufungua kila wakati, na chini ya kifuniko cha compartment ya betri kuna mashimo tu ambayo inakuwezesha kuunganisha programu ya JTAG kwenye ubao.

Tunaandika bootloader ya OTA ya ATmega128RFA1 (kama sehemu ya kifaa cha Smart Response XE)

Hii inatosha kupakia bootloader ya Arduino, lakini sio mchoro - bandari ya serial haijaunganishwa hapo, kwa hivyo bado huwezi kufanya bila kufungua kesi. Pia, mistari ya TX0 na RX0 ya lango la kwanza la mfululizo imeunganishwa na mistari ya kupigia kura ya matrix ya kibodi, yaani zile zinazochagulia vitufe vya kukokotoa kwenye kando za onyesho. Lakini unaweza kufanya nini - mwandishi aliunda hii:

Tunaandika bootloader ya OTA ya ATmega128RFA1 (kama sehemu ya kifaa cha Smart Response XE)

Alileta mistari ya JTAG pale, na sasa hakuna haja ya kufungua sehemu ya betri. Na ili michoro iweze kupakiwa, niliunganisha bandari zote mbili za serial kwenye kontakt sawa, pia kuongeza kubadili, kwa sababu kwa betri zilizowekwa, haiwezekani kimwili kuzima kifaa kwa njia nyingine yoyote.

Ilichukua muda mwingi kufanya kazi na chuma cha kutengenezea, kisu cha matumizi na bunduki ya gundi. Kwa ujumla, kupakia michoro "hewani" ni rahisi zaidi; tunahitaji haraka kubuni kitu kwa hili.

Arduino IDE hutumia programu kupakia michoro avrdude. Inaingiliana na microcontroller kwa kutumia itifaki STK500, ambayo hukuruhusu kuhamisha faili kwa pande zote mbili. Haioani na idhaa ambapo ucheleweshaji tofauti, upotoshaji na upotezaji wa data unawezekana. Ikiwa kitu kitafunguliwa au rustles kwenye chaneli ya serial, unaweza kwenda wazimu kutafuta sababu. Mara baada ya mwandishi kuteseka kwa nusu siku hadi akagundua kuwa shida ilikuwa kebo mbaya, na vile vile kibadilishaji cha kigeuzi cha CP2102. Hata kidhibiti kidogo kilicho na kibadilishaji cha kiolesura kilichojengwa, kwa mfano, ATmega32u4, wakati mwingine kinaweza kutenda kama hii. Kila mtumiaji wa Arduino amegundua kuwa makosa wakati wa kupakia michoro sio nadra sana. Wakati mwingine kurekodi huenda vizuri, lakini wakati wa kusoma mtihani kosa hugunduliwa. Hii haimaanishi kuwa kulikuwa na hitilafu wakati wa kuandika - kulikuwa na kushindwa wakati wa kusoma. Sasa fikiria kwamba wakati wa kufanya kazi "hewa" kitu kimoja kitatokea, lakini mara nyingi zaidi.

Baada ya kujaribu njia mbalimbali za kuondokana na tatizo hili, mwandishi alikuja na zifuatazo. Kifaa kina kumbukumbu ya 128 KB flash na kiolesura cha SPI - tunapokea data juu ya waya (kumbuka kwamba mwandishi tayari ana kifaa kimoja kilicho na kiunganishi upande), tumia kumbukumbu hii kama buffer, na kutuma data kwenye redio. kituo kwa kifaa kingine. Habari kutoka kwa Cybiko.

Baada ya kuandika msimbo wa kufanya kazi na kituo cha redio, pamoja na font, kipakiaji kilikua zaidi ya kilobytes 4. Kwa hivyo, thamani ya HFUSE ilibidi ibadilishwe kutoka 0xDA hadi 0xD8. Sasa bootloader inaweza kuwa hadi kilobytes 8 kwa muda mrefu, na anwani ya kuanzia sasa ni 0x1E000. Hii inaonekana katika Makefile, lakini inapaswa pia kuzingatiwa wakati wa kujaza bootloader kupitia avrdude.

Transceiver ya 802.15.4 katika ATmega128RFA1 iliundwa awali kufanya kazi kwa kutumia itifaki. Zigbee, ambayo ni ngumu sana, kwa hivyo mwandishi aliamua kusambaza pakiti badala yake. Hii inatekelezwa katika maunzi katika ATmega128RFA1, kwa hivyo nambari ndogo inahitajika. Pia, kwa unyenyekevu, mwandishi aliamua kutumia chaneli iliyowekwa, bila kukuruhusu kuichagua hata kwa mikono. Kiwango cha 802.15.4 kinasaidia chaneli 16 zilizo na nambari kutoka 11 hadi 26. Zimejaa sana, zingine pia zinaingiliana chaneli za WiFi (nyekundu ni chaneli za ZigBee, bluu, kijani na manjano ni WiFi).

Tunaandika bootloader ya OTA ya ATmega128RFA1 (kama sehemu ya kifaa cha Smart Response XE)

Ilibadilika kuwa chaneli 15 na 26 zinaweza kuathiriwa kidogo na WiFi. Mwandishi alichagua ya pili kati yao. Kanusho: mtafsiri hajui ikiwa inaruhusiwa kurahisisha ZigBee kwa njia hii. Labda tunapaswa kufanya programu zaidi kidogo na kuitekeleza kabisa?

Kwenye kifaa cha kwanza, ni muhimu kutekeleza mashine ya hali ya mwisho ambayo hupeleka data kupitia itifaki ya STK500. Kwa sehemu kubwa, jumbe zinazotumwa na kupokewa zinajitosheleza, lakini zingine zimefungwa na zile zilizopitia chaneli mapema. Maelezo ya mazungumzo yametolewa hapa.

Kipengele muhimu cha mazungumzo haya ni upitishaji wa pakiti zinazokusudiwa kuandikwa kwenye kumbukumbu ya flash ya kifaa lengwa. Kwa microcontrollers rahisi ya familia ya AVR, ukubwa wa ukurasa ni 128 bytes, lakini kwa ATmega128RFA1 ni 256. Na kwa kumbukumbu ya flash ambayo imeunganishwa kupitia itifaki ya SPI, ni sawa. Mpango katika kifaa cha kwanza, wakati wa kupakia mchoro, hauhamishi mara moja kwa pili, lakini huiandika kwenye kumbukumbu hii. Wakati IDE ya Arduino inakagua usahihi wa kiingilio, inatumwa kile kilichoandikwa hapo. Sasa tunahitaji kusambaza data iliyopokelewa kupitia kituo cha redio kwenye kifaa cha pili. Wakati huo huo, kubadili kutoka kwa kupokea hadi kusambaza na kurudi hutokea mara nyingi kabisa. Itifaki ya STK500 haijali ucheleweshaji, lakini haivumilii upotezaji wa data (ya kushangaza, lakini ilisemwa hapo juu kuwa ucheleweshaji pia huathiri uhamishaji wa data). Na hasara wakati wa maambukizi ya wireless ni kuepukika. ATmega128RFA1 ina utekelezaji wa vifaa vya kujengwa kwa maombi ya mara kwa mara wakati kuna mashaka juu ya usahihi wa uhamisho, lakini mwandishi aliamua kutekeleza sawa katika programu mwenyewe. Alitengeneza itifaki ambayo data nyingi zaidi hutiririka kwa njia moja kuliko nyingine.

Sio kamili, lakini inafanya kazi. Ukurasa wa baiti 256 umegawanywa katika sehemu nne, ambazo kila moja hupitishwa angani kama pakiti. Pakiti inaweza kuhifadhi hadi baiti 125 za data pamoja na baiti moja kwa urefu na baiti mbili za CRC. Kwa hivyo vipande vya urefu wa baiti 64 pamoja na nambari za ukurasa na sehemu (kutoka 0 hadi 3) huwekwa hapo. Kifaa kinachopokea kina kigeu kinachoruhusu kufuatilia ni sehemu ngapi zimepokelewa, na zote nne zinapofika, kifaa kinachotuma hupokea uthibitisho kwamba ukurasa mzima umepokelewa. Hakuna uthibitisho (CRC haikulingana) - tuma upya ukurasa mzima. Kasi ni kubwa zaidi kuliko wakati wa kusambaza kupitia kebo. Tazama:


Lakini kwa ujumla, itakuwa muhimu kutoa njia rahisi ya kuunganisha cable kwenye vifaa vya kupakia michoro na kwa njia hiyo. Kwa mfano, weka ndani ya kigeuzi cha kiolesura kama hicho kwenye CP2102, kama kwenye picha, na uishike kwenye ubao ili iweze kuhimili nguvu wakati wa kuunganisha na kukata kebo ya Micro USB.

Tunaandika bootloader ya OTA ya ATmega128RFA1 (kama sehemu ya kifaa cha Smart Response XE)

Pia ina kiimarishaji cha 3,3-volt (na jinsi ya kuitumia kwenye kifaa kilicho na umeme wa 6-volt - ikiwa tu ina utulivu sawa, na unaweza kuongeza diode mbili ili kuchagua moja kwa moja ni nani kati yao atawasha kifaa) . LED zote tatu zinapaswa kutengwa kutoka kwa ubao wa kubadilisha kiolesura, vinginevyo watapakia betri zaidi wakati wa kufanya kazi juu yao, na pia kuingilia kati upigaji kura wa kibodi na kufanya kazi na kumbukumbu ya flash na kiolesura cha SPI.

Kufuatia lengo kuligeuka kuwa ya kuvutia zaidi kuliko kuifanikisha (na hauitaji mzaha huo kuhusu basi). Mwandishi alijifunza mengi kuhusu bootloaders ya AVR, kumbukumbu ya flash ya SPI, itifaki ya STK500 na kiwango cha 802.15.4.

Nambari zingine zote pamoja na maktaba iliyoelezewa hapo juu ni - hapa, na pia iko chini ya GPL v3. Twitter ya mwandishi - hapa.

Chanzo: mapenzi.com

Kuongeza maoni