Saturday, June 16, 2012

ინფორმაციის შეყვანა მიკროკონტროლერში


ინფორმაციის შეყვანა მიკროკონტროლერში.

წინა პუბლიკაციებში დაწვრილებით იყო განხილული Atmega8 მიკროკონტროლერიდან ინფორმაციის გამოყვანის პროცედურა, Alhorithm Builder კომპილატორი და Proteus სიმულატორი. ამ პუბლიკაციაში განვიხილავთ მიკროკონტროლერში ინფორმაციის შეყვანის მაგალითს. წინა ალგორითმი ახორციელებდა მიკროკონტროლერის PB0, PB1 გამომყვანებთან  მიერთებული შუქდიოდების მონაცვლეობით ციმციმს. გარდავქმნათ ალგორითმი ისე, რომ იგი დამატებით ახორციელებდეს PC1, PC2 გამომყვანებთან მიერთებული შუქდიოდების მართვას ღილაკის საშუალებით, რომელიც მიერთებულია PC0 გამომყვანთან.


ალგორითმის ნახაზზე წითელი და მწვანე ფერებით გამოყოფილია ალგორითმში შეტანილი ცვლილებები. განვიხილოთ ისინი დაწვრილებით. პირველი სამი წითელი სტრიქონი ადგენს C პორტის PC0, PC1, PC2 გამომყვანების მიმართულებებს. კერძოდ, PC0 იმუშავებს ინფორმაციის შეყვანაზე, PC1, PC2 - გამოყვანაზე. C პორტის დანარჩენი გამომყვანების მიმართულებები უცვლელად დარჩა. აქ გამოვიყენეთ კონსტრუქცია  #->DDRx .# , რომელიც საშუალებას იძლევა „1“ ან „0“ უშუალოდ ჩავწეროთ DDRC რეგისტრის ცალკეულ თანრიგებში და ამით განვსაზღვროთ C პორტის ცალკეული გამომყვანების მიმართულებები.
განსაკუთრებული ყურადღების ღირსია მე-4 წითელი სტრიქონი. მართლაც, თუ PORTC-ს ნულოვანი გამომყვანი (PC0) შეყვანაზე დავაპროგრამეთ, რატომღა ვწერთ PORTC-ს ნულოვან თანრიგში ლოგიკურ „1“ ?  საქმე შემდეგშია: თუ პორტის გამომყვანი ინფორმაციის გამოყვანაზეა დაპროგრამებული (ე.ი. DDRx .# = 1), მაშინ ბრძანებები R->PORTx ,  1->PORTx .#  ან  0->PORTx .#  იწვევს შეაბამისი გამომყვანის ლოგიკური „1“ ან „0“ მდგომარეობაში  გადართვას, იმის და მიხედვით, თუ რა იყო ჩაწერილი PORTx-ის შესაბამის თანრიგში.  თუ პორტის გამომყვანი შეყვანაზეა დაპროგრამებული (ე.ი. DDRx .# = 0), მაშინ იგივე ბრძანებები იწვევენ შესაბამის გამომყვანებსა და კვების წყაროს  შიდა პლუს გამომყვანს შორის შიდა რეზისტორების მიერთებას ან მათს გათიშვას ( „1“ იწვევს შიდა რეზისტორის მიერთებას, „0“ - გათიშვას). ეს ღონისძიება იმისათვის არის საჭირო, რომ შეყვანაზე დაპროგრამებული გამომყვანი ჰაერში ჩამოკიდებული არ აღმოჩდეს. უკანასკნელ შემთხვევაში ამ გამომყვანთან მიერთებულ მავთულზე გარეშე ელექტრომაგნიტური ტალღებით გამოწვეულმა შემთხვევითმა პოტენციალებმა შეიძლება ყველაფერი აგვირიოს. თუ მე-4 წითელ სტრიქონს არ გამოვიყენებდით, მაშინ მოგვიწევდა სქემაში კიდევ ერთი, R5 რეზისტორის ჩართვა როგორც ეს ქვემოთ მოყვანილ სქემაზეა ნაჩვენები.

წითელ მე-5 და მე-6 სტრიქონებში ხდება R2, R3 რეგისტრებში საწყისი მნიშვნელობების ჩაწერა. წითელი მე-7 სტრიქონი ამოწმებს, დაჭერილია, თუ არა, ღილაკი (C პორტის ნულოვან გამომყვანზე შეიძლება იყოს ლოგიკური „1“ ან „0“; თუ ლოგიკური ნოლია, მაშინ ღილაკი დაჭერილია).  თუ ღილაკი დაჭერილი არ არის, მაშინ სრულდება წითელი მე-8 სტრიქონი -რეგისტრში R3 იწერება „0“ და პროგრამა აგრძელებს D1, D2 შუქდიოდების ციმციმის მომსახურებას. თუ ღილაკი დაჭერილია, მაშინ პროგრამა გადადის ალგორითმის მწვანე შტოზე. პირველ მწვანე სტრიქონში მოწმდება - ამ მომენტისათვის ღილაკი დაჭერილი იყო, თუ არა (R3 = 0 ?). თუ არ იყო დაჭერილი - მაშინ ფიქსირდება, რომ ახლა უკვე დაჭერილია (1->R3, სტრიქონი მე-2) და რეგისტრი R2-ის მნიშვნელობა იზრდება ერთით (R2++, სტრიქონი მე-3). შემდეგ მოწმდება მერამდენე დაჭერაა. თუ ღილაკი მესამედ არის დაჭერილი, მაშინ დაჭერის მრიცხველი განოლდება და D3, D4 შუქდიოდები ჩაქრება (0->R2, 0->PORTC .1, 0->PORTC .2). თუ ღილაკი მეორედ იქნა დაჭერილი, მაშინ აინთება D4 ,  ჩაქრება D3  (1->PORTC .2, 0->PORTC .1). თუ R2 არ უდრის არც 3 და არც 2, მაშინ ეს პირველი დაჭერაა, ამიტომ ჩაქრება  D4,  აინთება D3 (0->PORTC .2, 1->PORTC .1) და პროგრამა გადავა D1, D2 შუქდიოდების მომსახურებაზე. შემდეგ ისევ შემოწმდება ღილაკის დაჭერა და თუ ღილაკი აშვებული არ იყო, მაშინ არაფერი არ შეიცვლება - პროგრამა გააგრძელებს D1, D2 შუქდიოდების მომსახურებას. სიტუაცია შეიცვლება, თუ ღილაკს ავუშვებთ. ამ დროს R3 განოლდება (წითელი მე-8 სტრიქონი) და მორიგი შემოწმებისას ისევ ჩაირთვება D3, D4 შუქდიოდების მომსახურება.
შეამოწმეთ ალგორითმის მუშაობა Proteus-ის დახმარებით. როგორ კეთდება ეს,  აღწერილია წინა პუბლიკაციებში. აქ მხოლოდ ავღნიშნავ, რომ ღილაკის შემოსაყვანად საჭიროა Proteus -ის მენიუში აირჩიოთ „Library”, “Pick Device/Symbol” და ფანჯარაში “Keyword” აკრიფოთ “button”.
გაუშვით სიმულაცია. D1, D2 შუქდიოდები მონაცვლეობით უნდა ინთებოდნენ, ხოლო  D3, D4 შუქდიოდება ღილაკზე მაუსის დაჭერისას უნდა იცვლიდნენ ნათებას.
ადვილი შესამჩნევია, რომ შუქდიოდები საგრძნობლად აგვიანებენ რეაქციას ღილაკის დაჭერაზე. ეს იმის ბრალია, რომ მიკროკონტროლერი დაკავებულია დაყოვნების ქვეპროგრამის შესრულებით (Delay). თუ როგორ შეძლება გამოსწორდეს ეს ნაკლი, განხილული იქნება მომდევნო პუბლიკაციაში. თვალყური ადევნეთ პუბლიკაციებს. ნუ შეეცდებით გადაახტეთ მათ თანმიმდევრობას!

No comments:

Post a Comment