Բովանդակություն:

AVRSH. Arduino- ի համար հրամանատար թարգմանչի պատյան/AVR. 6 քայլ (նկարներով)
AVRSH. Arduino- ի համար հրամանատար թարգմանչի պատյան/AVR. 6 քայլ (նկարներով)

Video: AVRSH. Arduino- ի համար հրամանատար թարգմանչի պատյան/AVR. 6 քայլ (նկարներով)

Video: AVRSH. Arduino- ի համար հրամանատար թարգմանչի պատյան/AVR. 6 քայլ (նկարներով)
Video: Arduino: avr/io.h No such file or directory error when compiling using avr-gcc 2024, Հուլիսի
Anonim
AVRSH. Arduino/AVR- ի հրամանատար թարգմանչի պատյան
AVRSH. Arduino/AVR- ի հրամանատար թարգմանչի պատյան

Երբևէ ցանկացե՞լ եք «մուտք գործել» ձեր AVR միկրոկոնտրոլերի վրա: Երբևէ մտածե՞լ եք, որ թույն կլինի գրանցամատյան «կատու» անել ՝ դրա բովանդակությունը տեսնելու համար: Դուք միշտ ցանկացե՞լ եք միջոց ՝ ձեր իրական AVR- ի կամ Arduino- ի առանձին ծայրամասային ենթահամակարգերը * իրական ժամանակում * հզորացնելու և անջատելու համար: Ես նույնպես, այնպես որ ես գրեցի AVR Shell- ը, որը UNIX- ի նման պատյան է: Դա UNIX- ի նման է, քանի որ այն հիշեցնում է այն shell հաշիվը, որը դուք գնացել և գնել եք ձեր irc nick բախման բոտերը գործարկելու համար, ինչպես նաև մեկ կամ երկու ընդհանուր հրաման ունենալու համար: Այն ունի նաև ֆայլային համակարգ, որը նման է UNIX- ի extfs- ին ՝ օգտագործելով արտաքին EEPROM, բայց դա ինքնին նախագիծ է դարձել, այնպես որ ես այն մոդուլը առանձին կթողարկեմ այլ հրահանգով, երբ այն պատրաստ լինի արտադրության: Ահա այն բաների ցանկը, որոնք այժմ կարող եք անել AVR Shell- ի հետ.

  • Կարդացեք ձեր տվյալների ուղղման բոլոր գրանցամատյանները (DDRn), նավահանգիստներն ու կապումներն իրական ժամանակում
  • Գրեք ձեր բոլոր DDRn- ներին, նավահանգիստներին և կապումներին `շարժիչները, LED- ները կամ սենսորները իրական ժամանակում միացնելու համար:
  • Նշեք համակարգի բոլոր հայտնի գրանցամատյանները
  • Ստեղծեք և պահեք արժեքներ օգտվողի կողմից սահմանված փոփոխականների մեջ, որոնք ապահովված են EEPROM- ի կողմից:
  • Ստեղծեք արմատային գաղտնաբառ և վավերացրեք դրա դեմ (օգտագործվում է հեռագիր մուտք գործելու համար)
  • Կարդացեք կազմաձևված պրոցեսորի ժամացույցի արագությունը
  • Փոխեք ձեր պրոցեսորի ժամացույցի արագությունը ՝ նախալեզվիչ սահմանելով
  • Սկսեք և դադարեցրեք 16-բիթ ժամաչափերը տարբեր իրերի ժամանակացույցի համար
  • Միացրեք և (կամ) անջատեք ծայրամասային ենթահամակարգերը. Օգտակար է այն ժամանակ, երբ ցանկանում եք նվազեցնել միկրոկառավարիչի էներգիայի սպառումը կամ միացնել որոշակի գործառույթներ:
  • Գրված է C ++ - ով ՝ բազմակի օգտագործման օբյեկտներով:

Այս հրահանգը կանցնի avrsh- ի տեղադրման, օգտագործման և հարմարեցման միջոցով:

Քայլ 1: Այն, ինչ ձեզ հարկավոր կլինի

Այն, ինչ ձեզ պետք կգա
Այն, ինչ ձեզ պետք կգա

Այս հրահանգը շատ բան չի պահանջում, բացի այն, որ դուք ՝

  • Ունեցեք Arduino կամ ATmega328P: Այլ AVR- երը կարող են աշխատել, բայց գուցե ձեզ անհրաժեշտ լինի փոփոխել ծածկագիրը ՝ ձեր MCU- ին հատուկ բոլոր գրանցամատյանները նշելու համար: Անունները պետք է համապատասխանեն միայն այն բանին, ինչ նշված է ձեր MCU- ին հատուկ վերնագրի ֆայլում: Ռեեստրի անուններից շատերը նույնն են AVR- ների միջև, այնպես որ ձեր վազքը կարող է տարբեր լինել տեղափոխելիս:
  • Ձեր Arduino/AVR- ի սերիական USART- ին միանալու միջոց ունեցեք: Համակարգն ամենալայն փորձարկվել է AVR տերմինալով ՝ Windows հավելվածով, որը սերիական կապ է հաստատում ձեր USB կամ COM պորտի միջոցով: Աշխատում է Arduinos- ի հետ ՝ օգտագործելով USB կապը և ցանկացած AVR ՝ օգտագործելով Moderndevice.com- ի USB-BUB- ը: Այլ տերմինալային տարբերակները ներառում են ՝ tyեփամածիկ, minicom (Linux և FreeBSD), էկրան (Linux/FreeBSD), Hyperterminal, Teraterm: Ես գտել եմ, որ ծեփամածիկն ու տերաթերմը միացման ժամանակ մի փոքր աղբ են ուղարկում, որպեսզի ձեր առաջին հրամանը գայթակղվի:
  • Տեղադրեք և գործարկեք AVR Shell որոնվածը, որը կարող եք ներբեռնել այս էջերից կամ միշտ ստանալ վերջին տարբերակը BattleDroids.net կայքում:

AVR տերմինալը տեղադրելու համար պարզապես բացեք այն և գործարկեք այն: AVR Shell- ի որոնվածը տեղադրելու համար ներբեռնեք այն կամ ուղղակիորեն վերբեռնեք վեցանկյուն ֆայլը և միացրեք ձեր սերիական տերմինալը 9600 baud հասցեով, կամ ինքներդ կազմեք «make» - ով, այնուհետև «կազմեք ծրագիր» ՝ վեցանկյունը վերբեռնելու համար: Ուշադրություն դարձրեք, գուցե անհրաժեշտ լինի փոխել AVRDUDE կարգավորումները `ձեր COM պորտը արտացոլելու համար: Նշում. PROGMEM հատկանիշը կոտրված է C ++ - ի համար AVR GCC- ի ներկայիս ծրագրում, և դա հայտնի սխալ է: Եթե այն կազմեք, ակնկալեք, որ կստանաք բազմաթիվ նախազգուշացնող հաղորդագրություններ, որոնք կասեն «նախազգուշացում. Միայն սկզբնավորված փոփոխականները կարող են տեղադրվել ծրագրի հիշողության տարածքում»: Տեսնելուց զայրացնող լինելուց բացի, այս նախազգուշացումն անվնաս է: Քանի որ ներդրված հարթակում C ++ - ը AVR GCC առաջնահերթությունների ցանկում բարձր չէ, անհայտ է, թե երբ դա կլուծվի: Եթե դուք ստուգեք ծածկագիրը, կտեսնեք, թե որտեղ եմ ես աշխատել ՝ այս նախազգուշացումը նվազեցնելու համար ՝ իմ սեփական հատկանիշների հայտարարությունները գործադրելով: Բավականին պարզ: Ներբեռնեք և տեղադրեք այն, ինչ ձեզ կարող է անհրաժեշտ լինել, այնուհետև էջը շրջելու և եկեք ճեղքենք:

Քայլ 2. Գրանցամատյաններ կարդալ և գրել

Կարդալու և գրելու մատյաններ
Կարդալու և գրելու մատյաններ

AVR Shell- ը գրվել է հիմնականում որոշ սենսորների հասանելիության համար, որոնք ես միացրել էի իմ AVR- ին: Այն սկսվեց պարզ LED- ով, այնուհետև տեղափոխվեց լույսի տվիչներ, ջերմաստիճանի տվիչներ և վերջապես երկու ուլտրաձայնային փոխարկիչ: avrsh- ը կարող է սահմանել այս տվիչների թվային բաղադրիչները `դրանք վերահսկող գրանցամատյաններին գրելով: Գործարկելիս AVR գրանցամատյանները շահագործել Ձեր Arduino- ում բոլոր հայտնի գրանցիչների ցուցակը ստանալու համար մուտքագրեք.

տպագիր մատյաններ և դուք կստանաք այսպիսի տեսք ունեցող տպագիր

Ես գիտեմ հետևյալ գրանցամատյանների մասին.

TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK PINB EECR Pinc EEDR PIND Sreg EEARL GPIOR0 EEARH GPIOR1 GTCCR GPIOR2 TCCR0A TCCR0B TCNT0 OCR0A OCR0B SPCR SPDR ACSR SMCR MCUSR MCUCR SPMCSR WDTCSR CLKPR PRR OSCCAL PCICR EICRA PCMSK0 PCMSK1 TIMSK0 TIMSK1 TIMSK2 ADCL ADCH ADCSRA ADCSRB ADMUX DIDR0 DIDR1 TCCR1A TCCR1B TCCR1C TCNT1L TCNT1H ICR1L ICR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B Հայկական ՍՍՀ TWBR TWSR twar TWDR TWCR TWAMR UCSR0A UCSR0B UCSR0C UBRR0L UBRR0H UDR0 PORTB արմատ @ ATmega328p> Տեսնելու համար, թե ինչպես են առանձին բիթերը դրված ցանկացած գրանցամատյանում, օգտագործեք cat կամ echo հրամանը

կատու %GPIOR0 Այստեղ ես խնդրում եմ հրամանատար թարգմանչին ցուցադրել կամ արձագանքել Ընդհանուր նպատակի թիվ 0 մուտքի/ելքի գրանցամատյանի բովանդակությանը: Գրանցման անվան դիմաց նշեք տոկոսային նշանը (%): Դա ձեզ անհրաժեշտ է ՝ պատյանին նշելու համար, որ սա գրանցամատյանը նույնականացնող վերապահված հիմնաբառ է: Էխո հրամանի տիպիկ ելքն ունի այս տեսքը

GPIOR0 (0x0) սահմանվել է [00000000] Ելքը ցույց է տալիս գրանցամատյանի անունը, գրանցամատյանում հայտնաբերված տասնվեցական արժեքը և գրանցիչի երկուական ներկայացումը (յուրաքանչյուր բիթը ցույց է տալիս 1 կամ 0): Registerանկացած գրանցամատյանում որոշակի բիթ տեղադրելու համար օգտագործեք «index of» օպերատորը : Օրինակ, ենթադրենք, ես ուզում եմ, որ 3 -րդ բիթը լինի 1 -ին

%GPIOR0 [3] = 1 և պատյանը ձեզ պատասխան կտա ՝ նշելով դրա գործողությունը և արդյունքը

GPIOR0 (0x0) սահմանել [00000000] (0x8) սահմանել [00001000] Մի մոռացեք տոկոսի նշանը, որպեսզի տեղեկացնեք, որ ռեգիստրով աշխատում եք: Նաև նշեք, որ 3-րդ բիթը սահմանելով, դա 4 բիթ է, քանի որ մեր AVR- ն օգտագործում է զրոյական ինդեքս: Այլ կերպ ասած, հաշվելով մինչև 3 -րդ բիթը դուք հաշվում եք 0, 1, 2, 3, որը 4 -րդ տեղն է, բայց 3 -րդ բիթը: Դուք կարող եք մի փոքր մաքրել նույն ձևով ՝ մի փոքր զրոյի սահմանելով: Նման բիթեր սահմանելով ՝ կարող եք փոխել ձեր AVR- ի աշխատանքը թռիչքի ժամանակ: Օրինակ ՝ փոխելով OTC1A- ում հայտնաբերված CTC ժամաչափի համընկման արժեքը: Այն նաև թույլ է տալիս դիտել որոշակի պարամետրեր, որոնք դուք պետք է ծրագրված կերպով ստուգեք ձեր ծածկագրում, օրինակ ՝ UBBR արժեքը ձեր բաուդ փոխարժեքի համար: DDRn, PORTn և PINn- ի հետ աշխատելը Մուտքի/ելքի կապերը նույնպես նշանակված են գրանցամատյաններին և կարող են ճշգրիտ նույն կերպ սահմանվել, սակայն այս տիպի գրանցամատյանների հետ աշխատելու համար ստեղծվել է հատուկ շարահյուսություն: Կոդում կա նորմալ գործընթաց, ասենք, LED- ի կամ այլ սարքի միացման համար, որը պահանջում է թվային բարձր կամ ցածր: Այն պահանջում է Տվյալների ուղղությունների գրանցամատյան `նշելու համար, որ քորոցը ելքի համար է, այնուհետև որոշակի բիթին 1 կամ 0 գրել ճիշտ պորտում: Ենթադրելով, որ մենք ունենք LED միացված թվային PIN 13 (PB5) - ին և ցանկանում ենք այն միացնել, ահա թե ինչպես դա անել, երբ ձեր AVR- ն աշխատում է

սահմանել քորոց pb5 ելք գրել գինին pb5 բարձր Ելքը, բացի այն, որ կարող եք տեսնել ձեր LED- ի միացումը, նման կլինի այս տեսքին

root@ATmega328p> սահմանել pin pb5 արտադրանքը «Արմատ@ATmega328p>» - ը պատյան հուշումն է, որը ցույց է տալիս, որ պատրաստ է ընդունել հրամաններ ձեզանից: LED- ն անջատելու համար պարզապես ցածր գրեք քորոցին: Եթե ցանկանում եք կարդալ թվային մուտքագրումը քորոցից, օգտագործեք կարդալու հրամանը: Օգտագործելով մեր վերը նշված օրինակը

root@ATmega328p> կարդալ pb5 pin- ը ՝ pb5- ը ԲԱՐՁՐ է Այլապես, պարզապես արձագանքեք քորոցների գրանցամատյանը, որը վերահսկում է այդ կապի պորտը: Օրինակ, եթե մենք ունենք թվային կապի 7 և 8 (PD7 և PD8) միացված անջատիչներ, կարող եք հրաման ուղարկել

արձագանք %PIND իսկ պատյանը կցուցադրի այդ գրանցամատյանի բովանդակությունը ՝ ցույց տալով ձեզ միացված սարքերի բոլոր մուտքային/ելքային վիճակները և անջատիչի վիճակը միացված է կամ անջատված:

Քայլ 3: Ապահովիչներ կարդալ և գրել

Կարդալու և գրելու ապահովիչներ
Կարդալու և գրելու ապահովիչներ

Ապահովիչներ գրանցամատյանների հատուկ տեսակներ են: Նրանք վերահսկում են ամեն ինչ ՝ ձեր միկրոկառավարիչի ժամացույցի արագությունից մինչև այն ծրագրավորման մեթոդները, որոնք հասանելի են EEPROM գրելու համար: Երբեմն ձեզ հարկավոր կլինի փոխել այս կարգավորումները, հատկապես, եթե ստեղծում եք առանձին AVR համակարգ: Ես վստահ չեմ, որ դուք պետք է փոխեք ձեր ապահովիչների կարգավորումները Arduino- ում: Carefulգույշ եղեք ապահովիչների հետ; դուք կարող եք կողպել ինքներդ ձեզ, եթե դրանք սխալ եք դնում: Նախորդ հրահանգում ես ցույց տվեցի, թե ինչպես կարող եք կարդալ և տեղադրել ձեր ապահովիչները `օգտագործելով ձեր ծրագրավորողը և avrdude- ն: Այստեղ ես ձեզ ցույց կտամ, թե ինչպես կարդալ ձեր ապահովիչները գործարկման ժամանակ, որպեսզի տեսնեք, թե իրականում ինչպես է դրանք տեղադրել MCU- ն: Նկատի ունեցեք, որ սա ոչ թե կազմման ժամանակի պարամետրն է, որը դուք ստանում եք սահմանումներից, այլ իրական ապահովիչներ, քանի որ MCU- ն դրանք կարդում է գործարկման ժամանակ: ATmega328P տվյալների թերթի աղյուսակ 27-9-ից (տվյալների գրքույկ, ավելի շատ նման) ապահովիչների ցածր բայթերի բիթերը հետևյալն են.

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Հետաքրքիր է նշել, որ ապահովիչների դեպքում 0 -ը նշանակում է ծրագրավորված, իսկ 1 -ը նշանակում է, որ տվյալ բիթը չծրագրավորված է: Ինչ-որ չափով հակաինտուիտիվ է, բայց իմանալուց հետո դու դա գիտես:

  • CKDIV8- ը սահմանում է, որ ձեր պրոցեսորի ժամացույցը բաժանվի 8 -ի: ATmega328P- ը գալիս է գործարանից, որը ծրագրված է օգտագործել իր ներքին տատանումները 8 ՄՀց հաճախականությամբ, CKDIV8- ով ծրագրավորված (այսինքն `0), ինչը ձեզ տալիս է վերջնական F_CPU կամ CPU 1 ՄՀց հաճախականություն: Arduino- ում դա փոխվում է, քանի որ դրանք կազմաձևված են 16 ՄՀց հաճախականությամբ արտաքին տատանում օգտագործելու համար:
  • CKOUT- ը, երբ ծրագրավորվի, ձեր CPU- ի ժամացույցը դուրս կբերի PB0- ով, որը թվային PIN 8 -ն է Arduinos- ում:
  • SUT [1..0] - ը սահմանում է ձեր AVR- ի գործարկման ժամանակը:
  • CKSEL [3..0] - ը սահմանում է ժամացույցի աղբյուրը, օրինակ ՝ ներքին RC տատանողը, արտաքին տատանողը և այլն:

Երբ դուք կարդում եք ձեր ապահովիչները, այն կվերադարձվի ձեզ վեցանկյուն: Սա այն ձևաչափն է, որն անհրաժեշտ է, եթե ցանկանում եք ապահովիչներ գրել avrdude- ի միջոցով: Իմ arduino- ում ահա թե ինչ եմ ստանում, երբ կարդում եմ ապահովիչների ստորին բայթը.

root@ATmega328p> կարդալ lfuse Ստորին ապահովիչ ՝ 0xffԱյսպիսով, բոլոր բիթերը սահմանվում են 1. Ես նույն ընթացակարգն եմ արել Arduino- ի կլոնի վրա և ստացել նույն արժեքը: Ստուգելով իմ առանձին AVR համակարգերից մեկը ՝ ես ստացա 0xDA, որն այն արժեքն է, որը ես որոշ ժամանակ առաջ սահմանել էի չիպը կազմաձևելիս: Նույն ընթացակարգը օգտագործվում է High Fuse Byte- ի, Extended Fuse Byte- ի և Lock ապահովիչների ստուգման համար: Ifշգրտման և ստորագրության ապահովիչների բայթերը կոդի մեջ անջատված են #if 0 նախամշակող հրահանգով, որը կարող եք փոխել, եթե ձեզ փչացած զգաք:

