მთავარი ქსელის აპარატურა Atmega8 მიკროკონტროლერები. Atmega8 პროგრამირება დამწყებთათვის

Atmega8 მიკროკონტროლერები. Atmega8 პროგრამირება დამწყებთათვის

LED-ის დაკავშირება I/O პორტის ხაზთან

ამ მასალის შესწავლის შემდეგ, რომელშიც ყველაფერი დეტალურად არის აღწერილი მაგალითების დიდი რაოდენობით, თქვენ შეგიძლიათ მარტივად დაეუფლოთ და დაპროგრამოთ AVR მიკროკონტროლერების შემავალი/გამომავალი პორტები.

  • ნაწილი 2. LED-ის შეერთება I/O პორტის ხაზთან
  • ნაწილი 3. ტრანზისტორის შეერთება I/O პორტის ხაზთან
ჩვენ განვიხილავთ მაგალითს მიკროკონტროლერზე Atmega8 .

ჩვენ დავწერთ პროგრამას Atmel Studio 6.0 .

ჩვენ მივბაძავთ წრეს Proteus 7 პროფესიონალი .

მიკროკონტროლერების შესწავლის პირველი მაგალითია LED-ის შეერთება და კონტროლი; ეს არის ყველაზე მარტივი და აშკარა მაგალითი. ეს მაგალითი კლასიკური გახდა მიკროკონტროლერების შესწავლაში, როგორიცაა პროგრამა "Hello World!". სხვა პროგრამირების ენების სწავლისას.
მაქსიმალური დენი, რომლის გავლაც თითოეულ I/O პორტს შეუძლია, არის 40 mA.
მაქსიმალური დენი, რომლის გადატანა შეუძლია თითოეულ I/O პორტის ხაზს, არის 20 mA.
დატვირთვის, მათ შორის LED-ის, I/O პორტის ხაზებთან დაკავშირებამდე, თქვენ უნდა იცოდეთ, რომ შეგიძლიათ დაწვათ მიკროკონტროლერი I/O პორტის ხაზის დასაშვები დატვირთვის გადამეტებით.
დენის შესაზღუდად, რომელიც მიედინება მიკროკონტროლერის I/O პორტის ხაზებში, საჭიროა გამოთვალოთ და დააკავშიროთ რეზისტორი.

ნახ.: LED pinout.

ნახ: LED ანოდის დაკავშირება მიკროკონტროლერთან.

ნახ: LED კათოდის დაკავშირება მიკროკონტროლერთან.

დენის შემზღუდველი რეზისტორის წინააღმდეგობა, რომელიც დაკავშირებულია შეყვანის/გამომავალი პორტების ხაზებთან, LED-ის შეერთებისას გამოითვლება ფორმულით:

სად:
- Vs- ელექტრომომარაგების ძაბვა;
- ვსპ- ძაბვის ვარდნა I/O პორტის ხაზზე;
- ვდ- პირდაპირი ძაბვის ვარდნა LED-ზე;
- ID- პირდაპირი დენი LED-ზე;
- კნ- LED საიმედოობის კოეფიციენტი;

მაგალითი:
- ელექტრომომარაგების ძაბვა - 5 ვ;
- პირდაპირი ძაბვის ვარდნა LED-ზე - 2B ;
10 mA (გადაღებულია მონაცემთა ფურცლიდან LED-ზე);
- LED რობოტების საიმედოობის კოეფიციენტი - 75% (გადაღებულია მონაცემთა ფურცლიდან LED-ზე);
- ძაბვის ვარდნა I/O პორტის ხაზზე - 0.5 ვ (გადაღებულია მონაცემთა ფურცლიდან მიკროკონტროლერამდე: Vol (გამომავალი დაბალი ძაბვა) – თუ დენი შემოდის და Voh (გამომავალი მაღალი ძაბვა) – თუ დენი გადის);

ამრიგად, რეზისტორის მნიშვნელობა R = 166,66 Ohm, არჩეულია უახლოესი უფრო მაღალი წინააღმდეგობის მნიშვნელობა.

თუ LED-ის წინა ძაბვა უცნობია, წინააღმდეგობა შეიძლება გამოითვალოს Ohm-ის კანონის გამოყენებით.

სად:
- - ძაბვა, რომელიც გამოიყენება მიკროსქემის მონაკვეთზე;
- მე

მაგალითი:
4.5 ვ;
- I/O პორტის ხაზის ნომინალური დენი - 20 mA.

რეზისტორის მნიშვნელობის დადგენის შემდეგ , აუცილებელია სიმძლავრის გამოთვლა , გაზომილი ვატებში, რომელიც გამოიყოფა რეზისტორში სითბოს სახით, როდესაც წრეში დენი მიედინება.

სად:
- – ძაბვა, რომელიც გამოიყენება მიკროსქემის მონაკვეთზე;
- მე- I/O პორტის ხაზის რეიტინგული დენი.

მაგალითი:
- ძაბვა, რომელიც გამოიყენება მიკროსქემის მონაკვეთზე - 4.5 ვ;
- წინა დენი LED-ზე - 20 mA.

რეზისტორისთვის გამოყოფილი სიმძლავრის გამოთვლის შემდეგ, ჩვენ ვირჩევთ რეზისტორის სიმძლავრის უახლოეს უფრო მაღალ მნიშვნელობას. თუ რეზისტორის დენის გაფრქვევა არასაკმარისია, ის შეიძლება ვერ მოხდეს.

- დაბალი სიმძლავრის LED ანოდის დაკავშირება I/O პორტის ხაზთან:

#შეიცავს // მთავარი პროგრამა int main(void) ( // შეყვანის/გამოსვლის პორტების კონფიგურაცია DDRC = 0b11111111; // C პორტის ყველა ბიტის კონფიგურაცია "გამომავალი" რეჟიმში PORTC = 0b11111111; // C პორტის ყველა ბიტის დაყენება log-ზე "1" (პორტის გამოსავალზე ძაბვა უდრის Vcc) // მარადიული მარყუჟი ხოლო (1) ( ) )

- დაბალი სიმძლავრის LED კათოდის დაკავშირება I/O პორტის ხაზთან:

// გარე ბიბლიოთეკების ჩართვა #include #შეიცავს // მთავარი პროგრამა int main(void) ( // შეყვანის/გამოსვლის პორტების კონფიგურაცია DDRC = 0b11111111; // C პორტის ყველა ბიტის კონფიგურაცია "გამომავალი" რეჟიმში PORTC = 0b00000000; // C პორტის ყველა ბიტის დაყენება log-ზე "0" (პორტის გამომავალზე ძაბვა ტოლია GND) // მარადიული მარყუჟი, ხოლო (1) ())

- დაბალი სიმძლავრის LED– ის დაკავშირება ანოდთან და კათოდთან I/O პორტის ხაზთან:

// გარე ბიბლიოთეკების ჩართვა #include #შეიცავს // მთავარი პროგრამა int main(void) ( // შეყვანის/გამოსვლის პორტების კონფიგურაცია DDRD = 0b11111111; // D პორტის ყველა ბიტის კონფიგურაცია "გამოყვანის" რეჟიმში PORTD = 0b11111111; // D პორტის ყველა ბიტის დაყენება log-ზე "1" (პორტის გამოსავალზე ძაბვა უდრის Vcc) DDRC = 0b11111111; //C პორტის ყველა ბიტის დაყენება "გამომავალი" რეჟიმში PORTC = 0b00000000; //C პორტის ყველა ბიტის დაყენება ლოგიკაზე "0" (პორტის გამომავალზე ძაბვა ტოლია GND) / / მარადიული მარყუჟი, ხოლო (1) ())

როგორც ჩანს, ეს მარტივი თემაა, მაგრამ კომენტარებში მე ვიყავი გაჟღენთილი კითხვებით, თუ როგორ უნდა დააკავშიროთ მიკროკონტროლერი. როგორ დააკავშიროთ LED, ღილაკი, დენის მასა. რა უნდა გააკეთოს AGNDან AREF. რატომ არის საჭირო? AVCCდა მსგავსი რამ. ასე რომ, რადგან არის კითხვები, ეს ნიშნავს, რომ თემა გაუგებარია და საჭიროა რაც შეიძლება ამომწურავი პასუხის გაცემა. მე აღვწერ ყველაფერს AVR კონტროლერებისთვის, მაგრამ ზოგიერთი PIC-ისთვის ყველაფერი ძალიან, ძალიან ჰგავს. იმიტომ რომ პრინციპები აქ იგივეა.

კვება
მიკროკონტროლერს მუშაობისთვის სჭირდება ენერგია – ელექტროენერგია. ამისათვის, რა თქმა უნდა, თქვენ უნდა დაიწყოთ მასზე კვება. MK მიწოდების ძაბვა Atmel AVRგანსხვავდება 1.8 ადრე 5 ვოლტი, დამოკიდებულია სერიასა და მოდელზე. ყველა AVRშეუძლია იმუშაოს 5 ვოლტიდან (თუ არის წმინდა დაბალი ძაბვის სერიები, გთხოვთ განმარტოთ კომენტარებში, რადგან მე არ მინახავს ასეთი). ასე რომ, ჩვენ ვივარაუდებთ, რომ ჩვენი კონტროლერის მიწოდების ძაბვა ყოველთვის არის 5 ვოლტი ან მეტი. მიწოდების ძაბვის პლიუსი ჩვეულებრივ აღინიშნება როგორც Vcc. ნულოვანი ტერმინალი (ისევე როგორც დედამიწა, საცხოვრებელი და რასაც ისინი ეძახიან) მითითებულია GND. თუ მაგალითად ავიღოთ კომპიუტერის კვების წყარო. მაშინ შავი მავთული არის GND (სხვათა შორის, დამიწის მავთული ტრადიციულად შავად არის შეღებილი), ხოლო წითელი არის +5, რომელიც ჩვენი იქნება. Vcc. თუ თქვენ აპირებთ მიკროკონტროლერს ბატარეებიდან ჩართვას, მაშინ ბატარეების მინუსს მივიღებთ როგორც GNDდა პლუს ამისთვის Vcc(მთავარია, რომ ბატარეებიდან მიწოდების ძაბვა იყოს მოცემული MK-სთვის მითითებულ საზღვრებში, პრობლემა მონაცემთა ცხრილშია. პარამეტრი ჩვეულებრივ იწერება პირველ გვერდზე, მახასიათებლების ზოგადი აღწერაში:

ოპერაციული ძაბვები
–1.8 – 5.5V (ATtiny2313V)
–2.7 – 5.5V (ATtiny2313)
სიჩქარის კლასები
–ATtiny2313V: 0 - 4 MHz @ 1.8 - 5.5V, 0 - 10 MHz @ 2.7 - 5.5V
–ATtiny2313: 0 – 10 MHz @ 2.7 – 5.5V, 0 – 20 MHz @ 4.5 – 5.5V

გთხოვთ გაითვალისწინოთ, რომ არსებობს სპეციალური დაბალი ძაბვის სერიები (მაგალითად, 2313V დაბალი ძაბვა), რომლებშიც მიწოდების ძაბვის ქვედა ზღვარი გაცილებით დაბალია. ასევე ღირს ყურადღება მიაქციოთ შემდეგ პუნქტს სიხშირეების შესახებ. ეს გვიჩვენებს მაქსიმალური სიხშირის დამოკიდებულებას მიწოდების ძაბვაზე. ჩანს, რომ დაბალი ძაბვის დროს შეზღუდვის სიხშირეები უფრო დაბალია. და დაბალი ძაბვის სერიები ორჯერ ნელია, ვიდრე მათი მაღალი ძაბვის კოლეგები. თუმცა ყველა პროცესორი ემორჩილება ოვერკლაკს ;))))))

სერიის კონტროლერებთან მუშაობისთვის AVRსაკმარისია მხოლოდ საკვები. ყველა შესასვლელთან Vccთქვენ უნდა გამოიყენოთ ჩვენი 5 (ან რაც გაქვთ) ვოლტი და ყველა შეყვანა GNDუნდა დარგეს მიწაზე. მიკროკონტროლერს შეიძლება ჰქონდეს მრავალი შეყვანა Vccდა ბევრი შესასვლელი GND(განსაკუთრებით თუ ის კვადრატშია TQFPსხეული. რომელსაც ყველა მხრიდან აქვს გამოკვეთილი პიტალოვო). ბევრი ქინძისთავები მზადდება არა ინსტალაციის გამარტივებისთვის, არამედ ბროლის ყველა მხრიდან ერთგვაროვანი კვების მიზნით, რათა არ გადაიტვირთოს შიდა დენის სქემები. წინააღმდეგ შემთხვევაში, წარმოიდგინეთ, რომ ელექტრომომარაგება მხოლოდ ერთ მხარეს შეაერთეთ, ხოლო ჩიპის მეორე მხარეს თითოეულ პორტის ხაზზე დაკიდეთ LED და ერთდროულად აანთეთ. შიდა თხელი ფენიანი დენის ავტობუსი, რომელიც აორთქლდა ასეთი მიმდინარე დატვირთვით, აორთქლდა და პროცესორი უცებ აიღო და, როგორც ჩანს, უმიზეზოდ, ჩლიქები ჩამოაგდო. Ისე ყველა Vcc და GND გამომავალი უნდა იყოს დაკავშირებული. შეაერთეთ ისინი შესაბამისად და ჩართეთ ისინი.

ჩნდება გარკვეული კითხვები AGNDდა AVCC-ეს არის ანალოგური საფუძველი და ელექტროენერგიის მიწოდება ანალოგურ-ციფრული გადამყვანი. ADC არის ძალიან ზუსტი ძაბვის მრიცხველი, ამიტომ მიზანშეწონილია მისი ელექტროენერგია დამატებითი ფილტრების საშუალებით, რათა ჩარევა, რომელიც არ არის იშვიათი ჩვეულებრივი ელექტრომომარაგების წრეში, არ იმოქმედოს გაზომვის ხარისხზე. ამ მიზნით, ზუსტი სქემებით, მიწა იყოფა ციფრულ და ანალოგად (ისინი უნდა იყოს დაკავშირებული მხოლოდ ერთ მომენტში) და AVCCძაბვა მიეწოდება ფილტრის ჩოკის მეშვეობით. თუ არ აპირებთ ADC- ს გამოყენებას ან არ აპირებთ ზუსტი გაზომვების გაკეთებას, მაშინ ეს საკმაოდ მისაღებია AVCCგამოიყენე იგივე 5 ვოლტი, რაც იყო Vcc, ა AGNDდარგეს იმავე ადგილზე, როგორც ყველა. მაგრამ თქვენ უნდა დააკავშიროთ ისინი!!! EMNIP AVCC-დან ასევე უზრუნველყოფს A პორტს.

გაფრთხილება!!!

როგორც ჩანს, MEGA8 ჩიპს შეცდომა აქვს ჩიპის ტოპოლოგიის დონეზე - VCC და AVCC ურთიერთდაკავშირებულია ჩიპში. მათ შორის წინააღმდეგობა არის დაახლოებით (!!!) 5 Ohms.შედარებისთვის, ATmega16-ში და ATmega168-ში Vcc-სა და AVcc-ს შორის წინააღმდეგობა არის ათობით MEGA ohms! მონაცემთა ცხრილში ჯერ არ არის ამ მხრივ მინიშნებები, მაგრამ AVRFreaks-ზე 2004 წლის ერთ-ერთ თემაში ნათქვამია, რომ ხალხი ADC-ის ციფრული ხმაურით თავს იჭერდა, მერე ატმელის მხარდაჭერას მისწერეს WTF??? მათი თქმით, ჩიპში და VCC და AVCC არის შეცდომა ბროლის შიგნით. ამ ინფორმაციის გათვალისწინებით, ვფიქრობ, რომ Mega8– სთვის AVCC– ისთვის გასროლა პრაქტიკულად აზრი არ აქვს. მაგრამ AVCC ნებისმიერ შემთხვევაში უნდა იკვებებოდეს - ვინ იცის რამდენად ძლიერია ეს შინაგანი კავშირი?

AVR მიკროკონტროლერის უმარტივესი კავშირის დიაგრამა ნაჩვენებია ქვემოთ:

როგორც ხედავთ, ჩოხის დაემატა დენის წრეში AVCC, ასევე კონდენსატორები. კარგი პრაქტიკაა ასი ნანოფარადის კერამიკული კონდენსატორის განთავსება Vccდა GNDთითოეული მიკროსქემა (და თუ მიკროსქემას აქვს მრავალი დენის შეყვანა და საფუძველი, მაშინ თითოეულ კვების წყაროსა და თითოეულ მიწას შორის) რაც შეიძლება ახლოს არის დენის გამომავალთან - ეს გაამარტივებს ელექტროგადამცემის ავტობუსში გამოწვეულ მოკლე პულსურ ხმაურს, რომელიც გამოწვეულია ციფრული სქემების მუშაობით. . 47mKF კონდენსატორი დენის წრეში გაასწორებს ძაბვის უფრო ღრმა ტალღებს. კონდენსატორი შორის AVccდა GNDდამატებით დაამშვიდებს კვებას ADC.

შესასვლელი AREFეს არის ძაბვის საცნობარო შეყვანა ADC. ზოგადად, შეგიძლიათ გამოიყენოთ ძაბვა, რომლის მიმართაც იგი გამოითვლება ADC, მაგრამ ჩვეულებრივ გამოიყენება ან შიდა 2.56 ვოლტის მითითება, ან ძაბვა AVCC, შესაბამისად AREFრეკომენდებულია კონდენსატორის ჩამოკიდება, რაც ოდნავ გააუმჯობესებს საორიენტაციო ძაბვის ხარისხს ADC(და გამომავალი მაჩვენებლების ადეკვატურობა დამოკიდებულია მხარდაჭერის ხარისხზე ADC).

წრის გადატვირთვა
რეზისტორი ჩართულია გადატვირთვა. ზოგადად -ში AVRაქვს საკუთარი შიდა გადატვირთვის წრე და სიგნალი გადატვირთვაშიგნიდან ის უკვე ამოყვანილია 100 kOhm რეზისტორით Vcc. მაგრამ! გამკაცრება იმდენად ცუდია, რომ მიკროკონტროლერი იჭერს გადატვირთვის ყოველი დაცემინებისგან. მაგალითად, ფეხის თითით შეხებისგან RST, ან თუნდაც მხოლოდ საფასურის სანაცვლოდ თითის შეხებისგან. ამიტომ ძალიან რეკომენდებულია RSTმიიყვანეთ ელექტრომომარაგებამდე 10K რეზისტორით. ნაკლები არ ღირს, რადგან... მაშინ არის შესაძლებლობა, რომ ჩართვაში მყოფმა პროგრამისტმა ვერ დაძლიოს ეს გამკაცრება და შეუძლებელი იყოს MK-ის ჩართვა მიკროსქემის შიგნით. 10 ათასი სწორია.

ასევე არსებობს გადატვირთვის სქემა:

აღსანიშნავია ის, რომ როდესაც წრე ჩართულია, კონდენსატორი იხსნება და ძაბვა არის RSTნულთან ახლოს - მიკროკონტროლერი არ იწყება, რადგან მას უწყვეტი გადატვირთვა. მაგრამ დროთა განმავლობაში, რეზისტორის საშუალებით, კონდენსატორი დაიტენება და ძაბვა იქნება RSTაღწევს log1 - MK დაიწყება. კარგად, ღილაკი საშუალებას გაძლევთ აიძულოთ გადატვირთვა საჭიროების შემთხვევაში.

დაყოვნება იქნება დაახლოებით T=R*C ამ მაგალითისთვის - დაახლოებით ერთი წამი. რატომ ეს შეფერხება? დიახ, ყოველ შემთხვევაში, ისე, რომ MK არ დაიწყება, სანამ დაფაზე არსებული ყველა მოწყობილობა იკვებება და მიაღწევს სტაბილურ მდგომარეობას. ძველ MK-ებში ( AT89S51მაგალითად) ასეთი ჯაჭვის გარეშე, რომელიც უზრუნველყოფს თავდაპირველ გადატვირთვას, MK შეიძლება საერთოდ არ დაიწყოს.

ძირითადად, in AVRდაწყების შეფერხება, საჭიროების შემთხვევაში, შეიძლება გაკეთდეს პროგრამულად - შეამცირეთ იგი ნახევარი წამით აქტიური მოქმედებების დაწყებამდე. ასე რომ, კონდერის გადაგდება შეიძლება. და ღილაკი... რაც გინდა. გჭირდებათ გარე? გადატვირთვა? შემდეგ დატოვეთ. ჩვეულებრივ ვტოვებ.

საათის წყარო
საათის გენერატორი არის მიკროკონტროლერის გული. თითოეული პულსისთვის, კონტროლერის შიგნით ხდება გარკვეული სახის ოპერაცია - მონაცემები იგზავნება რეგისტრებისა და ავტობუსების საშუალებით, პორტის ქინძისთავები იცვლება, ტაიმერები დაწკაპუნებულია. რაც უფრო სწრაფია საათის სიხშირე, მით უფრო სწრაფად ასრულებს MK თავის მოქმედებებს და მოიხმარს მეტ ენერგიას (ლოგიკური კარიბჭეების გადართვა მოითხოვს ენერგიას, რაც უფრო ხშირად გადართვავენ, მით მეტი ენერგიაა საჭირო).

იმპულსების დაყენება ხდება მიკროკონტროლერში ჩაშენებული საათის გენერატორით. თუმცა, შეიძლება არსებობდეს გარე გენერატორიც, ყველაფერი ძალიან მოქნილად არის კონფიგურირებული! სიჩქარე, რომლითაც შიდა გენერატორი იკლებს, დამოკიდებულია მიკროკონტროლერის და აღკაზმულობის პარამეტრებზე.


გენერატორი შეიძლება იყოს:

  • შიდა შიდა სამაგისტრო RC სქემით.
    ამ შემთხვევაში სამაგრი საერთოდ არ არის საჭირო! და XTAL1 და XTAL2 ქინძისთავები საერთოდ არ შეიძლება იყოს დაკავშირებული, ან მათი გამოყენება შესაძლებელია როგორც ჩვეულებრივი შეყვანის/გამოსვლის პორტები (თუ MK ამის საშუალებას იძლევა). ჩვეულებრივ, თქვენ შეგიძლიათ აირჩიოთ 4 შიდა სიხშირიდან ერთ-ერთი. ეს რეჟიმი დაყენებულია ნაგულისხმევად.
  • შიდა გარე სამაგისტრო RC სქემით.
    აქ თქვენ უნდა დააკავშიროთ კონდენსატორი და რეზისტორი მიკროკონტროლერის გარეთ. საშუალებას გაძლევთ შეცვალოთ საათის სიხშირე ფრენის დროს უბრალოდ რეზისტორის მნიშვნელობის რეგულირებით.
  • შიდა გარე სამაგისტრო კვარცით.
    გარეთ მოთავსებულია კვარცის რეზონატორი და წყვილი კონდენსატორი. თუ კვარცი არის დაბალი სიხშირის (1 MHz-მდე), მაშინ კონდენსატორები არ არის დამონტაჟებული.
  • გარე.
    სხვა მოწყობილობიდან მართკუთხა სიგნალი იგზავნება MK-ის შესასვლელში, რომელიც ადგენს საათს. ეს რეჟიმი სასარგებლოა, მაგალითად, თუ გვჭირდება რამდენიმე მიკროკონტროლერი ერთი გენერატორიდან მკაცრი სინქრონიზაციისთვის.

სხვადასხვა სქემებს განსხვავებული უპირატესობები აქვთ:
Როდესაც შიდა RC წრეჩვენ ვზოგავთ ადგილს დაფაზე, არ გვჭირდება დამატებითი ნაწილები, მაგრამ მაქსიმალურ სიხშირეს ვერ ვაღწევთ და სიხშირე ოდნავ დამოკიდებულია ტემპერატურაზე და შეიძლება მერყეობდეს.

გარე კვარცს აქვს შესანიშნავი სიზუსტე, მაგრამ ის ღირს დამატებით 15 მანეთი და საჭიროებს დამატებით ნაწილებს და, რაც ყველაზე შეურაცხმყოფელია, ხშირად ჭამს რამდენიმე I/O ფეხს. ასევე, გარე კვარცის გამოყენებით, შეგიძლიათ მიაღწიოთ მაქსიმალურ შესრულებას MK-დან. MC სიხშირე განისაზღვრება იმ სიხშირით, რომლითაც არჩეული კვარცი არის სიმკვეთრე. გარე RC წრესაშუალებას აძლევს MK ოსცილატორს იკეცოს უფრო სწრაფად, ვიდრე შიდა, ღირს კვარცზე ნაკლები, მაგრამ აქვს იგივე პრობლემები სიხშირის სტაბილურობასთან, როგორც შიდა RC წრედს.

MK-ის დაკვრის მეთოდები აღწერილია განყოფილებაში მოცემულ მონაცემთა ცხრილში სისტემის საათის და საათის პარამეტრებიდა მთლიანად განისაზღვრება კონფიგურაციით დაუკრავენ ბიტები. ამასობაში, უაღრესად გირჩევთ არ შეეხოთ დაუკრავენსანამ ზუსტად არ გაიგებ რას აკეთებ და რატომ. იმიტომ რომ რაიმეს არასწორად დაყენებით, შეგიძლიათ ძალიან სწრაფად გადააქციოთ მიკროკონტროლერი უსარგებლო სილიკონის ნაწილად, მისი გაცოცხლება ძალიან რთული იქნება (მაგრამ შესაძლებელია!)

LED-ების და ღილაკების დაკავშირება მიკროკონტროლერთან
თავისთავად, გარესამყაროსთან ურთიერთქმედების გარეშე, მიკროკონტროლერი არ არის საინტერესო - ვის აინტერესებს, რას იკავებს იგი შიგნით? მაგრამ თუ შეგიძლიათ როგორმე აჩვენოთ ეს ან გავლენა მოახდინოთ მასზე...

ამრიგად, ღილაკი და LED დაკავშირებულია შემდეგნაირად:


ღილაკისთვის, თქვენ უნდა დააკავშიროთ არჩეული I/O ფეხი ღილაკის მეშვეობით მიწასთან. გამომავალი თავად უნდა იყოს კონფიგურირებული როგორც შესასვლელი ასაწევით(DDRxy=0 PORTxy=1). შემდეგ, როდესაც ღილაკზე არ არის დაჭერილი, ასაწევი რეზისტორის მეშვეობით, იქნება მაღალი ძაბვის დონე შესასვლელში და ბიტებიდან. PINhuწაკითხვისას მისცემს 1-ს.ღილაკზე დაჭერის შემთხვევაში შემავალი ჩართული იქნება და მასზე ძაბვა ნულამდე დაეცემა, რაც ნიშნავს PINxyწაიკითხება 0. რეგისტრის ბიტებში ნულების საფუძველზე PINxჩვენ ვიცით, რომ ღილაკები დაჭერილია.

წერტილოვანი ხაზი აჩვენებს დამატებით ასაწევ რეზისტორს. იმისდა მიუხედავად, რომ აწევა შესაძლებელია AVR-ის შიგნით პორტთან დაკავშირება, ის საკმაოდ სუსტია - 100 kOhm. ეს ნიშნავს, რომ ის ადვილად შეიძლება მიმაგრდეს მიწაზე ჩარევით ან ჩარევით, რაც გამოიწვევს ცრუ სიგნალიზაციას. და ამ შიდა ასაწევ რეზისტორებს ნამდვილად მოსწონთ დაწვა ჩარევისგან. მე უკვე მაქვს ათეული მიკროკონტროლერი მოკლული PullUp რეზისტორებით. ყველაფერი მუშაობს, მაგრამ არ არის გამკაცრება - დაიწვა. გარეთ რეზისტორს კიდებ და ისე მუშაობს თითქოს არაფერი მომხდარა. ამიტომ, კრიტიკული სქემებისთვის, მე დაჟინებით გირჩევთ დაამატოთ 10 kOhm-ის გარე ამომყვანი - მაშინაც კი, თუ შიდა სქემები დაფარულია, გარე ემსახურება. სწავლის პროცესში შეგიძლიათ დაივიწყოთ ეს.

სინათლის დიოდიუკავშირდება პორტს ორი გზით. სქემის მიხედვით პორტ-ლენდან პორტის სიმძლავრე. პირველ შემთხვევაში, დიოდის გასანათებლად, თქვენ უნდა გამოიყვანოთ მაღალი დონე log1 პორტში (დაახლოებით Vcc-ის ტოლი). მეორე შემთხვევაში, დიოდის გასანათებლად, თქვენ უნდა გამოიყვანოთ log0 პორტში - დაბალი დონე (ნულის მახლობლად). ამისთვის AVRროგორც ჩანს, განსხვავება არ არის, მაგრამ მიკროკონტროლერების მრავალი ძველი სერია გაცილებით უკეთ იშლება, ვიდრე ზემოთ, ამიტომ Port-Power წრე უფრო გავრცელებულია. მე ვიყენებ ორივე სქემას PCB განლაგების მოხერხებულობის საფუძველზე. ისე, პროგრამული უზრუნველყოფის დონეზე დიდი განსხვავება არ არის.
პორტის პინი LED-თან მუშაობისთვის უნდა იყოს კონფიგურირებული გასასვლელი(DDRxy=1) და შემდეგ, PORTxy-ის მნიშვნელობიდან გამომდინარე, პინს ექნება მაღალი ან დაბალი ძაბვის დონე.

სინათლის დიოდი უნდა იყოს დაკავშირებული რეზისტორის საშუალებით. ფაქტია, რომ LED- ის პირდაპირი წინააღმდეგობა ძალიან მცირეა. და თუ არ ზღუდავთ დენს მის მეშვეობით, მაშინ ის შეიძლება უბრალოდ დაიწვას. ან, რაც უფრო სავარაუდოა, დაწვა მიკროკონტროლერის პინი, რომელსაც, სხვათა შორის, შეუძლია დახატოს დაახლოებით 20-30 mA. და ნორმალური LED-ის გასანათებლად (ჩვენ ახლა არ განვიხილავთ ყველა სახეობას, ამ მონსტრებს შეუძლიათ ამპერების ჭამა) გჭირდებათ დაახლოებით 3...15 mA.

ასე რომ, ჩვენ განვიხილავთ:

  • MK ფეხის გამოსავალზე ძაბვა არის დაახლოებით 5 ვოლტი, LED-ზე ძაბვის ვარდნა ჩვეულებრივ დაახლოებით 2,5 ვოლტია (ეს არ შეიძლება იყოს უფრო მაღალი, წინააღმდეგ შემთხვევაში დიოდი მოიხმარს საჭიროზე მეტ დენს და ახშობს, გამოყოფს ლამაზ კვამლს)
  • ამრიგად, ძაბვა, რომელიც უნდა მიიღოს შემზღუდველმა რეზისტორმა, იქნება 5-2,5 = 2,5 ვ.
  • ჩვენ გვჭირდება დენი 5 mA - LED-ის კვებას აზრი არ აქვს, ჩვენ გვჭირდება მითითება და არა განათება :)
  • R=U/I= 2.5/5E-3 = 500 Ohm. სერიებში უახლოესი არის 510 Ohms. ავიღოთ. პრინციპში, შეგიძლიათ დააყენოთ 220 Ohm-დან 680 Ohm-მდე, რაც ხელი მოგივა - ნორმალურად დაიწვება.

თუ საჭიროა მრავალი LED-ის დაკავშირება, მაშინ თითოეულ მათგანს აქვს საკუთარი რეზისტორი. რა თქმა უნდა, შეგიძლიათ იყოთ გაუმაძღარი და ყველას დააყენოთ ერთი რეზისტორი. მაგრამ აქ ეს იქნება ბუნდოვანი - მხოლოდ ერთი რეზისტორია, მაგრამ ბევრი დიოდია! შესაბამისად, რაც უფრო მეტ დიოდს გავუშვებთ, მით უფრო ნაკლებ დენს მიიღებს თითოეული - ერთი რეზისტორის დენი დაყოფილი იქნება ოთხზე. მაგრამ თქვენ არ შეგიძლიათ დადოთ უფრო პატარა რეზისტორი - იმიტომ როდესაც ერთი დიოდი აანთებს, ის მიიღებს დენის ნაწილს ოთხზე და აწებებს ფარფლებს (ან დაწვავს პორტს).

მიკროსქემის დიზაინის რამდენიმე უცნაურობა ან რამდენიმე სიტყვა ქინძისთავების დაზოგვის შესახებ

რისი შედუღება შეუძლებელია, უნდა დაპროგრამდეს. (გ) ხალხური სიბრძნე.

ხშირად ხდება, რომ კონტროლერის მეხსიერება, როგორც ჩანს, საკმარისზე მეტია ამოცანის შესასრულებლად, ხოლო შესრულება ზედმეტად მაღალია, მაგრამ არ არის საკმარისი ფეხები. ასე რომ, თქვენ უნდა დააინსტალიროთ ზედმეტი და უფრო ძვირი მიკროკონტროლერი მხოლოდ იმიტომ, რომ მას უბრალოდ მეტი ქინძისთავები აქვს. მე გაჩვენებთ რამდენიმე მაგალითს, თუ როგორ შეგიძლიათ დაზოგოთ აპარატურა პროგრამის კოდის გართულებით.

ასეთი დანაზოგის ქვაკუთხედი, როგორც წესი, არის დროთა განმავლობაში ქინძისთავის დავალებების დინამიური გამოყოფის პრინციპი. ანუ, მაგალითად, გამომავალს შეუძლია ნებისმიერ ავტობუსზე იმუშაოს და როცა ავტობუსი არ არის აქტიური, მაშინ იმავე გამომავალი საშუალებით შეგიძლიათ შეამოწმოთ ღილაკის მდგომარეობა, ან გადასცეთ რაღაც სხვა ავტობუსზე. სწრაფად (ათობით ან თუნდაც ათასობით ჯერ წამში) ორ განსხვავებულ დავალებას შორის გადართვით, შეგიძლიათ მიაღწიოთ „ერთდროული ოპერაციის“ ეფექტს.

აქ მთავარია დაიცვან ორი წესი:

  • ორი განსხვავებული აპლიკაცია არ უნდა ერეოდეს ერთმანეთს ე.ი. დროის გამიჯვნა უნდა იყოს აგებული ისე, რომ მიმდებარე ფუნქციამ არ დაამახინჯოს შესამოწმებელი ფუნქციის შედეგი.
  • არავითარ შემთხვევაში არ უნდა ეწინააღმდეგებოდეს ძაბვის დონეებს.

მაგალითს მოგიყვან:

  • ჩვენ გვაქვს ქინძისთავები, რომელზედაც ჩამოკიდებულია გარკვეული სენსორის გამოსავალი და ღილაკი. სენსორიდან გამომავალი შეიძლება იყოს 0, 1 აქტიურ რეჟიმში და Hi-Z, როდესაც ჩართვა სიგნალი არ მოდის სენსორზე.
  • ღილაკი აძლევს ხაზს მყარ 0-ს მოკლე ჩართვის საშუალებით.

როგორ უნდა იმუშაოს:
ვთქვათ, რომ უმეტეს შემთხვევაში ჩვენ გვაქვს მიკროკონტროლერის შეყვანა კონფიგურირებული Hi-Z შეყვანისთვის და ვიღებთ კითხვებს სენსორიდან, რომელზეც ასევე გამოიყენება Enable სიგნალი. როდესაც ჩვენ გვჭირდება ღილაკის გამოკითხვა, ჩვენ ვაშორებთ ჩართვას სენსორს და მისი გამოსავალი გადადის Hi-Z რეჟიმში და არ გვერევა. მიკროკონტროლერის გამომავალს ვცვლით Pull-Up რეჟიმში და ვამოწმებთ არის თუ არა შეყვანისას ნული - დაჭერილი ღილაკის სიგნალი. გადაამოწმე? ჩვენ გადავიტანთ MK შეყვანას Hi-Z შეყვანაზე და კვლავ მივმართავთ ჩართვას სენსორზე. და იმდენჯერ წამში.

აქ ორი წინააღმდეგობა გვაქვს:

  • ლოგიკური წინააღმდეგობა
    0 ხაზზე შეიძლება იყოს ორ შემთხვევაში სენსორიდან ან ღილაკიდან. მაგრამ ამ შემთხვევაში, საღი აზრისა და საჭირო ფუნქციონირების გამოყენებით, შეგვიძლია უგულებელვყოთ ლოგიკური წინააღმდეგობა.

    ჩვენ უბრალოდ გვეცოდინება, რომ ღილაკზე დაჭერით ამახინჯებს სენსორის კითხვებს, რაც ნიშნავს, რომ როდესაც სენსორი მუშაობს, ჩვენ არ ვაჭერთ ღილაკს. და ისე, რომ სენსორის წაკითხვები არ იყოს შეცდომით ღილაკზე დაჭერით, ჩვენ უბრალოდ არ ვსვამთ ღილაკს იმ მომენტში, როდესაც ველოდებით მონაცემებს სენსორისგან. რა თქმა უნდა, ეს არ დაიცავს სულელური ქმედებებისგან. მაგრამ მაგალითის გასამარტივებლად, ახლა არ გავითვალისწინებ სისულელეებს.

  • ელექტრული წინააღმდეგობა
    თუ სენსორი დააყენებს 1-ს და ჩვენ დავაჭერთ ღილაკს, მაშინ აშკარაა, რომ GND და Vcc ერთსა და იმავე მავთულში არ ჯდება და ვიღაც მოკვდება. ამ შემთხვევაში, სენსორის გამომავალი მოკვდება, რადგან ის უფრო სუსტია - სუსტი ტრანზისტორს არ აქვს საშუალება კონკურენცია გაუწიოს სპილენძის ღილაკს.

    ასეთი წინააღმდეგობა ორგანიზაციული მეთოდებით ვერ მოგვარდება – შეუძლებელია ხაზის ძაბვის თვალით დადგენა და გადაწყვეტა დააჭირო ღილაკს თუ არა. და მხოლოდ იმის გამოცნობა შეიძლება, სად არის ახლა პროგრამა. ამიტომ სქემატურად მოვაგვარებთ.
    ღილაკების წრეს დავუმატოთ რეზისტორი, რეზისტორი პატარაა, გამოითვლება ხაზის ყველაზე სუსტი ტერმინალის მაქსიმალური დენის საფუძველზე.

    თუ, მაგალითად, სენსორის გამომავალს შეუძლია უზრუნველყოს არაუმეტეს 10 mA, მაშინ ჩვენ გვჭირდება ისეთი რეზისტორი, რომ მასში არსებული დენი Vcc-დან GND-მდე არ აღემატებოდეს ამ მნიშვნელობას. 5 ვოლტის მიწოდებით იქნება 510 ohms. ახლა, მაშინაც კი, თუ ხაზში არის log1, მაღალი დონე სენსორის მხრიდან, ღილაკზე დაჭერით ლოგიკური დონის დამახინჯებაც კი არ მოხდება, რადგან რეზისტორი შექმნილია პორტის მაქსიმალური დატვირთვის გათვალისწინებით

მაგალითი ცოტა ქაოტური აღმოჩნდა, მაგრამ, ვფიქრობ, არსი გასაგებია. მინდა ნახოთ და გაიგოთ არა მხოლოდ როგორ კეთდება, არამედ რატომ კეთდება :)

კარგად, რამდენიმე ფუნქციის რამდენიმე მაგალითი ერთ ფეხიზე:
ჯერ ერთი, ISP კონექტორი. დიდი ხნის წინ დამავიწყდა როგორი იყო მიკროკონტროლერის ჩასმა ჯერ პროგრამისტის ბლოკში, შემდეგ დაფაზე, შემდეგ უკან და ასე ბევრჯერ, სანამ პროგრამას არ გამართავ. ISP-ის კონექტორის 6 პინი მაქვს გაკრული დაფაზე და გამართვისას პროგრამისტი ყოველთვის ჩართულია დაფაზე და ხანდახან 10 წუთში ერთხელ ვცვლი პროგრამას რამდენჯერმე. ვკითხე და შევამოწმე. Არ მუშაობს? ჩავასწორე, ხელახლა გავაცივე... და ასე სანამ არ იმუშავებს. MK-ის ციმციმის რესურსი გამოითვლება ათასობით ჯერ. მაგრამ ISP კონექტორი ჭამს ქინძისთავებს. სულ 3 ცალი - MOSI, MISO, SCK.

პრინციპში, ამ ქინძისთავებზე ღილაკების მიმაგრებაც შეგიძლიათ. ამ შემთხვევაში არავინ შეაწუხებს არავის, მთავარია ეს ღილაკები არ დააჭიროთ ფირმვერის დროს. თქვენ ასევე შეგიძლიათ დაკიდოთ LED-ები (თუმცა ამ შემთხვევაში უმარტივესი შეიძლება ჩავარდეს, მაგრამ კარგია!) შემდეგ firmware-ის ციმციმისას ისინი ძალიან მხიარულად ციმციმებენ :)))

ინტერნეტის პროვაიდერის ქვეშ ხაზზეც შეგიძლია სხვა რამ დაკიდო, მთავარია ისე, რომ პროგრამული უზრუნველყოფის ციმციმისას ეს რაღაც უცებ არ დაიწყოს უცნაურად. მაგალითად, 100 კილოგრამიანი მანიპულატორის კონტროლი კიდია ISP-ის ხაზზე და პროგრამული უზრუნველყოფის დროს მან მიიღო გიჟური მონაცემების თაიგული - ასე რომ, შეიძლება გაგიჟდეს და ვინმეს თავი დაარტყას. ზოგადად უნდა იფიქრო. მაგრამ რაღაცით, რომელიც მუშაობს ავტობუსის ინტერფეისით, იმუშავებს შემდეგი სქემა:

ჩვენ ვცვლით გამომავალს 0-დან 1-მდე და ჩართავთ ზედა და ქვედა დიოდს. თუ ორივეს განათება გვჭირდება, მაშინ უბრალოდ მიკროკონტროლერის გამომავალს ვცვლით რეჟიმზე Hi-Zდა თითქოს იქ არ არის და დიოდები დაიწვება დენით. ან სწრაფად შეცვალეთ დიოდები ერთმანეთში, ამ შემთხვევაში ორივე დაიწვება თვალით. მიკროსქემის მინუსი აშკარაა - დიოდების ჩაქრობა შეუძლებელია. მაგრამ თუ გეგმის მიხედვით ერთი მაინც უნდა დაიწვას, მაშინ რატომაც არა? UPD:მერე ვიფიქრე, შესაძლებელია LED-ები და რეზისტორები ისე შევარჩიოთ, რომ მათი ჯამური ძაბვის ვარდნა იყოს მიწოდების ძაბვის დონეზე და ჯამური რეზისტორები ამ შემთხვევაში დენს მიიყვანოს ისეთ მინუსულ დონემდე, რომ როდესაც ფეხი მაღალია. Z, დიოდები საერთოდ არ ანათებს. თვალით მაინც სულაც არ იქნება შესამჩნევი. სიბნელის გარდა.

შემდეგი ვარიანტი არ ზოგავს ფეხებს, მაგრამ ის საშუალებას გაძლევთ გაამარტივოთ ბეჭდური მიკროსქემის დაფის განლაგება ელექტროენერგიის ან მიწის ავტობუსის ორ დიოდზე გადატანის გარეშე:

და ღილაკებზე მსგავსი ტაქტიკის გამოყენებით, შეგიძლიათ ან გაამარტივოთ გაყვანილობა, ან გაანაწილოთ 6 ღილაკი სამი ფეხის გასწვრივ.
აქაც ყველაფერი მარტივია - ერთი ფეხი ამწევს, მეორე მიწაზე ასველებს. ღილაკზე დაჭერა იწვევს ძაბვის ვარდნას ასაწევ ფეხზე. პროგრამა ამას გრძნობს და რიგრიგობით იკვლევს თითოეულ ღილაკს. შემდეგ იცვლება ფეხების როლები და ხდება შემდეგი ღილაკის გამოკითხვა.

ექვს ღილაკიან რეჟიმში სიტუაცია ანალოგიურია - ერთი ფეხი აწევს, მეორე მიწას, მესამე კი თავს Hi-Z-ს ახვევს და არ ირეკლავს. მაგრამ არის ერთი გვერდითი ეფექტი. მაგალითად, ჩვენ ვითხოვთ ღილაკს "B". ამისათვის ჩვენ ვათავსებთ ზედა ხაზს შესასვლელი ასაწევით(PORTxy=1, DDRxy=0), საშუალო იძლევა დაბალი გამომავალი დონე(PORTxy=0, DDRxy=1), ქვედა არ მონაწილეობს პროცესში, რადგან ის არის Hi-Z(PORTxy=0, DDRxy=0). თუ ჩვენ დავაჭერთ ღილაკს „B“, მაშინ ზედა ხაზი იმ მომენტში იკეცება და პროგრამა მიხვდება, რომ „B“ ღილაკი დაჭერილია, მაგრამ თუ „B“-ს არ დავაჭერთ, არამედ „E“ და „B“ ” ამავდროულად, მაშინ ზედა ხაზიც დაიძაბება და პროგრამა იფიქრებს, რომ ”B” იყო დაჭერილი, თუმცა ის იქ არ იყო. ამ სქემის მინუსი არის ის, რომ დაწკაპუნებები შეიძლება არასწორად დამუშავდეს. ასე რომ, თუ მოწყობილობას გამოიყენებენ redneck ოპერატორები, რომლებიც იყენებენ ყველაფერს განურჩევლად, მაშინ უმჯობესია უარი თქვან ასეთ სქემაზე.

და ბოლოს, დიაგრამა, რომელიც აჩვენებს, თუ როგორ შეგიძლიათ დააკავშიროთ ღილაკი და LED:


ის ასევე მუშაობს ექსკლუზიურად დინამიკაში. ანუ, ჩვენ ყოველთვის ვაჩვენებთ LED-ის სტატუსს - ანუ პორტში გამოვდივართ ან 0 (დიოდი ჩართულია) ან Hi-Z (დიოდი არ არის ჩართული). და როდესაც ჩვენ გვჭირდება ღილაკის გამოკითხვა, ჩვენ დროებით (რამდენიმე მიკროწამით) ვცვლით გამომავალს აწევის შეყვანის რეჟიმში (DDRxy=0 PORTxy=1) და ვუსმენთ ღილაკს. რეჟიმი, როდესაც გამომავალზე არის ძლიერი მაღალი დონე (DDRxy=1 PORTxy=1) არავითარ შემთხვევაში არ შეიძლება ჩართოთ, რადგან ღილაკზე დაჭერისას შეგიძლიათ პორტის დაწვა.

მინუსები - ღილაკზე დაჭერისას LED ანათებს, როგორც არ უნდა შეხედოთ მას. თუმცა, ეს შეიძლება იყოს არა შეცდომა, არამედ ფუნქცია :)

ეს არის ღვეზელები. ახლა წარმოიდგინეთ პროგრამა, რომელიც ახორციელებს ყველა ამ დინამიურ ფუნქციას + საკუთარი ალგორითმის თაიგულს. გამოდის ან გამოკითხვების გაუთავებელი სერია, ან ყველანაირი დროშის ლეგიონი. ასეთ შემთხვევებში, უმარტივესი დისპეტჩერიზაციის ან კოოპერატიული გაგზავნა არის მხოლოდ ის, რაც ექიმმა უბრძანა - თქვენ ატარებთ თითოეულ კვლევას თქვენი დავალების ციკლის განმავლობაში და არ ინერვიულოთ. მაგრამ თქვენ იყენებთ ATTiny2313-ს ყველგან და სარკასტულად უყურებთ მათ, ვინც მეგა8-ს ან რაღაც უფრო მსუქანს ერთსა და იმავე ამოცანას ახორციელებს :)

არაფერი არ ვიცი და რაღაცის დაწვის მეშინია რა ვქნა???

ნუ გეშინია და გააკეთე. ყოველივე ამის შემდეგ, მიკროკონტროლერი არ არის ისეთი ძვირადღირებული რამ, რომ თქვენ უნდა იტიროთ მისი სიკვდილი. ნაგავში ჩავყარე და ჩანთიდან ახალი ამოვიღე. უარეს შემთხვევაში, თუ ეს მართლაც საშინელია, მაშინ შეგიძლიათ შეიძინოთ მზა დემო დაფა, რომელზედაც ყველაფერი უკვე შედუღებული და გაყვანილია, როგორც უნდა. ყველაფერი რაც თქვენ უნდა გააკეთოთ არის დაპროგრამება და შედეგის ნახვა.

და შემდეგ, მაგალითის გამოყენებით, თუ როგორ განხორციელდა დემო გადახდა, შეეცადეთ გააკეთოთ რაიმე საკუთარი. თავად დემო დაფა არის მიკროკონტროლერი + რამდენიმე საწყისი პერიფერიული მოწყობილობა, რაც საკმარისია რამდენიმე მარტივი ექსპერიმენტისთვის და შეუძლია გააადვილოს სხვა მოწყობილობების დაკავშირება და შესწავლა. არსებობს სხვადასხვა დემო დაფა, მაგალითად, ბრენდირებული სისტემები, როგორიცაა STK500 ან AVR Butterfly, ან ჩემი, რომელიც შექმნილია ჩემი გამოცდილებიდან გამომდინარე და რომელზედაც დაფუძნებული იქნება მთელი შემდგომი სასწავლო კურსი.

ჩვენ ვისწავლით, თუ როგორ მოვიძიოთ ინფორმაცია AVR მიკროკონტროლერების სხვადასხვა მოდელებზე და გავიგოთ, როგორ წავიკითხოთ PDF დოკუმენტები Linux ოპერაციულ სისტემაში. მოდით ვისწავლოთ თუ როგორ დააკავშიროთ მიკროკონტროლერი პროგრამისტთან ISP ინტერფეისის გამოყენებით რამდენიმე დირიჟორის გამოყენებით.

მიკროკონტროლერის ჩიპის პროგრამისტთან სწორად დასაკავშირებლად, თქვენ უნდა გაარკვიოთ სად არის და რა ქინძისთავები აქვს. ჩვენთვის საინტერესო მიკროკონტროლერის შესახებ ამომწურავი ინფორმაციის მისაღებად, ჩამოტვირთეთ მონაცემთა ცხრილი ოფიციალურ ვებსაიტზე ( მონაცემთა ფურცელი) ჩიპისთვის, რომელიც ჩვენ გვაინტერესებს - მონაცემთა ცხრილები ATMEL მიკროკონტროლერებისთვის.

მონაცემთა ფურცლის პირველ გვერდზე მოცემულია მიკროკონტროლერის შესაძლებლობების დეტალური აღწერა, შემდეგ კი მოცემულია მიკროსქემების პინი თითოეული ტიპის შემთხვევისთვის. AVR ჩიპის თითოეული მონაცემთა ფურცელი შეიცავს უამრავ დეტალურ ინფორმაციას ინგლისურად, მაგალითად, ATmega8 მიკროკონტროლერის მონაცემთა ცხრილი შეიცავს 326 გვერდს!

ინგლისური არ იცი? - ეცადე ცოტა ისწავლო, ამის გარეშე ახლა ძალიან რთულია რადიოელექტრონული და კომპიუტერული ტექნოლოგიების თანამედროვე სამყაროში, ეს არის უნივერსალური საერთაშორისო ენა. იმავდროულად, თუ არ იცით რას ნიშნავს სიტყვა ან წინადადება, თარგმნეთ ის მანქანური თარგმანის სერვისის translate.google.com-ის მეშვეობით.

PDF დოკუმენტების კითხვა Linux-ზე

როგორც წესი, მიკროსქემების ყველა მონაცემთა ფურცელი მიეწოდება ფორმატში PDF(პორტატული დოკუმენტის ფორმატი) არის ელექტრონული დოკუმენტის ფორმატი სხვადასხვა პლატფორმებზე გამოსაყენებლად, შემუშავებული Adobe Systems-ის მიერ.

Windows-ისთვის არსებობს მრავალი განსხვავებული პროგრამა PDF დოკუმენტების წაკითხვისა და მუშაობისთვის. ოპერაციულ სისტემაში Linux PDF ფორმატს ასევე აქვს შესანიშნავი პროგრამული უზრუნველყოფის მხარდაჭერა.

  • Okular არის მრავალმხრივი და ძლიერი დოკუმენტის მაყურებელი, რომელიც შედის KDE დესკტოპის გარემოში;
  • Qpdfview - მარტივი და მსუბუქი პროგრამა დოკუმენტების PDF, DjVu და PS ფორმატებში სანახავად;
  • Evince (დოკუმენტის მაყურებელი) - ძალიან სწრაფი და მსუბუქი დოკუმენტების მაყურებელი PostScript (PS), EPS, DJVU, DVI, PDF;
  • Xpdf არის მაღალი ხარისხის PDF მაყურებელი.

რომელი პროგრამა უნდა ავირჩიო PDF-ის სანახავად Linux-ზე? - Okular და Evince პროგრამები ძალიან კარგად უმკლავდებიან თავიანთ ამოცანებს.

თუ დაინსტალირებული გაქვთ KDE დესკტოპის გარემო, მაშინ, სავარაუდოდ, Okular პროგრამა უკვე არის სისტემაში. თუ Okular არ არის დაინსტალირებული, შეგიძლიათ გამოასწოროთ ეს ბრძანებით:

Sudo apt-get დააინსტალირე okular okular-extra-backends

თუ თქვენ გაქვთ KDE-ს გარდა სხვა სამუშაო გარემო - GNOME, XFCE, UNITY, მაშინ უფრო ეკონომიური გამოსავალი იქნება Evince-ის დაყენება, რადგან ამ გარემოში Okular პროგრამის დაინსტალირება საჭიროებს გარკვეულ კომპონენტებს KDE სამუშაო გარემოდან.

ბრინჯი. 1. უნივერსალური დოკუმენტების მაყურებელი Evince for Linux - ინსტრუმენტი მიკროკონტროლერებზე PDF დოკუმენტების პეიჯინგისთვის.

Evince დოკუმენტების მაყურებელი ძალიან კარგად ხსნის უზარმაზარ დოკუმენტებს და ზოგჯერ უმკლავდება მათ, რის წაკითხვასაც Okular არ შეუძლია. Evince-ის ინსტალაცია Linux-ზე:

Sudo apt-get install evince

მე ვფიქრობ, რომ ახლა თქვენ არ გექნებათ პრობლემები PDF ფორმატში დოკუმენტების წაკითხვისას GNU Linux OS-ით.

AVR მიკროკონტროლერის დაკავშირება პროგრამისტთან

ზემოთ ითქვა, რომ მიკროკონტროლერის პროგრამისტთან დასაკავშირებლად საჭიროა ISP პინები: VCC, GND, MISO, MOSI, SCK, RST. ამ სახელების ქინძისთავები ყველა მიკროკონტროლერზეა, ამიტომ მონაცემთა ცხრილი დაგვეხმარება.

ბრინჯი. 2. ATmega8 მიკროკონტროლერის დამაგრება და ISP-თან დაკავშირება (USB ASP).

USB ASP პროგრამისტს აქვს +5V (VCC) ძაბვა ISP კონექტორზე, ამიტომ ჩიპის დასაპროგრამებლად შეგიძლიათ გამოიყენოთ კვების ბლოკი პროგრამისტიდან, უფრო სწორად, USB პორტიდან, რომელზეც ის არის დაკავშირებული.

ადრე განხილულ პროგრამისტებში, რომლებიც იყენებენ COM და LPT პორტებს, არ არის VCC გამომავალი, რაც ნიშნავს, რომ ამ პროგრამისტების გამოყენებისას, 5 ვ მიწოდების ძაბვა უნდა მიეწოდოს მიკროკონტროლერის GND (-) და VCC (+) პინებს. გარე წყარო.

მიკროკონტროლერის დაკავშირება USB ASP პროგრამისტთან უსადენო პურის დაფაზე ძალიან მარტივია ჯუმპერების გამოყენებით (გამტარები ქინძისთავებით ორივე ბოლოში).

ბრინჯი. 3. შეაერთეთ USB ASP პროგრამისტი ISP-ის კონექტორთან დამაგრებული პურის დაფაზე.

დღეს ჩვენ შევეცდებით გამოვიყენოთ უფრო მარტივი მიკროკონტროლერი ATtiny2313და დააკავშირეთ მას სიმბოლო LCD დისპლეი, რომელიც შეიცავს 16 სიმბოლოს ორ ხაზს.

ჩვენ დავაკავშირებთ ეკრანს სტანდარტული 4-ბიტიანი გზით.

პირველ რიგში, დავიწყოთ, რა თქმა უნდა, მიკროკონტროლერით, რადგან ჩვენ უკვე კარგად ვიცნობთ წინა გაკვეთილების ჩვენებას.

მოდით გავხსნათ კონტროლერის მონაცემთა ცხრილი ATtiny2313და ვნახოთ მისი პინოტი

ჩვენ ვხედავთ, რომ ეს კონტროლერი არსებობს ორი ტიპის შემთხვევაში, მაგრამ რადგან მე მივიღე DIP პაკეტში, განვიხილავთ საქმის ამ კონკრეტულ ვერსიას და პრინციპში, ისინი დიდად არ განსხვავდებიან, გარდა გარეგნობისა, ასე რომ, როგორია ნომერი ფეხები იგივეა - თითო 20.

ვინაიდან ATMega8 კონტროლერის 28 ფეხთან შედარებით 20 ფეხია, რომლებზეც ჩვენ ვმუშაობდით და გავაგრძელებთ მუშაობას, შესაბამისად, იქნება ნაკლები შესაძლებლობებიც.

პრინციპში ყველაფერი რაც ATmega8-ს ჰქონდა აქ არის, ერთადერთი ის არის, რომ ნაკლები პორტის ბრჭყალებია. მაგრამ რადგან ჩვენს წინაშე ამოცანაა შევეცადოთ მისი დაკავშირება SPI ავტობუსის საშუალებით სხვა კონტროლერთან, ეს დიდად არ დათრგუნავს.

არის სხვა განსხვავებები, მაგრამ ისინი უმნიშვნელოა და საჭიროებისამებრ გავეცნობით მათ.

მოდით გავაერთიანოთ ასეთი წრე (დააწკაპუნეთ სურათზე სურათის გასადიდებლად)

ეკრანი დაკავშირებულია D პორტის ქინძისთავებთან. PD1 და PD2 არის საკონტროლო შეყვანებთან, ხოლო დანარჩენი დაკავშირებულია დისპლეის მოდულის D4-D7 ქინძისთავებთან.

მოდით შევქმნათ პროექტი სახელწოდებით TINY2313_LCD, გადავიტანოთ მასში ყველაფერი, გარდა ძირითადი მოდულისა პროექტიდან ეკრანის Atmega8-თან დასაკავშირებლად.

რა თქმა უნდა, ზოგიერთი რამ გადაკეთებას საჭიროებს. ამისათვის თქვენ უნდა ყურადღებით შეისწავლოთ რომელი ფეხი რასთან არის დაკავშირებული. დისპლეის E ავტობუსი დაკავშირებულია PD2-თან, ხოლო RS ავტობუსი დაკავშირებულია PD1-თან, ასე რომ, მოდით შევიტანოთ ცვლილებები ფაილში LCD.H

#definee1PORTD| = 0B0000 01 00 // მითითებული ხაზი E 1 -მდე

#definee0PORTD& = 0B1111 10 11 // დააყენეთ ხაზი E 0-ზე

#definers1PORTD|=0b00000 01 0 // დააყენეთ RS ხაზი 1-ზე (მონაცემები)

#definers0PORTD&=0b11111 10 1 // დააყენეთ RS ხაზი 0-ზე (ბრძანება)

როგორც თამამი შრიფტიდან ვხედავთ, ასეთი მკვეთრი ცვლილებები არ გვქონია.

ახლა ინფორმაციის შეყვანა. აქ ვიყენებთ ფეხებს PD3-PD6, ანუ ისინი 1 პუნქტით არის გადაადგილებული Atmega8-თან შეერთებასთან შედარებით, ამიტომ ფაილში რაღაცას გამოვასწორებთ. LCD.cფუნქციაში sendhalfbyte

PORTD&=0ბ 1 0000 111; // წაშალეთ ინფორმაცია შეყვანის შესახებ DB4-DB7, დატოვეთ დანარჩენი

მაგრამ ეს ყველაფერი არ არის. ჩვენ ადრე გადავიტანეთ გადაცემული მონაცემები 4-ით, მაგრამ ახლა, ზემოაღნიშნული ცვლილებების გამო, დაგვჭირდება მხოლოდ 3-ით გადატანა. ამიტომ, იმავე ფუნქციაში ჩვენ ასევე გავასწორებთ პირველ სტრიქონს.

<<=3 ;

სულ ეს არის ცვლილებები. დამეთანხმებით, ისინი არც ისე დიდები არიან! ეს მიიღწევა იმით, რომ ჩვენ ყოველთვის ვცდილობთ დავწეროთ უნივერსალური კოდი და გამოვიყენოთ მაკრო ჩანაცვლება. ერთ დროს ამაზე რომ არ დაგვეხარჯა, ჩვენი ბიბლიოთეკის თითქმის ყველა ფუნქციაში კოდის გასწორება მოგვიწევდა.

მთავარ მოდულში ჩვენ არ ვეხებით D პორტის ინიციალიზაციას; მოდით, მთელი მოდული გადავიდეს გამომავალ მდგომარეობაში, როგორც მე-12 გაკვეთილზე.

ვცადოთ პროექტის აწყობა და ჯერ პროტეუსში ვნახოთ შედეგი, რადგან მეც გავაკეთე პროექტი, რომელიც ასევე იქნება მიმაგრებულ არქივში ატმელ სტუდიის პროექტთან ერთად.

ჩვენთან ყველაფერი მშვენივრად მუშაობს! ასე შეგიძლიათ სწრაფად გადააკეთოთ პროექტი ერთი კონტროლერისთვის მეორეზე.

Proteus ძალიან კარგია, მაგრამ ყოველთვის უფრო სასიამოვნოა რეალური დეტალების დათვალიერება. მთელი წრე აწყობილი იყო პურის დაფაზე, რადგან მე არ გამიკეთებია ან არ ავაწყობდი გამართვის დაფას ამ კონტროლერისთვის. ჩვენ დავაკავშირებთ პროგრამისტს მსგავსი სტანდარტული კონექტორის მეშვეობით

აქ არის მთელი დიაგრამა

აქ ყველაფერი სტანდარტულია. ასაწევი რეზისტორი RESET-ზე და ა.შ.

ახლა, სანამ კონტროლერი ავრდუდეში გავაცილებთ, უნდა ავირჩიოთ კონტროლერი და წავიკითხოთ მისი ფლეშ მეხსიერება

შემდეგ გადადით FUSES ჩანართზე და სწორად დააყენეთ საკრავები. ვინაიდან ჩვენ არ გვაქვს კვარცის რეზონატორი, ჩვენ ვაყენებთ ფუჟებს ამ გზით

საათის მეთოდები

