Სარჩევი:

AVR Assembler Tutorial 7: 12 ნაბიჯი
AVR Assembler Tutorial 7: 12 ნაბიჯი

ვიდეო: AVR Assembler Tutorial 7: 12 ნაბიჯი

ვიდეო: AVR Assembler Tutorial 7: 12 ნაბიჯი
ვიდეო: AVR Ассемблер. Урок 7. ШИМ. Управление серво. AVR Assembler. Lesson 7. PWM. Servo control. 2024, ივლისი
Anonim
AVR Assembler Tutorial 7
AVR Assembler Tutorial 7

კეთილი იყოს თქვენი მობრძანება გაკვეთილზე 7!

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

  1. კლავიატურა თქვენ შეგიძლიათ იყიდოთ ერთი ან შეგიძლიათ გააკეთოთ ის, რაც მე გავაკეთე და შეწმინდოთ ერთი.
  2. 2 ქალი სათაური კლავიატურისთვის (თუ ერთს იწმინდავთ)
  3. დამაკავშირებელი მავთულები
  4. პურის დაფა
  5. 41 კომის რეზისტორი
  6. 1 15 კომის რეზისტორი
  7. 1 3.3 კომის რეზისტორი
  8. 1 180 ohm რეზისტორი
  9. 1680 ohm რეზისტორი
  10. ციფრული მულტიმეტრი
  11. თქვენი ანალიზატორი მე –5 სახელმძღვანელოდან

შეიძლება დაგჭირდეთ პირველი ნაბიჯების გამოტოვება, თუ თქვენ უკვე გაქვთ კლავიატურა და არ გჭირდებათ მისი ამოღება.

აქ არის ბმული ჩემი AVR ასამბლეის გაკვეთილების სრული კოლექციისთვის:

ნაბიჯი 1: შეინახეთ კლავიატურა 1

შეინახეთ კლავიატურა 1
შეინახეთ კლავიატურა 1
შეინახეთ კლავიატურა 1
შეინახეთ კლავიატურა 1
შეინახეთ კლავიატურა 1
შეინახეთ კლავიატურა 1
შეინახეთ კლავიატურა 1
შეინახეთ კლავიატურა 1

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

ნაბიჯი 2: მოიძიეთ კლავიატურა 2

შეინახეთ კლავიატურა 2
შეინახეთ კლავიატურა 2
შეინახეთ კლავიატურა 2
შეინახეთ კლავიატურა 2
შეინახეთ კლავიატურა 2
შეინახეთ კლავიატურა 2

ახლა აიღეთ PVC ხერხი და გაჭერით პლასტიკური გასაღების ხვრელებიდან, შემდეგ კი გაჭერით კიდეზე, რომ მიიღოთ სიღრმე მარჯვნივ და დატოვოთ თხელი კლავიატურა.

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

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

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

ნაბიჯი 3: მოიძიეთ კლავიატურა 3

შეინახეთ კლავიატურა 3
შეინახეთ კლავიატურა 3
შეინახეთ კლავიატურა 3
შეინახეთ კლავიატურა 3
შეინახეთ კლავიატურა 3
შეინახეთ კლავიატურა 3

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

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

შეადგინეთ ამ გზით გამოყვანილი ქინძისთავების ყველა გასაღები.

ნაბიჯი 4: დააინსტალირეთ კლავიატურა

მავთულის კლავიატურა
მავთულის კლავიატურა
მავთულის კლავიატურა
მავთულის კლავიატურა

ახლა მიჰყევით გაყვანილობის დიაგრამას და მიამაგრეთ კლავიატურა თქვენს დაფაზე.

როგორ მუშაობს ეს, ჩვენ დავუშვებთ 5V მარცხენა მხარეს, ხოლო მარჯვენა მიდის GND– ზე. პირველი დიაგრამა მარჯვნივ მარჯვნივ გადადის ჩვენს პირველ ანალოგურ ქინძისთავებში Atmega328p მიკროკონტროლერზე. როდესაც არ არის დაჭერილი ღილაკები, სიგნალი იქნება 0V, ხოლო როდესაც თითოეული სხვადასხვა ღილაკს დააჭერთ, ანალოგურ პორტში შესასვლელი იქნება 0V- დან 5V- მდე, განსხვავებული ოდენობით, იმისდა მიხედვით, თუ რომელ კლავიშზეა დაჭერილი. ჩვენ ავირჩიეთ რეზისტორის მნიშვნელობები ისე, რომ თითოეული გზა შეიცავდეს წინააღმდეგობას, რომელიც განსხვავდებოდა დანარჩენისგან. მიკროკონტროლერის ანალოგური პორტი იღებს ანალოგიურ სიგნალს და ყოფს მას 1024 სხვადასხვა არხზე 0V- დან 5V- მდე. ეს ნიშნავს, რომ თითოეულ არხს აქვს სიგანე 5V/1024 = 0.005 V/არხი = 5 mV/არხი. ასე რომ, ანალოგიურ პორტს შეუძლია განასხვავოს შეყვანის ძაბვები, თუ ისინი განსხვავდებიან 5 მვ -ზე მეტი. ჩვენს შემთხვევაში ჩვენ შევარჩიეთ რეზისტორული მნიშვნელობები ისე, რომ ნებისმიერი ორი დაჭერით გამოაგზავნოს ძაბვის სიგნალი, რომელიც განსხვავდება ამაზე მეტს, ამიტომ მიკროკონტროლერს ადვილად უნდა შეეძლოს გადაწყვიტოს რომელ კლავიშზეა დაჭერილი. დიდი პრობლემა ის არის, რომ მთელი სისტემა ძალიან ხმაურიანია, ასე რომ ჩვენ დაგვჭირდება ძაბვის დიაპაზონის შერჩევა თითოეული ღილაკის დაჭერისათვის - მაგრამ ამას ცოტა მოგვიანებით შევეხებით.

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

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