Քայլ 4: Այլ հրամաններ

Այլ հրամաններ
Այլ հրամաններ

Կան մի քանի այլ հրամաններ, որոնք նախնական հրամանի թարգմանիչը հասկանում է, որ կարող եք օգտակար համարել: Դուք կարող եք տեսնել կատարված և ապագա թողարկման բոլոր հրամանները ՝ թողարկելով օգնության կամ ընտրացանկի հուշումը: Ես դրանք արագ կներկայացնեմ այստեղ, քանի որ դրանք հիմնականում ինքնաբացատրվող են: CPU ockամացույցի հաճախականության պարամետրեր Դուք կարող եք պարզել, թե ինչ է կազմաձևված ձեր որոնվածը որպես պրոցեսորի ժամացույցի կարգավորումներ օգտագործելու համար fcpu հրամանով.

root@ATmega328p> fcpuCPU Հաճախականությունը ՝ 16000000Դա 16 միլիոն է կամ 16 միլիոն հերց, ավելի հայտնի է որպես 16 ՄՀց: Դուք կարող եք դա փոխել թռիչքի ժամանակ, ինչ -ինչ պատճառներով, ժամացույցի հրամանով: Այս հրամանը վերցնում է մեկ փաստարկ. Նախնական սակարկիչը, որը պետք է օգտագործվի ժամացույցի արագությունը բաժանելիս: Theամացույցի հրամանը հասկանում է այս նախնական չափիչ արժեքները.

  • ckdiv2
  • ckdiv4
  • ckdiv8
  • ckdiv16
  • ckdiv32
  • ckdiv64
  • ckdiv128
  • ckdiv256

Օգտագործելով հրամանը.

ժամացույց ckdiv2 երբ ձեր պրոցեսորի արագությունը 16 ՄՀց է, կհանգեցնի ձեր ժամացույցի արագության փոփոխմանը մինչև 8 ՄՀց: Ckdiv64- ի նախնական չափիչ սարքի օգտագործումը ՝ 16 ՄՀց սկզբնական ժամաչափով, կհանգեցնի 250 ԿՀց ժամաչափի վերջնական արագության: Ինչու՞ երկրի վրա կցանկանայիք ձեր MCU- ն դանդաղեցնել: Դե, մեկի համար, ժամացույցի ավելի ցածր արագությունը սպառում է ավելի քիչ էներգիա, և եթե ձեր MCU- ն մարտկոցը լիցքաթափվի նախագծի պարիսպում, հնարավոր է, որ այն առավելագույն արագությամբ աշխատելու կարիք չունենա, և, հետևաբար, կարող է իջեցնել արագությունը և նվազեցնել էներգիայի սպառումը:, բարձրացնելով մարտկոցի կյանքը: Բացի այդ, եթե ժամացույցը օգտագործում եք մեկ այլ MCU- ի հետ ժամանակային որևէ հարցի համար, ասենք, ծրագրային UART կամ նման բան իրականացնելու համար, գուցե ցանկանաք այն դնել որոշակի արժեքի վրա, որը հեշտ է ստանալ հաճելի նույնիսկ բաուդ արագություն: սխալի ավելի ցածր տոկոսադրույքներ: Ipայրամասային ենթահամակարգերի միացում և անջատում Միևնույն նշանի հետ, ինչ նախկինում նշված էներգիայի սպառումը նվազեցնելու համար, գուցե ցանկանաք էլ ավելի նվազեցնել էներգիան ՝ անջատելով որոշ չօգտագործվող ինքնաթիռի ծայրամասային սարքերը: Հրամանի թարգմանիչն ու պատյանը կարող են ներկայումս միացնել և անջատել հետևյալ ծայրամասային սարքերը.

  • Անալոգային-թվային փոխարկիչ (ADC): Այս ծայրամասային սարքը օգտագործվում է այն ժամանակ, երբ ունեք անալոգային տվիչ, որը տրամադրում է տվյալներ (օրինակ ՝ ջերմաստիճան, լույս, արագացում և այլն) և անհրաժեշտ է այն թվային արժեքի փոխարկել:
  • Սերիալ ծայրամասային միջերես (SPI): SPI ավտոբուսը օգտագործվում է այլ SPI- ով միացված սարքերի հետ հաղորդակցվելու համար, ինչպիսիք են արտաքին հիշողությունները, LED վարորդները, արտաքին ADC սարքերը և այլն: եթե ծրագրավորում եք ISP- ի միջոցով:
  • Երկալար ինտերֆեյս: Որոշ արտաքին սարքեր շփման համար օգտագործում են I2C ավտոբուսը, չնայած դրանք արագորեն փոխարինվում են SPI- ով միացված սարքերով, քանի որ SPI- ն ավելի մեծ թողունակություն ունի:
  • USART. Սա ձեր սերիական ինտերֆեյսն է: Դուք հավանաբար չեք ուզում անջատել սա, եթե սերիական միացման միջոցով միացված եք AVR- ին: Այնուամենայնիվ, ես սա ավելացրի այստեղ ՝ որպես կմախք այն սարքերին տեղափոխելու համար, որոնք ունեն բազմաթիվ USART- ներ, ինչպիսիք են ATmega162- ը կամ ATmega644P- ը:
  • բոլորը Այս փաստարկը powerup կամ powerdown հրամանով միացնում է նշված բոլոր ծայրամասային սարքերը կամ անջատում դրանք բոլորը մեկ հրամանով: Կրկին, իմաստուն օգտագործեք այս հրամանը:

