Friday, June 15, 2012

მიკროკონტროლერის პროგრამირება ერთ დღეში (ნაწ. 1)


მიკროკონტროლერის პროგრამირება ერთ დღეში (ნაწ. 1)
შევადგინოთ და გამოვცადოთ პროგრამა Atmega8 მიკროკონტროლერისათვის, რომელიც უზრუნველყოფს შუქდიოდის ციმციმს. დაგვჭირდება მხოლოდ ორი პროგრამა:
1.
Algorithm builder
http://www.algrom.net/russian.html
2. Proteus http://bin.ge/file/60446/Proteus-7-6-SP0-rus.rar.html
პირველი მათგანიAlgorithm builder წარმოადგენს გრაფიკულ კომპილატორს, რომელიც იძლევა ფირმა Atmel-ის მიკროკონტროლერებისათვის პროგრამული კოდის შედგენის საშუალებას პროგრამირების გარეშე.
მეორე პროგრამული პროდუქტიProteus შეიცავს ელექტრონული მოწყობილობების პრინციპული სქემების შექმნის და მათი მუშაობის მოდელირების პროგრამას -ISIS და ნაბეჭდი დაფების პროექტირების პროგრამას -ARES. ჩვენ ამ სისტემიდან გამოვიყენებთ მხოლოდ პირველ მათგანს.
“My Documents”
ფოლდერში შექმენით ახალი ფოლდერი “Mc1day”დააინსტალირეთ და გაუშვით Algorithm builder . ამოირჩიეთ File, New.მენიუში აირჩიეთ “Options” “Project Options” და “Chip” ჩამონათვალში მონიშნეთ Atmega8.იქვე “Clock frequency,Hz” ფანჯარაში ჩაწერეთ 1000000. ამრიგად მოვახდინეთ მიკროკონტროლერის ტიპისა და მისი სატაქტო სიხშირის ამორჩევა. ერთი ტაქტის ანუ ერთი ბრძანების შესრულების დრო ამ სიხშირის შებრუნებული სიდიდის (ანუ, ჩვენს შემთხვევაში, 1 მიკროსეკუნდის) ტოლი იქნება.მენიუში აირჩიეთ “File” “Save As” და შეინახეთ პროექტი თქვენს მიერ შექმნილ ფოლდერში იმავე სახელით “Mc1day”.
“|” სიმბოლო აღნიშნავს პროგრამის ან ქვეპროგრამის დასაწყისს -”Vertex”. გადაინაცვლეთ ამ სიმბოლოზე და დაარქვით მას “RESET”. ჩვენს პროგრამაში ეს ის წერტილია, საიდანაც იწყება პროგრამის შესრულება კვების წყაროს ჩართვისას. იმისთვის, რომ ეს სწორედ ასეა და RESET არ არის უბრალოდ ქვეპროგრამა, საჭიროა, რომ “RESET” იყოს გამუქებული (Bold). ეს მიიღწევა F2 კლავიშის დაჭერით ან მენიუში “Elements” “Bold” ამორჩევით.
NOP – ცარიელი ბრძანებაა, მისი შესრულებისას არავითარი ოპერაცია არ სრულდება, უბრალოდ ხდება ერთი ტაქტის გამოტოვება. “<- Backspace” კლავიშის საშუალებით წაშალეთ იგი და მის ნაცვლად ჩაწერეთ:
სიმბოლო ” -> ” მიიღება “~” კლავიშზე დაჭერით და აღნიშნავს მინიჭების ოპერაციას. ჩვენი ჩანაწერი კი შეესაბამება ბრძანებას “თექვსმეტობითი რიცხვი FF გადაგზავნე რეგისტრში R16″ (შეგახსენებთ, რომ თექვსმეტობითი FF უდრის ორობით რიცხვს 1111 1111). რა თქმა უნდა, $FF-ის ნაცვლად შეგვეძლო ჩაგვეწერა ათობითი 255 -> R16, მაგრამ პროგრამირებისას მიღებულია თექვსმეტობითი ფორმატის ხმარება – უმჯობესია მიეჩვიოთ. დააჭირეთ <–| Enter”.
თაგუნას კურსორი “NOP” ბრძანების მარცხნივ აღმოჩნდა, ამიტომ წაშლა აღარ არის საჭირო. შეგვიძლია გავაგრძელოთ ახალი ბრძანების ბეჭდვა.
“R16 -> DDRB” ნიშნავს “გადაგზავნე R16 რეგისტრი B პორტის DDR რეგისტრში”. მიკროკონტროლერის შეყვანა/გამოყვანის (I/O) პორტები განკუთვნილია როგორც ინფორმაციის შესაყვანად, ისე მის გამოსაყვანად. ამიტომ მიკროკონტროლერს უნდა ეცნობოს, რომელ რეჟიმში უნდა იმუშაოს პორტმა. პორტი 8 თანრიგიანია და შესაძლებელია მისი ცალკეული თანრიგების გამომყვანები სხვადასხვა რეჟიმში მუშაობდენ. თუ პორტის DDR რეგისტრის რომელიმე თანრიგში “1″ ჩავწერთ, მაშინ პორტის შესაბამისი თანრიგის გამომყვანი ინფორმაციის გამოყვანის რეჟიმში გადაირთვება. “0″ ჩაწერა იწვევს ინფორმაციის შეყვანის რეჟიმში გადართვას. ჩვენ DDRB რეგისტრში $FF ჩავწერეთ (სწორედ ეს რიცხვი იყო R16 რეგისტრში), რაც გამოწვევს B პორტის ყველა 8 გამომყვანის გადართვას ინფორმაციის გამოყვანის რეჟიმში. რომ ჩაგვეწერა რიცხვი $E4 (ორობითი 1110 1000), მაშინ მიკროკონტროლერის B პორტის გამომყვანები B7,B6,B5 გადაირთვებოდა გამოყვანის რეჟიმში, B4 – შემოყვანის რეჟიმში, B3 -გამოყვანის რეჟიმში, B2,B1,B0 – შემოყვანის რეჟიმში.
გავაგრძელოთ: გამოვიყვანოთ “1″ B პორტის ყველა თანრიგში. ახლა, თუ B პორტის რომელიმე გამომყვანზე შუქდიოდს მივაერთებთ და პროგრამას გავუშვებთ, მაშინ შუქდიოდი აინთება.
შევეცადოთ, რომ შუქდიოდი ციმციმებდეს. ამისათვის საჭიროა, რომ შუქდიოდი რაღაც დროის განმავლობაში ენთოს, შემდეგ იმავე დროის განმავლობაში ჩაქრეს და პროცესი განმეორდეს.
მენიუში ამოირჩიეთ “Elements” “Label” . ამ ოპერაციის მეშვეობით ჩვენ შევქმენით “ჭდე” – ადგილი, სადაც შემდგომში შეგვიძლია დავბრუნდეთ.
R17, R18 რეგისტრებში ჩავწეროთ $FF. “R17- -”(ორი მინუსი) ნიშნავს “შეამცირე R17 რეგისტრის მნიშვნელობა ერთით”. თუ ამ ოპერაციას 255-ჯერ ($FF) გავიმეორებთ, მაშინ R17-ის მნიშვნელობა 0 -ის ტოლი გახდება, მაგრამ ამაზე 255 ტაქტი დაიხარჯება. ანუ მივიღებთ 255 ტაქტიან დაყოვნებას.რეალურად დაყოვნება გაცილებით მეტი იქნება, რადგან R17-ის მნიშვნელობის შემოწმებასაც დრო სჭირდება.
შევამოწმოთ უდრის თუ არა R17 რეგისტრის მნიშნელობა 0-ს. ამისთვის მენიუში ავირჩიოთ “Elements” “Condition” და შევამოწმოთ R17>0 ? თუ ეს ასეა, მაშინ გავიმეოროთ R17–. თუ ეს ასე არ არის (თუ R17 უკვე უდრის 0-ს), მაშინ გავაგრძელოთ – გადავიდეთ შემდეგ ბრძანებაზე. გადასვლის იმართულების საჩვენებლად გამოიყენეთ კლავიში “Alt” და იმავდროულად “მარჯვნივ”, “ზევით”, “მარცხნივ” ისრიანი კლავიშები.