ნაბიჯი 5: მიაბით კლავიატურა თქვენს ანალიზატორს

მიაბით კლავიატურა თქვენს ანალიზატორს
მიაბით კლავიატურა თქვენს ანალიზატორს
მიაბით კლავიატურა თქვენს ანალიზატორს
მიაბით კლავიატურა თქვენს ანალიზატორს

სურათები გვიჩვენებს, თუ როგორ გვინდა, რომ მივაერთოთ კლავიატურა მიკროკონტროლერს, რათა დავინახოთ გამომავალი ანალიზატორის ეკრანზე. არსებითად, ჩვენ უბრალოდ ვუკავშირდებით კლავიატურადან გამომავალს PortC pin 0 -ს, რომელსაც ასევე უწოდებენ ADC0 ATmega328P- ზე.

თუმცა, არსებობს რამდენიმე დამატებითი რამ. ჩვენ ასევე ვაპირებთ მავთულხლართების ღილაკს PD2. ანუ აიღეთ მავთული თქვენი 5V სარკინიგზო ღილაკიდან და ღილაკის მეორე მხრიდან PD2, და ბოლოს, ჩვენ გვინდა გათიშვა AREF პინი ჩვენი 5V სარკინიგზოდან და ნაცვლად დავტოვოთ იგი გათიშული. ჩვენ გვსურს ჩავდოთ 0,1 მიკროფარადის გამშლელი კონდენსატორი. ეს არის კერამიკული კონდენსატორი, რომელზეც 104 წერია. პირველი ორი ციფრი არის რიცხვი და ბოლო ციფრი არის სიმძლავრე 10 ჩვენ გავამრავლებთ მასზე პასუხის მისაღებად პიკოფარადებში (პიკო ნიშნავს 10^-12), ასე რომ 104 ნიშნავს 10 x 10^4 პიკოფარადს, რაც იგივეა 100 ნანოფარადები (ნანო ნიშნავს 10^-9), რაც იგივეა 0.1 მიკროფარდი (მიკრო ნიშნავს 10^-6). ყოველ შემთხვევაში, ყოველივე ეს არის სტაბილური AREF პინი, როდესაც ჩვენ შეგვიძლია გამოვიყენოთ იგი როგორც ჩვენი საცნობარო პინი.

ჩვენ ასევე გვინდა 1 მოჰ რეზისტორი PD2 და მიწას შორის. ჩვენ ვაპირებთ დააყენოთ PD2 როგორც გამომავალი pin 0V და ჩვენ ვიწვევთ პოზიტიურ ზღვარზე ამ პინზე. ჩვენ გვსურს, რომ ზღვარი მაშინვე გაქრეს, როდესაც ღილაკს გავათავისუფლებთ, ასე რომ ჩვენ ჩავდებთ ამ "დაწევის ქვემოთ" რეზისტორს.

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

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

მოდით დავწეროთ კოდი, რომელიც ამას მიაღწევს.

ნაბიჯი 6: რომელი გადამრთველი გადამრთველი უნდა დავაყენოთ?

რომელი გადამრთველი გადამრთველი უნდა დავაყენოთ?
რომელი გადამრთველი გადამრთველი უნდა დავაყენოთ?

მოდით, პირველ რიგში ვიფიქროთ იმაზე, თუ როგორ ვაპირებთ ამის კოდირებას ისე, რომ კონტროლერს შეეძლოს კლავიატურის შეყვანის წაკითხვა და მისი რიცხვითი მნიშვნელობის შესაბამისი ღილაკის დაჭერა. ჩვენ ვაპირებთ გამოვიყენოთ ანალოგური ციფრული გადამყვანი (ADC) რომელიც ჩაშენებულია Atmega328p- ში. ჩვენ ვიყენებთ AREF- ს, როგორც საცნობარო ძაბვას და ჩვენი კლავიატურის გამომავალი იქნება დაკავშირებული PortC0 ან PC0. გაითვალისწინეთ, რომ ამ პინს ასევე უწოდებენ ADC0 ანალოგურ-ციფრულ კონვერტორს 0. შეიძლება კარგი იდეა იყოთ, რომ წაიკითხოთ განყოფილება 12.4 ATmega328P- ის შეფერხებების შესახებ და ასევე თავი 24 ანალოგურ-ციფრულ გადამყვანზე, სანამ მივიღებთ დაწყებული ან მინიმუმ ის სექციები მზად არის მითითებისთვის. იმისათვის, რომ შევქმნათ მიკროკონტროლერი ისე, რომ მან იცოდეს რა უნდა გააკეთოს ანალოგური შეყვანის სიგნალით და როგორ უნდა იმოქმედოს ჩვენს პროგრამასთან, ჩვენ პირველ რიგში უნდა დავაყენოთ რამდენიმე სხვადასხვა ADC დაკავშირებული რეგისტრის ბიტი. ეს არსებითად უტოლდება ძველ გადამრთველებს პირველ კომპიუტერებზე. თქვენ ან ჩართავთ ან გამორთავთ გადამრთველს, ან კიდევ უფრო უკან შეაერთებთ კაბელებს ერთ გასასვლელსა და მეორეს შორის ისე, რომ გზაზე ამ ჩანგალს მიღწეულმა ელექტრონებმა იპოვონ ერთი კარიბჭე დახურული და მეორე ღია, რომელიც აიძულებს მას სხვა გზას გაუყოს ლაბირინთში. წრიული სქემა და ამით განსხვავებული ლოგიკური ამოცანის შესრულება. ასამბლეის ენაზე კოდირებისას ჩვენ გვაქვს წვდომა მიკროკონტროლერის ამ ფუნქციებზე, რაც ერთ – ერთი მიმზიდველია ამის გაკეთების საქმეში. ის უფრო "ხელისგულზეა" და გაცილებით ნაკლები ხდება "კულისებში". ასე რომ არ იფიქროთ ამ რეგისტრების დაყენებაზე, როგორც დამღლელი ამოცანა. ეს არის ის, რაც ასამბლეის ენას საინტერესოს ხდის! ჩვენ ვიძენთ ძალიან პირად ურთიერთობას ჩიპის შიდა მუშაობასა და ლოგიკასთან და ვაკეთებთ მას ზუსტად ის, რაც ჩვენ გვსურს - არც მეტი და არც ნაკლები. არ არის დაკარგული საათის ციკლი. ასე რომ, აქ არის კონცენტრატორების სია, რომლებიც ჩვენ უნდა დავაყენოთ:

  1. გამორთეთ სიმძლავრის შემცირების ADC ბიტი, PRADC, რომელიც არის PRR რეგისტრის ბიტი 0, რადგან თუ ეს ბიტი მასზეა, ის დახურავს ADC. ელექტროენერგიის შემცირების რეესტრი არსებითად არის საშუალება გამორთოთ სხვადასხვა ნივთი, რომელიც იყენებს ენერგიას, როცა არ გჭირდებათ. ვინაიდან ჩვენ ვიყენებთ ADC– ს, ჩვენ გვინდა დავრწმუნდეთ, რომ ის ამ გზით გამორთული არ არის. (იხილეთ PRADC 46 გვერდზე)
  2. შეარჩიეთ ADC0 ანალოგური შესასვლელი არხი MUX3… 0 – ის გამორთვით ADC Multiplexer Selection (ADMUX) რეგისტრში (იხილეთ ცხრილი 24–4 გვერდი 249) ეს უკვე ნაგულისხმევია, ასე რომ ჩვენ ამის გაკეთება ნამდვილად არ გვჭირდება. თუმცა, მე მას ჩავრთავ, რადგან თუ ოდესმე იყენებთ სხვა პორტს ADC0– ს გარდა, თქვენ მოგიწევთ ამ გადამრთველების გადართვა შესაბამისად. MUX3, MUX2, MUX1, MUX0– ის სხვადასხვა კომბინაცია საშუალებას გაძლევთ გამოიყენოთ ნებისმიერი ანალოგური პორტი თქვენს შესასვლელად და ასევე შეგიძლიათ შეცვალოთ ისინი ფრენისას, თუ გსურთ ერთდროულად შეხედოთ სხვადასხვა ანალოგური სიგნალების რამოდენიმეს.
  3. გამორთეთ REFS0 და REFS1 ბიტები ADMUX რეგისტრში ისე, რომ ჩვენ გამოვიყენოთ AREF როგორც ჩვენი საცნობარო ძაბვა და არა შიდა მითითება (იხ. გვერდი 248).
  4. ჩართეთ ADLAR ბიტი ADMUX– ში, რათა შედეგი იყოს „მარცხნივ მორგებული“, ჩვენ განვიხილავთ ამ არჩევანს მომდევნო ეტაპზე.
  5. დააყენეთ ADC0D ბიტი ციფრული შეყვანის გამორთვის რეგისტრში (DIDR0), რომ გამორთოთ ციფრული შეყვანა PC0– ზე. ჩვენ ვიყენებთ ამ პორტს ანალოგური შეყვანისთვის, ასე რომ ჩვენ შეგვიძლია გამორთოთ ციფრული შეყვანა.
  6. დააყენეთ ISC0 და ISC1 გარე შეფერხების კონტროლის რეესტრში A (EICRA), რომ მიუთითოთ, რომ ჩვენ გვსურს ძაბვის სიგნალის ამომავალი ზღვარზე ჩართვა INT0 პინზე (PD2), იხილეთ გვერდი 71.
  7. გაასუფთავეთ INT0 და INT1 ბიტი გარე შეწყვეტის ნიღბების რეესტრში (EIMSK) იმის მითითებით, რომ ჩვენ არ ვიყენებთ შეწყვეტებს ამ პინზე. თუ ჩვენ ჩავრთავთ ამ პინზე შეწყვეტის საშუალებას, დაგვჭირდება შეწყვეტის დამმუშავებელი 0x0002 მისამართზე, მაგრამ ჩვენ ვაყენებთ მას ისე, რომ სიგნალი ამ პინზე გამოიწვიოს ADC კონვერსია, რომლის დასრულებასაც ახორციელებს ADC კონვერტაციის სრული შეწყვეტა მისამართი 0x002A. იხილეთ გვერდი 72.
  8. დააყენეთ ADC ჩართვა (ADEN) ბიტი (ბიტი 7) ADC კონტროლისა და სტატუსის რეესტრში A (ADCSRA), რომ ჩართოთ ADC. იხილეთ გვერდი 249.
  9. ჩვენ შეგვიძლია დავიწყოთ ერთი კონვერტაცია ADC დაწყების კონვერტაციის ბიტის (ADSC) დაყენებით ყოველ ჯერზე, როდესაც გვსურს ანალოგური სიგნალის წაკითხვა, თუმცა, ახლა ჩვენ გვირჩევნია, რომ ის ავტომატურად წაიკითხოს, როდესაც ვინმე ღილაკს დააჭერს, ასე რომ, ამის ნაცვლად, ჩვენ ADC- ს გავააქტიურებთ Autotrigger ჩართეთ (ADATE) ბიტი ADCSRA რეგისტრში ისე, რომ გაშვება ავტომატურად მოხდეს.
  10. ჩვენ ასევე დავაყენეთ ADPS2..0 ბიტი (AD Prescalar ბიტი) 111 -ზე ისე, რომ ADC საათი არის პროცესორის საათი გაყოფილი 128 ფაქტორით.
  11. ჩვენ შევარჩევთ ADC გამომწვევ წყაროს PD2, რომელსაც ასევე უწოდებენ INT0 (გარე შეფერხების მოთხოვნა 0). ჩვენ ამას ვაკეთებთ ADCSRB რეესტრის სხვადასხვა ბიტების გადართვით (იხ. ცხრილი 24-6, გვერდზე 251). ჩვენ ცხრილში ვხედავთ, რომ ჩვენ გვსურს ADTS0 გამორთული, ADTS1 ჩართული და ADTS2 გამორთული ისე, რომ ADC გამოიწვევს ამ პინის გამორთვას. გაითვალისწინეთ, რომ ჩვენ გვსურს განუწყვეტლივ აღვნიშნოთ ანალოგური პორტი, მაგალითად, თუ ვკითხულობთ უწყვეტ ანალოგურ სიგნალს (როგორიცაა ხმის შერჩევა ან რამე), ჩვენ ამას დავაყენებთ უფასო გაშვების რეჟიმში. მეთოდი, რომელსაც ჩვენ ვიყენებთ PD2– ზე გაშვების დასადგენად, იწვევს ანალოგური პორტის PC0– ის ADC კითხვას, შეფერხების გარეშე. შეფერხება მოვა, როდესაც კონვერტაცია დასრულდება.
  12. ADC Interrupt Enable (ADIE) ბიტის ჩართვა ADCSRA რეგისტრში ისე, რომ როდესაც ციფრული გარდაქმნის ანალოგი დასრულებულია, ის გამოიწვევს შეფერხებას, რომლისთვისაც ჩვენ შეგვიძლია დავწეროთ შეწყვეტის დამმუშავებელი და.org 0x002A.
  13. დააყენეთ I ბიტი SREG– ში, რომ შეუშალოს ხელი.

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

ნაბიჯი 7: ჩაწერეთ შეწყვეტის დამმუშავებელი

ბოლო ეტაპზე ჩვენ დავინახეთ, რომ ჩვენ შევქმენით ის ისე, რომ PD2– ზე გამოვლენილი ზღვარი გამოიწვევს ანალოგიურ ციფრულ კონვერტაციას PC0– ზე და როდესაც ეს კონვერტაცია დასრულდება, ის ჩააგდებს ADC– ის კონვერტაციის სრულ წყვეტს. ახლა ჩვენ გვსურს რაღაც გავაკეთოთ ამ შეფერხებით. თუ თქვენ შეისწავლით ცხრილს 12-6 65 გვერდზე, ნახავთ შესაძლო შეფერხებების ჩამონათვალს. ჩვენ უკვე ვნახეთ RESET შეწყვეტა მისამართზე 0x0000 და ტაიმერი/Counter0 გადავსების შეწყვეტა მისამართზე 0x0020 წინა გაკვეთილებში. ახლა ჩვენ გვინდა შევხედოთ ADC შეფერხებას, რომელსაც ჩვენ ვხედავთ, რომ ცხრილი არის მისამართზე 0x002A. ასე რომ, ასამბლეის ენის კოდის დასაწყისში დაგვჭირდება სტრიქონი, სადაც ნათქვამია:

.org 0x002Arjmp ADC_int

რომელიც გადავა ჩვენს შეწყვეტის დამმუშავებელზე, რომელსაც ეწოდება ADC_int, როდესაც ADC დაასრულებს კონვერტაციას. ასე რომ, როგორ უნდა დავწეროთ ჩვენი შეფერხების დამმუშავებელი? ისე, როგორც ADC მუშაობს არის შემდეგი გაანგარიშების შესრულებით:

ADC = Vin x 1024 / Vref

მოდით ვნახოთ რა მოხდება, თუ კლავიატურაზე დავაწკაპუნებ ღილაკს "ხელახალი აკრეფა". ამ შემთხვევაში PC0– ზე ძაბვა შეიცვლება რაღაც მნიშვნელობამდე, ვთქვათ 1.52V, და ვინაიდან Vref არის 5V– ზე გვექნება:

ADC = (1.52V) x 1024 / 5V = 311.296

და ასე გამოჩნდება 311. თუ ჩვენ გვსურს, რომ ეს დავუბრუნოთ ძაბვას, ჩვენ უბრალოდ შევცვალოთ გაანგარიშება. ჩვენ არ დაგვჭირდება ამის გაკეთება, რადგან ჩვენ არ ვართ დაინტერესებული რეალური ძაბვებით მხოლოდ მათ შორის განასხვავებით. როდესაც კონვერტაცია დასრულდება, შედეგი ინახება 10 – ბიტიან ნომერში, რომელიც მოთავსებულია ADCH და ADCL რეგისტრებში და ჩვენ ვიწვევთ მას „დარჩეს მორგებული“, რაც იმას ნიშნავს, რომ 10 ბიტიანი იწყება ADCH– ის 7 – ე ბიტიდან და მიდის ქვემოთ ADCL- ის ბიტი 6 (სულ არის 16 ბიტი ამ ორ რეგისტრში და ჩვენ ვიყენებთ მხოლოდ 10 მათგანს, ანუ 1024 არხს). ჩვენ გვექნება შედეგი "სწორად მორგებული", თუ გვსურს ADLAR ბიტის გაწმენდა ADMUX რეგისტრში. მიზეზი, რის გამოც ჩვენ ვირჩევთ მარცხნივ მორგებულს არის ის, რომ ჩვენი სიგნალები საკმაოდ შორს არის ერთმანეთისგან, რომ არხის ნომრის ბოლო ორი ციფრი არ არის შესაბამისი და ალბათ მხოლოდ ხმაურია, ამიტომ ჩვენ გამოვყოფთ კლავიშებს მხოლოდ ზედა 8 ციფრის გამოყენებით, სხვა სიტყვებით რომ ვთქვათ, ჩვენ მხოლოდ ADCH– ს უნდა შევხედოთ იმის გასარკვევად, თუ რომელ ღილაკზეა დაჭერილი. ასე რომ, ჩვენმა წყვეტმა დამმუშავებელმა უბრალოდ უნდა წაიკითხოს ნომერი ADCH– დან დარეგისტრირდით, გადააკეთეთ ეს რიცხვი კლავიატურის მნიშვნელობად და შემდეგ გაგზავნეთ ეს მნიშვნელობა ჩვენს რეგისტრის ანალიზატორ LED- ზე, რათა შევამოწმოთ, რომ "9" -ის დაწკაპუნება გამოიწვევს "00001001" -ის შესაბამისი LED- ის განათებას. სანამ ჩვენ წავიდეთ თუმცა ჩვენ ჯერ უნდა ვნახოთ რა გამოჩნდება ADCH– ში, როდესაც სხვადასხვა ღილაკებს ვაჭერთ. მოდით დავწეროთ მარტივი შეფერხების დამმუშავებელი, რომელიც უბრალოდ აგზავნის ADCH- ის შინაარსს ანალიზატორის ეკრანზე. ასე რომ, აქ არის ის, რაც ჩვენ გვჭირდება:

ADC_int: lds ანალიზატორი, ADCH; ჩატვირთეთ ADCH- ის მნიშვნელობა ჩვენს ანალიზატორებშიბი EIFR, 0; გაასუფთავეთ გარე შეწყვეტის დროშა ისე, რომ იგი მზად იყოს ხელახლა წასასვლელად

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

ნაბიჯი 8: გამოაქვეყნეთ კლავიშის ღილაკების მნიშვნელობები

გამოაქვეყნეთ კლავიშთაშორისი მნიშვნელობები
გამოაქვეყნეთ კლავიშთაშორისი მნიშვნელობები

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

სავარჯიშო 3: გააკეთეთ ეს შედგენა და შემდეგ ხელახლა დაწერეთ თქვენი ADC შეწყვეტის რუტინა.

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

ADC_int:; გარე შეფერხების დამმუშავებელი ანალიზატორი; მოემზადეთ ახალი ნომრების ღილაკებისთვის H, ADCH; ADC განახლდება, როდესაც ADCH იკითხება clccpi buttonH, 240brlo PC+3; თუ ADCH უფრო დიდია, ეს არის 1ldi ანალიზატორი, 1; ასე რომ დატვირთეთ ანალიზატორი 1rjmp დაბრუნებით; და დააბრუნეთ clccpi ღილაკი H, 230; თუ ADCH უფრო დიდია ვიდრე 2brlo PC+3ldi ანალიზატორი, 2rjmp დაბრუნების clccpi ღილაკი H, 217brlo PC+3ldi ანალიზატორი, 3rjmp დაბრუნების clccpiHH, 203brlo PC+3ldi ანალიზატორი, 4rjmp დაბრუნების clccpi ღილაკი H, 187brlo PC+3ldi ანალიზატორი, 5rjmp დაბრუნების clccpi ღილაკი, 155brlo PC+3ldi ანალიზატორი, 6rjmp დაბრუნების clccpi ღილაკი H, 127brlo PC+3ldi ანალიზატორი, 255; ჩვენ დავაყენებთ ფლეშს როგორც ყველა onrjmp დაბრუნების clccpi ღილაკს H, 115brlo PC+3ldi ანალიზატორი, 7rjmp დაბრუნების clccpi ღილაკს H, 94brlo PC+3ldi ანალიზატორი, 8rjmp დაბრუნების clccpi ღილაკი H, 62brlo PC+3ldi ანალიზატორი, 9rjmp დაბრუნების clccpi ღილაკი H, 37brlo PC+3ldi ანალიზატორი, 0b11110000; ვარსკვლავი არის ზედა ნახევარი onrjmp დაბრუნების clccpi ღილაკი H, 28brlo PC+3ldi ანალიზატორი, 0rjmp დაბრუნების clccpi ღილაკი H, 17brlo PC+3ldi ანალიზატორი, 0b00001111; hash sign is bottom half onrjmp return clccpi buttonH, 5brlo PC+3ldi ანალიზატორი, 0b11000011; ხელახალი აკრიფა არის ზედა 2 ქვედა 2rjmp დაბრუნების ldi ანალიზატორი, 0b11011011; წინააღმდეგ შემთხვევაში მოხდა შეცდომა დაბრუნება: reti

ნაბიჯი 9: კოდი და ვიდეო 1 ვერსიისთვის

მე დავამატე ჩემი კოდი კლავიატურის დრაივერის ამ პირველი ვერსიისთვის. ამ შემთხვევაში თქვენ უნდა დააჭიროთ ღილაკს და შემდეგ დააჭიროთ ღილაკს, რათა გამოიწვიოთ ADC– ის წაკითხვა კლავიატურის შეყვანისაგან. ის, რაც ჩვენ გვირჩევნია, არ არის ღილაკი, არამედ კონვერტაციის სიგნალი მოდის თავად კლავიშის დაჭერით. სავარჯიშო 3: შეიკრიბეთ და ატვირთეთ ეს კოდი და სცადეთ. შეიძლება დაგჭირდეთ კონვერტაციის სხვადასხვა ბარიერის შეცვლა თქვენი კლავიშების წნევის შესატყვისად, ვინაიდან ისინი სავარაუდოდ განსხვავდებიან ჩემგან. რა მოხდება, თუ თქვენ ცდილობთ გამოიყენოთ კლავიატურის შეყვანა როგორც ADC0- ისთვის, ასევე გარე შეწყვეტის პინისთვის ღილაკის ნაცვლად? მე ასევე დავამატებ ჩვენი კლავიშების დრაივერის ამ პირველი ვერსიის მუშაობის ვიდეოს. თქვენ შეამჩნევთ ამას ჩემს კოდში არის ნაწილი Stack Pointer– ის ინიციალიზაციისთვის. არსებობს სხვადასხვა რეგისტრები, რომელთაც ჩვენ გვსურს დავაბიჯოთ და გამოვიდეთ დასტიდან, როდესაც ვამუშავებთ ცვლადებს და რა-არა და ასევე არის ისეთი რეგისტრები, რომელთა შენახვა და აღდგენა გვსურს მოგვიანებით. მაგალითად, SREG არის რეესტრი, რომელიც არ არის დაცული შეფერხებებზე, ასე რომ სხვადასხვა დროშები, რომლებიც დაყენებულია და გაწმენდილია ოპერაციების შედეგად, შეიძლება შეიცვალოს, თუ შეფერხება მოხდება რაღაცის შუაგულში. ასე რომ, საუკეთესოა თუ SREG- ს მიაწერთ შეწყვეტის დამმუშავებლის დასაწყისში და შემდეგ კვლავ გამორთავთ შეწყვეტის დამმუშავებლის ბოლოს. მე ის ჩავდე კოდში, რათა ნახოთ როგორ არის ინიციალიზებული და ვიწინასწარმეტყველოთ როგორ დაგვჭირდება მოგვიანებით, მაგრამ რადგან ჩვენ არ გვაინტერესებს რა ხდება SREG– ში ჩვენს კოდში შეფერხებების დროს მე არ გამოვიყენე სტეკი ამისათვის. ასევე შენიშვნა რომ მე გამოვიყენე ცვლის ოპერაცია ინიციალიზაციისას რეესტრებში სხვადასხვა ბიტის დასაყენებლად. მაგალითად ხაზში:

ldi ტემპერატურა, (1 <> sts EICRA, ტემპ

ზემოთ მოყვანილი კოდის პირველ სტრიქონში "<<" არის ცვლის ოპერაცია. ის არსებითად იღებს ორობითი რიცხვი 1, რომელიც არის 0b00000001 და ცვლის მას მარცხნივ ISC01 რიცხვის რაოდენობით. ეს არის ბიტის დასახელება ISC01 EICRA რეგისტრში. ვინაიდან ISC01 არის ბიტი 1, რიცხვი 1 გადადის მარცხენა 1 პოზიციაზე და ხდება 0b00000010. ანალოგიურად მეორე, ISC00, არის EICRA- ს ბიტი 0 და ამიტომ რიცხვის 1 ცვლა არის ნულოვანი პოზიციები მარცხნივ. თუ გადახედავთ m328Pdef.inc ფაილს, რომელიც გადმოწერილი გაქვთ პირველ სამეურვეოში და მას შემდეგ იყენებთ evrr– ს, დაინახავთ, რომ ეს მხოლოდ ".equ" განცხადებების გრძელი ჩამონათვალია. თქვენ აღმოაჩენთ, რომ ISC01 უდრის 1 -ს. ასამბლერი ცვლის მის თითოეულ მაგალითს 1 -ით, სანამ რამის აწყობას დაიწყებდეთ. ისინი მხოლოდ რეგისტრირებული ბიტების სახელებია, რაც გვეხმარება ჩვენ ადამიანებში კოდის წერაში. ახლა, ვერტიკალური ხაზი ორ ცვლის ოპერაციას შორის არის ლოგიკური "ან" ოპერაცია. აქ არის განტოლება:

0b00000010 | 0b00000001 = 0b00000011

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

ორი ტემპერატურა, (1

ეს არის ტემპერატურის 0b00000001, რომელიც აყენებს 1 -ს ნულოვან ბიტში და დანარჩენს უცვლელად ტოვებს. ასევე როცა ვწერდით

ანდი ტემპი, 0b11111110

ეს ცვლის ნულოვანი ბიტის ტემპერატურას 0 -ზე და დანარჩენს უცვლელად ტოვებს.

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

კარგი, ახლა ვნახოთ, შეგვიძლია თუ არა თავი დავაღწიოთ იმ ზედმეტ ღილაკს…

ნაბიჯი 10: კოდი ვერსიისთვის 2

ღილაკის მოშორების უმარტივესი გზა არის მხოლოდ მისი მთლიანად ამოღება, PB2– ში შეყვანის დავიწყება და უბრალოდ ADC– ის „უფასო გაშვების რეჟიმში“გადართვა.

სხვა სიტყვებით რომ ვთქვათ, უბრალოდ შეცვალეთ ADCSRB რეგისტრი ისე, რომ ADTS2, ADTS1 და ADTS0 ნულის ტოლია.

შემდეგ დააყენეთ ADSC ბიტი ADCSRA– ში 1, რომელიც დაიწყებს პირველ კონვერტაციას.

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

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

მოდით ვიპოვოთ სხვა გამოსავალი …

ნაბიჯი 11: როგორ დავაღწიოთ თავი ღილაკს? ვერსია 3

როგორ დავაღწიოთ თავი ღილაკს? ვერსია 3
როგორ დავაღწიოთ თავი ღილაკს? ვერსია 3

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

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

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

აზრი? კარგი, გავაკეთოთ…

გადახედეთ თანდართულ ახალ კოდს.

თქვენ ხედავთ შემდეგ ცვლილებებს:

  1. ჩვენ დავამატეთ rjmp მისამართზე.org 0x0002, რათა გაუმკლავდეს INT0 გარე შეფერხებას
  2. ჩვენ შევცვალეთ EIMSK რეგისტრი იმის მითითებით, რომ ჩვენ გვსურს შეფერხება INT0 პინზე
  3. ჩვენ შევცვალეთ ADATE pin ADCSRA რეესტრში, ავტომატური გათიშვის გასაუქმებლად
  4. ჩვენ თავი დავაღწიეთ ADCSRB პარამეტრებს, რადგან ისინი შეუსაბამოა, როდესაც ADATE გამორთულია
  5. ჩვენ აღარ გვჭირდება გარე ტრიგერის დროშის გადაყენება, რადგან INT0 შეწყვეტის რუტინა ამას ავტომატურად აკეთებს დასრულებისთანავე - ადრე ჩვენ არ გვქონდა შეფერხების რუტინა, ჩვენ უბრალოდ ჩავრთეთ სიგნალის ADC გამორთვა იმ პინზე, ასე რომ ჩვენ მოგვიწია გაასუფთავეთ ეს დროშა ხელით.

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

სავარჯიშო 5: გაუშვით ეს ვერსია და ნახეთ რა მოხდება.

ნაბიჯი 12: კოდი და ვიდეო სამუშაო ვერსიისთვის

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

რაც ჩვენ გვჭირდება არის შემოღების შეფერხება PD2– ზე და ADC კითხულობას შორის PC0– ზე. ჩვენ ამას გავაკეთებთ ქრონომეტრის/მრიცხველის, მრიცხველის გადინების შეწყვეტისა და დაგვიანების რუტინის დამატებით. საბედნიეროდ, ჩვენ უკვე ვიცით, როგორ გავაკეთოთ ეს მე –3 გაკვეთილიდან! ასე რომ, ჩვენ უბრალოდ დავაკოპირებთ და ჩასვამთ შესაბამის კოდს იქიდან.

მე მივეცი მიღებული კოდი და ვიდეო, რომელიც აჩვენებს მას მუშაობაში.

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

  1. ჩვენ ვიყენებთ კლავიატურის ძაბვის გამომუშავებას PD2– ზე გასააქტიურებლად, რაც გავლენას ახდენს PC0– ის კითხვაზე.
  2. ჩვენ ნამდვილად არ ვიცით რამდენ ხანს უნდა გადადოთ ტრიგერის შემდეგ საუკეთესო კითხვის მისაღებად.
  3. ADC კონვერტაციის დასრულებას რამდენიმე ციკლი სჭირდება, რაც იმას ნიშნავს, რომ ჩვენ არ შეგვიძლია სწრაფი ცეცხლი კლავიატურაზე.
  4. ალბათ არის ხმაური თავად კლავიატურაზე.
  5. და ა.შ…

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

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

  1. ის იყენებს მხოლოდ 2 ქინძისთავს ჩვენს მიკროკონტროლერზე 8 -ის ნაცვლად.
  2. ეს არის დიდი პროექტი აჩვენოს ADC– ის სხვადასხვა ასპექტები მიკროკონტროლერზე, რომელიც განსხვავდება სტანდარტული საგნებისგან, რომელთა ნახვა შეგიძლიათ იქ, როგორიცაა ტემპერატურის კითხვა, შემობრუნება პოტენომეტრი და ა.შ. ვიდრე უბრალოდ თავისუფალი პროცესორის გაშვების რეჟიმი.

ყოველ შემთხვევაში, აქ მოცემულია რამდენიმე სავარჯიშო თქვენთვის:

სავარჯიშო 6: ხელახლა ჩაწერეთ ADC კონვერტაციის სრული შეწყვეტის დამმუშავებელი საძიებო ცხრილის გამოსაყენებლად. ანუ ასე რომ, ის ამოწმებს ანალოგურ მნიშვნელობას ცხრილის პირველ პუნქტთან და თუ ის უფრო დიდია, ის ბრუნდება შეწყვეტიდან, თუ ეს არ არის, ის ზრდის Z- ს ცხრილის მომდევნო პუნქტს და კვლავ ტოვებს ტესტს. ეს შეამცირებს კოდს და გაასუფთავებს შეფერხების რუტინას და გახდის მას ლამაზს. (მე მომდევნო ეტაპზე მივცემ შესაძლო გადაწყვეტას) სავარჯიშო 7: მიამაგრეთ თქვენი კლავიატურა მიკროკონტროლერზე 8 ქინძისთავზე და ჩაწერეთ მისთვის მარტივი დრაივერი და შეიგრძენით რამდენად ლამაზია. შეგიძლიათ იფიქროთ რამოდენიმე გზაზე, რომ გავაუმჯობესოთ ჩვენი მეთოდი?

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

Შეხვედრამდე!

გირჩევთ: