Სარჩევი:

როგორ განვსაზღვროთ ბრუნვის მიმართულება ციფრული მბრუნავი გადამრთველიდან PIC– ით: 5 ნაბიჯი
როგორ განვსაზღვროთ ბრუნვის მიმართულება ციფრული მბრუნავი გადამრთველიდან PIC– ით: 5 ნაბიჯი

ვიდეო: როგორ განვსაზღვროთ ბრუნვის მიმართულება ციფრული მბრუნავი გადამრთველიდან PIC– ით: 5 ნაბიჯი

ვიდეო: როგორ განვსაზღვროთ ბრუნვის მიმართულება ციფრული მბრუნავი გადამრთველიდან PIC– ით: 5 ნაბიჯი
ვიდეო: Lesson 97: Controlling Servo Motor using Rotary Encoder and Display Angle On LCD 2024, ივლისი
Anonim
როგორ განვსაზღვროთ ბრუნვის მიმართულება ციფრული მბრუნავი გადამრთველიდან PIC– ით
როგორ განვსაზღვროთ ბრუნვის მიმართულება ციფრული მბრუნავი გადამრთველიდან PIC– ით

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

ნაბიჯი 1: ნაწილები

ნაწილები
ნაწილები

ამის განსახორციელებლად დაგჭირდებათ: მბრუნავი გადამრთველი (კვადრატი კოდირებული) ამოიღეთ რეზისტორები შესაბამისი მიკროკონტროლის პლატფორმა ჩემი პროექტისთვის მე გამოვიყენე Grayhill 61C22-01-04-02 ოპტიკური კოდირება. მბრუნავი გადართვის მონაცემების ფურცელი ითხოვს 8.2k ohm- ის გამწევ რეზისტორებს გადამრთველიდან მომდინარე ორ მონაცემთა ხაზზე. თქვენ გსურთ შეამოწმოთ მონაცემთა ფურცელი იმ კოდირებისთვის, რომლის გამოყენებასაც ირჩევთ. მბრუნავი გადამრთველი, რომელიც მე გამოვიყენე, ასევე შეიძლება შეუკვეთოთ ღერძულ ღილაკზე გადამრთველით. ეს არის სასარგებლო ფუნქცია იმ შერჩევის ჩასატარებლად, რომელიც დარეკილია და ა.შ. მაგრამ მე არ განვიხილავ მის ინტერფეისს აქ. მე მაქვს "შესაფერისი მიკროკონტროლის პლატფორმა" ჩამოთვლილი, რადგან (მე ვფიქრობ) ეს შეიძლება განხორციელდეს ერთზე მეტ პლატფორმაზე. მე მინახავს ბევრი ადამიანი, რომლებიც იყენებენ სხვა მიკროკონტროლერებს Instructables– ისთვის, ამიტომ მინდა ზოგადი მიდგომის ჩვენებაც. მე დავწერე ყველა კოდი PIC Basic Pro– ში მიკროჩიპთან PIC16F877A– ს გამოსაყენებლად. მართლაც, მთავარი, რაც გჭირდებათ მიკროკონტროლერზე, არის შეწყვეტის შესაძლებლობა, როდესაც ხდება ლოგიკური ცვლილება რომელიმე ორ პინზე. PIC16F877A– ზე ამას ქვია PORTB ცვლილების შეფერხება. შეიძლება სხვა სახელები იყოს სხვა კონტროლერებზე. ეს მიკროკონტროლერის შეწყვეტის ფუნქცია არის ნაწილი იმისა, რაც ამ განხორციელებას ასე ელეგანტურს ხდის.

ნაბიჯი 2: აპარატურის ინტერფეისი

აპარატურის ინტერფეისი
აპარატურის ინტერფეისი

"მარტივი" გამოსავალი იქნება "ერთი ბოძი -16 გასროლა" გადამრთველი 16 მიკროკონტროლერთან კავშირით. თითოეული გადართვის გამომავალი მიბმული იქნება მიკროკონტროლერის პინზე ისე, რომ აკრიფეთ ყველა პოზიცია მიკროკონტროლერის მიერ. ეს არის I/O ქინძისთავების გადაჭარბებული გამოყენება. ყველაფერი კიდევ უფრო გაუარესდება, თუ გვსურს, რომ 16 -ზე მეტი პოზიცია (დაკავებული) იყოს ჩვენთვის ხელმისაწვდომი გადამრთველზე. გადამრთველზე თითოეული დამატებითი პოზიცია მოითხოვს დამატებით შეყვანას მიკროკონტროლერში. ეს სწრაფად ხდება მიკროკონტროლერზე შეყვანის ძალიან არაეფექტური გამოყენება. შეიყვანეთ მბრუნავი გადართვის სილამაზე. მბრუნავ გადამრთველს აქვს მხოლოდ ორი გამოსავალი მიკროკონტროლერისთვის, რომელიც ჩამოთვლილია A და B მონაცემების ფურცელზე. არსებობს მხოლოდ ოთხი შესაძლო ლოგიკური დონე, რომელსაც შეუძლია მიიღოს ეს ხაზები: AB = 00, 01, 10 და 11. ეს მნიშვნელოვნად ამცირებს შეყვანის ხაზების რაოდენობას, რომელიც უნდა გამოიყენოთ მიკროკონტროლერთან გადამრთველის დასაკავშირებლად. ამრიგად, ჩვენ შევამცირეთ შეყვანის ხაზების რაოდენობა მხოლოდ ორზე. Ახლა რა? როგორც ჩანს, ჩვენ ნამდვილად გვჭირდება 16 განსხვავებული მდგომარეობა, მაგრამ ამ ახალ გადამრთველს აქვს მხოლოდ ოთხი. ჩვენ თვითონ გვესროლა ფეხი? არა წაიკითხეთ. ჩვენ განვიხილავთ მბრუნავი გადამრთველის მუშაობის თეორიას.

ნაბიჯი 3: ტექნიკის მუშაობის თეორია

აპარატურის მუშაობის თეორია
აპარატურის მუშაობის თეორია
აპარატურის მუშაობის თეორია
აპარატურის მუშაობის თეორია
აპარატურის მუშაობის თეორია
აპარატურის მუშაობის თეორია

ბრუნვის მიმართულების შეგრძნება შესაძლებელია ზემოაღნიშნული "ერთი ბოძი -16 სროლის" გადამრთველის გამოყენებით, მაგრამ ის იყენებს ბევრ შეყვანას მიკროკონტროლერზე. მბრუნავი გადამრთველის გამოყენება ამცირებს მიკროკონტროლერის შეყვანის რაოდენობას, მაგრამ ახლა ჩვენ გვჭირდება ინტერფეისის სიგნალების ინტერპრეტაცია და მათი ბრუნვის მიმართულებით გადათარგმნა. ადრე აღვნიშნე, რომ გადამრთველი იყო კვადრატული კოდირებული. ეს არის ასევე ერთ -ერთი მთავარი ელეგანტურობა ამ გადაწყვეტაში. ეს ნიშნავს, რომ არის 2-ბიტიანი კოდი, რომელსაც აძლევს გადამრთველი, რომელიც შეესაბამება გადართვის პოზიციას. თქვენ ალბათ ფიქრობთ: "თუ მიკროკონტროლერში არის ორი ბიტიანი შეყვანა, როგორ წარმოვადგენთ ყველა 16 პოზიციას?" ეს კარგი კითხვაა. ჩვენ არ წარმოვადგენთ მათ ყველას. ჩვენ უბრალოდ უნდა ვიცოდეთ ღილაკის შედარებითი პოზიციები, ასე რომ ჩვენ შეგვიძლია განვსაზღვროთ ბრუნვის მიმართულება. სახელურის აბსოლუტური პოზიცია შეუსაბამოა. საათის ისრის მიმართულებით ბრუნვისთვის, კოდი, რომელსაც გადამრთველი აძლევს, მეორდება ყოველ ოთხ წერტილში და ნაცრისფერია. რუხი კოდირებული ნიშნავს, რომ თითოეული პოზიციის ცვლილებისთვის არის მხოლოდ ერთი ბიტიანი ცვლილება. იმის ნაცვლად, რომ AB შეყვანის ათვლა საათის ისრის ბრუნვაში ორობითი ასე: 00, 01, 10, 11, ის იცვლება ასე: 00, 10, 11, 01. გაითვალისწინეთ, რომ ამ უკანასკნელი შაბლონისთვის, მხოლოდ ერთი შეყვანა იცვლება კომპლექტი. მიკროკონტროლერში AB შეყვანის საათის ისრის საწინააღმდეგო მნიშვნელობები ასე გამოიყურება: 00, 01, 11, 10. ეს არის საათის ისრის შებრუნებული ნიმუში AB = 00 პირველი ჩამოთვლილი. გადახედეთ დიაგრამებს უფრო ვიზუალური ახსნისთვის რა

