Pišemo zagonski nalagalnik OTA za ATmega128RFA1 (kot del naprave Smart Response XE)

Pišemo zagonski nalagalnik OTA za ATmega128RFA1 (kot del naprave Smart Response XE)

Vse se je začelo z avtorjem, ki je na sekundarnem trgu kupil zanimivo napravo - Smart Response XE (kratek opis). Namenjen je šolam: vsak učenec v razredu prejme napravo, ki je podobna elektronskemu zvezku ali prevajalniku iz devetdesetih let, učitelj zastavi vprašanje, učenci pa na tipkovnici naprav vtipkajo odgovore, ki jih prejmejo preko radijski kanal (802.15.4) na sprejemnik, povezan z učiteljevim osebnim računalnikom.

Te naprave so bile ukinjene pred nekaj leti in tisto, kar so šole kupovale za 100 do 200 $ vsako, se zdaj pojavlja na eBayu za 10 $ ali manj. Tamkajšnja strojna oprema je zelo primerna za geeky eksperimente:

  • 60 tipkovnica
  • zaslon z ločljivostjo 384 × 136, 2 bita na slikovno piko - podobno kot BC, CGA, vendar 4 ne barve, ampak gradacije svetlosti
  • mikrokrmilnik ATmega128RFA1 (128 kB flash pomnilnik, 4 kB ROM, 16 kB RAM, 802.15.4 sprejemnik)
  • zunanji (glede na mikrokrmilnik, ne na celotno napravo) 1 megabit (128 kilobajtov) bliskovni pomnilnik z vmesnikom SPI
  • predal za 4 AAA elemente.

Že iz imena mikrokontrolerja je razvidno, da pripada družini AVR, kar pomeni, da je narediti napravo združljivo z Arduino več kot nepomembna naloga...

Od novic naprej Hackaday avtor ugotovil, kaj je so že naredili (ista povezava vam pove, kaj morate kje povezati), ki ima možnost izvajati igre za Arduboy:


Toda avtorja bolj zanima priložnost, da ne igra na napravi, ampak študira:

  • flash pomnilnik s serijskim vmesnikom SPI
  • zagonski nalagalniki za AVR
  • standard 802.15.4

Avtor je začel s pisanjem knjižnice (GPL v3), ki omogoča inicializacijo zaslona, ​​izhod besedila in pravokotnikov ter dostop do bliskovnega pomnilnika SPI. Nato so se mu začele porajati ideje za praktično uporabo naprave: žepni terminal, združljiv z VT-100, igre za več igralcev. Ko je obnovil tri naprave, se je odločil, da jih bo "naučil" sprejemati skice "po zraku". Kar bi bilo ne samo zanimivo, ampak tudi zelo priročno: ohišje naprave je težko vsakič odpreti, pod pokrovom prostora za baterije pa so le luknje, ki vam omogočajo, da na ploščo priključite programator JTAG.

Pišemo zagonski nalagalnik OTA za ATmega128RFA1 (kot del naprave Smart Response XE)

To je dovolj za nalaganje zagonskega nalagalnika Arduino, ne pa tudi skice - serijska vrata tam niso povezana, tako da še vedno ne morete brez odpiranja ohišja. Prav tako sta liniji TX0 in RX0 prvega serijskega vmesnika združeni s poizvedovalnimi linijami matrike tipkovnice, in sicer s tistimi, ki poizvedujejo funkcijske tipke ob straneh zaslona. Toda kaj lahko storite - avtor je zgradil tole:

Pišemo zagonski nalagalnik OTA za ATmega128RFA1 (kot del naprave Smart Response XE)

Tja je prinesel linije JTAG in zdaj ni treba odpreti prostora za baterije. In da se lahko naložijo skice, sem oba serijska vhoda povezal na isti konektor, dodal sem tudi stikalo, saj je z vstavljenimi baterijami fizično nemogoče drugače izklopiti napravo.

Kar nekaj časa je vzelo delo s spajkalnikom, nožem in lepilno pištolo. Na splošno je nalaganje skic "po zraku" veliko bolj priročno, za to moramo nujno nekaj izumiti.

Arduino IDE uporablja program za nalaganje skic avrdude. Z mikrokrmilnikom komunicira s pomočjo protokola STK500, ki omogoča prenos datotek v obe smeri. Slabo je združljiv s kanali, kjer so možne spremenljive zakasnitve, popačenje in izguba podatkov. Če v serijskem kanalu kaj popusti ali zašumi, lahko znorite in iščete vzrok. Nekoč je avtor trpel pol dneva, dokler ni ugotovil, da je težava v slabem kablu, pa tudi v muhastem pretvorniku vmesnika CP2102. Tudi mikrokrmilnik z vgrajenim pretvornikom vmesnikov, na primer ATmega32u4, lahko včasih deluje tako. Vsak uporabnik Arduina je opazil, da napake pri nalaganju skic niso tako redke. Včasih gre snemanje dobro, vendar se med testnim branjem odkrije napaka. To ne pomeni, da je prišlo do napake med pisanjem - do napake je prišlo med branjem. Zdaj pa si predstavljajte, da se bo pri delu "po zraku" zgodilo isto, vendar veliko pogosteje.

Po preizkušanju različnih načinov za premagovanje te težave je avtor prišel do naslednjega. Naprava ima 128 KB flash pomnilnik z vmesnikom SPI - podatke sprejemamo po žicah (ne pozabite, da ima avtor že eno napravo s konektorjem ob strani), ta pomnilnik uporabljamo kot medpomnilnik in pošiljamo podatke po radiu. kanal na drugo napravo. Pozdrav iz Cybiko.

Po pisanju kode za delo z radijsko postajo in pisave je nalagalnik postal daljši od 4 kilobajtov. Zato je bilo treba vrednost HFUSE spremeniti iz 0xDA v 0xD8. Zdaj je lahko zagonski nalagalnik dolg do 8 kilobajtov, začetni naslov pa je zdaj 0x1E000. To se odraža v Makefileu, vendar ga je treba upoštevati tudi pri polnjenju zagonski nalagalnik prek avrdude.

Oddajnik-sprejemnik 802.15.4 v ATmega128RFA1 je prvotno zasnovan za delovanje s protokolom Zigbee, kar je precej zapleteno, zato se je avtor odločil, da namesto tega samo prenaša pakete. To je implementirano v strojni opremi v ATmega128RFA1, zato je potrebna majhna koda. Prav tako se je avtor zaradi enostavnosti odločil za uporabo fiksnega kanala, ki vam ne omogoča niti ročne izbire. Standard 802.15.4 podpira 16 kanalov s številkami od 11 do 26. So precej natrpani, nekateri tudi prekrivajo WiFi kanale (rdeči so kanali ZigBee, modri, zeleni in rumeni pa WiFi).

Pišemo zagonski nalagalnik OTA za ATmega128RFA1 (kot del naprave Smart Response XE)

Izkazalo se je, da sta za motnje WiFi najmanj dovzetna kanala 15 in 26. Avtor je izbral drugega. Izjava o omejitvi odgovornosti: prevajalec ne ve, ali je dovoljeno poenostaviti ZigBee na ta način. Mogoče bi morali malo bolj programirati in ga v celoti implementirati?

Na prvi napravi je potrebno implementirati končni avtomat, ki prenaša podatke po protokolu STK500. Večinoma so poslana in prejeta sporočila samozadostna, nekatera pa so vezana na tista, ki so prej šla skozi kanal. Podan je opis dialoga tukaj.

Pomembna komponenta tega dialoga je prenos paketov, namenjenih zapisovanju v bliskovni pomnilnik ciljne naprave. Za preproste mikrokontrolerje družine AVR je velikost strani 128 bajtov, za ATmega128RFA1 pa 256. In za bliskovni pomnilnik, ki je povezan prek protokola SPI, je enako. Program v prvi napravi, ko naloži skico, je ne prenese takoj v drugo, ampak jo zapiše v ta pomnilnik. Ko Arduino IDE preveri pravilnost vnosa, pošlje tisto, kar je tam zapisano. Zdaj moramo prejete podatke prenesti prek radijskega kanala na drugo napravo. Hkrati se precej pogosto pojavlja preklop s sprejema na oddajanje in nazaj. Protokol STK500 je brezbrižen do zamud, vendar ne dopušča izgube podatkov (čudno, toda zgoraj je bilo rečeno, da zamude vplivajo tudi na prenos podatkov). In izgube med brezžičnim prenosom so neizogibne. ATmega128RFA1 ima vgrajeno strojno implementacijo ponavljajočih se zahtevkov ob dvomih o pravilnosti prenosa, vendar se je avtor odločil, da bo isto programsko implementiral sam. Razvil je protokol, po katerem teče veliko več podatkov v eno smer kot v drugo.

Ni popolno, vendar deluje. 256-bajtna stran je razdeljena na štiri segmente, od katerih se vsak prenaša po zraku kot paket. Paket lahko vsebuje do 125 bajtov podatkov plus en bajt za dolžino in dva bajta za CRC. Tako so tam postavljeni fragmenti, dolgi 64 bajtov, skupaj s številkami strani in segmentov (od 0 do 3). Sprejemna naprava ima spremenljivko, ki ji omogoča sledenje, koliko segmentov je bilo prejetih, in ko prispejo vsi štirje, naprava pošiljateljica prejme potrditev, da je bila prejeta celotna stran. Ni potrditve (CRC se ne ujema) – ponovno pošlji celotno stran. Hitrost je celo večja kot pri prenosu po kablu. Glej:


Toda na splošno bi bilo treba zagotoviti udoben način za povezavo kabla z napravami za nalaganje skic in prek njega. Na primer, postavite tak pretvornik vmesnika na CP2102, kot je na fotografiji, in ga prilepite na ploščo, tako da lahko prenese silo pri priklopu in odklopu kabla Micro USB.

Pišemo zagonski nalagalnik OTA za ATmega128RFA1 (kot del naprave Smart Response XE)

Ima tudi 3,3-voltni stabilizator (in kako ga uporabiti v napravi s 6-voltnim napajalnikom - če ima le isti stabilizator in lahko dodaš dve diodi, da samodejno izbereš, katera bo napajala napravo) . Vse tri LED diode je treba odspajkati s plošče pretvornika vmesnika, sicer bodo med delovanjem dodatno obremenile baterije, motile pa bodo tudi anketiranje tipkovnice in delo z bliskovnim pomnilnikom z vmesnikom SPI.

Zasledovanje cilja se je izkazalo za celo bolj zanimivo kot njegovo doseganje (in ne rabite tiste šale o avtobusu). Avtor je izvedel veliko o AVR bootloaderjih, SPI flash pomnilniku, STK500 protokolu in standardu 802.15.4.

Vsa druga koda poleg zgoraj opisane knjižnice je − tukaj, in je tudi pod GPL v3. Avtorjev Twitter - tukaj.

Vir: www.habr.com

Dodaj komentar