R18 რეგისტრისათვის ანალოგიური ოპერაციების ჩატარება საშუალებას მოვცემს გავზარდოთ დაყოვნება კიდევ 255-ჯერ. ამ დროის განმავლობაში ჩვენი შუქდიოდი იქნება ანთებული. გავიმეოროთ იგივე პროცედურა ჩამქრალი შუქდიოდისათვის და დავიწყოთ თავიდან.
წითლად მონიშნული გადასვლის განსახორციებლად საჭიროა მენიუში აირჩიოთ “Elements” “JMP Vector” და შემდეგ გამოიყენოთ “Alt” + ისრიანი კლავიშები.




ალგორითმის შედგენა დასრულებულია! ახლა საჭიროა მისი კომპილაცია. ანუ საჭიროა, რომ გრაფიკული ფორმით წარმოდგენილი ალგოროთმიდან მივიღოთ მიკროკონტროლერის პროგრამულ მახსოვრობაში (FlashROM) ჩასაწერი კოდი. ამისთვის საჭიროა მენიუში აირჩიოთ “Program” “Compile” . კომპილატორი გვაცნობებს, რომ კომპილაცია წარმატებით დასრულდა. მენიუში აირჩიეთ “File” “Save” და დახურეთ პროგრამა.
გახსენით თქვენი ფოლდერი “Mc1day”. ნახავთ, რომ იქ შეიქმნა ახალი ფოლდერი “Mc1day_INI”, რომელშიც მოთავსებულია ინფორმაცია პროექტის შესახებ. ამ ფოლდერის შიგთავსი არ გვაინტერესებს. ჩვენთვის მნიშვნელოვანია მის გარეთ მოთავსებული ფაილები. Mc1day.alp – ეს თვით პროექტის ფაილია, Mc1day.hex – ეს სწორედ ის ფაილია, რომელიც უნდა ჩაიწეროს მიკროკონტროლერის FlashROM-ში, EE_Mc1day.hex – ფაილი წარმოადგენს მიკროკონტროლერის მუდმივი მახსოვრობის (EEPROM) შიგთავსს. მუდმივი მახსოვრობა ჩვენ არ გამოგვიყენებია, ამიტომ ეს ფაილი არ დაგვჭირდება. იმის შესახებ, თუ როგორ უნდა გამოვიყენოთ Mc1day.hex ფაილი – შემდეგ სტატიაში.

No comments:

Post a Comment