ნაბიჯი 4: პროგრამის მუშაობის თეორია

პროგრამული უზრუნველყოფის ოპერაციის თეორია
პროგრამული უზრუნველყოფის ოპერაციის თეორია

რუტინა, რომელიც განსაზღვრავს ბრუნვის მიმართულებას, შეწყვეტილია. მიკროკონტროლერს, რომელსაც თქვენ ირჩევთ, უნდა შეეძლოს შეწყვეტა ნებისმიერ დროს, როდესაც შეწყვეტის ჩართვისას შეიცვლება (სულ მცირე) ორ პინზე. ამას ეწოდება PORTB ცვლილების შეწყვეტა PIC16F877A– ზე. როდესაც გადამრთველი ბრუნდება, მიკროკონტროლერი შეწყდება და პროგრამის შესრულება გადაეგზავნება შეფერხების სერვისის რუტინას (ISR). ISR სწრაფად გაარკვევს, თუ რომელი გზით იყო გადართული გადამრთველი, სათანადოდ დააყენებს დროშას და სწრაფად დაუბრუნდება მთავარ პროგრამას. ჩვენ გვჭირდება, რომ ეს სწრაფად მოხდეს იმ შემთხვევაში, თუ მომხმარებელი ძალიან სწრაფად ბრუნავს გადამრთველს. ჩვენ ვიცით, რომ ნაცრისფერი კოდირებული AB შაბლონი იმეორებს ყოველ ოთხ პოზიციას, ასე რომ, თუ ჩვენ ამ ოთხ პოზიციას შორის გადასვლის რუტინულ მუშაობას ვაკეთებთ, ის ყველა დანარჩენზე იმუშავებს. გაითვალისწინეთ, რომ ერთ ოთხ პოზიციურ ციკლში არის ოთხი კიდე. ამომავალი ზღვარი და დაცემა ზღვარი როგორც A შეყვანისთვის ასევე B შეყვანისთვის. მიკროპროცესორი გაწყდება ყოველ ჯერზე, როდესაც არსებობს ზღვარი, რაც იმას ნიშნავს, რომ მიკროკონტროლერი შეწყდება ნებისმიერ დროს, როდესაც ღილაკი გადატრიალდება. შედეგად, ISR– მა უნდა გაარკვიოს, რომელი მიმართულებით იყო მოქცეული სახელური. დასახმარებლად, როგორ გავაკეთოთ ეს, ჩვენ მივმართავთ ტალღის ფორმას საათის ისრის მიმართულებით. გაითვალისწინეთ, რომ ნებისმიერ დროს A- ს აქვს ზღვარი, მისი ახალი მნიშვნელობა ყოველთვის განსხვავდება B.- სგან. როდესაც სახელური გადადის 1-დან 2 პოზიციაზე, A გადადის ლოგიკა -0-დან ლოგიკაზე -1. B ჯერ კიდევ 0 არის ამ გადასვლისთვის და არ ემთხვევა A– ს ახალ მნიშვნელობას. კიდევ ერთხელ გაითვალისწინეთ, რომ B და A– ს ახალი მნიშვნელობა განსხვავებულია. ახლა ჩვენ შეგვიძლია დავინახოთ, რომ ნებისმიერ დროს A იწვევს შეწყვეტას საათის ისრის მიმართულებით, მისი ახალი მნიშვნელობა განსხვავდება B.- სგან. მოდით შევამოწმოთ B რა არის. B- ს აქვს მზარდი ზღვარი როდესაც გადამრთველი გადადის პოზიციიდან 2 -ზე 3. აქ, B- ის ახალი მნიშვნელობა იგივეა, რაც A. საათის ისრის მიმართულებით ბრუნვის ბოლო დარჩენილ ზღვარს ათვალიერებს, B- ს აქვს ვარდნის ზღვარი, რომელიც მოძრაობს 4 -დან 5 პოზიციაზე. (პოზიცია 5 იგივეა, რაც პოზიცია 1.) B- ის ახალი მნიშვნელობა აქ იგივეა, რაც A! ახლა ჩვენ შეგვიძლია გამოვიტანოთ გარკვეული გამოქვითვები! თუ A იწვევს შეწყვეტას და A– ს ახალი მნიშვნელობა განსხვავდება B– სგან, ბრუნვა იყო საათის ისრის მიმართულებით. გარდა ამისა, თუ B იწვევს შეწყვეტას და B- ის ახალი მნიშვნელობა იგივეა, რაც A, მაშინ ბრუნვა იყო საათის ისრის მიმართულებით. მოდით სწრაფად განვიხილოთ ისრის საწინააღმდეგო ბრუნვის შემთხვევა. საათის ისრის ბრუნვის მსგავსად, საათის ისრის საწინააღმდეგო ბრუნვა გამოიწვევს ოთხ შეწყვეტას ერთ ციკლში: ორი A შესასვლელისთვის და ორი შეყვანის B. შესასვლელს A აქვს მზარდი ზღვარი, როდესაც სახელური გადადის 4 -დან 3 -მდე და დავარდნილი ზღვარი მოძრაობს 2 -დან 1 -მდე როდესაც ღილაკი გადადის 4 -დან 3 -მდე, A- ის ახალი მნიშვნელობა იგივეა, რაც B. მნიშვნელობა. გაითვალისწინეთ, რომ როდესაც A გადადის 2 -დან 1 -მდე, მისი ახალი მნიშვნელობა იგივეა, რაც B- ს. ახლა ჩვენ ვხედავთ, რომ როდესაც A იწვევს წყვეტს და მისი ახალი მნიშვნელობა ემთხვევა B– ს, ბრუნვა იყო საათის ისრის საწინააღმდეგოდ. სწრაფად, ჩვენ შევხედავთ B შეყვანას ყველაფრის გადამოწმების მიზნით. B გამოიწვევს შეწყვეტას, როდესაც სახელური გადადის 5 პოზიციიდან (რაც იგივეა 1) 4 -მდე და როდესაც ღილაკი გადადის 3 პოზიციიდან 2. ამ ორივე შემთხვევაში, B- ის ახალი მნიშვნელობა არ ემთხვევა არსებულ მნიშვნელობას A– ს საპირისპიროა იმ შემთხვევებისა, როდესაც B იწვევს საათის ისრის ბრუნვის შეწყვეტას. ეს კარგი ამბავია. ყველაფერი ამოწმებს ისე, როგორც უნდა. შეჯამება, თუ A იწვევს შეწყვეტას და მისი ახალი მნიშვნელობა არ ემთხვევა B მნიშვნელობას, ან თუ B იწვევს შეწყვეტას და B– ის ახალი მნიშვნელობა შეესაბამება A– ს მნიშვნელობას, ჩვენ ვიცით, რომ იყო საათის ისრის მიმართულებით ბრუნვა. ჩვენ შეგვიძლია შევამოწმოთ პროგრამის საწინააღმდეგო საათის ისრის საწინააღმდეგო ბრუნვის სხვა შემთხვევები ან შეგვიძლია ვივარაუდოთ, რომ რადგან ის არ იყო საათის ისრის მიმართულებით, ის იყო ისრის საწინააღმდეგოდ. ჩემმა რუტინამ უბრალოდ გააკეთა ვარაუდი.

ნაბიჯი 5: პროგრამული უზრუნველყოფა

პროგრამული უზრუნველყოფა
პროგრამული უზრუნველყოფა
პროგრამული უზრუნველყოფა
პროგრამული უზრუნველყოფა

მე არ გამომიყენებია ჩამონტაჟებული შეფერხებები PIC Basic Pro– ში. მე გამოვიყენე რამოდენიმე ფაილი, რომელიც ჩავრთე დარელ ტეილორის კოდში რუტინის შესასრულებლად. სწორედ აქ ეკუთვნის დარელის უზარმაზარი დამსახურება! ფაილები უფასოა. უბრალოდ ეწვიეთ მის ვებსაიტს დამატებითი ინფორმაციისთვის, სხვა პროგრამებისთვის და ფაილების ჩამოსატვირთად. თქვენ შეგიძლიათ გამოტოვოთ ეს ნაწილი, თუ არ იყენებთ PIC– ს დარელ ტეილორის შეფერხებით. უბრალოდ შექმენით შეწყვეტა საჭიროებისამებრ იმ პლატფორმაზე, რომელსაც თქვენ იყენებთ. დარელ ტეილორის (DT) წყვეტების მისაღებად ორი რამ არის გასაკეთებელი: 1.) ჩართეთ DT_INTS-14.bas და ReEnterPBP.bas ფაილები თქვენს კოდი.2.) დააკოპირეთ და ჩასვით თქვენს კოდში. ASMINT_LIST მაკრო; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, დიახ endm INT_CREATEENDAS ჩადეთ ჩანართები და სივრცეები, როგორიცაა გრაფიკა ინსტრუქციის ბოლოს, ასე რომ თქვენ შეგიძლიათ მარტივად დაინახოთ ყველაფერი თქვენს კოდში. თქვენ ოდნავ უნდა შეცვალოთ იგი თქვენს მოთხოვნებს. ლეიბლის ქვეშ ჩაანაცვლეთ ISR ქვეპროექტის სახელით, რომელიც არის თქვენი ISR. ნუ დაივიწყებთ ხაზგასმას! თქვენ გჭირდებათ ეს! იმისათვის, რომ შეფერხებები მუშაობდეს, კიდევ ორი რამ არის გასაკეთებელი: 1.) ჩაწერეთ ISR. თქვენ ამას დაწერთ ზუსტად ისე, როგორც აპირებდით PBP ქვეგეგმის დაწერას, გარდა იმისა, რომ თქვენ დაგჭირდებათ @ INT_RETURN ქვეპროგრამის ბოლოს RETURN- ის ნაცვლად. ეს აღიარებს შეწყვეტას და დააბრუნებს პროგრამის შესრულებას იქ, სადაც ის მთავარ მარყუჟში დარჩა. ISR– ის შიგნით, თქვენ უნდა გაასუფთაოთ შეწყვეტის დროშა, რათა თქვენი პროგრამა არ დაიჭიროს რეკურსიულ შეფერხებაში. PORTB– ის წაკითხვა არის მხოლოდ ის, რაც უნდა გაკეთდეს PIC16F877A– ზე შეწყვეტის დროშის გასასუფთავებლად. თითოეულ განსხვავებულ მიკროკონტროლერს აქვს განსხვავებული გზა შეწყვეტის დროშების გასუფთავების მიზნით. შეამოწმეთ მონაცემების ფურცელი თქვენი მიკროკონტროლისთვის.2.) როდესაც მიაღწევთ თქვენს კოდის იმ წერტილს, რომლის შეწყვეტა გსურთ, გამოიყენეთ კოდის ეს ხაზი:@ INT_ENABLE RBC_INT როცა გსურთ შეწყვეტის გამორთვა უბრალოდ გამოიყენეთ:@ INT_DISABLE RBC_INT ბევრია იმ ნივთების შეფუთვაში, რაც მე ახლახანს განვიხილე, ასე რომ, მე სწრაფად შევაჯამებ. ჯერჯერობით, თქვენი პროგრამა ასე უნდა გამოიყურებოდეს:; რაიმე საჭირო დაყენება ან კოდი INCLUDE "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ASMINT_LIST მაკრო; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, დიახ endm INT_CREATEENDASM; ნებისმიერი სხვა საჭირო დაყენება ან კოდი@ INT_ENABLE RBC_INT; კოდი, რომელმაც უნდა იცოდეს რომელი მიმართულებით ბრუნავს ღილაკი@ INT_DISABLE RBC_INT; სხვა კოდიEND; ProgrammyISR- ის დასასრული:; ISR კოდი აქ@ INT_RETURN (Interrupt Handler Setup Table) მე ვფიქრობ, რომ ეს არის ის, სადაც ყველას, ვინც არ იყენებს PIC ან DT შეფერხებებს, შეუძლია კვლავ შეუერთდეს. ახლა ჩვენ უნდა დავწეროთ ISR, ასე რომ მიკროკონტროლერმა იცის რა მიმართულებით ბრუნავს ღილაკი. პროგრამული უზრუნველყოფის თეორიის განყოფილებიდან გავიხსენოთ, რომ ჩვენ შეგვიძლია გამოვიტანოთ ბრუნვის მიმართულება, თუ ვიცით შეყვანის გამომწვევი შეყვანა, მისი ახალი მნიშვნელობა და სხვა შეყვანის მნიშვნელობა. აქ არის ფსევდოკოდი: წაიკითხეთ PORTB ნაკაწრის ცვლადში, რომ გაასუფთაოთ დროშა შეამოწმეთ თუ A- მ გამოიწვია შეწყვეტა. თუ მართალია, შეადარეთ A და B. შეამოწმეთ განსხვავებული თუ განსხვავებული, ეს იყო საათის ისრის მიმართულებით ბრუნვა სხვა, ის იყო ისრის საწინააღმდეგო EndifCheck თუ B გამოიწვია შეწყვეტა. თუ მართალია, შეადარეთ A და B შეამოწმეთ თუ არა განსხვავებული, თუ იგივე, ის იყო საათის ისრის მიმართულებით ბრუნვა სხვა, ეს იყო ისრის საწინააღმდეგო Endif დაბრუნება შეწყვეტიდან როგორ ვიცით, რომ A ან B ცვლილებამ გამოიწვია შეფერხება? შეცვლილი შეყვანისა და სხვა (უცვლელი) შეყვანის ახალი მნიშვნელობის აღმოჩენა ადვილია, რადგან ჩვენ შეგვიძლია მათი წაკითხვა ISR– ის შიგნით. ჩვენ უნდა ვიცოდეთ, რა მდგომარეობაში იყო თითოეული მათგანი, სანამ აღსრულება გაეგზავნებოდა ISR- ს. ეს ხდება მთავარ რუტინაში. ძირითადი რუტინა ზის და ელოდება ბაიტის ცვლადს, რომელსაც ჩვენ CWflag ვუწოდეთ, რომ იყოს მითითებული 1 -ზე ან გაწმენდილია 0 -ზე ISR- ით. ღილაკის თითოეული აღიარებული ცვლილების შემდეგ ან თუ არ არსებობს ღილაკის აქტივობა, ცვლადი არის 5 -ზე მითითებული უმოქმედო მდგომარეობაზე. თუ დროშა დაყენებულია ან გაწმენდილია, ძირითადი რუტინა მაშინვე ზრდის ან ამცირებს მითითებულ წერტილის წნევას ბრუნვის შესაბამისად და შემდეგ CWflag ცვლადს აბრუნებს 5 – ზე, რადგან ღილაკი ისევ უმოქმედოა. როგორც ძირითადი რუტინა არის CWflag– ის შემოწმება, ის ასევე აფიქსირებს A და B მბრუნავი გადამრთველების მდგომარეობის მდგომარეობას. ეს მართლაც ძალიან მარტივია და ასე გამოიყურება: oldA = AoldB = B აქ მართლაც არაფერია გასაოცარი. უბრალოდ ჩართეთ ეს ორი ხაზი მარყუჟის დასაწყისში, რომელიც ამოწმებს CWflag- ს ბრუნვას. ჩვენ უბრალოდ ვაახლებთ მბრუნავი სახელურიდან შეყვანის ლოგიკურ მნიშვნელობებს ზრდა/შემცირების მარყუჟში ძირითად რუტინაში, ასე რომ ჩვენ შეგვიძლია დავინახოთ, თუ რა შეტევამ გამოიწვია შეწყვეტა ISR- ის შესრულებისას. აქ არის ISR კოდი: ABchange: scratch = PORTB 'წაიკითხეთ PORTB, რომ გათიშოთ დროშა' თუ A იწვევს წყვეტს, შეამოწმეთ B ბრუნვის მიმართულება IF oldA! = A მაშინ 'თუ A და B განსხვავებულია, ეს იყო საათის ისრის ბრუნვა IF A! = B შემდეგ GOTO CW 'წინააღმდეგ შემთხვევაში, ის იყო საათის ისრის საწინააღმდეგო ბრუნვა სხვა GOTO CCW ENDIF ENDIF' თუ B იწვევს შეწყვეტას, შეამოწმეთ A ბრუნვის მიმართულება IF oldB! = B THEN 'თუ A და B ერთნაირია, ის იყო საათის ისრის მიმართულებით ბრუნვა IF A == B შემდეგ GOTO CW 'წინააღმდეგ შემთხვევაში, ის იყო საათის ისრის საწინააღმდეგო ბრუნვა ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURN მე შევიტანე ISR კოდი AB_ISR.bas ფაილში, რადგან კოდის ჩანართები არ ჩანს ისე, როგორც უნდა. ახლა, რადგანაც ISR– ს აქვს ძველი მნიშვნელობები A და B შესასვლელებისთვის, მას შეუძლია განსაზღვროს რომელი შეყვანის შედეგად მოხდა შეფერხება, შეადაროს იგი სხვა (უცვლელ) შეყვანას და განსაზღვროს მიმართულება ბრუნვის. ყველა ძირითადი რუტინული უნდა გააკეთოთ, შეამოწმოთ CWflag, რომ ნახოთ რომელი მიმართულებით აღმოჩნდა მჭიდი (თუ აქვს) და გაზარდოთ ან შეამციროთ მრიცხველი, დააყენოთ წერტილი ან რაც მოგწონთ ან გჭირდებათ. ვიმედოვნებ, რომ ეს ეხმარება და არც ყოფილა დამაბნეველი ამ ტიპის ინტერფეისი განსაკუთრებით სასარგებლოა, თუ თქვენი სისტემა უკვე იყენებს შეფერხებებს, რადგან ეს არის მხოლოდ ერთი შეწყვეტა დასამატებლად. ისიამოვნეთ!

გირჩევთ: