Sve je počelo tako što je autor kupio zanimljiv uređaj na sekundarnom tržištu - Smart Response XE (
Ovi uređaji su ukinuti prije nekoliko godina, a ono što su škole kupile po cijeni od 100-200 dolara sada se pojavljuje na eBayu za 10 dolara ili manje. Tamošnji hardver je vrlo pogodan za štreberske eksperimente:
- Tastatura sa 60 tastera
- ekran rezolucije 384×136, 2 bita po pikselu - sličan BC, CGA, ali 4 ne boje, već gradacije svjetline
- mikrokontroler ATmega128RFA1 (128 kB fleš memorija, 4 kB ROM, 16 kB RAM, 802.15.4 primopredajnik)
- eksterna (u odnosu na mikrokontroler, ne ceo uređaj) 1 megabit (128 kilobajta) fleš memorija sa SPI interfejsom
- pretinac za 4 AAA elementa.
Iz naziva mikrokontrolera jasno je da pripada AVR porodici, što znači da je Arduino kompatibilan zadatak više nego trivijalan...
Od vesti pa nadalje
Ali autora više zanima mogućnost da se ne igra na uređaju, već da uči:
- fleš memorija sa serijskim SPI interfejsom
- bootloaders za AVR
- standard 802.15.4
Autor je počeo pisanjem
Ovo je dovoljno da učitate Arduino bootloader, ali ne i skicu - serijski port tamo nije povezan, tako da još uvijek ne možete bez otvaranja kućišta. Takođe, linije TX0 i RX0 prvog serijskog porta su kombinovane sa linijama za pozivanje matrice tastature, odnosno onima koje prozivaju funkcijske tastere na bočnim stranama ekrana. Ali šta možete - autor je napravio ovo:
Tamo je donio JTAG linije i sada nema potrebe za otvaranjem odjeljka za baterije. A da bi se skice mogle učitati, spojio sam oba serijska porta na isti konektor, dodajući i prekidač, jer je sa ugrađenim baterijama fizički nemoguće isključiti uređaj na bilo koji drugi način.
Bilo je potrebno dosta vremena za rad s lemilom, nožem i pištoljem za ljepilo. Općenito, postavljanje skica "preko zraka" je mnogo praktičnije; hitno moramo izmisliti nešto za ovo.
Arduino IDE koristi program za postavljanje skica
Nakon što je pokušao na različite načine da prevaziđe ovaj problem, autor je došao do sledećeg. Uređaj ima fleš memoriju od 128 KB sa SPI interfejsom - podatke primamo preko žica (ne zaboravite da autor već ima jedan uređaj sa konektorom sa strane), koristimo ovu memoriju kao bafer i šaljemo podatke preko radija kanal na drugi uređaj. Pozdrav iz Cybika.
Nakon pisanja koda za rad sa radio kanalom, kao i fonta, loader je postao duži od 4 kilobajta. Stoga je HFUSE vrijednost morala biti promijenjena iz 0xDA u 0xD8. Sada bootloader može biti dugačak do 8 kilobajta, a početna adresa je sada 0x1E000. Ovo se odražava u Makefile-u, ali ga takođe treba uzeti u obzir prilikom popunjavanja
802.15.4 primopredajnik u ATmega128RFA1 originalno je dizajniran za rad koristeći protokol
Pokazalo se da su kanali 15 i 26 najmanje podložni smetnjama od WiFi-a. Autor je odabrao drugi od njih. Disclaimer: prevodilac ne zna da li je dozvoljeno pojednostaviti ZigBee na ovaj način. Možda bismo trebali malo više programirati i implementirati ga u potpunosti?
Na prvom uređaju je potrebno implementirati konačni stroj koji prenosi podatke putem STK500 protokola. Uglavnom, poruke koje se prenose i primaju su samodovoljne, ali neke su vezane za one koje su ranije prošle kroz kanal. Dat je opis dijaloga
Važna komponenta ovog dijaloga je prijenos paketa namijenjenih za upis u fleš memoriju odredišnog uređaja. Za jednostavne mikrokontrolere AVR familije, veličina stranice je 128 bajtova, ali za ATmega128RFA1 je 256. I za fleš memoriju koja je povezana preko SPI protokola je ista. Program u prvom uređaju, prilikom učitavanja skice, ne prenosi je odmah na drugi, već je upisuje u ovu memoriju. Kada Arduino IDE provjeri ispravnost unosa, šalje se ono što je tamo napisano. Sada trebamo prenijeti primljene podatke preko radio kanala na drugi uređaj. Istovremeno, prelazak sa prijema na odašiljanje i nazad se dešava prilično često. STK500 protokol je indiferentan prema kašnjenjima, ali ne toleriše gubitak podataka (čudno, ali je gore rečeno da kašnjenja utiču i na prenos podataka). A gubici tokom bežičnog prijenosa su neizbježni. ATmega128RFA1 ima ugrađenu hardversku implementaciju ponovljenih zahtjeva kada postoje sumnje u ispravnost prijenosa, ali je autor sam odlučio da isto implementira u softver. Razvio je protokol u kojem mnogo više podataka teče na jedan način nego na drugi.
Nije savršeno, ali radi. Stranica od 256 bajta podijeljena je na četiri segmenta, od kojih se svaki prenosi putem zraka kao paket. Paket može sadržavati do 125 bajtova podataka plus jedan bajt za dužinu i dva bajta za CRC. Dakle, fragmenti dužine 64 bajta zajedno sa brojevima stranica i segmenata (od 0 do 3) se tamo postavljaju. Prijemni uređaj ima varijablu koja mu omogućava da prati koliko je segmenata primljeno, a kada sva četiri stignu, uređaj koji šalje prima potvrdu da je cijela stranica primljena. Nema potvrde (CRC se ne podudara) - ponovo pošaljite cijelu stranicu. Brzina je čak i veća nego kod prijenosa putem kabla. vidi:
Ali općenito, bilo bi potrebno osigurati zgodan način povezivanja kabela s uređajima za učitavanje skica i kroz njega. Na primjer, stavite unutar takvog pretvarača sučelja na CP2102, kao na fotografiji, i zalijepite ga na ploču tako da može izdržati silu prilikom spajanja i odspajanja Micro USB kabela.
Ima i 3,3-voltni stabilizator (i kako ga koristiti u uređaju sa 6-voltnim napajanjem - samo da ima isti stabilizator, a možete dodati dvije diode da automatski odaberete koja će od njih napajati uređaj) . Sve tri LED diode moraju biti odlemljene sa konvertorske ploče interfejsa, inače će dodatno napuniti baterije prilikom rada na njima, a i ometati prozivanje tastature i rad sa fleš memorijom sa SPI interfejsom.
Ispostavilo se da je postizanje cilja još zanimljivije od postizanja (i ne treba mi ta šala o autobusu). Autor je naučio mnogo o AVR bootloaderima, SPI fleš memoriji, STK500 protokolu i standardu 802.15.4.
Sav drugi kod osim gore opisane biblioteke je −
izvor: www.habr.com