Բովանդակություն:
- Քայլ 1. Ինչպե՞ս կարող ենք ստիպել երկու միկրոկոնտրոլեր `խոսել միմյանց հետ:
- Քայլ 2. Հաղորդակցության ենթածրագրեր
- Քայլ 3: Եզրակացություն
Video: AVR Assembler ձեռնարկ 6: 3 քայլեր
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:45
Բարի գալուստ Tutorial 6:
Այսօրվա ձեռնարկը կարճ կլինի, որտեղ մենք կմշակենք մի մեթոդ ՝ մեկ atmega328p- ի և մյուսի միջև տվյալների փոխանցման համար ՝ օգտագործելով դրանք միացնող երկու նավահանգիստ: Այնուհետև մենք վերցնում ենք զառախաղ 4 -րդ ձեռնարկից և գրանցման անալիզատորը ձեռնարկ 5 -ից, դրանք միացնում ենք իրար և օգտագործում ենք մեր մեթոդը ՝ գլանափաթեթների արդյունքը փոխանցող անալիզատորին փոխանցելու համար: Այնուհետև մենք տպելու ենք գլանակը երկուական տարբերակով ՝ օգտագործելով LED- ները, որոնք մենք կառուցել ենք անալիզատորի համար ձեռնարկում 5 -ում:
Այս ձեռնարկում ձեզ հարկավոր է.
- Ձեր նախատիպերի տախտակը
- Ձեր զառախաղը ձեռնարկ 4 -ից
- Ձեր գրանցման անալիզատորը ձեռնարկ 5 -ից
- Երկու միացնող լարեր
-
Ամբողջական տվյալների թերթիկի պատճենը (2014 թ. Վերանայում).
www.atmel.com/images/Atmel-8271-8-bit-AVR-M…
-
Հրահանգների հավաքածուի ձեռնարկի պատճենը (2014 թ. Վերանայում).
www.atmel.com/images/atmel-0856-avr-instruc…
Ահա հղում իմ AVR հավաքողների ձեռնարկների ամբողջական հավաքածուին ՝
Քայլ 1. Ինչպե՞ս կարող ենք ստիպել երկու միկրոկոնտրոլեր `խոսել միմյանց հետ:
Քանի որ մենք սկսում ենք ընդլայնել մեր նախագիծը, որպեսզի մեր միակ վերջնական արտադրանքը կազմված լինի ավելի փոքր մասերի հավաքածուից, մեզ ավելի շատ կապում կպահանջվեն, քան մեկ Atmega328P- ը կարող է ապահովել: Հետևաբար, մենք պատրաստվում ենք ընդհանուր նախագծի յուրաքանչյուր հատվածը կատարել առանձին միկրոկոնտրոլերի վրա, այնուհետև նրանց հանձնարարել կիսել տվյալները իրենց միջև: Այսպիսով, խնդիրը, որը մենք պետք է լուծենք, այն է, թե ինչպես կարող ենք պարզ մեթոդով հանդես գալ, որպեսզի վերահսկիչները խոսեն միմյանց հետ և փոխանցեն տվյալներ նրանց միջև: Դե, այս վերահսկիչների մեջ մեկ բան այն է, որ նրանք յուրաքանչյուրը կատարում են վայրկյանում 16 միլիոն հրահանգ: Սա շատ ճշգրիտ ժամանակավորված է, ուստի մենք կարող ենք օգտագործել այս ժամանակը `տվյալների փոխանցման համար: Եթե մենք օգտագործում ենք միլիվայրկյան ձգձգումներ ՝ տվյալները կազմելու համար, ապա իրականում մենք չպետք է այդքան ճշգրիտ լինենք, քանի որ պրոցեսորը կատարում է 16,000 հրահանգներ մեկ միլիվայրկյանում: Այլ կերպ ասած, միլիվայրկյանը հավերժություն է պրոցեսորի համար: Այսպիսով, եկեք փորձենք այն զառախաղերով: Ես ուզում եմ զառախաղի արդյունքը փոխանցել զառախաղերի չիպից անալիզատորի չիպին: Ենթադրենք, որ դուք կանգնած էիք փողոցի մյուս կողմում, և ես ուզում էի ձեզ ազդանշան տալ զույգ զառերի իմ գլորման արդյունքին: Մի բան, որ կարող էի անել, եթե մենք երկուսս էլ ժամացույց ունենայինք, այն է, որ ես կարող էի միացնել լապտերը, այնուհետև երբ դուք պատրաստ լինեք ստանալ իմ տվյալները, դուք միացրեք ձեր լապտերը և մենք երկուսս կսկսենք մեր ժամացույցները: Հետո ես լապտերը վառ պահում եմ միլիվայրկյանների ճշգրիտ թվով, երբ զառերը գլորում են, այնուհետև անջատում: Այսպիսով, եթե ես գլորեի 12 -ը, ես իմ լույսը վառ կպահեի 12 միլիվայրկյանների ընթացքում: Այժմ վերը նշվածի խնդիրն այն է, որ ձեզ և ինձ համար ոչ մի կերպ չենք կարողանա ժամանակները ճիշտ ճշգրտել ՝ 5 միլիվայրկյանից 12 -ը տարբերելու համար: միլիվայրկյաններ Բայց ինչ վերաբերում է դրան. Ենթադրենք, մենք որոշեցինք, որ ես մեկ տարի վառած լույսս կպահեմ զառախաղի յուրաքանչյուր համարի դիմաց: Այնուհետև, եթե ես գլորեմ 12 -ը, ես լույս կփայլեմ ձեզ վրա 12 տարի, և կարծում եմ, որ դուք կհամաձայնվեք, որ հավանականություն չկա, որ դուք սխալ թույլ կտաք թիվը պարզելիս: Դուք կարող եք ընդմիջում կատարել և գնալ բեյսբոլ խաղալու, կարող եք նույնիսկ վեց ամիս խաղալու խեցգետիններ Վեգասում, քանի դեռ տարվա ընթացքում ինչ -որ պահի հայացքն ուղղել եք դեպի փողոց ՝ տեսնելու համար, որ լույսը վառված է, հաշիվը բաց չեք թողնի: Դե, դա հենց այն է, ինչ մենք անում ենք միկրոկոնտրոլերների համար: CPU- ի համար մեկ միլիվայրկյանը մեկ տարվա նման է: Այսպիսով, եթե ես ազդանշանը միացնեմ 12 միլիվայրկյան շարունակ, գրեթե ոչ մի հնարավորություն չկա, որ մյուս միկրոկառավարիչը դա շփոթեցնի 10 -ի կամ 11 -ի հետ, անկախ նրանից, թե ինչն է ընդհատում և ինչ չի պատահի այդ ընթացքում: Միկրոկոնտրոլերների համար միլիվայրկյանը հավերժություն է: Այսպիսով, ահա թե ինչ ենք անելու: Սկզբում մենք կընտրենք վերահսկիչի երկու նավահանգիստ `մեր հաղորդակցության նավահանգիստները լինելու համար: Տվյալներ ստանալու համար ես կօգտագործեմ PD6 (եթե ցանկանանք կարող ենք այն անվանել Rx) և տվյալների փոխանցման համար կընտրեմ PD7 (ցանկության դեպքում այն կարող ենք անվանել Tx): Անալիզատոր չիպը պարբերաբար ստուգելու է իր Rx քորոցը և ազդանշան տեսնելու դեպքում այն կիջնի «հաղորդակցման ենթածրագրի», այնուհետև վերադարձի ազդանշան կփոխանցի զառախաղին ՝ ասելով, որ պատրաստ է ստանալ: Նրանք երկուսն էլ կսկսեն ժամանակը և զառախաղը ազդանշան կհաղորդի (այսինքն ՝ 5 Վ) մեկ զառախաղի մեկ թվի համար միլիվայրկյանի համար: Այսպիսով, եթե գլանափաթեթը կրկնակի վեցյակ էր կամ 12, ապա զառախաղը PD7- ի վրա կդարձներ 5 Վ 12 միլիվայրկյան, այնուհետև այն նորից կդարձներ 0 Վ: Անալիզատորը յուրաքանչյուր միլիվայրկյանում ստուգելու է իր PD6 կապը ՝ ամեն անգամ հաշվելով, և երբ այն վերադառնա 0 Վ, ապա ստացված թիվը դուրս է բերում անալիզատորի էկրանին ՝ LED- ների վրա ցույց տալով երկուական երկուական: Այսպիսով, սա ծրագիրն է: Տեսնենք ՝ կարո՞ղ ենք այն իրականացնել:
Քայլ 2. Հաղորդակցության ենթածրագրեր
Առաջին բանը, որ մենք պետք է անենք, երկու կարգավորիչների միացումն է: Այսպիսով, մեկից վերցրեք մետաղալար PD6- ից և մյուս կողմից միացրեք այն PD7- ին, և հակառակը: Այնուհետև դրանք նախաստորագրեք ՝ PD7- ը երկուսի վրա դնելով OUTPUT և երկուսում PD6- ը INPUT: Ի վերջո, բոլորը սահմանեք 0 Վ: Մասնավորապես, յուրաքանչյուր միկրոկառավարիչի կոդի Init կամ Reset բաժնում ավելացրեք հետևյալը.
sbi DDRD, 7; PD7- ը սահմանվել է ելքի
cbi PortD, 7; PD7 սկզբում 0V cbi DDRD, 6; PD6- ը մուտքագրված է cbi PortD, 6; PD6 սկզբնապես 0V clr ընդհանուր; ընդհանուր զառերի վրա սկզբնապես 0
Հիմա եկեք ստեղծենք հաղորդակցության ենթածրագիրը զառախաղերի վրա: Սկզբում սահմանեք մի նոր փոփոխական, որը կոչվում է «ընդհանուր», որը կպահի զառախաղի վրա գլորված ընդհանուր թիվը և այն կսկսի զրոյի:
Այնուհետև գրեք ենթածրագիր ՝ անալիզատորի հետ շփվելու համար.
հաղորդակցվել:
cbi PortD, 7 sbi PortD, 7; Ուղարկեք պատրաստ ազդանշանի սպասում. Sbic PinD, 6; կարդալ PinD և բաց թողնել, եթե 0V rjmp սպասման ուշացում 8; համաժամացման հետաձգում (գտել են սա փորձնականորեն) ուղարկել. նվազեցնել ընդհանուր հետաձգումը 2; յուրաքանչյուր մահվան համար cpi ընդհանուր, 0; 0 այստեղ նշանակում է «ընդհանուր» թվերի ուշացումներ են ուղարկվել breq PC+2 rjmp send cbi PortD, 7; PD7- ից 0V clr ընդհանուր; ընդհանուր զառերը զրոյականացնել մինչև 0 ռետ
Անալիզատորում մենք հիմնական ռեժիմից կանչ ենք ավելացնում հաղորդակցման ենթածրագրին.
clr անալիզատոր; պատրաստվել նոր համարին
sbic PinD, 6; ստուգեք PD6- ը 5 Վ ազդանշանի համար զանգահարեք; եթե 5 Վ գնա շարժական անալիզատորին հաղորդելու համար, ընդամենը; ելք դեպի անալիզատոր ցուցադրվող rcall անալիզատոր
և այնուհետև գրեք հաղորդակցման ենթածրագիրը հետևյալ կերպ.
հաղորդակցվել:
clr ընդհանուր; վերականգնել ընդհանուրը մինչև 0 հետաձգում 10; ցատկումներից ազատվելու հետաձգում sbi PortD, 7; PB7- ը սահմանել 5V ազդանշանի պատրաստ ընդունման համար. հետաձգում 2; սպասեք հաջորդ թվին ներառյալ ընդհանուր; ընդհանուր sbic PinD- ի ավելացում, 6; եթե PD6- ը վերադառնա 0V, մենք ավարտեցինք rjmp ստանալը. հակառակ դեպքում, կրկնօրինակեք ավելի շատ տվյալների համար cbi PortD, 7; վերականգնելուց հետո վերականգնել PD7- ը
Ահա՛ Այժմ յուրաքանչյուր միկրոկառավարիչ ստեղծվել է, որպեսզի հաղորդի զառերի արդյունքը, այնուհետև ցուցադրի այն անալիզատորի վրա:
Մենք կիրականացնենք ավելի արդյունավետ հաղորդակցման ավելի ուշ եղանակ, երբ մենք պետք է փոխանցենք գրանցամատյանի բովանդակությունը վերահսկիչների միջև ՝ զառերի փոխարեն: Այդ դեպքում մենք դեռ կօգտագործենք դրանք միացնող երկու լար, բայց մենք կօգտագործենք 1, 1 ՝ «փոխանցման սկիզբ» նշանակելու համար. 0, 1 նշանակում է «1»; 1, 0 նշանակում է «0»; և վերջապես 0, 0 նշանակում է «ավարտի փոխանցում»:
Ercորավարժություն 1. Տեսեք, արդյոք կարող եք կիրառել ավելի լավ մեթոդը և օգտագործել այն ՝ զառախաղը 8 բիթանոց երկուական համար փոխանցելու համար:
Ես կցեմ մի տեսանյութ, որը ցույց է տալիս իմը շահագործման մեջ:
Քայլ 3: Եզրակացություն
Ձեր տեղեկանքի համար կցել եմ ամբողջական ծածկագիրը: Այն այնքան մաքուր և կոկիկ չէ, որքան ես կցանկանայի, բայց ես այն կմաքրեմ, քանի որ այն ընդլայնելու ենք ապագա ձեռնարկներում:
Այսուհետ ես պարզապես կցեմ ծածկագիր պարունակող ֆայլերը, այլ ոչ թե ամեն ինչ մուտքագրեմ այստեղ: Մենք պարզապես մուտքագրում ենք այն հատվածները, որոնք մեզ հետաքրքրում են քննարկել:
Սա կարճ ձեռնարկ էր, որտեղ մենք գտանք մի պարզ մեթոդ ՝ մեր անալիզատորին միկրոկոնտրոլերերին ասելու, թե ինչ արդյունք տվեց մեր զառախաղը մեր զառախաղի միկրոկոնտրոլերից ՝ ընդամենը երկու նավահանգիստ օգտագործելով:
Exորավարժություն 2. Պատրաստ ազդանշանի փոխարեն ՝ ցույց տալու համար, թե երբ է զառախաղը պատրաստ փոխանցելու, և մյուսը, երբ անալիզատորը պատրաստ է ընդունել, օգտագործեք «արտաքին ընդհատում», որը կոչվում է «Pin Change Interrupt»: Atmega328p- ի քորոցները կարող են օգտագործվել այս կերպ, այդ իսկ պատճառով նրանք ունեն pinout դիագրամում դրանց կողքին PCINT0 միջոցով PCINT23: Դուք կարող եք դա իրականացնել որպես ընդհատում նույն կերպ, ինչպես մենք արեցինք ժմչփի արտահոսքի ընդհատման դեպքում: Այս դեպքում ընդհատվող «բռնիչը» կլինի այն ենթածրագիրը, որը հաղորդակցվում է զառախաղի հետ: Այս կերպ, իրականում կարիք չկա կապի ենթածրագիրը հիմնականից կանչել. Այն կգնա ցանկացած ժամանակ, երբ այդ քորոցի վրա տեղի ունենա փոփոխություն:
Ercորավարժություն 3. Մեկ միկրոկառավարիչի միջև տվյալների հաղորդակցման և փոխանցման այլ միջոցների հավաքածու շատ ավելի լավ միջոց է `ներկառուցված 2-լարային սերիական ինտերֆեյսի օգտագործումը հենց միկրոկոնտրոլի վրա: Փորձեք կարդալ տվյալների թերթիկի 22 -րդ բաժինը և տեսեք, թե արդյոք կարող եք պարզել, թե ինչպես այն իրականացնել:
Այս ավելի պարզեցված տեխնիկան մենք կօգտագործենք ապագայում, երբ լրացուցիչ կարգավորիչներ ավելացնենք:
Այն, որ մեր անալիզատորի հետ միասին արել ենք այն, որ վերցնում ենք զառերի ընդհանուր քանակը, այնուհետև LED- ների միջոցով այն տպում ենք երկուական տարբերակով, այն չէ, ինչը կարևոր է: Փաստն այն է, որ այժմ մեր անալիզատորը «գիտի», թե ինչ է զառախաղը և կարող է համապատասխանաբար օգտագործել այն:
Հաջորդ ձեռնարկում մենք կփոխենք մեր «անալիզատորի» նպատակը, կներկայացնենք մի քանի այլ շղթայի տարրեր և ավելի հետաքրքիր կերպով կօգտագործենք զառախաղը:
Մինչև հաջորդ անգամ…
Խորհուրդ ենք տալիս:
AVR Assembler ձեռնարկ 2: 4 քայլ
AVR Assembler Tutorial 2: Այս ձեռնարկը շարունակությունն է " AVR Assembler Tutorial 1 " Եթե դուք չեք անցել ձեռնարկ 1 -ը, ապա պետք է դադարեցնեք և առաջինը դա անեք: Այս ձեռնարկում մենք կշարունակենք մեր ուսումնասիրությունը atmega328p u
AVR Assembler ձեռնարկ 1: 5 քայլ
AVR Assembler Tutorial 1. Ես որոշել եմ գրել մի շարք ձեռնարկներ, թե ինչպես գրել հավաքման լեզվի ծրագրեր Atmega328p- ի համար, որը Arduino- ում օգտագործվող միկրոկոնտրոլերն է: Եթե մարդիկ շահագրգռված մնան, ես կշարունակեմ շաբաթական մեկ անգամ դուրս հանել, մինչև որ վերջանա
AVR Assembler ձեռնարկ 9: 7 քայլեր
AVR Assembler Tutorial 9: Բարի գալուստ Tutorial 9: Այսօր մենք ցույց կտանք, թե ինչպես կառավարել ինչպես 7-հատվածանոց, այնպես էլ 4-նիշանոց ցուցադրումներ ՝ օգտագործելով մեր ATmega328P և AVR հավաքման լեզվի ծածկագիրը: Դա անելու ընթացքում մենք ստիպված կլինենք շեղումներ ձեռնարկել, թե ինչպես օգտագործել կույտը
AVR Assembler Tutorial 11: 5 Քայլեր
AVR Assembler Tutorial 11. Բարի գալուստ Tutorial 11: Այս կարճ ձեռնարկում մենք վերջապես պատրաստվում ենք կառուցել մեր վերջնական նախագծի առաջին մասը: Առաջին բանը, որ դուք պետք է անեք, գնալ այս ձեռնարկի վերջին քայլին և դիտել տեսանյութը: Հետո եկեք այստեղ: [դադար, մինչ դու
AVR Assembler ձեռնարկ 3: 9 քայլեր
AVR Assembler Tutorial 3: Բարի գալուստ թիվ 3 ձեռնարկ: Նախքան սկսելը ես ուզում եմ մի փիլիսոփայական միտք անել: Մի վախեցեք փորձարկել այն սխեմաները և ծածկագիրը, որը մենք կառուցում ենք այս ձեռնարկներում: Փոխեք լարերը շուրջը, ավելացրեք նոր բաղադրիչներ, վերցրեք բաղադրիչներ