Ние пишуваме OTA подигнувач за ATmega128RFA1 (како дел од уредот Smart Response XE)

Ние пишуваме OTA подигнувач за ATmega128RFA1 (како дел од уредот Smart Response XE)

Се започна со купување на интересен уред на секундарниот пазар на авторот - Smart Response XE (краток опис). Наменет е за училиштата: секој ученик во одделението добива уред сличен на електронска тетратка или преведувач од деведесетите, наставникот поставува прашање, а учениците ги пишуваат одговорите на тастатурите на уредите кои се добиваат преку радио канал (802.15.4) до ресивер поврзан со компјутерот на наставникот.

Овие уреди беа прекинати пред неколку години, а она што училиштата го купија за 100-200 долари секој сега се појавува на eBay за 10 долари или помалку. Хардверот таму е многу погоден за џики експерименти:

  • Тастатура со 60 копчиња
  • дисплеј со резолуција од 384×136, 2 бита по пиксел - слично на BC, CGA, но 4 не бои, туку градации на осветленост
  • микроконтролер ATmega128RFA1 (128 kB флеш меморија, 4 kB ROM, 16 kB RAM, 802.15.4 трансивер)
  • надворешна (во однос на микроконтролерот, не целиот уред) 1 мегабитна (128 килобајти) флеш меморија со SPI интерфејс
  • преграда за 4 ААА елементи.

Од името на микроконтролерот е јасно дека припаѓа на семејството AVR, што значи дека уредот да биде компатибилен со Arduino е повеќе од тривијална задача...

Од вестите натаму Hackaday авторот откри што е тоа веќе направиле (истата врска ви кажува што да поврзете каде), имајќи можност да стартувате игри за Arduboy:


Но, авторот е повеќе заинтересиран за можноста да не игра на уредот, туку да учи:

  • флеш меморија со сериски SPI интерфејс
  • подигнувачи за AVR
  • стандард 802.15.4

Авторот започна со пишување библиотеки (GPL v3), кој ви овозможува да го иницијализирате екранот, да прикажувате текст и правоаголници и да пристапите до флеш меморијата SPI. Потоа почна да доаѓа со идеи за практична употреба на уредот: џебен терминал компатибилен со VT-100, игри со повеќе играчи. Откако изгради три уреди, тој реши да ги „научи“ да примаат скици „преку воздухот“. Што би било не само интересно, туку и многу погодно: куќиштето на уредот е тешко да се отвора секој пат, а под капакот на преградата за батерии има само дупки што ви дозволуваат да поврзете програмер JTAG на плочата.

Ние пишуваме OTA подигнувач за ATmega128RFA1 (како дел од уредот Smart Response XE)

Ова е доволно за да го поставите подигнувачот на Arduino, но не и скицата - сериската порта не е поврзана таму, така што сè уште не можете да направите без да го отворите куќиштето. Исто така, линиите TX0 и RX0 од првата сериска порта се комбинираат со линиите за избирање на матрицата на тастатурата, имено оние што ги избираат функционалните копчиња на страните на екранот. Но, што можете да направите - авторот го изгради ова:

Ние пишуваме OTA подигнувач за ATmega128RFA1 (како дел од уредот Smart Response XE)

Таму ги донесе JTAG линиите и сега нема потреба да се отвора батерискиот простор. И за да може да се ставаат скици, ги поврзав двата сериски порти на истиот конектор, додавајќи и прекинувач, бидејќи со поставените батерии физички е невозможно да се исклучи уредот на друг начин.

Беше потребно доста време да се работи со рачка за лемење, помошен нож и пиштол за лепило. Во принцип, поставувањето скици „преку воздухот“ е многу поудобно, итно треба да измислиме нешто за ова.

Arduino IDE ја користи програмата за поставување скици аврдуде. Тој е во интеракција со микроконтролерот користејќи го протоколот STK500, кој ви овозможува да пренесувате датотеки во двете насоки. Слабо е компатибилен со канали каде што се можни променливи доцнења, изобличување и загуба на податоци. Ако нешто се ослободи или шушка во серискиот канал, може да полудите да ја барате причината. Еднаш авторот страдаше половина ден додека не сфати дека проблемот е лош кабел, како и каприциозниот конвертор за интерфејс CP2102. Дури и микроконтролер со вграден конвертор за интерфејс, на пример, ATmega32u4, понекогаш може да дејствува вака. Секој корисник на Arduino забележал дека грешките при поставување скици не се толку ретки. Понекогаш снимањето оди добро, но за време на тестот за читање се открива грешка. Ова не значи дека имало грешка при пишувањето - имало неуспех при читањето. Сега замислете дека кога работите „преку воздух“ ќе се случи истото, но многу почесто.

Откако се обидел на различни начини да го надмине овој проблем, авторот дошол до следново. Уредот има флеш меморија од 128 KB со интерфејс SPI - добиваме податоци преку жиците (запомнете дека авторот веќе има еден уред со конектор на страна), ја користиме оваа меморија како бафер и ги испраќаме податоците преку радио канал на друг уред. Здраво од Cybiko.

По пишувањето на кодот за работа со радио каналот, како и фонтот, натоварувачот стана подолг од 4 килобајти. Затоа, вредноста на HFUSE мораше да се смени од 0xDA на 0xD8. Сега подигнувачот може да биде долг до 8 килобајти, а почетната адреса сега е 0x1E000. Ова се рефлектира во Makefile, но треба да се земе предвид и при пополнување подигнувач преку avrdude.

Трансиверот 802.15.4 во ATmega128RFA1 е првично дизајниран да работи со помош на протоколот ЗигБи, што е доста комплицирано, па авторот одлучил наместо тоа само да пренесува пакети. Ова е имплементирано во хардверот во ATmega128RFA1, па затоа е потребен мал код. Исто така, за едноставност, авторот одлучи да користи фиксен канал, не дозволувајќи ви да го изберете дури и рачно. Стандардот 802.15.4 поддржува 16 канали со броеви од 11 до 26. Тие се доста преполни, некои се преклопуваат и со WiFi каналите (црвено се ZigBee каналите, сината, зелената и жолтата се WiFi).

Ние пишуваме OTA подигнувач за ATmega128RFA1 (како дел од уредот Smart Response XE)

Се испостави дека каналите 15 и 26 се најмалку подложни на пречки од WiFi. Одрекување: преведувачот не знае дали е дозволено да го поедностави ZigBee на овој начин. Можеби треба да направиме малку повеќе програмирање и да го имплементираме целосно?

На првиот уред, неопходно е да се имплементира машина за конечни состојби што пренесува податоци преку протоколот STK500. Во најголем дел, пораките што се пренесуваат и примаат се самодоволни, но некои се врзани за оние што поминале низ каналот порано. Даден е опис на дијалогот тука.

Важна компонента на овој дијалог е преносот на пакети наменети да се запишат во флеш меморијата на одредишниот уред. За едноставни микроконтролери од фамилијата AVR, големината на страницата е 128 бајти, но за ATmega128RFA1 е 256. А за флеш меморијата што е поврзана преку протоколот SPI е исто. Програмата во првиот уред, кога поставува скица, не ја префрла веднаш на вториот, туку ја запишува во оваа меморија. Кога Arduino IDE ја проверува точноста на записот, се испраќа она што е напишано таму. Сега треба да ги пренесеме примените податоци преку радио канал на вториот уред. Во исто време, префрлањето од примање на пренос и назад се случува доста често. Протоколот STK500 е рамнодушен кон одложувањата, но не толерира загуба на податоци (чудно, но погоре беше кажано дека одложувањата исто така влијаат на преносот на податоци). И загубите за време на безжичниот пренос се неизбежни. ATmega128RFA1 има вградена хардверска имплементација на повторени барања кога има сомнежи за исправноста на преносот, но авторот одлучил истото да го имплементира самиот во софтверот. Тој разви протокол во кој многу повеќе податоци течат на еден начин отколку на друг.

Не е совршено, но функционира. Страницата од 256 бајти е поделена на четири сегменти, од кои секој се пренесува преку воздухот како пакет. Еден пакет може да содржи до 125 бајти податоци плус еден бајт за должина и два бајта за CRC. Така, фрагменти долги 64 бајти заедно со броеви на страници и сегменти (од 0 до 3) се поставени таму. Уредот што прима има променлива што му овозможува да следи колку сегменти се примени, а кога ќе пристигнат сите четири, уредот што испраќа добива потврда дека целата страница е примена. Нема потврда (CRC не се совпадна) - повторно испратете ја целата страница. Брзината е уште поголема отколку кога се пренесува преку кабел. Видете:


Но, генерално, би било неопходно да се обезбеди пригоден начин за поврзување на кабелот со уредите за поставување скици и преку него. На пример, ставете внатре таков конвертор за интерфејс на CP2102, како на фотографијата, и залепете го на плочата за да може да ја издржи силата при поврзување и исклучување на Micro USB кабелот.

Ние пишуваме OTA подигнувач за ATmega128RFA1 (како дел од уредот Smart Response XE)

Има и стабилизатор од 3,3 волти (и како да го користите во уред со напојување од 6 волти - само ако го има истиот стабилизатор и можете да додадете две диоди за автоматски да изберете која од нив ќе го напојува уредот) . Сите три LED диоди мора да се одлемеат од плочата на конверторот на интерфејсот, во спротивно тие дополнително ќе ги вчитаат батериите кога работат со нив, а исто така ќе пречат во гласањето на тастатурата и ќе работат со флеш меморија со интерфејсот SPI.

Следењето на целта се покажа уште поинтересно од постигнувањето (и не ви треба таа шега за автобусот). Авторот научи многу за AVR подигнувачите, SPI флеш меморијата, протоколот STK500 и стандардот 802.15.4.

Сите други кодови покрај библиотеката опишана погоре е - тука, а исто така е под GPL v3. Твитер на авторот - тука.

Извор: www.habr.com

Додадете коментар