Scrivemu un bootloader OTA per ATmega128RFA1 (cum'è parte di u dispusitivu Smart Response XE)

Scrivemu un bootloader OTA per ATmega128RFA1 (cum'è parte di u dispusitivu Smart Response XE)

Tuttu hà cuminciatu cù l'autore cumprà un dispositivu interessante nantu à u mercatu secundariu - Smart Response XE (corta descrizzione). Hè destinatu à e scole: ogni studiente in a classe riceve un dispositivu simile à un quaderno elettronicu o un traduttore di l'anni novanta, u maestru face una quistione, è i studienti scrivenu e risposte nantu à i tastieri di i dispositi, chì sò ricevuti via un canale radio (802.15.4) à un ricevitore cunnessu à u PC di u maestru.

Sti dispusitivi sò stati discontinuati parechji anni fà, è ciò chì e scole anu acquistatu per $ 100- $ 200 ognunu hè avà apparsu in eBay per $ 10 o menu. U hardware hè assai adattatu per esperimenti geek:

  • Tastiera à 60 tasti
  • display cù una risoluzione di 384 × 136, 2 bits per pixel - simile à BC, CGA, ma 4 micca culori, ma gradazioni di luminosità
  • microcontroller ATmega128RFA1 (128 kB memoria flash, 4 kB ROM, 16 kB RAM, ricetrasmettitore 802.15.4)
  • esterna (in relazione à u microcontroller, micca u dispusitivu tutale) 1 megabit (128 kilobyte) memoria flash cù interfaccia SPI
  • compartimentu per 4 elementi AAA.

Da u nome di u microcontroller hè chjaru chì appartene à a famiglia AVR, chì significa chì rende u dispusitivu Arduino-compatibile hè un compitu più chè triviale...

Da a nutizia in avanti Hackaday l'autore hà scupertu ciò chì hè anu digià fattu (u stessu ligame vi dice ciò chì cunnette induve), avè l'uppurtunità di eseguisce ghjochi per Arduboy:


Ma l'autore hè più interessatu à l'uppurtunità di ghjucà micca nantu à u dispusitivu, ma di studià:

  • memoria flash cù interfaccia seriale SPI
  • bootloaders per AVR
  • standard 802.15.4

L'autore principia per scrive librarii (GPL v3), chì permette di inizializà a visualizazione, u testu di output è i rettanguli, è accede à a memoria flash SPI. Allora hà cuminciatu à vene cun idee per l'usu praticu di u dispusitivu: un terminal di sacchetta VT-100-compatibile, ghjochi multiplayer. Dopu avè ricustruitu trè apparecchi, hà decisu di "insignà" à riceve schizzi "sopra l'aria". Ciò chì ùn saria micca solu interessante, ma ancu assai cunvene: u casu di u dispusitivu hè difficiule d'apre ogni volta, è sottu à a tappa di u compartment di a bateria ci sò solu buchi chì permettenu di cunnette un programatore JTAG à u bordu.

Scrivemu un bootloader OTA per ATmega128RFA1 (cum'è parte di u dispusitivu Smart Response XE)

Questu hè abbastanza per carricà l'Arduino bootloader, ma micca u sketch - u portu seriale ùn hè micca cunnessu quì, cusì ùn pudete micca fà senza apre u casu. Inoltre, e linee TX0 è RX0 di u primu portu seriale sò cumminati cù e linee di polling di a matrice di u teclatu, vale à dì quelli chì sondanu i tasti di funzione à i lati di a visualizazione. Ma chì pudete fà - l'autore hà custruitu questu:

Scrivemu un bootloader OTA per ATmega128RFA1 (cum'è parte di u dispusitivu Smart Response XE)

Hà purtatu e linee JTAG quì, è avà ùn ci hè bisognu di apre u compartment di a bateria. È cusì chì i sketches ponu esse caricati, aghju cunnessu i dui porti seriali à u stessu connettore, aghjunghjendu ancu un switch, perchè cù e batterie installate, hè fisicamente impussibile di disattivà u dispusitivu in ogni altru modu.

Pigliò un pocu di tempu per travaglià cù un ferru di saldatura, un cuteddu utilitariu è una pistola di cola. In generale, uploading sketchs "over the air" hè assai più convenientu; avemu urgentemente bisognu di inventà qualcosa per questu.

Arduino IDE usa u prugramma per carica i sketches avrdude. Interagisce cù u microcontroller usendu u protocolu STK500, chì vi permette di trasfiriri schedari in i dui direzzione. Hè pocu cumpatibile cù i canali induve ritardu variabile, distorsione è perdita di dati sò pussibuli. Se qualcosa s'hè alluntanatu o rustles in u canali seriale, pudete andà in pazzi à circà a causa. Una volta l'autore hà patitu per a mità di ghjornu, finu à ch'ellu hà capitu chì u prublema era un cable cattivu, è ancu un capricciusu cunvertitore d'interfaccia CP2102. Ancu un microcontroller cù un cunvertitore d'interfaccia integrata, per esempiu, ATmega32u4, pò volte agisce cusì. Ogni utilizatore d'Arduino hà nutatu chì l'errore quandu caricate sketches ùn sò micca cusì rari. A volte l'arregistramentu va bè, ma durante una prova di lettura hè rilevatu un errore. Questu ùn significa micca chì ci hè statu un errore durante a scrittura - ci hè statu un fallimentu durante a lettura. Avà imaginate chì quandu u travagliu "sopra l'aria" succederà a listessa cosa, ma assai più spessu.

Dopu avè pruvatu diverse manere di superà stu prublema, l'autore hè ghjuntu cù i seguenti. U dispusitivu hà una memoria flash 128-kilobyte cù una interfaccia SPI - ricevemu dati nantu à i fili (ricurdate chì l'autore hà digià un dispositivu cù un connettore à u latu), utilizate sta memoria cum'è un buffer, è mandà e dati nantu à u canale radio à un altru dispusitivu. Salutami da Cybiko.

Dopu avè scrittu u codice per travaglià cù u canali radio, è ancu u font, u caricatore hè diventatu più longu di 4 kilobytes. Dunque, u valore HFUSE hà da esse cambiatu da 0xDA à 0xD8. Avà u bootloader pò esse finu à 8 kilobytes longu, è l'indirizzu di partenza hè avà 0x1E000. Questu hè riflessu in u Makefile, ma deve ancu esse cunsideratu quandu si riempie bootloader via avrdude.

U transceiver 802.15.4 in l'ATmega128RFA1 hè originariamente pensatu per travaglià cù u protokollu ZigBee, chì hè abbastanza cumplicatu, cusì l'autore hà decisu di trasmette solu pacchetti invece. Questu hè implementatu in hardware in l'ATmega128RFA1, cusì pocu codice hè necessariu. Inoltre, per a simplicità, l'autore hà decisu di utilizà un canali fissu, ùn permettenu micca di selezziunà ancu manualmente. U standard 802.15.4 supporta i canali 16 cù numeri da 11 à 26. Sò abbastanza affollati, alcuni si superponu ancu i canali WiFi (rossu sò canali ZigBee, blu, verde è giallu sò WiFi).

Scrivemu un bootloader OTA per ATmega128RFA1 (cum'è parte di u dispusitivu Smart Response XE)

Hè risultatu chì i canali 15 è 26 sò menu suscettibili à l'interferenza da WiFi. L'autore hà sceltu u sicondu di elli. Disclaimer: u traduttore ùn sapi micca s'ellu hè permessu di simplificà ZigBee in questu modu. Forsi duvemu fà un pocu più di prugrammazione è implementà cumpletamente?

Nantu à u primu dispusitivu, hè necessariu implementà una macchina à stati finiti chì trasmette dati via u protocolu STK500. Per a maiò parte, i missaghji trasmessi è ricivuti sò autosufficienti, ma alcuni sò ligati à quelli chì anu passatu per u canali prima. A descrizzione di u dialogu hè datu ccà.

Un cumpunente impurtante di stu dialogu hè a trasmissione di pacchetti destinati à esse scrittu à a memoria flash di u dispusitivu di destinazione. Per i microcontrollers simplici di a famiglia AVR, a dimensione di a pagina hè 128 bytes, ma per l'ATmega128RFA1 hè 256. È per a memoria flash chì hè cunnessu via u protocolu SPI, hè u listessu. U prugramma in u primu dispositivu, quandu si carica un sketch, ùn u trasfiriu micca immediatamente à u sicondu, ma u scrive in questa memoria. Quandu l'Arduino IDE verifica a correttezza di l'entrata, hè mandatu ciò chì era scrittu quì. Avà avemu bisognu di trasmette i dati ricevuti via u canali radiu à u sicondu dispositivu. À u listessu tempu, u cambiamentu da a ricivuta à a trasmissione è u ritornu hè abbastanza spessu. U protokollu STK500 hè indifferenti à i ritardi, ma ùn tollerà micca a perdita di dati (stranu, ma hè statu dettu sopra chì i ritardi affettanu ancu u trasferimentu di dati). E perdite durante a trasmissione wireless sò inevitabbili. L'ATmega128RFA1 hà una implementazione hardware integrata di richieste ripetute quandu ci sò dubbiti nantu à a correttezza di u trasferimentu, ma l'autore hà decisu di implementà u stessu in u software stessu. Hà sviluppatu un protokollu in quale flussi assai più dati in una manera di l'altru.

Ùn hè micca perfettu, ma funziona. A pagina di 256 byte hè divisa in quattru segmenti, ognunu di i quali hè trasmessu in l'aria cum'è un pacchettu. Un pacchettu pò cuntene finu à 125 byte di dati più un byte per a lunghezza è dui byte per CRC. Allora i frammenti di 64 bytes longu cù i numeri di pagina è di segmentu (da 0 à 3) sò posti quì. U dispusitivu di ricivutu hà una variàbile chì permette di seguità quanti segmenti sò stati ricivuti, è quandu tutti i quattru ghjunghjenu, u dispositivu di mandatu riceve cunferma chì a pagina sana hè stata ricevuta. Nisuna cunferma (CRC ùn currisponde micca) - rinviate tutta a pagina. A vitezza hè ancu più grande di quandu trasmette via cable. Vede:


Ma in generale, saria bisognu di furnisce una manera còmuda di cunnette u cable à i dispositi per uploading sketchs è attraversu. Per esempiu, mette in un tali cunvertitore di l'interfaccia nantu à u CP2102, cum'è in a foto, è cola à u bordu in modu chì pò sustene a forza quandu cunnette è disconnecting u cable Micro USB.

Scrivemu un bootloader OTA per ATmega128RFA1 (cum'è parte di u dispusitivu Smart Response XE)

Havi ancu un stabilizzatore di 3,3 volti (è cumu aduprà in un dispositivu cù una fonte di energia di 6 volti - s'ellu hà solu u listessu stabilizzatore, è pudete aghjunghje dui diodi per selezziunà automaticamente quale di elli alimenterà u dispusitivu) . Tutti i trè LED devenu esse dissoldati da a scheda di cunvertitore di l'interfaccia, altrimente carcàranu in più e batterie quandu operanu nantu à elli, è ancu interferiscenu cù u votu di u teclatu è travaglià cù memoria flash cù una interfaccia SPI.

Perseguite un scopu hè diventatu ancu più interessante di ottene (è ùn avete micca bisognu di quellu scherzu annantu à l'autobus). L'autore hà amparatu assai nantu à i bootloaders AVR, a memoria flash SPI, u protocolu STK500 è u standard 802.15.4.

Tutti l'altri codice in più di a biblioteca descritta sopra hè - ccà, è hè ancu sottu GPL v3. Twitter di l'autore - ccà.

Source: www.habr.com

Add a comment