Մենք գրում ենք OTA bootloader ATmega128RFA1-ի համար (որպես Smart Response XE սարքի մաս)

Մենք գրում ենք OTA bootloader ATmega128RFA1-ի համար (որպես Smart Response XE սարքի մաս)

Ամեն ինչ սկսվեց նրանից, որ հեղինակը երկրորդական շուկայում ձեռք բերեց հետաքրքիր սարք՝ Smart Response XE (Կարճ նկարագրություն) Այն նախատեսված է դպրոցների համար. դասարանի յուրաքանչյուր աշակերտ ստանում է իննսունականների էլեկտրոնային նոթատետրի կամ թարգմանչի նման սարք, ուսուցիչը տալիս է հարց, իսկ աշակերտները պատասխանները տպում են սարքերի ստեղնաշարերի վրա, որոնք ստացվում են ռադիոալիք (802.15.4) ուսուցչի համակարգչին միացված ընդունիչին:

Այս սարքերը դադարեցվել են մի քանի տարի առաջ, և այն, ինչ դպրոցները գնել են յուրաքանչյուրը 100-200 դոլարով, այժմ հայտնվում է eBay-ում 10 դոլարով կամ ավելի քիչ: Այնտեղ ապարատը շատ հարմար է գեյկի փորձերի համար.

  • 60 ստեղնաշարի ստեղնաշար
  • էկրան 384×136 լուծաչափով, 2 բիթ մեկ պիքսելում - նման է BC-ին, CGA-ին, բայց 4-ը ոչ թե գույներ, այլ պայծառության աստիճանավորում
  • միկրոկոնտրոլեր ATmega128RFA1 (128 կԲ ֆլեշ հիշողություն, 4 կԲ ROM, 16 կԲ RAM, 802.15.4 հաղորդիչ)
  • արտաքին (կապված միկրոկոնտրոլերի, ոչ թե ամբողջ սարքի հետ) 1 մեգաբիթ (128 կիլոբայթ) ֆլեշ հիշողություն SPI ինտերֆեյսով
  • 4 AAA տարրերի խցիկ:

Միկրոկառավարիչի անունից պարզ է դառնում, որ այն պատկանում է AVR ընտանիքին, ինչը նշանակում է, որ սարքը Arduino-ի հետ համատեղելի դարձնելն ավելի քան տրիվիալ խնդիր է...

Նորություններից սկսած Հաքադայ հեղինակը պարզել է, թե դա ինչ է արդեն արել են (նույն հղումը ձեզ ասում է, թե ինչ կապել որտեղ), ունենալով Arduboy-ի համար խաղեր վարելու հնարավորություն.


Բայց հեղինակին ավելի շատ հետաքրքրում է սարքում ոչ թե խաղալու, այլ ուսումնասիրելու հնարավորությունը.

  • ֆլեշ հիշողություն սերիական SPI ինտերֆեյսով
  • bootloaders AVR-ի համար
  • 802.15.4 ստանդարտ

Հեղինակը սկսեց գրելով գրադարաններ (GPL v3), որը թույլ է տալիս նախաստորագրել էկրանը, արտածել տեքստ և ուղղանկյուններ և մուտք գործել SPI ֆլեշ հիշողություն: Հետո նա սկսեց գաղափարներ հորինել սարքի գործնական օգտագործման համար՝ VT-100-ի հետ համատեղելի գրպանային տերմինալ, բազմախաղացող խաղեր։ Վերակառուցելով երեք սարք՝ նա որոշեց նրանց «սովորեցնել» էսքիզներ ստանալ «եթերում»։ Ինչը կլիներ ոչ միայն հետաքրքիր, այլև շատ հարմար. սարքի պատյանը դժվար է բացվում ամեն անգամ, իսկ մարտկոցի խցիկի կափարիչի տակ կան միայն անցքեր, որոնք թույլ են տալիս միացնել JTAG ծրագրավորողը տախտակին:

Մենք գրում ենք OTA bootloader ATmega128RFA1-ի համար (որպես Smart Response XE սարքի մաս)

Սա բավական է Arduino բեռնախցիկը վերբեռնելու համար, բայց ոչ ուրվագիծը. սերիական պորտը միացված չէ այնտեղ, այնպես որ դուք դեռ չեք կարող անել առանց գործը բացելու: Նաև առաջին սերիական պորտի TX0 և RX0 տողերը համակցված են ստեղնաշարի մատրիցայի քվեարկության գծերի հետ, մասնավորապես՝ էկրանի կողքերում գտնվող ֆունկցիոնալ ստեղները: Բայց ինչ կարող ես անել. հեղինակը կառուցել է սա.

Մենք գրում ենք OTA bootloader ATmega128RFA1-ի համար (որպես Smart Response XE սարքի մաս)

Նա JTAG գծերը բերեց այնտեղ, և այժմ մարտկոցի խցիկը բացելու կարիք չկա։ Եվ որպեսզի էսքիզները վերբեռնվեն, ես երկու սերիական պորտերը միացրել եմ նույն միակցիչին՝ ավելացնելով նաև անջատիչ, քանի որ տեղադրված մարտկոցների դեպքում ֆիզիկապես անհնար է այլ կերպ անջատել սարքը։

Զոդման երկաթի, օգտակար դանակով և սոսինձ ատրճանակով աշխատելու համար բավական ժամանակ պահանջվեց: Ընդհանրապես, էսքիզները «եթերում» վերբեռնելը շատ ավելի հարմար է, դրա համար շտապ պետք է ինչ-որ բան հորինել:

Arduino IDE-ն օգտագործում է ծրագիրը էսքիզներ վերբեռնելու համար օր. Այն փոխազդում է միկրոկոնտրոլերի հետ՝ օգտագործելով արձանագրությունը STK500- ը, որը թույլ է տալիս ֆայլեր փոխանցել երկու ուղղություններով: Այն վատ է համատեղելի ալիքների հետ, որտեղ հնարավոր են փոփոխական ուշացումներ, աղավաղումներ և տվյալների կորուստ: Եթե ​​սերիալային ալիքում ինչ-որ բան թուլանում է կամ խշշում է, դուք կարող եք խենթանալ՝ փնտրելով պատճառը: Մի անգամ հեղինակը տուժեց կես օր, մինչև հասկացավ, որ խնդիրը վատ մալուխի մեջ է, ինչպես նաև քմահաճ CP2102 ինտերֆեյսի փոխարկիչի մեջ։ Նույնիսկ ներկառուցված ինտերֆեյսի փոխարկիչ ունեցող միկրոկոնտրոլերը, օրինակ՝ ATmega32u4, երբեմն կարող է գործել այսպես: Arduino-ի յուրաքանչյուր օգտատեր նկատել է, որ էսքիզները վերբեռնելիս սխալներն այնքան էլ հազվադեպ չեն: Երբեմն ձայնագրությունը լավ է ընթանում, բայց թեստի ընթերցման ժամանակ սխալ է հայտնաբերվում: Սա չի նշանակում, որ գրելու ժամանակ սխալ է եղել՝ ընթերցանության ժամանակ սխալ է եղել։ Հիմա պատկերացրեք, որ «եթերում» աշխատելիս նույնը կլինի, բայց շատ ավելի հաճախ։

Այս խնդիրը հաղթահարելու տարբեր ուղիներ փորձելուց հետո հեղինակը հանգել է հետեւյալին. Սարքն ունի 128 ԿԲ ֆլեշ հիշողություն SPI ինտերֆեյսով. մենք տվյալներ ենք ստանում լարերի միջոցով (հիշեք, որ հեղինակն արդեն ունի մեկ սարք՝ կողքի միակցիչով), օգտագործում ենք այս հիշողությունը որպես բուֆեր և ուղարկում ենք տվյալները ռադիոյով։ ալիք դեպի այլ սարք: Բարև Cybiko-ից:

Ռադիոալիքի հետ աշխատելու կոդը, ինչպես նաև տառատեսակը գրելուց հետո բեռնիչը դարձավ 4 կիլոբայթից ավելի երկար։ Հետևաբար, HFUSE արժեքը պետք է փոխվեր 0xDA-ից մինչև 0xD8: Այժմ bootloader-ը կարող է ունենալ մինչև 8 կիլոբայթ երկարություն, իսկ մեկնարկային հասցեն այժմ 0x1E000 է: Սա արտացոլված է Makefile-ում, բայց պետք է նաև հաշվի առնել լրացնելիս բեռնախցիկ avrdude-ի միջոցով։

ATmega802.15.4RFA128-ի 1 հաղորդիչն ի սկզբանե նախագծված է աշխատելու արձանագրության միջոցով ZigBee, ինչը բավականին բարդ է, ուստի հեղինակը որոշել է փոխարենը պարզապես փաթեթներ փոխանցել: Սա ներդրված է ATmega128RFA1 ապարատում, ուստի քիչ կոդ է պահանջվում: Նաև պարզության համար հեղինակը որոշել է օգտագործել ֆիքսված ալիք՝ թույլ չտալով նույնիսկ ձեռքով ընտրել այն։ 802.15.4 ստանդարտը աջակցում է 16 ալիք՝ 11-ից 26 թվերով: Դրանք բավականին մարդաշատ են, որոշները նաև համընկնում են WiFi ալիքների հետ (կարմիրը ZigBee ալիքներն են, կապույտը, կանաչը և դեղինը WiFi-ն են):

Մենք գրում ենք OTA bootloader 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 bootloader ATmega128RFA1-ի համար (որպես Smart Response XE սարքի մաս)

Այն ունի նաև 3,3 վոլտ կայունացուցիչ (և ինչպես օգտագործել այն 6 վոլտ սնուցմամբ սարքում. եթե միայն այն ունի նույն կայունացուցիչը, և կարող եք ավելացնել երկու դիոդ՝ ավտոմատ կերպով ընտրելու համար, թե դրանցից որն է սնուցում սարքը) . Բոլոր երեք LED-ները պետք է չզոդված լինեն ինտերֆեյսի փոխարկիչի տախտակից, հակառակ դեպքում դրանք լրացուցիչ կբեռնեն մարտկոցները դրանց վրա աշխատելիս, ինչպես նաև կխանգարեն ստեղնաշարի քվեարկությանը և աշխատելու ֆլեշ հիշողության հետ SPI ինտերֆեյսով:

Նպատակին հասնելն ավելի հետաքրքիր է ստացվել, քան դրան հասնելը (և ավտոբուսի մասին այդ կատակը պետք չէ): Հեղինակը շատ բան է իմացել AVR բեռնիչների, SPI ֆլեշ հիշողության, STK500 արձանագրության և 802.15.4 ստանդարտի մասին:

Բոլոր մյուս ծածկագրերը, բացի վերը նկարագրված գրադարանից, − է այստեղ, և այն նաև գտնվում է GPL v3-ի տակ: Հեղինակային Twitter - այստեղ.

Source: www.habr.com

Добавить комментарий