root@ATmega328p> powerdown twi Powerdown of twi complete.root@ATmega328p> powerup twi Powerup of twi ամբողջական:

Timամաչափերի գործարկման և դադարեցման պատյանն ունի ներկառուցված 16-բիթ ժամաչափ, որը հասանելի է օգտագործման համար: Startամաչափը սկսում եք ժմչփի հրամանով.

ժամաչափի մեկնարկըև կանգնեցնել ժմչփը կանգառում փաստարկով

ժամաչափի կանգառԱյս ժամաչափը չի հակասի ներքին USART ժամաչափին: Տեսեք USART ժմչփի կատարման մանրամասների ծածկագիրը, եթե ձեզ հետաքրքրում է նման տհաճ մանրամասնությունը

root@ATmega328p> ժմչփի մեկնարկը Սկսեց timer.root@ATmega328p> ժմչփի կանգառը Անցած ժամանակը ՝ ~ 157 վայրկյան Նույնականացում Շենքը կարող է 8 նիշանոց գաղտնաբառ պահել EEPROM- ում: Գաղտնաբառի այս մեխանիզմը ստեղծվել է telnet- ի մուտքի հնարավորություններին աջակցելու համար, սակայն կարող է ընդլայնվել ՝ այլ իրեր պաշտպանելու համար: Օրինակ, դուք կարող եք պահանջել որոշակի հրամաններ, ինչպիսիք են գրանցամատյանների արժեքների փոփոխումը, նույնականացման մեխանիզմի միջոցով: Տեղադրեք գաղտնաբառը գաղտնաբառի հրամանով

