Kirjoitamme OTA-käynnistyslatainta ATmega128RFA1:lle (osana Smart Response XE -laitetta)

Kirjoitamme OTA-käynnistyslatainta ATmega128RFA1:lle (osana Smart Response XE -laitetta)

Kaikki alkoi siitä, että kirjailija osti mielenkiintoisen laitteen jälkimarkkinoilta - Smart Response XE (lyhyt kuvaus). Se on tarkoitettu kouluille: jokainen luokan oppilas saa 802.15.4-luvun sähköistä muistikirjaa vastaavan laitteen tai kääntäjän, opettaja esittää kysymyksen ja oppilaat kirjoittavat vastaukset laitteiden näppäimistöille, jotka vastaanotetaan radiokanava (XNUMX) opettajan PC:hen kytkettyyn vastaanottimeen.

Näiden laitteiden valmistus lopetettiin useita vuosia sitten, ja koulut, jotka kukin ostivat 100–200 dollarilla, ilmestyvät eBaysta 10 dollarilla tai vähemmän. Siellä oleva laitteisto soveltuu erittäin hyvin nörttikokeiluun:

  • 60 näppäimistön näppäimistö
  • näyttö, jonka resoluutio on 384 × 136, 2 bittiä pikseliä kohden - samanlainen kuin BC, CGA, mutta 4 ei väriä, vaan kirkkausasteikko
  • mikro-ohjain ATmega128RFA1 (128 kt flash-muisti, 4 kt ROM, 16 kt RAM, 802.15.4 lähetin-vastaanotin)
  • ulkoinen (suhteessa mikro-ohjaimeen, ei koko laitteeseen) 1 megabitin (128 kilotavua) flash-muisti SPI-liitännällä
  • lokero 4 AAA-elementille.

Mikro-ohjaimen nimestä selviää, että se kuuluu AVR-perheeseen, mikä tarkoittaa, että laitteen tekeminen Arduino-yhteensopivaksi on enemmän kuin triviaali tehtävä...

Uutisista eteenpäin Hackaday kirjoittaja sai selville, mikä se on ovat jo tehneet (sama linkki kertoo, mihin liität), kun sinulla on mahdollisuus ajaa pelejä Arduboylle:


Mutta kirjoittaja on enemmän kiinnostunut mahdollisuudesta olla pelaamatta laitteella, vaan opiskella:

  • Flash-muisti, jossa on SPI-sarjaliitäntä
  • käynnistyslataimet AVR:lle
  • standardi 802.15.4

Kirjoittaja aloitti kirjoittamalla kirjasto (GPL v3), jonka avulla voit alustaa näytön, tulostaa tekstiä ja suorakulmioita sekä käyttää SPI-flash-muistia. Sitten hän alkoi keksiä ideoita laitteen käytännön käyttöön: VT-100-yhteensopiva taskupääte, moninpelit. Kolmen laitteen uudelleen rakentamisen jälkeen hän päätti "opettaa" ne vastaanottamaan luonnoksia "ilman välityksellä". Mikä olisi paitsi mielenkiintoista, myös erittäin kätevää: laitteen koteloa on vaikea avata joka kerta, ja paristokotelon kannen alla on vain reikiä, joiden avulla voit liittää JTAG-ohjelmoijan levyyn.

Kirjoitamme OTA-käynnistyslatainta ATmega128RFA1:lle (osana Smart Response XE -laitetta)

Tämä riittää lataamaan Arduino-käynnistyslataimen, mutta ei luonnosta - sarjaporttia ei ole kytketty sinne, joten et silti voi tehdä ilman kotelon avaamista. Myös ensimmäisen sarjaportin TX0- ja RX0-rivit on yhdistetty näppäimistömatriisin pollauslinjoihin, nimittäin niihin, jotka pollaavat näytön sivuilla olevia toimintonäppäimiä. Mutta mitä voit tehdä - kirjoittaja rakensi tämän:

Kirjoitamme OTA-käynnistyslatainta ATmega128RFA1:lle (osana Smart Response XE -laitetta)

Hän toi JTAG-linjat sinne, eikä paristolokeroa enää tarvitse avata. Ja jotta sketsit saisi ladattua, liitin molemmat sarjaportit samaan liittimeen lisäten myös kytkimen, koska akkujen ollessa asennettuina laitetta ei ole fyysisesti mahdollista sammuttaa millään muulla tavalla.

Juotosraudalla, apuveitsellä ja liimapistoolilla työskentely kesti melko kauan. Yleensä luonnosten lataaminen "ylhäältä" on paljon kätevämpää; meidän on kiireesti keksittävä jotain tätä varten.

Arduino IDE käyttää ohjelmaa luonnosten lataamiseen avrdude. Se on vuorovaikutuksessa mikro-ohjaimen kanssa protokollan avulla STK500, jonka avulla voit siirtää tiedostoja molempiin suuntiin. Se on huonosti yhteensopiva kanavien kanssa, joissa vaihtelevat viiveet, vääristymät ja tietojen häviäminen ovat mahdollisia. Jos jotain irtoaa tai kahisee sarjakanavassa, voit mennä hulluksi etsimään syytä. Kerran kirjoittaja kärsi puoli päivää, kunnes hän tajusi, että ongelma oli huono kaapeli sekä oikukas CP2102-liitäntämuunnin. Jopa mikro-ohjain, jossa on sisäänrakennettu liitäntämuunnin, esimerkiksi ATmega32u4, voi joskus toimia näin. Jokainen Arduino-käyttäjä on huomannut, että virheet luonnosten lataamisessa eivät ole niin harvinaisia. Joskus tallennus sujuu hyvin, mutta testilukemisen aikana havaitaan virhe. Tämä ei tarkoita, että kirjoittamisen aikana tapahtui virhe - lukemisen aikana tapahtui virhe. Kuvittele nyt, että työskennellessäsi "over the air" tapahtuu sama, mutta paljon useammin.

Yritettyään eri tapoja ratkaista tämä ongelma, kirjoittaja päätyi seuraavaan. Laitteessa on 128 KB flash-muisti SPI-liitännällä - vastaanotamme dataa johtoja pitkin (muista, että tekijällä on jo yksi laite, jossa on liitin sivulla), käytämme tätä muistia puskurina ja lähetämme tiedot radion kautta. kanava toiseen laitteeseen. Terveisiä Cybikosta.

Kirjoitettuaan koodin radiokanavan kanssa toimimaan sekä fontin kanssa, latausohjelmasta tuli yli 4 kilotavua. Siksi HFUSE-arvo oli muutettava arvosta 0xDA arvoon 0xD8. Nyt käynnistyslatain voi olla jopa 8 kilotavua pitkä, ja aloitusosoite on nyt 0x1E000. Tämä näkyy Makefilessä, mutta se tulee ottaa huomioon myös täytettäessä käynnistyslatain avrduden kautta.

ATmega802.15.4RFA128:n 1-lähetin-vastaanotin on alun perin suunniteltu toimimaan protokollan avulla ZigBee, mikä on melko monimutkaista, joten kirjoittaja päätti vain lähettää paketteja sen sijaan. Tämä on toteutettu laitteistossa ATmega128RFA1:ssä, joten koodia tarvitaan vähän. Myös yksinkertaisuuden vuoksi kirjoittaja päätti käyttää kiinteää kanavaa, joka ei sallinut sinun valita sitä edes manuaalisesti. 802.15.4-standardi tukee 16 kanavaa numeroilla 11-26. Ne ovat melko tungosta, jotkut ovat myös päällekkäisiä WiFi-kanavien kanssa (punainen ovat ZigBee-kanavia, sininen, vihreä ja keltainen ovat WiFi).

Kirjoitamme OTA-käynnistyslatainta ATmega128RFA1:lle (osana Smart Response XE -laitetta)

Kävi ilmi, että kanavat 15 ja 26 ovat vähiten herkkiä WiFin häiriöille. Kirjoittaja valitsi niistä toisen. Vastuuvapauslauseke: kääntäjä ei tiedä, saako ZigBeetä yksinkertaistaa tällä tavalla. Ehkä meidän pitäisi tehdä hieman enemmän ohjelmointia ja toteuttaa se kokonaan?

Ensimmäisessä laitteessa on tarpeen toteuttaa äärellinen tilakone, joka välittää tietoja STK500-protokollan kautta. Lähetetyt ja vastaanotetut viestit ovat pääosin omavaraisia, mutta osa niistä on sidottu aiemmin kanavan kautta kulkeneisiin viesteihin. Dialogin kuvaus on annettu täällä.

Tämän dialogin tärkeä komponentti on kohdelaitteen flash-muistiin kirjoitettaviksi tarkoitettujen pakettien lähettäminen. Yksinkertaisilla AVR-perheen mikro-ohjaimilla sivukoko on 128 tavua, mutta ATmega128RFA1:llä se on 256. Ja SPI-protokollalla kytketyllä flash-muistilla se on sama. Ensimmäisessä laitteessa oleva ohjelma, kun lataa luonnosta, ei siirrä sitä välittömästi toiseen, vaan kirjoittaa sen tähän muistiin. Kun Arduino IDE tarkistaa merkinnän oikeellisuuden, sille lähetetään mitä siellä kirjoitettiin. Nyt meidän on lähetettävä vastaanotetut tiedot radiokanavan kautta toiseen laitteeseen. Samaan aikaan vaihto vastaanottamisesta lähetykseen ja takaisin tapahtuu melko usein. STK500-protokolla on välinpitämätön viiveille, mutta ei siedä tietojen häviämistä (outoa, mutta yllä sanottiin, että viiveet vaikuttavat myös tiedonsiirtoon). Ja häviöt langattoman tiedonsiirron aikana ovat väistämättömiä. ATmega128RFA1:ssä on sisäänrakennettu laitteistototeutus toistuviin pyyntöihin, kun siirron oikeellisuudesta on epäilyksiä, mutta kirjoittaja päätti toteuttaa saman ohjelmistossa itse. Hän kehitti protokollan, jossa paljon enemmän dataa virtaa yhteen suuntaan kuin toiseen.

Se ei ole täydellinen, mutta se toimii. 256-tavuinen sivu on jaettu neljään segmenttiin, joista jokainen lähetetään pakettina. Paketti voi sisältää enintään 125 tavua dataa sekä yhden tavun pituuden ja kaksi tavua CRC:tä varten. Joten 64 tavun pituiset fragmentit sivu- ja segmenttinumeroineen (0-3) sijoitetaan sinne. Vastaanottavassa laitteessa on muuttuja, jonka avulla se voi seurata kuinka monta segmenttiä on vastaanotettu, ja kun kaikki neljä saapuvat, lähettävä laite vastaanottaa vahvistuksen, että koko sivu on vastaanotettu. Ei vahvistusta (CRC ei täsmää) - lähetä koko sivu uudelleen. Nopeus on jopa suurempi kuin kaapelin kautta lähetettäessä. Katso:


Mutta yleisesti ottaen olisi tarpeen tarjota kätevä tapa liittää kaapeli laitteisiin luonnosten lataamista varten ja sen kautta. Aseta esimerkiksi tällainen liitäntämuunnin CP2102:n sisään, kuten kuvassa, ja liimaa se levyyn niin, että se kestää voiman kytkettäessä ja irrotettaessa Micro USB -kaapelia.

Kirjoitamme OTA-käynnistyslatainta ATmega128RFA1:lle (osana Smart Response XE -laitetta)

Siinä on myös 3,3 voltin stabilisaattori (ja kuinka sitä käytetään laitteessa, jossa on 6 voltin virtalähde - jos vain siinä on sama stabilointi, ja voit lisätä kaksi diodia valitaksesi automaattisesti, kumpi niistä antaa virtaa laitteeseen) . Kaikki kolme LEDiä on juotettava irti liitäntämuunninkortista, muuten ne kuormittavat lisäksi paristoja käytettäessä niitä ja häiritsevät myös näppäimistön pollausa ja toimivat flash-muistin kanssa SPI-liitännällä.

Tavoitteen tavoittelu osoittautui vielä mielenkiintoisemmaksi kuin sen saavuttaminen (eikä tarvitse sitä vitsiä bussista). Kirjoittaja oppi paljon AVR-käynnistyslataimista, SPI-flash-muistista, STK500-protokollasta ja 802.15.4-standardista.

Kaikki muut koodit edellä kuvatun kirjaston lisäksi ovat − täällä, ja se on myös GPL v3:n alla. Tekijän Twitter - täällä.

Lähde: will.com

Lisää kommentti