MK-ის დაკვრის კანონიკური ხერხია კვარცის რეზონატორის შეერთება შესაბამის ქინძისთავებთან (სურ. 18.11, ა). C1 და C2 კონდენსატორების ტევადობა ტიპიურ შემთხვევაში უნდა იყოს 22-36 pF (კვარცის ჩართვისთვის იხილეთ თავი 15). Tiny და Mega მოდელების უმეტესობას აქვს სპეციალური კონფიგურაციის ბიტი, რომელიც საშუალებას გაძლევთ დაარეგულიროთ მოხმარება. როდესაც ეს ბიტი დაყენებულია ერთზე (დაპროგრამებული), რხევის ამპლიტუდა მცირდება, თუმცა, შესაძლო სიხშირის დიაპაზონი და საერთო ხმაურის იმუნიტეტი ვიწროვდება, ამიტომ ამ რეჟიმის გამოყენება არ არის რეკომენდებული (იხ. ქვემოთ). ასევე შეიძლება გამოყენებულ იქნას დაბალი სიხშირის კვარცის რეზონატორი (მაგალითად, "საათი" 32,768 ჰც), ხოლო C1 და C2 კონდენსატორების დაყენება არ არის საჭირო, რადგან დახრილობის O მნიშვნელობის დაყენებისას შედის შიდა 36 pF კონდენსატორები. MC-ში არის დაკავშირებული.

კვარცის ნაცვლად, შეიძლება გამოყენებულ იქნას კერამიკული რეზონატორი. ამ ხაზების ავტორმა შეძლო MK-ის გაშვება არასტანდარტულ სიხშირეებზე, იმავე კავშირში კვარცის ნაცვლად მინიატურული ინდუქციური გამოყენების გამოყენებით (მისი მნიშვნელობით 4,7 μH და კონდენსატორის სიმძლავრეებით 91 pF, სიხშირე დაახლოებით 10 MHz).

ბრინჯი. 18.11. AVR მიკროკონტროლერის დაკვრის მეთოდები: a - კვარცის რეზონატორის გამოყენებით; ბ - გარე გენერატორი; გ - RC ჯაჭვები

ბუნებრივია, MK-ის დაკვრა შესაძლებელია გარე გენერატორიდანაც (ნახ. 18.11, ბ). ეს განსაკუთრებით მოსახერხებელია, როდესაც გჭირდებათ MK-ის სინქრონიზაცია გარე კომპონენტებთან, ან გქონდეთ ძალიან ზუსტი საათის სიხშირე შესაბამისი გენერატორების გამოყენებისას (მაგალითად, Epson-ის SG-8002 სერია).

პირიქით, როდესაც სიზუსტე არ არის საჭირო, შეგიძლიათ გამოიყენოთ გარე LAN ჯაჭვი (ნახ. 18.11, გ). ამ წრეში, ტევადობა C1 უნდა იყოს მინიმუმ 22 pF, ხოლო რეზისტორი R1 არჩეულია 3.3-100 ohms დიაპაზონიდან. ამ შემთხვევაში, სიხშირე განისაზღვრება ფორმულით F = 2/3 RC, CI საერთოდ არ შეიძლება დაყენდეს, თუ დაწერთ ლოგიკურ ნულს SCR კონფიგურაციის უჯრედში, რითაც დააკავშირებთ შიდა 36 pF კონდენსატორს.

დაბოლოს, თქვენ შეგიძლიათ გააკეთოთ გარე კომპონენტების გარეშე - გამოიყენეთ ჩაშენებული IG გენერატორი, რომელსაც შეუძლია იმუშაოს ოთხ სიხშირეზე, დაახლოებით ტოლია 1, 2, 4 და 8 MHz. ეს ფუნქცია საუკეთესოდ გამოიყენება დაბალი დონის მოდებში (1x Tiny, ხელმისაწვდომია 8-პინიან პაკეტში - მაშინ რეზონატორის ან გარე ოსცილატორის დასაკავშირებლად განკუთვნილი ქინძისთავები შეიძლება გამოყენებულ იქნას სხვა მიზნებისთვის, როგორიცაა ჩვეულებრივი I/O პორტები. კლასიკური ოჯახი ჩაშენებული RC ოსცილატორი არ ქონდა.

ნაგულისხმევად, Tiny და Mega ოჯახების MK დაყენებულია იმუშაოს ჩაშენებულ ოსცილატორთან 1 MHz სიხშირით (cksel = oooi), ამიტომ სხვა რეჟიმებში მუშაობისთვის საჭიროა შესაბამისად დააყენოთ cksel კონფიგურაციის უჯრედები (იხ. ცხრილი 18.1). როგორ გავაკეთოთ ეს პრაქტიკაში, განხილული იქნება მე-19 თავში. ამ უჯრედების რეკომენდირებული მნიშვნელობა ჩვეულებრივი რეზონატორებისთვის 1 MHz და მეტიდან არის ყველა ერთი cksel უჯრედებში და ნული sk-ში.

დეტალები

უჯრედების დაყენებისას მხედველობაში უნდა იქნას მიღებული, რომ მდგომარეობა cksel = oooo (სარკე კვარცის რეზონატორის ყველაზე ხშირად გამოყენებული მნიშვნელობის მიმართ iiii) აყენებს MK-ს საათის რეჟიმში გარე ოსცილატორიდან და ამ მდგომარეობაში მას არ შეუძლია. იყოს დაპროგრამებული გარე სიხშირის გამოყენების გარეშე. ასევე, თუ თქვენ ცდილობთ რეჟიმის დაყენებას დაბალი სიხშირის რეზონატორით, მაშინ მაღალი სიხშირის MC აღარ დაიწყება და ყველა პროგრამისტს არ შეუძლია მუშაობა ასეთ დაბალ სიხშირეზე. ამიტომ, უჯრედების და არა მხოლოდ cksel-ის მანიპულირებისას, თქვენ უნდა იყოთ უკიდურესად ფრთხილად და გქონდეთ კარგი წარმოდგენა იმაზე, თუ რას აყენებთ კონკრეტულად. ეს უფრო დეტალურად განიხილება შემდეგ თავში.

ცხრილი 18.1. CKSEL კონფიგურაციის უჯრედების დაყენება საათის რეჟიმებიდან გამომდინარე

საათის წყარო

გარე სიხშირე

ჩამონტაჟებული /?C-გენერატორი

ჩამონტაჟებული RC ოსცილატორი

ჩამონტაჟებული /?C-გენერატორი

ჩამონტაჟებული RC ოსცილატორი

გარე RC ჯაჭვი

გარე /?C-ჯაჭვი

გარე RC ჯაჭვი

გარე RC ჯაჭვი

დაბალი სიხშირის რეზონატორი

ცხრილი 16.1 (ბოლო)

საათის წყარო

კერამიკული რეზონატორი

კერამიკული რეზონატორი

კვარცის რეზონატორი

კვარცის რეზონატორი

პარალელური I/O პორტები

I/O პორტები (ვიმეორებთ, რომ ისინი არ უნდა აგვერიოს არც I/O რეგისტრებთან და არც MK-ის სერიულ პორტებთან გარე მოწყობილობებთან ინფორმაციის გაცვლისთვის) სხვადასხვა მოდელებში შეიძლება იყოს 1-დან 7-მდე. პორტები ნომინალურად არის 8 ბიტიანი. ზოგიერთ შემთხვევაში, ბიტის მოცულობა შეზღუდულია პაკეტის ქინძისთავების რაოდენობით და შეიძლება იყოს რვაზე ნაკლები. პორტები მითითებულია ასოებით A, B, C, D და ა.შ., და არა აუცილებლად თანმიმდევრობით: ქვედა მოდელებში შეიძლება იყოს, მაგალითად, მხოლოდ B და D პორტები (როგორც ATtiny2313) ან ზოგადად მხოლოდ ერთი პორტი. B (როგორც ATtinylx-ში).

კორპუსში კონტაქტების რაოდენობის შესამცირებლად, უმეტეს შემთხვევაში, პორტების შესაბამის გარე ქინძისთავებს, გარდა ძირითადი ფუნქციისა (ორმხრივი შეყვანა/გამომავალი), აქვთ დამატებითი. გაითვალისწინეთ, რომ გადატვირთვის პინის გარდა, თუ მას შეუძლია მუშაობა ალტერნატიულ რეჟიმში, არ არის საჭირო სპეციალური პორტის პინის გადართვა. თუ, მაგალითად, თქვენ პროგრამაში მოაწყეთ UART სერიული პორტი, მაშინ შესაბამისი პორტის პინები (მაგალითად, ATmega8335-ში ეს არის PDO და PD1 პორტის პინები) იმუშავებს ალტერნატიულ ფუნქციაში, როგორც UART შეყვანა და გამომავალი. თუმცა, ქინძისთავების ასეთ სპეციალურ გამოყენებას შორის ინტერვალებში, ისინი პრინციპში შეიძლება გამოყენებულ იქნას როგორც ჩვეულებრივი ორმხრივი ქინძისთავები. პრაქტიკაში აუცილებელია მიკროსქემის დიზაინის ზომების გამოყენება ფუნქციების ერთმანეთისგან იზოლირებისთვის, ამიტომ არ არის რეკომენდებული ამ ფუნქციის ბოროტად გამოყენება.

პორტის ქინძისთავები საკმარისად ავტონომიურია და მათი რეჟიმი შეიძლება დაყენდეს ერთმანეთისგან დამოუკიდებლად. ნაგულისხმევად, როდესაც დენი ჩართულია, ყველა დამატებითი მოწყობილობა გამორთულია და პორტები მუშაობენ შეყვანის სახით და არიან მესამე მდგომარეობაში მაღალი სიჩქარით (ანუ მაღალი შეყვანის წინაღობით). გამოსავალზე მუშაობა მოითხოვს სპეციალურ ინსტრუქციებს, რისთვისაც პროგრამაში თქვენ უნდა დააყენოთ სასურველ გამომავალს შესაბამისი ბიტი მონაცემთა მიმართულების რეესტრში (ეს რეგისტრი არის დანიშნული DDRx, სადაც x არის ასო, რომელიც განსაზღვრავს კონკრეტულ პორტს, მაგალითად, პორტი A იქნება დდრა). თუ ბიტი გადატვირთულია (ანუ ტოლია ლოგიკური ნულის), მაშინ გამომავალი მუშაობს როგორც შეყვანა (როგორც ნაგულისხმევად); თუ ის დაყენებულია (ანუ ტოლია ლოგიკური), მაშინ ის მუშაობს როგორც გამომავალი.

გამომავალი ერთ მდგომარეობაზე დასაყენებლად, საჭიროა ცალკე დააყენოთ შესაბამისი ბიტი პორტის მონაცემთა რეესტრში (აღნიშნულია portx-ით), ხოლო O-ზე დასაყენებლად, გადატვირთეთ ეს ბიტი. გამომავალი (შესვლა-გამომავალი, DDRx რეგისტრი) და მისი მდგომარეობა (O-1, portx) არ უნდა აგვერიოს.

portx მონაცემთა რეგისტრი ფაქტობრივად მხოლოდ გამომავალი ბუფერია; რაც მასზე წერია, მაშინვე გამოდის. მაგრამ თუ დააყენებთ პორტის პინს შეყვანაზე (ანუ ჩაწერეთ ლოგიკური ნული ddrx მიმართულების რეგისტრში), როგორც ეს ხდება ნაგულისხმევად, მაშინ portx მონაცემთა რეგისტრი ითამაშებს ოდნავ განსხვავებულ როლს - მისი ბიტების ნულზე დაყენება ნიშნავს, რომ შეყვანა მესამე მდგომარეობაშია მაღალი წინააღმდეგობით და მისი ერთზე დაყენება ტერმინალთან დააკავშირებს 35-120 kOhm წინააღმდეგობის მქონე რეზისტორს.

შენიშვნები მინდვრებში

უმეტეს შემთხვევაში, ჩაშენებული ასაწევი რეზისტორი არ არის საკმარისი საიმედო მუშაობისთვის - ჩარევის გამო, MC შეიძლება გაუმართავი იყოს და უმჯობესია ამ შიდა რეზისტორის პარალელურად დააინსტალიროთ დამატებითი გარე რეზისტორი, 1 წინააღმდეგობით. 5 kOhm-მდე (მოხმარებისთვის კრიტიკულ შემთხვევებში მისი ღირებულება შეიძლება გაიზარდოს 20-30 kOhm-მდე). მაგალითად, თუ თქვენ დააკავშირებთ გარე ღილაკს ორი ქინძისთავთან შესავალზე, რომელიც გადართულია მიწაზე, ან პინი მუშაობს „საერთო ავტობუსზე“ დისტანციურ მოწყობილობებთან (მდებარეობს სხვა დაფაზე), ან პინი ასრულებს ფუნქციას. გარე შეფერხება (იხ. ქვემოთ), მაშინ ასეთი დამატებითი რეზისტორი უნდა იყოს დაკავშირებული.

პორტის პინზე დონის წაკითხვის პროცედურა, თუ ის შეყვანის მდგომარეობაშია, არ არის სრულიად ტრივიალური. მაცდურია მონაცემების წაკითხვა portx მონაცემთა რეესტრიდან, მაგრამ ამით არაფერი გამოდგება - თქვენ წაიკითხავთ მხოლოდ იმას, რაც მანამდე დაწერეთ. და იმის წასაკითხად, თუ რა არის რეალურად ხელმისაწვდომი შესასვლელში (პირდაპირ მიკროსქემის გამომავალზე), გათვალისწინებულია კიდევ ერთი შესაძლებლობა. ამისათვის თქვენ უნდა შეხვიდეთ ზოგიერთ მასივში, რომელიც აღინიშნება pinx-ით. წვდომა ხორციელდება ისევე, როგორც ჩვეულებრივი RVV-ების ცალკეული ბიტები (იხ. თავი 19\ მაგრამ pinx არ არის რეგისტრი, ის უბრალოდ არის მისამართების გარკვეული დიაპაზონი, საიდანაც წაკითხვა უზრუნველყოფს ინფორმაციის წვდომას ბუფერული ელემენტებიდან პორტის შესასვლელში. დაწერე რამე პიNx-ის მისამართებზე, რა თქმა უნდა, შეუძლებელია.

წყვეტს

როგორც კომპიუტერებში, მიკროკონტროლერებში შეფერხებები ორი ტიპისაა. მაგრამ თუ კომპიუტერში შეფერხებები იყოფა აპარატურად (მაგალითად, ტაიმერიდან ან კლავიატურიდან) და პროგრამულ უზრუნველყოფას (სინამდვილეში არა შეფერხებები, არამედ BIOS-ში დაწერილი ქვეპროგრამები - Windows-ის გავრცელებასთან ერთად, ეს კონცეფცია თითქმის გაქრა პროგრამისტების პრაქტიკიდან), შემდეგ MK-ში, ბუნებრივია, ყველაფერი Interrupts არის აპარატურა და ისინი იყოფა შიდა და გარე. ცალ-ცალკე ნებისმიერი შეფერხება, ისევე როგორც ზოგადად მათი წარმოშობის შესაძლებლობა, წინასწარ სპეციალურ ნებართვას მოითხოვს.

მტკიცედ უნდა გვესმოდეს, რომ ნებისმიერი შეფერხების ინიციალიზაციისთვის, თქვენ უნდა გააკეთოთ ოთხი რამ პროგრამაში: ჩართეთ შეფერხებები ზოგადად (ისინი გამორთულია ნაგულისხმევად), შემდეგ ჩართეთ ეს კონკრეტული შეფერხება, დააყენეთ მისთვის ერთ-ერთი ხელმისაწვდომი რეჟიმი და ბოლოს. , დააყენეთ შეფერხების ვექტორი: მაჩვენებელი ეტიკეტზე , რომლის გასწვრივ განლაგებულია შეფერხების დამმუშავებლის ქვეპროგრამული პროცედურა. და, რა თქმა უნდა, ამის შემდეგ თქვენ უნდა დაწეროთ თავად დამმუშავებელი, წინააღმდეგ შემთხვევაში ეს ყველაფერი უშედეგოდ მოხდება. ეს უფრო დეტალურად არის განხილული მე-19 თავში.

შიდა შეფერხებები შეიძლება წარმოიშვას ნებისმიერი მოწყობილობიდან, რომელიც დამატებითია სისტემის ბირთვზე - ტაიმერებიდან, ანალოგური შედარებიდან, სერიული პორტიდან და ა.შ. შიდა შეფერხება არის მოვლენა, რომელიც ხდება სისტემაში და წყვეტს ძირითადი პროგრამის შესრულებას. შიდა შეფერხების სისტემა AVR-ში საკმაოდ ვრცელია და წარმოადგენს მოწყობილობების სისტემის ბირთვთან ურთიერთქმედების ძირითად სისტემას და ამ საკითხს არაერთხელ დავუბრუნდებით.

AVR MK-ს აქვს მინიმუმ ორი გარე შეფერხება, INTO, INT1 (მეგას უმეტესობას აქვს მესამე - ICHT2). გარე შეფერხება არის მოვლენა, რომელიც ხდება მაშინ, როდესაც სიგნალი გამოჩნდება ერთ-ერთ შესასვლელში, რომელიც სპეციალურად ამ მიზნით არის შექმნილი. არსებობს სამი სახის მოვლენა, რომელიც იწვევს შეფერხებას და მათი დაყენება შესაძლებელია პროგრამულ უზრუნველყოფაში: ეს შეიძლება იყოს დაბალი ძაბვის დონე, ან დადებითი ან უარყოფითი ზღვარი შესაბამის პინზე. საინტერესოა, რომ ყველა ამ მოვლენისთვის შეფერხებები შესრულებულია მაშინაც კი, თუ შესაბამისი პორტის პინი კონფიგურირებულია როგორც გამომავალი.

მოდით მოკლედ გადავხედოთ ამ რეჟიმების გამოყენების თავისებურებებს. დაბალი დონის შეფერხება (რეჟიმი დაყენებულია ნაგულისხმევად, მის ინიციალიზაციისთვის უბრალოდ ჩართოთ შესაბამისი შეწყვეტა) ხდება მაშინ, როდესაც შესაბამისი შეყვანა დაბალია. "ყოველ ჯერზე" ნიშნავს, რომ მართლაც ყოველ ჯერზე, ანუ თუ უარყოფითი იმპულსი გაგრძელდება გარკვეული დროის განმავლობაში, მაშინ შეფერხების დამუშავების პროცედურა, რომელიც დასრულდა, განმეორდება ისევ და ისევ, რაც ხელს უშლის ძირითადი პროგრამის მუშაობას. მაშასადამე, ამ გარე შეფერხების რეჟიმის გამოყენების ჩვეულებრივი სქემაა მისი დაუყოვნებლივ გამორთვა მისი დაწყებისთანავე (დამუშავების პროცედურა, დაწყების შემდეგ, დასრულდება ერთხელ) და ხელახლა ჩართვა მხოლოდ მაშინ, როდესაც გარე გავლენა უკვე დასრულებული უნდა იყოს (მაგალითად, თუ ეს არის ღილაკის დაჭერა, შემდეგ ის კვლავ უნდა დაუშვას ტაიმერით ერთი ან ორი წამის შემდეგ).

ამის საპირისპიროდ, აწევა ან დაცემა შეფერხებები შესრულებულია ერთხელ. რა თქმა უნდა, არ არსებობს დაცვა კონტაქტური გადახტომისგან და არც შეიძლება იყოს, რადგან MK-ს არ შეუძლია განასხვავოს გადახტომა მოკლე იმპულსების სერიისგან. თუ ეს კრიტიკულია, თქვენ უნდა მიიღოთ გარე ზომები, რათა დაიცვათ გადახტომა, ან გამოიყენოთ იგივე მეთოდი, როგორც დონის შეფერხებისთვის - შეფერხების დამმუშავებლის პროცედურის შიგნით, გამორთეთ შეფერხება თავად პირველი ბრძანებით და გარკვეული დროის შემდეგ სხვა პროცედურაში ( ტაიმერით ან სხვა მოვლენით) ხელახლა გადასაჭრელად („ანტი-ბოუნსის“ ეს მეთოდი ფაქტობრივად იდენტურია ერთჯერადი მოწყობილობის გამოყენებისა, იხილეთ თავი 15).

დეტალები

ყურადღებიან მკითხველს აქვს ლეგიტიმური კითხვა - რატომ გვჭირდება საერთოდ გარე დონის შეფერხების რეჟიმი? ფაქტია, რომ ყველა მოდელში ის შესრულებულია ასინქრონულად - იმ მომენტში, როდესაც დაბალი დონე ჩნდება MK გამომავალზე. რა თქმა უნდა, შეფერხების გამოვლენა შეიძლება მოხდეს მხოლოდ მიმდინარე ინსტრუქციის ბოლოს, ამიტომ ძალიან მოკლე პულსი შეიძლება დაიკარგოს. მაგრამ INTO და INT1 შეფერხებები კიდეების მართვის რეჟიმში უმეტეს მოდელებისთვის განისაზღვრება პირიქით, მხოლოდ სინქრონულად - კონტროლერის საათის სიგნალის დონეების სხვაობის მომენტში, ამიტომ მათი ხანგრძლივობა არ უნდა იყოს ერთ საათზე ნაკლები პერიოდი. . მაგრამ ეს არ არის ყველაზე მნიშვნელოვანი: ზოგადად, ამ რეჟიმებში განსხვავება არ იქნებოდა, რომ არა ის ფაქტი, რომ სინქრონული რეჟიმი ნამდვილად მოითხოვს ზუსტად ამ საათის სიგნალის არსებობას. მაშასადამე, ასინქრონულ გარე შეფერხებას, შესაბამისად, შეუძლია „გააღვიძოს“ კონტროლერი, რომელიც იმყოფება ენერგიის დაზოგვის ერთ-ერთ ღრმა რეჟიმში, როდესაც საათის გენერატორი არ მუშაობს, მაგრამ სინქრონული არა. და ჩვეულებრივი MCU-ები, როგორიცაა კლასიკური ოჯახის AT90S8515 (მაგრამ არა მისი მეგა-ანალოგი!), შეიძლება გაიღვიძოს ღრმა "ძილისგან" მხოლოდ გარე დონის შეფერხებით, რაც ყოველთვის არ არის მოსახერხებელი გამოსაყენებლად. Meda ოჯახის მოდელების უმეტესობას (უმცროსი მოდელების - გარდა ATmegaS) აქვს სხვა შეფერხება, INT2, რომელიც ხდება მხოლოდ კიდეებზე (ეს არ შეიძლება დონის მიხედვით), მაგრამ, განსხვავებით INTO და INT1, ასინქრონულად. ATtiny2313-ში (მაგრამ არა მის „კლასიკურ“ ანალოგში!) ასეთი ასინქრონული შეფერხება შეიძლება მოხდეს B პორტის 8 პინიდან რომელიმე სიგნალით. ეს მნიშვნელოვნად ზრდის კონტროლერის გამოყენებადობას ენერგიის დაზოგვის რეჟიმში.

ტაიმერ-მრიცხველები

AVR MK-ების უმეტესობას აქვს ორი ან სამი ტაიმერი, რომელთაგან ერთი არის 16-ბიტიანი, ხოლო დანარჩენი 8-ბიტიანი (მეგას ძველ მოდელებში მრიცხველების საერთო რაოდენობა შეიძლება იყოს 6-მდე). ყველა მრიცხველს აქვს მნიშვნელობების წინასწარ ჩატვირთვის შესაძლებლობა და შეუძლია იმუშაოს უშუალოდ პროცესორის საათის სიხშირედან (SC) ან მისგან, გაყოფილი 8, 64, 256 ან 1024-ზე (ზოგიერთ შემთხვევაში 16-ზე და 32-ზე), ასევე გარე სიგნალი. ზოგადად, MK-ში ტაიმერების დიზაინი, როგორც ვთქვით, მსგავსია 561HEU/14 მრიცხველების (იხ. თავი 15), მხოლოდ მათი ფუნქციონირება მნიშვნელოვნად გაფართოვდა.

AVR არქიტექტურაში 8-ბიტიან მრიცხველებს ენიჭებათ ნომრები O და 2, ხოლო 16-ბიტიანებს ენიჭებათ ნომრები 1, 3 და ასე შემდეგ. ზოგიერთ 8-ბიტიან მრიცხველს (ჩვეულებრივ ტაიმერი 2, თუ ორი მათგანია) შეუძლია ასინქრონულ რეჟიმში იმუშაოს საათის ცალკეული გენერატორიდან და განაგრძოს ფუნქციონირება მაშინაც კი, თუ MCU დანარჩენი ნაწილი "მძინარე" მდგომარეობაშია, რაც მათ საშუალებას აძლევს. გამოყენებული იქნება როგორც რეალურ დროში საათი.

კონტრ-ტაიმერების, როგორც გარე იმპულსების ჩვეულებრივი მრიცხველების გამოყენებისას (და რეაქცია შესაძლებელია როგორც დაცემაზე, ასევე პულსის კიდეზე), დათვლილი იმპულსების სიხშირე არ უნდა აღემატებოდეს MK საათის გენერატორის სიხშირის ნახევარს (და ასიმეტრიული გარე მეანდრი, ინსტრუქციები გვირჩევენ შეზღუდვის სიხშირის კიდევ უფრო დაბალ მნიშვნელობას - 0.4 საათიდან). ეს გამოწვეულია იმით, რომ გარე იმპულსების დათვლისას მათი კიდეები სინქრონულად გამოვლენილია (საათის სიგნალის დადებითი კიდეების მომენტებში). გარდა ამისა, გასათვალისწინებელია, რომ მრიცხველის შინაარსის განახლების შეფერხება გარე პულსის ჩამოსვლის შემდეგ შეიძლება იყოს 2,5 საათის პერიოდამდე.

ეს საკმაოდ ძლიერი შეზღუდვებია, ამიტომ, მაგალითად, MK, როგორც უნივერსალური სიხშირის მრიცხველის გამოყენება არ არის ძალიან მოსახერხებელი - უმჯობესია შეიმუშაოთ მაღალსიჩქარიანი სქემები შესაბამისი კომბინირებული ლოგიკის ან FPGA-ების (პროგრამირებადი ლოგიკური ინტეგრირებული სქემების) გამოყენებით.

როდესაც მრიცხველის გადინება ხდება, ხდება მოვლენა, რომელმაც შეიძლება გამოიწვიოს შესაბამისი შეფერხება. 8-ბიტიანი Timer O მრიცხველი შეზღუდულია ამ ფუნქციით ზოგიერთ შემთხვევაში. ტაიმერი 2, თუ არსებობს, ასევე შეუძლია გამოიწვიოს შეფერხება, თუ დათვლილი მნიშვნელობა ემთხვევა წინასწარ განსაზღვრულ მნიშვნელობას. 16-ბიტიანი მრიცხველები უფრო "მოწინავე" არიან და შეუძლიათ გამოიწვიონ შეფერხებები, როდესაც ისინი ემთხვევა ორ დამოუკიდებლად მითითებულ რიცხვს A და B. ამ შემთხვევაში, მრიცხველები შეიძლება ნულამდე გადააბრუნონ ან განაგრძონ დათვლა და პულსების წარმოქმნა შესაძლებელია სპეციალურ ქინძისთავებზე ( აპარატურა, პროგრამის მონაწილეობის გარეშე).

გარდა ამისა, 16-ბიტიან მრიცხველებს შეუძლიათ "დაიპყრონ" გარე ერთი იმპულსები სპეციალურ ქინძისთავზე. ამ შემთხვევაში შეიძლება გამოძახდეს შეფერხება და მრიცხველის შინაარსი მოთავსებულია გარკვეულ რეესტრში. თავად მრიცხველი შეიძლება იყოს ნულამდე და ხელახლა დაიწყოს თვლა, ან უბრალოდ გააგრძელოს დათვლა. ეს რეჟიმი მოსახერხებელია გარე სიგნალის პერიოდის გასაზომად ან გარკვეული არარეგულარული მოვლენების დასათვლელად (როგორიცაა ნაწილაკების გავლა გეიგერის მრიცხველში). მნიშვნელოვანია, რომ ასეთი მოვლენების წყარო შეიძლება იყოს ჩაშენებული ანალოგური შედარებითი, რომელიც შემდეგ გამოიყენება როგორც პულსის ფორმირება.

ყველა კონტრტაიმერს შეუძლია იმუშაოს ე.წ. PWM რეჟიმები, ანუ როგორც 8-, 9-, 10- ან 16-ბიტიანი პულსის სიგანის მოდულატორები (PWM) და ერთმანეთისგან დამოუკიდებლად, რაც მრავალარხიანი PWM-ის განხორციელების საშუალებას იძლევა. ტექნიკურ დოკუმენტაციაში მრავალი გვერდი ეთმობა ამ რეჟიმებს, მათი სირთულის, მრავალფეროვნებისა და უხერხულობის გამო. ამ რეჟიმების უმარტივესი გამოყენება აუდიო დაკვრისთვის მოკლედ იქნება განხილული 22 თავში ხმოვან სიგნალთან დაკავშირებით. გაითვალისწინეთ, რომ ხმის სინთეზი არ არის PWM რეჟიმების ერთადერთი ან თუნდაც უმაღლესი პრიორიტეტული დანიშნულება; ისინი ასევე შეიძლება გამოყენებულ იქნას სიმძლავრის ან დენის რეგულირებისთვის (მაგალითად, ბატარეების დამუხტვისას), საკონტროლო ძრავების, სიგნალის გასწორებისა და ციფრულიდან ანალოგური გადაქცევისთვის. .

ქრონომეტრის გარდა, ყველა AVR კონტროლერს გამონაკლისის გარეშე აქვს Watchdog ტაიმერი. იგი ძირითადად განკუთვნილია MK-ის ენერგიის დაზოგვის რეჟიმიდან გარკვეული დროის ინტერვალის შემდეგ ამოსაღებად, მაგრამ ასევე შეიძლება გამოყენებულ იქნას MK-ის გადაუდებელი გადატვირთვისთვის. მაგალითად, თუ პროგრამის მოქმედება დამოკიდებულია გარე სიგნალების მოსვლაზე, მაშინ თუ ისინი დაიკარგება (მაგალითად, ხაზის შესვენების გამო), MK შეიძლება "ჩამოკიდებული" და Watchdog ტაიმერი გამოიტანს მას. ამ სახელმწიფოს.

სერიული პორტები

გარე მოწყობილობებთან მონაცემების გაცვლის სერიული პორტები ნებისმიერი MK-ის ყველაზე მნიშვნელოვანი კომპონენტია; მათ გარეშე, მისი „კომუნიკაცია“ გარე სამყაროსთან მკვეთრად შეზღუდულია. მათ უწოდებენ თანმიმდევრულს, რადგან მხოლოდ ერთი ბიტი გადაიცემა ერთდროულად (ზოგიერთ შემთხვევაში შესაძლებელია ერთდროულად გადაცემა და მიღება, მაგრამ მაინც მხოლოდ ერთი ბიტი ერთდროულად). სერიული პორტების ყველაზე მნიშვნელოვანი უპირატესობა პარალელურებთან შედარებით (როდესაც ხდება მთელი ბაიტების ან ტეტრადის ბუჩქების გაცვლა ერთდროულად) არის კავშირების რაოდენობის შემცირება. მაგრამ ეს არ არის ერთადერთი: პარადოქსულია, რომ სერიული ინტერფეისები მნიშვნელოვან სტარტს აძლევს პარალელურს მაღალი სიჩქარით, როდესაც ხაზებში შეფერხებები იწყებს გავლენას გადაცემის სიჩქარეზე. ეს უკანასკნელი არ შეიძლება იყოს მკაცრად იგივე, და ეს არის ერთ-ერთი მიზეზი იმისა, რომ სერიული ინტერფეისები ახლა იწყებენ დომინირებას (ტიპიური მაგალითებია USB და FireWire COM, LPT და SCSI ნაცვლად, ან Serial ATA ნაცვლად IDE).

მიკროკონტროლერ მოწყობილობებში ჩვენი მოცულობის მონაცემებით, რა თქმა უნდა, გადაცემის სიჩქარე მეორეხარისხოვნად გვეხება, მაგრამ დამაკავშირებელი მავთულის რაოდენობა ძალიან კრიტიკული ფაქტორია. ამიტომ, ყველა გარე მოწყობილობას, რომლებთანაც ამ წიგნში შევეხებით, ექნება სერიული ინტერფეისი.

თითქმის ნებისმიერი სერიული პორტის სიმულაცია შესაძლებელია პროგრამულ უზრუნველყოფაში რეგულარული MK პინების გამოყენებით. ოდესღაც ეს გაკეთდა ამ ნოპტობებიდან ყველაზე პოპულარული - UART-ის შემთხვევაშიც კი. თუმცა, მას შემდეგ MK-ებმა შეიძინეს აპარატურის სერიული პორტები, რაც, თუმცა, არ ნიშნავს მათი აბსოლუტური გამოყენების აუცილებლობას. სერიული პორტების პროგრამული სიმულაციის სიმარტივე კიდევ ერთი უპირატესობაა.

ყველა ტიპის პორტიდან, რომელიც შეიძლება იყოს AVR MCU-ში, ჩვენ განსაკუთრებულ ყურადღებას მივაქცევთ UART-უნივერსალურ ასინქრონულ მიმღებ-გადამცემს, „უნივერსალურ ასინქრონულ გადამცემს“. UART არის ნებისმიერი მოწყობილობის ძირითადი ნაწილი, რომელიც მხარს უჭერს RS-232 პროტოკოლს, მაგრამ არა მხოლოდ მას (ეს არ არის უნივერსალური) - მაგალითად, ინდუსტრიული სტანდარტები RS-485 და RS-422 ასევე დანერგილია UART-ის საშუალებით. , ვინაიდან ისინი RS-232-ისგან განსხვავდებიან მხოლოდ ელექტრული პარამეტრებით და დასაშვები სიჩქარით და არა კონსტრუქციის ზოგადი ლოგიკით. პერსონალურ კომპიუტერებს აქვთ COM პორტი, რომელიც მუშაობს იგივე RS-232 პროტოკოლის გამოყენებით და UART კვანძი ასევე მისი ძირითადი ნაწილია.

ამიტომ, UART ემსახურება როგორც MK-სა და კომპიუტერს შორის მონაცემების გაცვლის მთავარ გზას. გაითვალისწინეთ, რომ COM პორტის არარსებობა უმეტეს თანამედროვე კომპიუტერის მოდელებში არ წარმოადგენს დაბრკოლებას: ამისათვის არის USB-COM ადაპტერები და დამატებითი ბარათი COM პორტებით შეიძლება ჩასვათ დესკტოპის მოდელში.

შენიშვნები მინდვრებში

რატომ არის ეს ჩვენთვის ასე მნიშვნელოვანი? ფაქტია, რომ მოწყობილობის განლაგების კომპიუტერთან შეერთებით, მაშინაც კი, თუ მონაცემთა გაცვლა არ არის უზრუნველყოფილი მოწყობილობის ფუნქციონირებით, ბევრად უფრო ადვილია პროგრამის გამართვა, უბრალოდ პროგრამის სწორ ადგილებში დროებით ჩასმა გაგზავნის ოპერაცია. მონაწილეთა მნიშვნელობები რეგისტრირდება კომპიუტერში და იღებს მათ რეალურ დროში ზოგიერთი ან ტერმინალის ემულატორის პროგრამის გამოყენებით. ეს ბევრად უფრო მოსახერხებელია, ვიდრე მოცულობითი AVR Studio-ს დაუფლება და ძვირადღირებული გამართვის დაფთან ერთად. ამიტომ, ჩემი რჩევაა, დაუყოვნებლივ გააკეთოთ გამართვის დაფა, რომელიც შეიცავს პროგრამირების კონექტორს (იხ. შემდეგი თავი) და UART/RS-232 დონის გადამყვანი კონექტორით ნულ მოდემის კაბელის დასაკავშირებლად (იხ. თავი 21).

როგორ გამოვიყენოთ UART პრაქტიკაში აღწერილია 21-ე თავში. UART-ის გარდა, თითქმის ყველა AVR MCU შეიცავს ყველა სერიულ პორტს შორის უმარტივესს - SPI (Serial Peripheral Interface). SPI მოწყობილობის პრინციპი ნახსენები იყო მე-16 თავში. მისმა ფუნდამენტურმა სიმარტივემ ნაწილობრივ ცუდი როლი ითამაშა: ძნელია იპოვოთ ორი მოწყობილობა, სადაც SPI პროტოკოლები სრულიად იდენტურია; ჩვეულებრივ, ამ პორტზე გაცვლა თან ახლავს ამა თუ იმ პორტს. ზარები და სასტვენები”. უნდა აღინიშნოს, რომ AVR პროგრამირება ასევე ხორციელდება SPI-ის საშუალებით, თუმცა, ზოგადად, ეს ინტერფეისი და მონაცემთა გაცვლის SPI განსხვავებულია, თუმცა უმეტეს შემთხვევაში მათ აქვთ იგივე ქინძისთავები.

მაგრამ ამ წიგნში, 21-ე თავში, ჩვენ განვიხილავთ უფრო რთულ, თუმცა უფრო ნელ, I^C ინტერფეისს, რომელიც უფრო ხშირად არის საჭირო, რადგან ამდენი პერიფერიული მოწყობილობა მუშაობს მასში.

ჩვენ განვიხილავთ AVR ოჯახის MK-ის სხვა კომპონენტებს (მაგალითად, ADC-ებს), რადგან წარმოგიდგენთ კონკრეტულ სქემებს - ეს უფრო გასაგები იქნება. აქ ჩვენ დავასრულებთ მიკროკონტროლერთან ვრცელ შესავალს და გადავალთ კითხვაზე, თუ როგორ დავაპროგრამოთ იგი.

სიახლე საიტზე

>

Ყველაზე პოპულარული