root@ATmega328p> passwd blah Գրեց արմատային գաղտնաբառը EEPROM- ինԹույլատրել գաղտնաբառի դեմ (կամ պահանջել ծրագրային թույլտվություն ծածկագրի միջոցով) `հեղինակային հրամանով: Նկատի ունեցեք, որ եթե դուք փորձում եք փոխել արմատային գաղտնաբառը, և եթե արդեն կա արմատային գաղտնաբառ, ապա պետք է ինքներդ ձեզ թույլատրեք հին գաղտնաբառի դեմ ՝ նախքան այն նոր գաղտնաբառ փոխելու թույլտվությունը:

root@ATmega328p> passwd blinky Դուք պետք է առաջին հերթին ինքներդ ձեզ լիազորեք:Իհարկե, պետք է բեռնել avrsh.eep ֆայլը, եթե ջնջեք որոնվածը, որպեսզի ձեր հին արժեքներն ու փոփոխականները վերականգնվեն: Makefile- ը ձեզ համար կստեղծի EEPROM ֆայլ: Փոփոխականներ Կեղևը հասկանում է օգտագործողի կողմից սահմանված փոփոխականների հասկացությունը: Կոդը սահմանափակում է սա մինչև 20, բայց եթե ցանկանում եք, կարող եք փոխել այն ՝ փոխելով script.h- ում սահմանվող MAX_VARIABLES- ը: Դուք կարող եք պահպանել ցանկացած 16-բիթանոց արժեք (այսինքն ՝ ցանկացած թիվ մինչև 65, 536) մի փոփոխականի մեջ, որը հետագայում հետ կանչվի: Շարահյուսությունը նման է գրանցամատյաններին, բացառությամբ, որ դոլարի նշանը ($) օգտագործվում է պատյանում փոփոխականներ նշելու համար: Թվարկեք ձեր բոլոր փոփոխականները print variables հրամանով

տպել փոփոխականներ Օգտվողի կողմից սահմանված փոփոխականներ. Ինդեքսի անուն -> Արժեք (01). $ ԱՆՎԱՐ $ -> 0 (02): $ ԱՆՎԱՐ $ -> 0 (03): $ ԱՆՎԱՐ $ -> 0 (04): $ ԱՆՎԱՐ $ -> 0 (05): $ FREE $ -> 0 (06): $ FREE $ -> 0 (07): $ FREE $ -> 0 (08): $ FREE $ -> 0 (09): $ FREE $ -> 0 (10): $ ԱՆՎԱՐ $ -> 0 (11): $ ԱՆՎԱՐ $ -> 0 (12): $ ԱՆՎԱՐ $ -> 0 (13): $ ԱՆՎԱՐ $ -> 0 (14): $ ԱՆՎԱՐ $ -> 0 (15): $ ԱՆՎԱՐ $ -> 0 (16): $ ԱՆՎԱՐ $ -> 0 (17): $ ԱՆՎԱՐ $ -> 0 (18): $ ԱՆՎԱՐ $ -> 0 (19): $ ԱՆՎԱՐ $ -> 0 (20). $ ԱՆՎԱՐ $ -> 0 Ամբողջական:Սահմանել փոփոխական

$ newvar = 25 $ timeout = 23245Ստացեք տվյալ փոփոխականի արժեքը

root@ATmega328p> արձագանք $ newvar $ newvar 25Դուք կարող եք տեսնել, թե ինչ փոփոխականներ եք դուք այժմ հաստատել տպման հրահանգով, որը դուք արդեն գիտեք

Օգտվողի կողմից սահմանված փոփոխականներ. Ինդեքսի անուն -> Արժեք (01): newvar -> 25 (02): timeout -> 23245 (03): $ ԱՆՎԱՐ $ -> 0 (04): $ ԱՆՎԱՐ $ -> 0 (05): $ FREE $ -> 0 (06): $ FREE $ -> 0 (07): $ FREE $ -> 0 (08): $ FREE $ -> 0 (09): $ FREE $ -> 0 (10): $ FREE $ -> 0 (11): $ FREE $ -> 0 (12): $ FREE $ -> 0 (13): $ FREE $ -> 0 (14): $ FREE $ -> 0 (15): $ FREE $ -> 0 (16): $ FREE $ -> 0 (17): $ FREE $ -> 0 (18): $ FREE $ -> 0 (19): $ FREE $ -> 0 (20): $ ԱՆՎԱՐ $ -> 0 Ամբողջական:$ ԱՆՎԱՐ $ անունը պարզապես նշում է, որ այդ փոփոխականի գտնվելու վայրը անվճար է և դեռ փոփոխականի անուն չի տրվել:

Քայլ 5: Shell- ի հարմարեցում

Shell- ի անհատականացում
Shell- ի անհատականացում

Եթե ցանկանում եք, դուք ազատ եք կոտրել ծածկագիրը և այն հարմարեցնել ձեր սեփական կարիքներին: Եթե ես իմանայի, որ ես կթողարկեի այս ծածկագիրը, ես առանձին հրամանատար թարգմանչի դաս և հրամանատարական կառուցվածք կկազմեի և պարզապես կկրկնեի գործառույթի ցուցիչի այս կանչով: Դա կնվազեցնի ծածկագրի քանակը, բայց մինչ այն կանգնած է, կեղևը վերլուծում է հրամանի տողը և կանչում է համապատասխան պատյան մեթոդը: Ձեր անհատական պատվերներն ավելացնելու համար կատարեք հետևյալը. վերլուծել հրամանի տողը և առանձին տալ հրամանը և ցանկացած փաստարկ: Փաստարկները փոխանցվում են որպես ցուցիչներ դեպի ցուցիչներ կամ ցուցիչների զանգված, այնուամենայնիվ, երբ ցանկանում եք աշխատել դրանց հետ: Սա հայտնաբերված է shell.cpp- ում: Բացեք shell.cpp- ը և գտեք AVRShell դասի ExecCmd մեթոդը: Կարող եք ցանկություն ավելացնել ծրագրի հիշողության մեջ: Եթե դա անում եք, ավելացրեք progmem.h և progmem.cpp հրամանը: Դուք կարող եք հրամանը ավելացնել հիշողության ծրագրին անմիջապես PSTR () մակրոյի միջոցով, բայց դուք կստեղծեք մեկ այլ նախազգուշացում ավելի վաղ նշված տիպի վերաբերյալ: Կրկին, սա C ++ - ի հետ աշխատող հայտնի սխալ է, բայց դուք կարող եք այն շրջանցել ՝ հրամանը ուղղակիորեն ավելացնելով ծրագրում:* ֆայլերում, ինչպես ես արել եմ: Եթե դեմ չեք SRAM- ի օգտագործման ավելացմանը, կարող եք ավելացնել հրամանը, ինչպես ես պատկերազարդել եմ «ժամացույց» հրամանով: Ասացեք, որ ցանկանում եք ավելացնել նոր հրաման, որը կոչվում է «newcmd»: Գնացեք AVRShell:: ExecCmd և գտեք հարմար վայր հետևյալ ծածկագիրը տեղադրելու համար.

այլապես, եթե (! strcmp (c, "newcmd")) cmdNewCmd (args);Սա կավելացնի ձեր հրամանը և կկոչի cmdNewCmd մեթոդը, որը դուք կգրեք հաջորդ քայլին: 2. Գրեք ձեր պատվերի հրամանի կոդը Նույն ֆայլում ավելացրեք ձեր պատվերի հրամանի կոդը: Սա մեթոդի սահմանումն է: Դուք դեռ կցանկանաք ավելացնել հայտարարագիրը shell.h- ին: Պարզապես կցեք այն մյուս հրամաններին: Նախորդ օրինակում ծածկագիրը կարող է այսպիսի տեսք ունենալ

voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR («Ձեր հրամանը ՝ %s / r / n», args [0]); WriteRAM (buff);}Այստեղ մի քանի բան կա: Նախ, «buff»-ը 40 նիշ զանգվածի բուֆեր է, որը տրամադրված է ձեր օգտագործման ծածկագրում: Մենք օգտագործում ենք sprintf ծրագրի հիշողության տարբերակը, քանի որ այն փոխանցում ենք PSTR: Եթե ցանկանում եք, կարող եք օգտագործել սովորական տարբերակը, բայց համոզվեք, որ ձևը PSTR- ով չեք փոխանցում: Բացի այդ, փաստարկները գտնվում են args զանգվածում: Եթե մուտքագրեք «newcmd arg1 arg2», ապա կարող եք հասնել այս փաստարկներին args [0] և args [1] ենթագրերով: Դուք կարող եք փոխանցել առավելագույնը MAX_ARGS արգումենտ, ինչպես սահմանված է ծածկագրում: Վերամշակելիս կարող եք ազատորեն փոխել այդ արժեքը, եթե ձեզ հարկավոր է միանգամից ավելի շատ փաստարկներ փոխանցել: WriteLine- ը և WriteRAM- ը գլոբալ գործառույթներ են, որոնք վերադարձնում են UART- ի համանուն մեթոդները: Այս գործառույթի 2 -րդ փաստարկը անուղղակի է: Եթե ոչինչ չանցնեք, ապա հրամանի տողը կգրվի դրանից հետո: Եթե որպես երկրորդ արգումենտ 0 -ն ընդունեք, հուշումը չի գրվի: Սա օգտակար է, երբ ցանկանում եք մի քանի առանձին տող գրել ելքի վրա, մինչև հրամանի տողն օգտագործողին վերադարձվի: 3. Հրահանգը թող կատարի հրամանի կոդը Դուք արդեն ասել եք, որ պատյան կատարողը պետք է գործի cmdNewCmd մեթոդը, երբ նոր հրաման եք կարգավորում, բայց ավելացրեք այն shell.h ֆայլին, որպեսզի այն հասկանալի լինի պատյան օբյեկտի կողմից: Պարզապես ավելացրեք այն վերջին հրամանի տակ կամ առաջին հրամանի դիմաց, կամ այնտեղ որևէ այլ տեղ: Եվ վերջ: Վերամշակեք և ներբեռնեք որոնվածը ձեր Arduino- ում, և ձեր նոր հրամանը հասանելի է պատյանից ՝ հուշման դեպքում:

Քայլ 6: Ամփոփում

Դուք պետք է իմանաք, թե ինչպես տեղադրել և միանալ ձեր AVR/Arduino- ին և ստանալ ուղիղ հուշում ձեր գործող միկրոկոնտրոլերի վրա: Դուք գիտեք մի քանի հրամաններ, որոնք կհանեն MCU- ի գործարկման տվյալները կամ արժեքներ կդնեն MCU- ում: Ձեզ նաև ցույց է տրվել, թե ինչպես ավելացնել ձեր անհատականացված ծածկագիրը ՝ ձեր սեփական յուրահատուկ հրամանները ստեղծելու համար ՝ ձեր կարիքների համար այն հետագայում հարմարեցնելու համար: Դուք նույնիսկ կարող եք կոտրել հրամանի թարգմանիչը, որպեսզի այն պարունակի միայն ձեր անհատական պատվերները, եթե դա համապատասխանում է ձեր կարիքներին: Հուսով եմ, որ ձեզ դուր է եկել այս ուսանելի դասը, և որ AVR Shell- ը կարող է օգտակար լինել ձեզ համար ՝ որպես իրական ժամանակի հրամանի թարգմանիչ կամ որպես ուսուցման գործընթաց ՝ ձեր սեփականը կյանքի կոչելու համար: Ինչպես միշտ, ես անհամբերությամբ սպասում եմ որևէ մեկնաբանության կամ առաջարկի, թե ինչպես կարելի է բարելավել այս հրահանգը: funվարճացեք ձեր AVR- ով:

Խորհուրդ ենք տալիս: