I2C ավտոբուս ATtiny- ի և ATmega- ի համար. 8 քայլ
I2C ավտոբուս ATtiny- ի և ATmega- ի համար. 8 քայլ
Anonim

Ես սիրում եմ Atmel AVR միկրոկոնտրոլերները: Այս հրահանգում նկարագրված Ghetto Development System- ի ստեղծումից ի վեր, ես զվարճալի ավարտ չեմ ունեցել AVR ATtiny2313 և մասնավորապես ATmega168 փորձարկումների ժամանակ: Ես նույնիսկ այնքան հեռու գնացի, որ անջատիչներ որպես մուտքեր օգտագործելու վերաբերյալ հրահանգ գրեցի, և ընդլայնեցի Ghetto Development System- ի հայեցակարգը CPLD- ներին: Վերջերս կատարված նախագծի ընթացքում ինձ անհրաժեշտ էին մի քանի անջատիչներ `կառավարման արժեքներ սահմանելու համար: AVR- ները չունեին բավարար I/O կապում, այնպես որ ես ստիպված էի ինչ -որ բան մտածել: Ես կարող էի փորձել ստեղնաշարով և դիսփլեյով մուտքի բարդ համակարգ, բայց ATtiny2313- ը ռեսուրսներ չէր ունենա: Բարեբախտաբար, Atmel- ը այս խնդրի շուրջ միջոց է գտել `ներառելով ինտերֆեյս, որը կարող է կապել լրացուցիչ չիպերի (օրինակ` հիշողության կամ մուտքի/ելքի նավահանգիստների) պարզ երկալար ինտերֆեյսով: Rightիշտ է, օգտագործելով AVR- ի ընդամենը երկու մուտքի/ելքային կապ, մենք կարող ենք մուտք գործել բազմաթիվ լրացուցիչ մուտքի/ելքային կապեր, ինչպես նաև այլ ռեսուրսներ: Այս երկու մետաղալար ինտերֆեյսը պաշտոնապես հայտնի է որպես Ինտեգրված շղթայի ավտոբուս, կամ պարզապես I2C ավտոբուս և ստեղծվել է NXP- ի կողմից, երբ այն դեռ Philips կիսահաղորդիչներ էր: Եթե կարդում եք այս Instructable- ը, ապա հավանաբար լսել եք I2C ավտոբուսի մասին և գուցե նույնիսկ օգտագործել եք այն PIC- ի կամ այլ միկրոկոնտրոլերի վրա: Թեև հայեցակարգային առումով շատ պարզ է և աջակցվում է AVR- ների ապարատային ռեսուրսներով, ծրագրային ապահովման վարորդները դեռ անհրաժեշտ են I2C ավտոբուսից օգտվելու համար: Atmel- ը տրամադրում է Դիմումի գրառումներ (տե՛ս սույն Հրահանգի հետագայում ռեսուրսները), սակայն դրանք թերի են և այլ AVR սարքի հետ շփվելուց բացի որևէ օրինակ չեն ցուցադրում: Այս Հրահանգի նպատակը չէ որևէ մեկին սովորեցնել, թե ինչպես ստեղծել I2C վարորդներ AVR- ներ: Ավելի շուտ, ես ATmy2313 և ATmega168 սարքերի համար կտրամադրեմ Atmel վարորդների ընդլայնված տարբերակները, կբացատրեմ այն պահանջներն ու սահմանափակումները, որոնք կիրառվում են դրանք օգտագործելիս և ձեզ ցույց կտամ I2C սարքերի աշխատանքային օրինակներ: Այս Instructable- ի միջոցով աշխատելուց հետո դուք կկարողանաք հաջողությամբ օգտագործել I2C ավտոբուսը ձեր AVR նախագծերում: Ակնհայտ է, որ դուք կարող եք անտեսել վարորդներին կամ փոքր կամ MEGA- ի համար, եթե ձեզ հետաքրքրում է դրանցից միայն մեկը: Նրանց համար, ովքեր հետաքրքրված են ավելին իմանալու I2C ավտոբուսի մասին, ես կտրամադրեմ համապատասխան նյութի հղումներ:

Քայլ 1. Ինչի՞ց է այս ամենը I2C- ի պարագաներ:

I2C ավտոբուսը պարզ, երկալար կապ է, որը կարող է միացնել բազմաթիվ սարքեր միմյանց և թույլ տալ նրանց փոխանակել տվյալներ: Իր ամենապարզ ձևով կա մեկ հիմնական սարք, որը հաղորդակցվում է բազմաթիվ ստրուկ սարքերի հետ: Բոլոր սարքերը միացված են I2C ավտոբուսի երկու լարերին զուգահեռ: Երկու լարերը հայտնի են որպես SCL և SDA: SCL- ը ժամացույցի գիծ է և վերահսկվում է հիմնական սարքի կողմից: SDA- ն երկկողմանի տվյալների գիծ է: Տվյալները փոխանցելու համար վարպետը ուղարկում է ստրուկի հասցե ՝ մեկ բիթ կարդալ/գրելու դրոշի հետ միասին: Եթե ցանկանում եք գրել, վարպետը կշարունակի տվյալներ ուղարկել հասցեագրված ստրուկին: Եթե պահանջվում է ընթերցում, ստրուկը կպատասխանի տվյալներով: Գործարքները համակարգելու համար SCL և SDA տողերը շահարկվում են վարպետի և ստրուկի կողմից ՝ ազդանշան տալով մի քանի պայմանների: Դրանք ներառում են START, STOP, ACK (ճանաչել) և NAK (չընդունել): Այս պայմանների մանրամասները վարում են վարորդները: Ձեր մեջ իսկական գեյերը կարող են սովորել բոլոր մանրամասները սույն Հրահանգի վերջում տրված հղումներում: Էլեկտրական պահանջները բավականին պարզ են: Վարպետը և ստրուկները պետք է օգտագործեն նույն մակարդակը Vcc- ի համար, հիմքերը պետք է միացված լինեն, և SCL և SDA գծերը պետք է քաշվեն մինչև Vcc: Ձգվող ռեզիստորների արժեքը ճշգրիտ որոշվում է ավտոբուսի ընդհանուր հզորության վրա հիմնված հաշվարկով, բայց գործնականում կարող է լինել գրեթե ցանկացած արժեք 1.8K- ից մինչև 10K: Ես սկսում եմ 5.1K- ով և օգտագործում եմ ավելի ցածր արժեքներ, մինչև այն աշխատի: Սովորաբար դա խնդիր չէ, եթե սարքերի միջև շատ սարքեր կամ երկար մետաղալարեր չկան: I2C ավտոբուսի տվյալների անվանական արագությունը 100 Կբիթ/վրկ է: Հնարավոր են նաև 400 Կբիթ/վայրկյան, 1 Մբիթ/վայրկյան և ավելի բարձր դրույքաչափեր, սակայն սույն Հրահանգի վարորդները չեն ապահովում դրանք: Բոլոր I2C սարքերը կաշխատեն 100 Կբիթ/վրկ: ATtiny2313- ը և ATmega168- ը յուրաքանչյուրը տարբեր կերպ են իրականացնում I2C ավտոբուսը: ATtiny2313- ն օգտագործում է Universal Serial Interface (USI) սարքավորում, որը կարող է օգտագործվել նաև SPI ավտոբուսի համար: ATmega168- ը սարքավորում է հատկացրել I2C ավտոբուսի համար, որը հայտնի է որպես երկու լարային միջերես (TWI): Վարորդները գրվելուց հետո այս տարբերությունները հիմնականում թափանցիկ են օգտագործողի համար: Significantրագրային ապահովման մեջ էական տարբերություն կա. ATmega168 I2C վարորդն անջատված է, իսկ ATtiny2313- ի դեպքում `ոչ: Սա նշանակում է, որ ATmega168 ծրագիրը պետք չէ սպասել I2C տվյալների փոխանցումների իրականացմանը, այլ միայն պետք է սպասել ՝ նախքան մեկ այլ փոխանցում նախաձեռնելը, կամ մինչև տվյալները կհասնեն ընթերցված գործողությունից: Օրինակները և քննարկումները, որոնք պետք է հետևել, պետք է հստակեցնեն: I2C հասցեները 7 բիթ են, ուստի մինչև 127 սարք կարող է լինել ավտոբուսում, եթե յուրաքանչյուրն ունի յուրահատուկ հասցե: Ինչպես ցույց է տրված նկարում, այս 7 բիթանոց հասցեն տեղափոխվում է մեկ բիթ ձախ և ամենաքիչ նշանակալի բիթը օգտագործվում է հասցեում սարքի ընթերցման կամ գրման նշման համար: Այսպիսով, ստրուկի ամբողջական հասցեն 8 բիթ բայթ է: Փաստացի հասցեն մասամբ որոշվում է սարքի ներքին մասում և չի կարող փոխվել (4 առավել նշանակալի բիթ), և մասամբ որոշվում է բիտերով, որոնք կարող են կապված լինել սարքի կապումներին (3 նվազագույն նշանակալի բիթ), որոնք կարող են բարձր կամ ցածր կապվել կոնկրետ հասցե: Շփոթեցնող է հնչում, բայց օրինակով դա պարզ կդառնա: PCA8574A տվյալների թերթիկը ցույց է տալիս, որ I2C հասցեի չորս ամենանշանակալից բիթերը միշտ կլինեն 0111. Հաջորդ երեք բիթերը որոշվում են AD0, AD1 և AD2 կապում տեղադրված պարամետրերով: Այս կապումները կարող են կապված լինել գետնին կամ դրական լարման մատակարարմանը (5 վոլտ) `համապատասխանաբար 0 կամ 1: Այսպիսով, հնարավոր հասցեների տիրույթը 38 -ից 3F տասնվեցական է, ինչպես ցույց է տրված PCA8574 տվյալների թերթի մյուս նկարում: Այսպիսով, փոխելով հասցեի բիթի կարգավորումները, I2C ավտոբուսում միաժամանակ կարող է լինել մինչև 8 PCA8574A: Յուրաքանչյուրը կպատասխանի միայն իր հատուկ ստրուկի հասցեին: Եթե նույնիսկ ավելի շատ I/O նավահանգիստներ են անհրաժեշտ, PCA8574- ը կարող է օգտագործվել: PCA8574- ի և PCA8574A- ի միջև միակ տարբերությունն այն է, որ PCA8574- ի I2C ստրուկի հասցեների տիրույթը 20 -ից 27 տասնվեցական է: Տվյալ սարքի հասցեի որոշումը կարող է շփոթեցնել, քանի որ որոշ տվյալների թերթեր ընթերցման/գրելու բիթը համարում են մաս հասցեն: Ուշադիր կարդացեք տվյալների թերթիկը և հիշեք, որ ստրուկի հասցեն կլինի 7 բիթ: Կարդալու/գրելու բիթը պետք է վերաբերվի առանձին: Կրկին, օրինակը կօգնի: 24C16 EEPROM- ի տվյալների թերթիկը, որով մենք փորձարկելու ենք, ասում է, որ ստրուկի հասցեի առաջին (ամենանշանակալից) չորս բիթերը 1010 -ն են: Հաջորդ երեք բիթերը կարող են որոշվել A0, A1 և A2- ով; սակայն նշեք, որ տվյալների թերթիկը ներառում է նաև 24C01- ից 24C08- ը, որոնք ավելի փոքր չափի EEPROM- ներ են: Տվյալների թերթիկի նկարը ցույց է տալիս, որ այս հասցեի բիթերի պարամետրերն անտեսվում են չափերի մեծացման հետ և ամբողջությամբ անտեսվում են 24C16- ի համար: Այսինքն, վերջին երեք բիթերը նշանակություն չունեն, և 24C16- ն իսկապես օգտագործում է I2C ստրուկի բոլոր հասցեները 50 -ից մինչև 57 տասնվեցական: Ստրուկ հասցեների շրջանակը փաստացի կանդրադառնա 24C16- ի շրջանակներում տարբեր հատվածների: Առաջին 256 բայթերը գտնվում են 50 ժամ հասցեում, հաջորդ 256 -ը ՝ 51 ժամ, և այսպես շարունակ մինչև վերջին 256 -ը ՝ 57 ժ, ընդհանուր 2K բայթ: Քանի որ PCF8570 RAM- ի հասցեն, որի հետ մենք նույնպես փորձարկում ենք, այս տիրույթում է, 24C16- ը և PCF8570- ը չեն կարող օգտագործվել միասին:

Քայլ 2: Պատվիրեք որոշ I2C սարքեր

Այժմ, երբ դուք մի փոքր գիտեք I2C ավտոբուսի մասին և ցանկանում եք այն օգտագործել, ինչու՞ չպատվիրել որոշ I2C սարքեր փորձարկել այժմ, որպեսզի նրանք կարողանան ձեզ մոտ լինել, երբ դուք պատրաստում եք ծրագրակազմը: Համապատասխան սարքերը ներառում են I/ O Interface Expander (իմ սիրածը), Static Ram և EEPROM: Շատ ավելին կան, բայց դրանք հիանալի սկիզբ են: AVR պրոցեսորները, որոնք մենք կօգտագործենք, ATtiny2313 և Atmega168 են (օգտագործվում են Arduino- ում): Եթե դուք նորեկ եք դրանցից, ապա նայեք այս հիանալի հրահանգին ՝ դրանց մասին սովորելու և ձեր գետտոյի զարգացման համակարգը կառուցելու համար: Սույն Instructable- ի ATmega168- ի սխեման ցույց է տալիս, թե ինչպես կարելի է կիրառել Ghetto Development System- ը այս պրոցեսորի համար: Parallelուգահեռ նավահանգստի մալուխը նույնն է, ինչ ATtiny2313- ի համար: (Ես չեմ փորձել Ghetto Development System- ի USB տարբերակը, ուստի վստահ չեմ, թե ինչպես է դրան հասանելի I2C ավտոբուսը: Նույնը Arduino- ի համար): Ահա Digikey- ի մասերի համարները: EXPANDER 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: IC EEPROM SERIAL 16K CAT24C16LI-G-ND

Քայլ 3: I2C վարորդներ

Ահա I2C ավտոբուսի վարորդի գործառույթների նկարագրությունները: Դրանք մշակվել են ՝ սկսնակների համար Atmel Apps Notes- ի միջոցով: Ես չէի կարող դա անել առանց նրանց, որպես հիմք կառուցելու համար: Մշակումը կատարվել է WinAVR- ի և gcc C կոմպիլյատորի միջոցով:. Ամացույցի արագության սահմանափակումները նկարագրված են ստորև ՝ յուրաքանչյուր պրոցեսորի համար: Քանի որ ես ի վիճակի չեմ փորձարկել պրոցեսորի համի / ժամացույցի արագության հնարավոր բոլոր համակցությունները, ես պարզապես կառչեմ այն ամենից, ինչ իրականում կարող եմ ստուգել և կփորձեմ նշել սահմանափակումներն ու սահմանափակումները: Ահա վարորդի գործառույթները և ինչպես օգտագործել դրանք: Խնդրում ենք նայել օրինակներին ՝ ավելի մանրամասն և ամբողջական ծրագրերում օգտագործվող գործառույթները տեսնելու համար: ATtiny2313- ի համար. Ժամացույցի պահանջ. Վարորդները նախատեսված են ATtiny2313- ի համար 1 ՄՀց հաճախականությամբ (կանխադրված արագությամբ): Եթե ցանկանում եք աշխատել այլ տեմպերով, ապա դուք պետք է կարգավորեք կայունները վարորդների մեջ: Եթե դա անելու համար օգնության կարիք ունեք, ուղարկեք ինձ էլ. Կարող եք նաև որոշ ակնարկներ ստանալ Atmel հավելվածների նշումներից ՝ Resources Step- ի հղումներում: USI_TWI_Master_Initialise () Այս գործառույթը I2C ռեժիմի աշխատանքի համար նախաստորագրում է USI ապարատը: Onceանգահարեք այն մեկ անգամ ծրագրի սկզբում: Այն անվավեր է վերադառնում և փաստարկներ չկան: Քանի որ այս գործառույթը վերադարձնում է միայն սխալի կոդը, ես օգտագործում եմ TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) ֆունկցիան ՝ սխալի LED լուսավորելու համար: Սխալի կոդերը սահմանվում են USI_TWI_Master.h- ում: Ահա թե ինչպես կարելի է այն անվանել. Այն օգտագործվում է նաև մի քանի բայթ գրելու համար: Այս գործառույթն օգտագործելու 6 քայլ կա. անստորագիր char messageBuf (MESSAGEBUF_SIZE); 2) Տեղադրեք Slave հասցեն որպես առաջին բայթ բուֆերում: Տեղափոխեք այն մի քիչ ձախ և ԿԱՄ ՝ կարդալու/գրելու բիթում: Ուշադրություն դարձրեք, որ կարդալու/գրելու բիթը կարդալու համար կլինի 1, իսկ գրելու համար `0: Այս օրինակը կարդալու համար է: messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (TRԻՇՏ << TWI_READ_BIT); 3) Երբ գրում եք, բայթը գրելու համար տեղադրեք բայֆերի հաջորդ վայրում: 4) Callանգահարեք USI_TWI_Start_Read_Write գործառույթը ՝ հաղորդագրության բուֆերով և հաղորդագրության չափով որպես արգումենտներ: temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) վերադարձված արժեքը (այս դեպքում ջերմաստիճանը) կարող է ստուգվել `արդյոք սխալ է տեղի ունեցել: Եթե այո, ապա այն վարվում է այնպես, ինչպես քննարկվեց վերևում: 6) Եթե Read- ը պահանջվում էր, ապա բայտի ընթերցումը կլինի երկրորդ տեղում բուֆերում: Եթե մի քանի բայթ պետք է գրվի (օրինակ ՝ հիշողության սարքի վրա), ապա այս նույն ռեժիմը կարող է օգտագործվել: Բուֆերի տեղադրումը և ռեժիմը կանչելը փոքր -ինչ տարբերվում են: Բուֆերի երկրորդ բայթը կլինի սկզբնական հիշողության հասցեն, որին պետք է գրել: Գրվելիք տվյալները կլինեն հաջորդ բայթերում: Հաղորդագրության չափը կլինի այն չափը, որը կներառի բոլոր վավեր տվյալները: Այսպիսով, եթե պետք է գրվի 6 բայթ, ապա հաղորդագրության չափը կլինի 8 (ստրուկի հասցե + հիշողության հասցե + տվյալների 6 բայթ): USI_TWI_Start_Random_Read () Այս գործառույթը օգտագործվում է I2C սարքից մի քանի բայթ կարդալու համար, մի տեսակ հիշողություն: Այս ռեժիմի օգտագործումը շատ նման է նախորդ առօրյային ՝ երկու բացառությամբ: Կարդալու/գրելու բիտի կարգավորումը նշանակություն չունի: Այս ռեժիմին կանչելը միշտ կառաջացնի Read գործողություն: Հաղորդագրության չափը պետք է լինի 2 գումարած կարդալու բայթերի քանակը: Եթե սխալներ տեղի չեն ունեցել, տվյալները կլինեն երկրորդ վայրում սկսվող բուֆերում: ATmega168: ockամացույցի պահանջը. վարորդները նախատեսված են ATMega168- ի համար 4 ՄՀց հաճախականությամբ: Օրինակի կոդը ցույց է տալիս, թե ինչպես կարելի է կարգավորել ժամացույցի այս արագությունը: Եթե ցանկանում եք աշխատել այլ տեմպերով, ապա դուք պետք է կարգավորեք կայունները վարորդների մեջ: Եթե անհրաժեշտ է դա անել, ինձ էլ. Onceանգահարեք այն մեկ անգամ ծրագրի սկզբում: Այն անվավեր է վերադառնում և փաստարկներ չկան: Անպայման միացրեք ընդհատումները ՝ նախաստորագրելուց հետո զանգահարելով swi (): TWI_Get_State_Info () Այս գործառույթը վերադարձնում է I2C սխալի մասին տեղեկությունները և օգտագործվում է, եթե I2C գործարքի ընթացքում սխալ է տեղի ունեցել: Քանի որ այս գործառույթը վերադարձնում է միայն սխալի կոդը, ես օգտագործում եմ TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) ֆունկցիան ՝ սխալի LED լուսավորելու համար: Սխալի կոդերը սահմանվում են TWI_Master.h- ում, սակայն փոփոխված են սխալի LED ազդանշանի համար: Մանրամասների համար տե՛ս օրինակի կոդը: Ահա թե ինչպես կարելի է այն անվանել. երկու գործառույթ նույնն են, ինչ վերը նկարագրված համապատասխան գործառույթները, բայց մի քանի բացառություններով: Նրանք չեն վերադարձնում սխալի որևէ արժեք: Տվյալների ընթերցումը չի փոխանցվում բուֆերի մեջ: Դա կանենք հաջորդ նկարագրված գործառույթով: TWI_Start_Random_Read զանգահարելիս հաղորդագրության չափը պետք է լինի պահանջվող տվյալների բայթերի գումարած մեկ գումարած ոչ թե երկու: ATmega168- ի I2C վարորդը ընդհատվում է: Այսինքն, I2C գործարքները սկսվում են, այնուհետև կատարվում են ինքնուրույն, մինչ հիմնական ռեժիմը շարունակում է գործել: Երբ հիմնական ռեժիմը ցանկանում է տվյալներ, որոնք սկսվել է I2C գործարքից, այն պետք է ստուգի ՝ արդյոք տվյալները հասանելի են: Նույն իրավիճակն է սխալների ստուգման դեպքում: Հիմնական առօրյան պետք է համոզված լինի, որ I2C գործարքն ավարտված է ՝ սխալները ստուգելուց առաջ: Այս նպատակների համար օգտագործվում են հաջորդ երկու գործառույթները: Օրինակ ծրագրերը ցույց են տալիս, թե ինչպես օգտագործել դա: TWI_Read_Data_From_Buffer () Callանգահարեք այս գործառույթը ՝ I2C վարորդի ստացման բուֆերից տվյալները փոխանցելու հաղորդագրության բուֆերին: Այս գործառույթը կապահովի, որ տվյալները փոխանցելուց առաջ I2C գործարքն ավարտված լինի: Մինչ այս ֆունկցիան մի արժեք է վերադարձնում, ես համարում եմ, որ սխալի բիթը ուղղակիորեն ստուգելը ավելի հուսալի է: Ահա թե ինչպես կարելի է այն անվանել: Հաղորդագրության չափը պետք է լինի մեկով ավելի մեծ, քան ցանկալի տվյալների բիթերի քանակը: Տվյալները կլինեն messageBuf- ում ՝ սկսած երկրորդ վայրից: temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

Քայլ 4: Եկեք կառուցենք:

Սկսեք ներբեռնելով I2C Schematics.zip ֆայլը: Հնարավոր է, որ ցանկանաք ստեղծել I2C թղթապանակ ձեր աշխատանքային տարածքում `սխեմաներն ու օրինակելի ծրագրի ֆայլերը պահելու համար: Բացեք սխեմաները այս գրացուցակում: Դուք կգտնեք մի թղթապանակ, որը կոչվում է I2C Schematics: Բացեք փոքրիկ I2C.pdf անունով ֆայլը: Այս սխեմատիկ պատկերը ցույց է տալիս ATtiny2313 գետտոյի զարգացման համակարգը և PCA8574A I/O նավահանգստի ընդլայնիչը (դրա շուրջը գտնվում է մեծ գծանշված տուփը): Port Expander- ի սխեման կառուցված է հացահատիկի վրա: Նայեք լուսանկարներին ՝ տեսնելու, թե ինչ տեսք ունեն այս սխեմաները: Նրանք իսկապես բավականին պարզ են: Սխեմատիկայի ATtiny2313 հատվածը հենց Գետտոյի զարգացման համակարգն է `երեք լուսավորիչով (LED1, 2 և 3, գումարած R4, 5 և 6) և դրան միացված մի կոճակ (S1), գումարած մեկ լրացուցիչ մանրամասներ: Այդ դետալը թռիչքների (JP4, 5 և 6) ավելացումն է, որը կարելի է հեռացնել ՝ թույլ տալով միացնել I2C ավտոբուսի SCL և SDA գծերը: Թռիչքները ծրագրավորման համար պետք է տեղում լինեն, այնուհետև հանվեն, որպեսզի SCL- ն և SDA- ն միացվեն: Լուսանկարներում պատկերված են թռչկոտողները տեղում և հեռացված: Այս թռիչքների տեղադրումը ձերն է, դուք պարզապես պետք է դրանք տեղադրեք ձեր Ghetto զարգացման համակարգի վրա, եթե ցանկանում եք օգտագործել I2C ավտոբուսը: I2C ավտոբուսը պետք է անջատվի, և թռիչքները տեղադրվեն ծրագրավորման համար: Նկատի ունեցեք, որ I2C ավտոբուսի համար ձեզ իսկապես պետք է մտահոգել JP4- ը և JP6- ը: Տեղադրեք JP5, եթե կարծում եք, որ երբևէ կցանկանաք օգտագործել SPI ավտոբուսը: PCA8574A I/O Port Expander- ի տախտակ տեղադրելը շատ պարզ է: Ապահովեք Vcc (+5 վոլտ) և Gnd (հող) միացումները և միացրեք AD0, 1 և 2 -ը գետնին (I2C ստրուկի հասցեն դարձնում է 38 վեցանկյուն): Այնուհետև միացրեք 4 թարթիչ և 4 DIP անջատիչ: (Եթե դուք չունեք DIP անջատիչներ, կարող եք պարզապես օգտագործել լարերը: Կապեք գետնին կամ համապատասխանաբար միացրեք կամ անջատեք ազդանշանը): Վերջապես, SDA- ից և SCL- ից միացրեք ձգվող դիմադրիչները (R11 և 12) Vcc- ին: Սրանք ցուցադրվում են որպես 3.3K, բայց 1.8K- ից մինչև 5.1K ցանկացած արժեք պետք է աշխատի (գուցե մինչև 10K, բայց ես դա չեմ փորձել): ATtiny2313- ը ծրագրավորելուց հետո կարող եք հեռացնել թռիչքները և միացնել SDA- ն և SCL- ը փորձարկման համար: Այժմ ATmega168- ի համար: Այստեղ միակ կնճիռն այն է, որ գուցե դուք չեք կառուցել Ghetto զարգացման համակարգ այս պրոցեսորի համար: Եթե դա այդպես է, ապա իմ տրամադրած սխեմատիկան (MEGA I2C.pdf) ցույց կտա ձեզ, թե ինչպես: Սա պարզապես ATtiny2313 տարբերակի փոփոխություն է: Եթե նախապես պլանավորում եք, կարող եք համոզվել, որ ձեր ծրագրավորման մալուխը կհամապատասխանի երկու համակարգերին: Հիմնական տարբերությունը C2- ի և C3- ի ավելացումն է: Դրանք տեղադրելու համար տես նկարները, դրանք պետք է շատ մոտ լինեն չիպին; նրանցից մեկն իրականում չիպի տակ է: Դրանք օգնում են աղմուկը պահել հատկապես անալոգային թվային փոխարկիչից: Անհրաժեշտ չէ թռիչքներ տեղադրել, եթե չեք նախատեսում օգտագործել SPI ավտոբուսը, քանի որ դրանք անհրաժեշտ չեն այս չիպի վրա I2C ավտոբուսի համար: Նշենք, որ PCA8754A տախտակը անփոփոխ կլինի: Դուք պարզապես կկապեք SDA- ն և SCL- ը և կհեռանաք: Հեշտ, հա՞

Քայլ 5: Եկեք ծածկագրենք և փորձարկենք:

It'sամանակն է կառուցել վարորդներն ու օրինակելի ծրագրերը: Մենք կսկսենք ATtiny2313- ով և PCA8574A տախտակով, որը մենք նոր ենք կառուցել: Ներբեռնեք I2C.zip ֆայլը ձեր I2C աշխատանքային գրացուցակում և բացեք այն: Դուք կունենաք նոր թղթապանակ, որը կոչվում է I2C: Դրանում դուք կգտնեք USI I2C (ATtiny2313- ի համար) և TWI I2C (ATmega168- ի համար): USI I2C- ում կգտնեք I_O Port պանակը: Այդ թղթապանակը պարունակում է մեր առաջին ծրագրի ծրագրի ծածկագիրը և USI I2C վարորդները: Օգտագործելով WinAVR- ը ՝ կազմեք և բեռնեք կոդը ATtiny2313- ում: Խորը շունչ քաշեք և միացրեք հոսանքը: Ահա, թե ինչ կարելի է ակնկալել. Միացնելով, ATtiny2313- ի PD6 նավահանգստում LED 1 -ը երկու անգամ թարթում է: Ուրիշ ոչինչ տեղի չի ունենա, մինչև կոճակը սեղմելը (S1): Ամեն անգամ, երբ կոճակը սեղմվում է, անջատիչները կարդացվում են, և դրանց կարգավորումը կցուցադրվի PCA8574A- ին միացված LED- ների վրա: Փոխեք անջատիչների արժեքը, սեղմեք կոճակը, և LED- ները պետք է փոխվեն: Շարունակեք դա անել, մինչև չանցնեք այն տեսնելու հուզմունքը: Եթե (Աստված մի արա! I2C սխալները ազդանշան կլինեն LED3 (PD4) վրա թարթելով և հավանաբար նշանակում է, որ դուք պետք է ստուգեք, որ SDA- ն և SCL- ը միացված են ճիշտ կապումներին և ճիշտ են քաշված:Եթե ինչ -որ բան դեռ չի աշխատում, կարդացեք այս բաժնի մնացած մասը ՝ վրիպազերծման մասին տեղեկանալու համար: Այժմ հետ գնացեք և եկեք նայենք ծածկագրին: Բացեք ֆայլը USI_I2C_Port.c: Սա ծրագրի օրինակ է: (USI_TWI_Master.c և USI_TWI_Master.h պարունակում են վարորդներ. Դուք կարող եք անտեսել դրանք, եթե ձեզ հետաքրքիր չէ:) Օգտագործեք օրինակ ՝ ձեր սեփական I2C ծրագրերը ղեկավարելու համար: Հիմնականում ծրագիրը ցույց է տալիս, թե ինչպես սկսել և օգտագործել I2C վարորդները, ներառյալ կարգավորումը: բարձրացրեք ստրուկի հասցեն և հաղորդագրության բուֆերի մնացած մասը և դրանից դուրս բերեք տվյալները: Դուք նաև կտեսնեք, թե ինչպես եմ ես հանում կոճակը և կարգավորում while հանգույցը: Theրագրի մի քանի մանրամասներ կան, որոնք արժանի են հիշատակման: Ուշադրություն դարձրեք, որ անջատիչներից ստացված տվյալները շրջված են նախքան Port Expander- ի LED- ների վրա գրելը: Նաև նկատի ունեցեք, որ Port Expander- ի մուտքային նավահանգիստները պետք է գրվեն որպես բարձր, որպեսզի դրանք ճիշտ աշխատեն: Այդ մանրամասները նկարագրված են PCA8574A տվյալների թերթիկում: Միշտ ուշադիր կարդացեք տվյալների թերթերը: Առավել հետաքրքրական է պայմանական վրիպազերծման օգտագործումը: Fileրագրի ֆայլի սկզբին մոտ է հայտարարությունը // #define DEBUG- ը և ծածկագրով ցանված են #ifdef DEBUG- ի հայտարարությունները: Քանի դեռ DEBUG- ը սահմանված չէ (երկու շեղ գծերը դարձնում են տողը մեկնաբանություն և պահում այն սահմանումից), #ifdef- ից #endif հայտարարությունների ծածկագիրը չի կազմվի: Բայց եթե ամեն ինչ չաշխատի այնպես, ինչպես դուք էիք սպասում, վերամշակեք և վերաբեռնեք կոդը #define DEBUG- ով ՝ առանց մեկնաբանության: Դուք ավելի շատ թարթում կստանաք LED- ների վրա, որոնք կարող եք վերծանել ՝ հետևելու ձեր ծրագրի կատարմանը և կօգնեն ձեզ գտնել այն, որտեղ ամեն ինչ սխալ է: Իրականում ես խորհուրդ եմ տալիս փորձել սա պարզապես տեսնելու համար, թե ինչ է տեղի ունենում: Այն, ինչ կտեսնեք, այն է, որ LED 2 -ը (PD5- ի վրա) կթարթվի ծրագրի կատարման ընթացքի ընթացքում: Անջատիչներից կարդացած արժեքը կթարթվի LED 1 -ի (PD6) վրա, նախքան այն ցուցադրվի Port Expander LED- ների վրա: Դուք պետք է կարողանաք հետևել ծրագրին, երբ այն աշխատում է ՝ օգտագործելով այս LED- ները: Հաջորդը մենք կաշխատենք ATmega168- ի հետ. բաց թողեք այս բաժինը, եթե ձեզ հետաքրքրում է միայն ATtiny2313- ը: Դեռ ինձ հետ? Լավ Տեղափոխվեք TWI_I2C թղթապանակ, փոխեք աշխատանքային գրացուցակը IO_Port և կազմեք և բեռնեք TWI_I2C_Port.c ATmega168- ում: Անջատեք SDA և SCL գծերը ATtiny2313- ից և միացրեք դրանք ATmega168- ին: Միացրեք ուժը և հողը, և միացեք: Գործողությունը պետք է լինի նույնը: Խաղացեք մինչև հուզմունքն անհետանա, ապա եկեք նայենք ծածկագրին: Բացեք TWI_I2C_Port.c: Կոդը գրեթե նույնական է, բացառությամբ սխալների մշակման և ընդհատված վարորդների տեղավորման: Ահա տարբերությունները. Նկատի ունեցեք, որ I2C ավտոբուսը ճիշտ աշխատելու համար ժամացույցը պետք է սահմանվի 4 ՄՀց: Sei (); հայտարարությունը միացնում է ընդհատումները I2C վարորդների սկզբնականացումից հետո: Սխալները ստուգելու համար ստուգվում է որոշակի կարգավիճակի բիթ: Ընթերցման ընթացքում TWI_Read_Data_From_Buffer գործառույթը պետք է կանչվի `ընթերցված տվյալները հաղորդագրության բուֆերում փոխանցելու համար: Գրելու ընթացքում, մինչ (TWI_Transceiver_Busy ()) պետք է օգտագործվի ՝ սխալները ստուգելուց առաջ համոզված լինելու, որ փոխանցումն ավարտված է: Այս վերջին երկու գործառույթները վերը նկարագրված են վարորդների նկարագրության մեջ: Բացի այդ, ծածկագիրը գրեթե նույնն է, ինչ ATtiny2313- ի համար: DEBUG- ը նույնն է գործում նաև, եթե ցանկանում եք դրա հետ փորձարկել:

Քայլ 6: Օգտագործելով I2C հիշողություն

Այժմ, երբ մենք սովորեցինք օգտագործել I2C ավտոբուսը `I/O Port Expander կարդալու և գրելու համար, եկեք անցնենք I2C հիշողությունների օգտագործմանը` ինչպես RAM, այնպես էլ EEPROM: Հիմնական տարբերությունն այն է, որ մի քանի բայթ կարելի է կարդալ կամ գրել հիշողություններից մեկ I2C հրամանով: Այս փորձերին պատրաստվելու համար մենք պետք է փոքր -ինչ փոփոխենք սարքավորումները և մի քանի նոր սխեմաներ ստեղծենք սեղանի վրա: Պահպանեք Port Expander- ի սխեման, քանի որ այն կօգտագործենք հիշողության որոշ արժեքներ ցուցադրելու համար: Հեռացրեք DIP անջատիչներն PCA8574A- ից և այդ կապում տեղադրեք թարթիչներ: Եթե դուք չունեք բավականաչափ լուսարձակող լուսարձակներ, P4- ից P7- ով տեղադրվածները տեղափոխեք P0- ից մինչև P3: (Displayedուցադրվող արժեքները բավական փոքր են): Այժմ նայեք սխեմատիկ I2C Ram.pdf- ին և միացրեք PCF8570- ը սեղանի վրա: Նայեք նաև նկարին: Համոզվեք, որ կապում եք 7 -րդ կապը Vcc- ի հետ: SDA- ի և SCL- ի համար լարեր գործարկեք PCA8574A- ից: Լրացուցիչ քաշման դիմադրիչներ չեն պահանջվում: Եթե դուք նույնպես հետաքրքրված եք EEPROM- ով, կառուցեք այդ միացումը ՝ օգտագործելով նաև I2C EEPROM.pdf- ը 24C16- ի համար, սակայն զգուշացեք, որ օրինակը օգտագործում է ATmega168- ը: Այս սխեման իսկապես պարզ է: Ինչպես նշվեց վերևում, հասցեի բիթերը պետք է անտեսվեն: Պարզապես միացրեք ուժը և գետինը: Մի միացրեք SDA- ն և SCL- ն դեռ այն բանից հետո, երբ մենք չենք ավարտել Ram- ի հետ փորձարկումները: Մենք կսկսենք մեր հիշողության փորձերը ATtiny2313- ի հետ, որը միացված է PCA8574A Port Expander- ին և PCF8570 Ram- ին: Theրագիրը որոշ թվեր կգրի Ram- ին, այնուհետև դրանք նորից կկարդա և կցուցադրի Port Expander- ում: Փոխեք ձեր աշխատանքային գրացուցակը RAM- ով ՝ USI I2C- ի ներքո: Օգտագործեք make ֆայլը ՝ USI_I2C_RAM.c կազմելու և ներբեռնելու համար: Ուշադրություն դարձրեք, որ I2C վարորդի ֆայլերը նույնն են, ինչ մենք օգտագործել էինք ավելի վաղ: Միացրեք հոսանքը և LED 1 -ի (PD6) վրա պետք է մեկ անգամ թարթել: Տվյալները կգրվեն առաջին 4 բայթ հիշողության մեջ: Սեղմեք կոճակը, և երկու բայթ կընթերցվեն և կցուցադրվեն: Պորտ Expander- ում (P0) պետք է տեսնել մեկ LED լույս, երկու վայրկյան դադար, այնուհետև երկու LED լույս (P0 և P1): Եվս երկու վայրկյան դադար, և LED- ները պետք է անջատվեն: Կրկին սեղմեք կոճակը ՝ հաջորդականությունը նորից սկսելու համար: Վրիպազերծումը նման է վերը նկարագրված մեթոդին: Եկեք նայենք ծածկագրին: Բացեք USI_I2C_RAM.c: Այն պետք է բավականին նման լինի նախորդ կոդին: Հիմնական տարբերությունները կարդալու և գրելու հիշողության մանրամասներն են: Նայեք, թե ինչպես է հաղորդագրության բուֆերը բեռնվում նախքան զանգը, որն իրականում գրում է: Առաջին բայթը ստրուկի հասցեն է `կարդալու/գրելու բիթը համապատասխանաբար սահմանված: Բայց հաջորդ բայթը հիշողության հասցեն է, որով պետք է սկսել գրել տվյալները: Այնուհետև գալիս են տվյալների բայթերը, որոնք հաջորդաբար կբեռնվեն հիշողության մեջ ՝ սկսած մեր նշած հասցեից: Հաղորդագրության չափը մենք սահմանում ենք որպես 6: Այսպիսով, մենք սկսում ենք գրել 00 հասցեով և գրել 01, 03, 02 և 06 արժեքները հիշողության վայրերում 00 -ից 03 -ը: Հիշողությունից տվյալները հետ կարդալու համար մենք պետք է օգտագործենք USI_TWI_Start_Random_Read գործառույթը: Հաղորդագրության բուֆերը ստանում է ստրուկի հասցեն առաջին բայթում, իսկ մեկնարկային հասցեն ՝ երկրորդ բայթում: Այնուհետև կանչեք հաղորդագրության չափը կարդալու համար բայթերի գումարած գործառույթը `գումարած 2. Նշեք, որ կարդալ/գրելու բիթը նշանակություն չունի, քանի որ ընթերցումը կկատարվի անկախ նրանից: Վերադարձված տվյալները կսկսվեն հաղորդագրության բուֆերում գտնվող երկրորդ վայրում: Տվյալները կարդալուց հետո դրանք շրջված են Port Expander- ում ցուցադրվելու համար և միաժամանակ մեկ բայթ են գրում դրան արժեքների միջև դադարով: Վերջապես, Port Expander LED- ները անջատված են: Նավահանգիստի ընդլայնիչին ուղղված գրությունները նույնական են, ինչ արվել էր նախորդ օրինակներում: Funվարճության համար կարող եք մեկնաբանել վերը նշված #սահմանել DEBUG- ի հայտարարությունը և տեսնել բազմաթիվ թարթող LED- ներ: Մեկ այլ հաջող փորձից հետո հուզմունքով ողողված, եկեք շարժվենք դեպի ATmega168 և EEPROM: Փոխեք ձեր աշխատանքային գրացուցակը EEPROM- ի TWI I2C- ի ներքո: Օգտագործեք make ֆայլը ՝ TWI_I2C_EEPROM.c կազմելու և ներբեռնելու համար: Նկատի ունեցեք, որ I2C վարորդի ֆայլերը նույնն են, ինչ մենք ավելի վաղ օգտագործել էինք PCA8574A- ի համար: Testրագիրը փորձարկելու համար անջատեք ATtiny2313- ը և միացրեք ATmega168- ը: Թողեք I2C ավտոբուսը խրված Ram- ի վրա և միացեք: Արդյունքները տարբեր են, քանի որ մենք այժմ գրում և կարդում ենք ավելի շատ տվյալներ: PD7- ի LED 1 -ը պետք է թարթել սկզբնավորման ժամանակ: Կտտացրեք կոճակին, և տվյալները կվերադառնան հիշողությունից և կցուցադրվեն: PCA8574- ի LED- ները պետք է թարթեն հետևյալ հաջորդականությամբ. P1, P0 & P2, (բոլորը անջատված են), P0 & P1, P1 & P2: Վերջապես, նավահանգստի LED- ները բոլորը պետք է անջատվեն: Կրկին սեղմեք կոճակը ՝ սա կրկնելու համար: Օh, բայց սպասեք, ասում եք: Այս ծրագիրը EEPROM- ի համար չէ՞: Քանի որ մենք մուտք ենք գործում հիշողության սարք նույն I2C հասցեով, նույն ծրագիրը գործում է ինչպես Ram- ի, այնպես էլ EEPROM- ի համար: Անջատեք և SDA- ն և SCL- ը Ram- ից տեղափոխեք EEPROM և նորից գործարկեք ծրագիրը: Այն պետք է աշխատի ճիշտ նույնը: Նկատի ունեցեք, որ EEPROM- ը և Ram- ը չեն կարող միացված լինել I2C ավտոբուսին միաժամանակ, քանի որ նրանք ունեն նույն հասցեն: (Ձեզանից խելացիները կարող են մտածել ծրագրավորման հասցեի բիթերը Ram- ում փոխելու մասին, բայց դա դեռ չի աշխատի: 24C16- ն օգտագործում է հասցեների ամբողջ բլոկը, որոնք կարող են ծրագրավորվել Ram- ի համար): Լավ, եկեք նայենք այս վերջին ծրագրին. Բացեք TWI_I2C_EEPROM.c: Առաջին բանը, որ պետք է նկատել, այն է, որ ես նշել եմ, թե ինչպես պետք է անդրադառնալ ամբողջական 24C16 EEPROM- ին: Այն կարող է հասանելի լինել 256 բայթ կտորներով 8 տարբեր I2C ստրուկների հասցեներով: Տեսեք, թե ինչպես է MEMORY_ADDR- ը սահմանվում որպես սկզբնական հասցե ՝ 50 տասնվեցական; դրա համար էլ խոյը աշխատեց: Եթե ցանկանում եք մուտք գործել 24C16- ի այլ բլոկներ, ապա օգտագործեք մյուս հասցեները, ինչպես ես նշեցի: Տեսեք, թե ինչպես եմ ես ստեղծել հիշողություն գրելու համար: Սկզբում բուֆերում տեղադրվում է ընթերցման/գրելու բիթերի հավաքածուի ստրուկի հասցեն, այնուհետև 00 -ի մեկնարկային հասցեն, այնուհետև 16 բայթ տվյալներ: TWI_Start_Read_Write ֆունկցիան կոչված է տվյալները գրելու (ինչպես նախկինում) ՝ հաղորդագրության չափը սահմանելով 18. Եթե կոճակը սեղմված է, մենք օգտագործում ենք TWI_Start_Random_Read և TWI_Read_Data_From_Buffer ՝ տվյալները հետ կարդալու համար: Յուրաքանչյուր երրորդ բայթ ցուցադրվում է Port Expander LED- ների վրա: Ի վերջո, LED- ները անջատված են ՝ հաջորդ կոճակին սեղմելուն սպասելու համար: Դուք կարող եք մտածել, թե ինչու ես որոշեցի գրել 16 բայթ: Եթե ուշադիր կարդաք տվյալների թերթիկը, կտեսնեք, որ 24C16- ը գրում է, երբ ստանում է 16 բայթ, նույնիսկ եթե ավելի շատ բայթ է ուղարկվում: Այսպիսով, թվում էր, թե դա գեղեցիկ թիվ է օգտագործման համար: Եթե ընտրեք մեծացնել սա, դուք պետք է փոխեք MESSAGEBUF_SIZE- ի չափը: Դուք նաև պետք է փոխեք TWI_BUFFER_SIZE արժեքը TWI_Master.h- ում: Դա պայմանավորված է նրանով, որ վարորդը պատճենում է տվյալները հաղորդագրության բուֆերից `ընդհատման ծառայության ռեժիմի կողմից օգտագործելու համար: Շնորհավորում եմ: Այժմ դուք պատրաստ եք օգտագործել I2C ավտոբուսը ձեր սեփական նախագծերում:

Քայլ 7: Վեբ ռեսուրսներ

Ահա փորձերի համար օգտագործվող մասերի տվյալների թերթերի հղումները: Դուք, անշուշտ, պետք է դրանք ձեռք բերեք, եթե ուրիշ ոչինչ չեք ստանում: (Նրանք սիրում են քառակուսի փակագծեր օգտագործել իրենց URL- ներում, այնպես որ ես չեմ կարող դրանք ճիշտ ներառել այստեղ: Կներեք:] I2C տարածք հասնելու համար ընտրեք «Ինտերֆեյս» ապրանքների ցանկից: Դուք կկարողանաք հասնել նրանց I2C կայքին և հասանելիություն բոլոր առաջարկվող տվյալների թերթերին և ծրագրերին: I2C ավտոբուսի նկարագրությունը և տեխնիկական մանրամասները, մասնավորապես, այստեղ են: Ստացեք ATtiny2313 և ATmega168 տվյալների թերթերը (տվյալների գրքեր) Atmel- ից: Atmel հավելվածի նշումները այստեղ են: Նայեք AVR310 և AVR315: Վերցրեք նաև կոդը: Նայեք այստեղ շատ ավելի I2C իրերի համար:

Քայլ 8: Նշումներ Geeks- ի համար

Իսկական գեյի համար, ով ցանկանում է մանրամասներ իմանալ, ահա որոշ բաներ, որոնք պետք է հիշել, եթե նայեք Atmel Apps Notes- ին և վարորդի կոդին. Բացի ստրուկի հասցեից և կարդալու/գրելու բիթից, հրամանները, ռեժիմները և այլն նշված չեն և հատուկ են տվյալ սարքին: Դա շատ պարզ դարձնելու համար նշեք, որ Atmel- ի օրինակում օգտագործվող սխեման վերաբերում է միայն այդ օրինակին և բավականին ոչ ստանդարտ է: + USI- ով, ժամաչափը տրամադրվում է ծրագրային ապահովման միջոցով. TWI- ով այն տրամադրվում է Bit Rate Generator- ի կողմից: + USI մեթոդը չի օգտագործում ընդհատումներ. TWI- ն անում է: Սա որոշակի իմաստ ունի, քանի որ Մեգա ընտանիքը (օգտագործելով TWI) կարող է շատ այլ բաներ անել և չպետք է խցկվի I2C փոխանցումներով: USI- ի համար ընդհատված տարբերակն անշուշտ հնարավոր է, այն պարզապես չի կիրառվում այս Հրահանգում: + USI ապարատը օպտիմիզացված չէ I2C- ի համար և կարող է կարգավորել միայն 8 բիթ փոխանցում: Սա նշանակում է, որ իններորդ բիթը (կամ NACK կամ ACK) ուղարկելու համար պահանջվում է երկու փոխանցում: TWI սարքավորումն ինքնաբերաբար կարգավորում է դա: Սա մի փոքր ավելի է բարդացնում USI վարորդի իրականացումը: + TWI- ի սխալների հայտնաբերումը մշակվում է ապարատային համակարգչում: USI- ն պահանջում է ծրագրային ապահովման մշակում, որը ինչ -որ բան բարդացնում է: + TWI ապարատը ուղղակիորեն վերահսկում է նավահանգստի կազմաձևումը: USI ապարատը պահանջում է, որ նավահանգստի բիթերը կազմաձևվեն նախքան նավահանգստի օգտագործումը: Դուք դա կտեսնեք Master_Initialize առօրյայում USI- ի համար:-Atmel- ը պնդում է, որ հնարավոր է օգտագործել AVR նավահանգիստների քաշքշուկները I2C ավտոբուսների քաշման համար: Ես չեմ գտել այդ մոտեցումն աշխատեցնելու միջոց: Երկու արտաքին ռեզիստորների օգտագործումը կարծես բավականին պարզ սխեմա է, ուստի ես դրա վրա շատ ժամանակ չեմ ծախսել:

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