პროგრამირების mk საწყისი ნულიდან. AVR პროგრამირება

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

სამწუხაროდ, ყველას სურს დაუყოვნებლივ. აქედან გამომდინარე, მე გადავწყვიტე წასვლა მეორე მხრივ - ტრენინგი SI- ზე, მაგრამ მისი საცვლების შოუ. კარგი პროგრამისტი- embedder ყოველთვის ფლობს მისი ნაჭერი რკინის for squall, გარეშე მისცეს ნაბიჯი ნაბიჯი ნებართვის გარეშე. ასე რომ, ეს იქნება დასაწყისში ასე კოდი, მაშინ რა დაიბადა შემდგენელი და როგორ მართლაც მუშაობს სინამდვილეში :)

მეორეს მხრივ, si ძლიერი მხარე ეს არის porteability კოდი. თუ, რა თქმა უნდა, სწორად წერა. პროექტის სხვადასხვა ნაწილში მუშაობის ალგორითმების და მათი რკინის დანერგვა. შემდეგ, ალგორითმის სხვა MK- ს გადასცეს, საკმარისია მხოლოდ ინტერფეისის ფენის გადაწერა, სადაც ჯირკვლის ყველა მიმართვა დაწერილია და მთელი სამუშაო კოდი დატოვებს. და, რა თქმა უნდა, წაკითხული. Sash წყარო წყარო უფრო ადვილია გასაგები ერთი შეხედვით (თუმცა .. მე, მაგალითად, არ აინტერესებს რა flirt არის მინიმუმ si, მინიმუმ AFM :)), მაგრამ, კიდევ ერთხელ, თუ დაწერე ყველაფერი უფლება. ამ მომენტებით, მეც ყურადღება მიაქციე.

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

პირველი პროგრამა C- სთვის AVR- ზე

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

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

ასევე არის Codevision AVR C.- ძალიან პოპულარული შემდგენელი. იგი პოპულარული გახდა მისი სიმარტივის შესახებ. სამუშაო პროგრამა თქვენ შეგიძლიათ მიიღოთ მასში რამდენიმე წუთში - საწყის კოდის ოსტატი ხელს უწყობს, ყველა სახის ყურების ინიციალიზაციის ბეჭედს. პატიოსნად, მე ვწუხვარ, რომ ეჭვმიტანილი მქონდა - რატომღაც მე მქონდა ამ შემდგენელის მიერ დაწერილი პროგრესი, გარკვეული სახის ნიშნავდა, მაგრამ არა კოდი. საშინელი ოდენობა არასაჭირო ზედმეტი ზედმეტი და ოპერაციების, რომელიც გადაისხა მცირე კოდები და ნელი სიჩქარე. თუმცა, ალბათ იყო შეცდომა დნმ წერდა ორიგინალური firmware. პლუს მას სურს ფული. არ ჰგავს IAR, მაგრამ შესამჩნევი. და Demozhim- ში არა უმეტეს 2KB კოდექსზე.
ბზარი რა თქმა უნდა, მაგრამ თუ თქვენ მოიპარონ, ასე მილიონი, გრძნობა IAR :)

Არსებობს ასევე Image Craft AVR გ და მიკროქო მიკროელექტრონიკიდან. არც სხვა გამოყენების გამოყენება, მაგრამ აქ SWG. ძალიან plowing MicropascalMelt არის საშინლად მოსახერხებელი პროგრამირების გარემო და ბიბლიოთეკა. მე ვფიქრობ, რომ მიკროუსი არ იქნება უარესი, არამედ გადაიხადა.

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

ასე რომ, ჩამოტვირთეთ Winavr C და AVR სტუდია დააყენოთ. შემდეგ სტუდია პირველად დააყენა, მაშინ, ზემოთ, Winavr რულონებს მეტი და clings to სტუდიაში სახით მოდული. მე მკაცრად ვურჩევ Winavr- ის ინსტალაციას მოკლევადიან პერსპექტივაში, რაღაც C: \\ winavr ამით, რითაც თქვენ თავიდან აცილება piles პრობლემები გზებით.

პროექტის შექმნა
ასე რომ, სტუდია გადაეცემა, Si არის fastened, დროა ცდილობენ რაღაც პროგრამა. დავიწყოთ მარტივი, მარტივი. სტუდიის გაშვება, აირჩიე იქ ახალი პროექტი, როგორც შემდგენელი AVR GCC და შეიტანეთ სახელი პროექტის.

ხსნის სამუშაო ველს ცარიელი * .c ფაილი.

ახლა კი არ აფერხებს სტუდიის ჩანართების გზების კონფიგურაციას. ამისათვის, slant at:
ინსტრუმენტები მენიუ - პარამეტრები - ზოგადი - Filetabs და აირჩიეთ "ფაილის სახელი მხოლოდ" ჩამოსაშლელი სიაში. წინააღმდეგ შემთხვევაში შეუძლებელი იქნება მუშაობა - Tab- ზე იქნება ფაილის სრული გზა და ეკრანზე ორი ჩანართზე მეტი იქნება.

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

Pile შევიდა ღილაკს მექანიზმი.


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

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

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


Სულ ეს არის. ჯიმ ყველგან OK და წასვლა წყარო.

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

ეს ასე იმუშავებს:
COM პორტის ჩამოსვლისთანავე, ერთეული (კოდი 0x31) იქნება განათება diodion, ხოლო როდესაც ნულოვანი (კოდი 0x30) ჩამოსვლა ხდება. უფრო მეტიც, ყველაფერი შესრულდება interrupts, და ფონური ამოცანა იქნება blinking სხვა დიოდი. უბრალოდ და მნიშვნელობა.

შეაგროვეთ სქემა
ჩვენ გვჭირდება დაკავშირება USB-USART კონვერტორი მოდული Microcontroller Usart კონვერტორები. ამის გაკეთება, მიიღოს jumper ორი გაყვანილობა და დააყენა ჯვარი ქინძისთავები ჯვარი. ანუ, RX კონტროლერი აკავშირებს TX Converter- თან და TX კონვერტორს RX კონტროლერთან.

აღმოჩნდება, შედეგად, ეს არის ასეთი სქემა:


სხვა დასკვნების, კვების, გამონადენი, ეს არის სტანდარტული

ჩვენ ვწერთ კოდს

დაუყოვნებლივ გააკეთე დაჯავშნა, რომ მე არ გავაღრმავებ სპეციალურად SI ენის აღწერას. ამისათვის უბრალოდ არსებობს უზარმაზარი მატერიალური მასალა, დაწყებული კლასიკა "SI პროგრამირების ენა" K & R- დან და სხვადასხვა ტექნიკით დამთავრებული.

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

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

ნაკლებად სავარაუდოა, რომ მე უკეთესი აღწერს, ამიტომ ტრენინგის კურსის ნაცვლად, ლურჯი subtleties- ის დეტალური ექსპოზიციის ნაცვლად, მე უბრალოდ პირდაპირი ბმულები ამ ტექნიკის გარკვეულ გვერდებზე მივცემ.

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

1 #Include.

#Include.

ეს ფაილი არის საქაღალდეში Winavr. და იგი შეიცავს ყველა რეესტრს და კონტროლერის ყველა რეესტრს. და იქ ყველა cunning, მითითებით კონკრეტული კონტროლერი, რომელიც გადაცემულია შემდგენელი მეშვეობით Გააკეთოს ფაილი პარამეტრი MCU. და ამ ცვლადის საფუძველზე თქვენს პროექტში, სათაურის ფაილი ყველა პორტების მისამართების აღწერა და რეგისტრაცია ამ კონტროლერს წარმოადგენს. როგორ! ამის გარეშეც შესაძლებელია, მაგრამ მაშინ ვერ შეძლებთ რეესტრის სიმბოლურ სახელებს, როგორიცაა SREG ან UDR და უნდა გვახსოვდეს თითოეული "0xc1", და ეს არის ხელმძღვანელი.

იგივე გუნდი თავად #Include.<имя файла> საშუალებას გაძლევთ დაამატოთ თქვენი პროექტი ნებისმიერი ტექსტური ფაილის შინაარსი, მაგალითად, ფაილი, რომელიც აღწერს ფუნქციებს ან სხვა კოდის ნაწილს. და ისე, რომ დირექტივა იპოვის ამ ფაილს, ჩვენ მიუთითეთ ჩვენი პროექტის გზები (Winavr- ის დირექტორია უკვე არსებობს).

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

  • დაბრუნების ღირებულება, მაგალითად, sin (x) დააბრუნებს X სინუსის ღირებულებას. როგორც მათემატიკაში, მოკლედ.
  • გადაცემული პარამეტრების, იგივე X.
  • სხეულის ფუნქცია.

ყველა ღირებულებები გადაცემული და დაბრუნდა უნდა იყოს ნებისმიერი ტიპის, რაც დამოკიდებულია მონაცემებზე.

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

1 2 3 4 5 Int main (ბათილია) (დაბრუნება 0;)

int main (ბათილია) (დაბრუნება 0;)

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

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

რა თქმა უნდა, microcontroller მთავარი. პრინციპში არაფერი არ შემიძლია და თეორიულად უნდა იყოს ბათილად ძირითადი (ბათილია)მაგრამ GCC თავდაპირველად არის გაშენებული PC- ზე და იქ პროგრამას შეუძლია დაბრუნდეს ოპერაციული სისტემის ღირებულება დასრულების შემდეგ. ამიტომ GCC- ზე ბათილად ძირითადი (ბათილია) გაფრთხილება.

ეს არ არის შეცდომა, ის იმუშავებს, მაგრამ მე არ მომწონს ვარნაციები.

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

Ესენი არიან { } ფიგურა ფრჩხილებში არის პროგრამული ბლოკი, ამ შემთხვევაში სხეულის ფუნქცია მთავარი., იქნება კოდი.

Დაბრუნების. - ეს არის დაბრუნების ღირებულება, რომ ძირითადი ფუნქცია დასრულდება დასრულების შემდეგ, რადგან ჩვენ ვართ int, ანუ, რიცხვი, რომელიც ჩვენ უნდა დავუბრუნდეთ რიცხვს. მიუხედავად იმისა, რომ ჯერ კიდევ არ არის აზრი, რადგან Microcontroller- ზე მთავარ, ჩვენ, გარდა არსად. დავბრუნდები ნულოვანი. არაფრისთვის. და შემდგენელი, როგორც წესი, ჭკვიანი და კოდი არ ქმნის კოდს.
თუმცა, თუ თქვენ pervert, მაშინ მთავარი. თქვენ შეგიძლიათ წასვლა MC - მაგალითად, ჩამონტაჟებული bootloader განყოფილებაში და შეასრულოს იგი, მაგრამ უკვე არსებობს დაბალი დონის firmware კრეფა, შეცვალოს გარდამავალი მისამართები. ქვემოთ ნახავთ და გაიგებთ, თუ როგორ უნდა გავაკეთოთ ეს. Რისთვის? ეს არის კიდევ ერთი კითხვა, 99.999% შემთხვევაში ეს Nafig არ არის აუცილებელი :)

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

1 2 3 4 5 6 Int main (ბათილად) (ხელმოწერილი char i; დაბრუნება 0;)

int main (ბათილად) (ხელმოწერილი char i; დაბრუნება 0;)

ხელმოწერა. ასე რომ არ არის დაუზუსტებელი. ფაქტია, რომ ორობითი წარმომადგენლობით, ჩვენ გვყავს უფროსი ბიტი ნიშანი, რომელიც ნიშნავს ერთ ბაიტას (char) ნომერი + 127 / -128, მაგრამ თუ ნიშანი გაუქმება იგი უკვე 0-დან 255 წლამდე. როგორც წესი, ნიშანი არის არაა საჭირო. Ამიტომ ხელმოწერა..
ᲛᲔ. - ეს არის მხოლოდ ცვლადის სახელი. Მეტი აღარ.

ახლა თქვენ უნდა დაიწყოთ პორტების ინიციატივა Utart.. რა თქმა უნდა, თქვენ შეგიძლიათ მიიღოთ და დააკავშიროთ ბიბლიოთეკა და მოვუწოდებთ რაიმე სახის UARTINIT (9600); მაგრამ მაშინ არ იცი, რა მოხდა სინამდვილეში.

ჩვენ ამას ვაკეთებთ:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Int main (ბათილად) (ხელმოწერილი char i; #define xtal 8000000l #define baudrate 9600l #Define bauddivider (xtal / (16 * baudrate) -1) #Define hi (x) ((x) \u003e\u003e 8) #define lo (x) ((x) & 0xff) ubrl \u003d lo (bauddivider); Ubrrh \u003d hi (bauddivider); Ucsra \u003d 0; Ucsrb \u003d 1.<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main (ბათილად) (ხელმოწერილი char i; #define xtal 8000000l #define baudrate 9600l #define bauddivider (xtal / (16 * baudrate) -1) #define hi (x) (x) (x) (x) \u003e\u003e 8) #define lo x) (x) & 0xff) ubrrl \u003d lo (bauddivider); ubrrh \u003d hi (bauddivider); ucsra \u003d 0; ucsrb \u003d 1<

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

ისინი ხელს შეუწყობენ თქვენი რუტინული ოპერაციების გამოთვლას საჭირო კოეფიციენტების გამოთვლა. პირველ რიგში ვამბობთ, რომ ამის ნაცვლად XTAL თქვენ შეგიძლიათ უსაფრთხოდ შეცვალონ 80,000,000 და ლ.- გაცნობის სპეციფიკაცია, ხანგრძლივი mall არის პროცესორი საათის სიხშირე. იგივე baudrate. - UART- ის მონაცემების სიხშირე.

bauddivider. უკვე უფრო რთული, ნაცვლად იმისა, რომ ორი წინა პირის ფორმულა გამოითვლება.
კარგად სესხს და ჩი ამ შედეგისგან მიიღებს ახალგაზრდა და უფროსი ბაიტებს, რადგან ერთ byte ეს აშკარად არ შეესაბამება. -ში ჩი ICSE SHIFT კეთდება (მაკროის შეყვანის პარამეტრი) რვაჯერ მარჯვნივ, შედეგად, მხოლოდ უძველესი ბაიტი დარჩება. ბ. სესხს ჩვენ გავაკეთეთ სურათების და ნომერი 00FF, შედეგად, მხოლოდ ახალგაზრდა Byte დარჩება.

ასე რომ ყველაფერი, რაც კეთდება #Define თქვენ შეგიძლიათ უსაფრთხოდ ჩააგდოთ, და სასურველი ნომრები ითვლიან კალკულატორს და დაუყოვნებლივ შევა მათ UBBRL \u003d ხაზები .... და ubbrh \u003d ... ..

შეიძლება. მაგრამ! ამის გაკეთება ეს კატეგორიულად შეუძლებელია!

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

მაშინ ყველაფერი მარტივია:
ყველა ეს "UBRRL და CO" არის გადამცემი კონფიგურაციის რეგისტრაცია, რომელთანაც ჩვენ მსოფლიოსთან კომუნიკაცია. ახლა ჩვენ მივიღეთ საჭირო ღირებულებები სასურველი სიჩქარისა და მარჯვენა რეჟიმის კონფიგურაციით.

ჩაწერის ნახვა 1< ნიშნავს შემდეგს: მიიღეთ 1 და განათავსეთ იგი Rxen. ფრენაში. Rxen. ეს არის მე -4 ბიტიანი რეესტრი UCSRB., ამიტომ 1< ქმნის ორობითი რიცხვს 00010000, Txen. - ეს არის მე -3 ბიტი და 1< Dast 00001000. ერთი "|" Გატეხილია ან00010000 | 00001000 \u003d 00011000. დარჩენილი საჭირო კონფიგურაციის ბიტი გამოფენილია ანალოგიურად და დაემატა ზოგადი bunch. შედეგად, ასამბლეის ნომერი დაიწერა UCSRB- ში. დეტალები დაწერილია Datashet- ში MC- ში USART- ის განყოფილებაში. ასე რომ არ მიიღოთ განადგურებული ტექნიკური დეტალები.

მზად არის, დროა, რა მოხდა. პიპსი ემულაციის შედგენასა და დაწყებასთან დაკავშირებით (CTRL + F7).

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

ფაქტია, რომ თავდაპირველად, ფაქტობრივად, იგი იდგა row urrrl \u003d lo (bauddivider); ყოველივე ამის შემდეგ, ის ფაქტი, რომ ჩვენ განვსაზღვრავთ, ეს არ არის კოდი, მაგრამ უბრალოდ წინასწარი გათვლები, მაშინ სიმულატორი პატარაა. მაგრამ ახლა ის მიხვდა, პირველი ინსტრუქცია დასრულდა და თუ ხეზე ასვლა I / O View, Usart სექციაში და გაიმარჯვებს Ubbrl Byte, ნახავთ, რომ უკვე არსებობს უკვე! 0x33.

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

გახსნა
ახლა გადატვირთეთ სიმულაციური ნულოვანი. დაწკაპეთ იქ გადატვირთვა (Shift + F5). ღია disassembly ჩამონათვალი, ახლა თქვენ ნახავთ რა ხდება კონტროლერი ფაქტობრივად. ნახვა -\u003e Disassembler. და არა yyaaaa !!! Assembler !!! Uzhos !!! მაგრამ თქვენ უნდა. ასე რომ, მოგვიანებით, როდესაც რაღაც არასწორია, არ გაბედავდა კოდს და არ სთხოვდა ლამერულ საკითხებს ფორუმებზე და დაუყოვნებლივ გადავიდა დაკარგვა და უყურებდა, სადაც თქვენ გაქვთ ჩერდება. იქ საშინელი არაფერია.

პირველი, ეს იქნება სერიის თავზე:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A კითხვა 0x0000002A Jump +00000002: 940C0034 კითხვა 0x00000034 Jump +00000004: 940C0034 კითხვა 0x00000034 Jump +00000006: 940C0034 კითხვა 0x00000034 Jump +00000008: 940C0034 კითხვა 0x00000034 Jump + 0000000A: 940C0034 კითხვა 0x00000034 Jump + 0000000C: 940C0034 კითხვა 0x00000034 Jump + 0000000E: 940C0034 კითხვა 0x00000034 Jump +00000010: 940C0034 კითხვა 0x00000034 Jump +00000012: 940C0034 კითხვა 0x00000034 Jump +00000014: 940C0034 კითხვა 0x00000034 Jump +00000016: 940C0034 კითხვა 0x00000034 Jump +00000018: 940C0034 კითხვა 0x00000034 Jump + 0000001A: 940C0034 კითხვა 0x00000034 Jump + 0000001C : 940C0034 კითხვა 0x00000034 Jump + 0000001E: 940C0034 კითხვა 0x00000034 Jump +00000020: 940C0034 კითხვა 0x00000034 Jump +00000022: 940C0034 კითხვა 0x00000034 Jump +00000024: 940C0034 კითხვა 0x00000034 Jump +00000026: 940C0034 კითხვა 0x00000034 Jump +00000028: 940C0034 კითხვა 0x00000034 Jump

00000000: 940C002A კითხვა 0x0000002A Jump +00000002: 940C0034 კითხვა 0x00000034 Jump +00000004: 940C0034 კითხვა 0x00000034 Jump +00000006: 940C0034 კითხვა 0x00000034 Jump +00000008: 940C0034 კითხვა 0x00000034 Jump + 0000000A: 940C0034 კითხვა 0x00000034 Jump + 0000000C: 940C0034 კითხვა 0x00000034 Jump + 0000000E : 940C0034 კითხვა 0x00000034 Jump +00000010: 940C0034 კითხვა 0x00000034 Jump +00000012: 940C0034 კითხვა 0x00000034 Jump +00000014: 940C0034 კითხვა 0x00000034 Jump +00000016: 940C0034 კითხვა 0x00000034 Jump +00000018: 940C0034 კითხვა 0x00000034 Jump + 0000001A: 940C0034 კითხვა 0x00000034 Jump + 0000001C: 940C0034 კითხვა 0x00000034 Jump + 0000001E: 940C0034 კითხვა 0x00000034 Jump +00000020: 940C0034 კითხვა 0x00000034 Jump +00000022: 940C0034 კითხვა 0x00000034 Jump +00000024: 940C0034 კითხვა 0x00000034 Jump +00000026: 940C0034 კითხვა 0x00000034 Jump +00000028: 940C0034 კითხვა 0x00000034 Jump

ეს არის შეფერხების ვექტორების მაგიდა. ჩვენ დავუბრუნდებით მას, ხოლო ვხედავ და გახსოვდეთ, რომ ეს არის. პირველი სვეტი არის Flash- ის ფლეშ მისამართი, რომელშიც ბრძანება ცრუობს, მესამე მენონიკური გუნდის მეორე ბრძანების კოდექსი, იგივე ასამბლეის ინსტრუქცია, გუნდის მესამე ოპერატორი. კარგად, ავტომატური კომენტარი.
ასე რომ, თუ გამოიყურება, მაშინ არსებობს მყარი გადასვლები. და JMP ბრძანების კოდი არის ოთხი ბაიტი, იგი შეიცავს გარდამავალი მისამართი ჩამოთვლილი უკან - ახალგაზრდა byte for ახალგაზრდა მისამართი და კოდი გარდამავალი ბრძანება 940c

0000002b: be1f out 0x3f, r1 გარეთ I / O ადგილმდებარეობა

ჩაწერეთ ეს ნულოვანი 0x3f მისამართი, თუ ხედავთ I / O View Column- ს, მაშინ დაინახავთ, რომ 0x3f მისამართი არის SREG - დროშა რეგისტრაცია კონტროლერის რეგისტრაცია. ისინი. ჩვენ გადატვირთეთ SREG პროგრამის გაშვება ნულოვანი პირობებით.

1 2 3 4 + 0000002C: E5CF LDI R28.0X5F დატვირთვა დაუყოვნებლივ + 0000002D: E0D4 LDI R29.0X04 დატვირთვა დაუყოვნებლივ + 0000002E: BFDE Out 0x3e, R29 Out to I / O მდებარეობა + 0000002F: BFCD Out 0x3D, R28 Out to I / O მდებარეობა

0000002C: E5CF LDI R28.0X5F დატვირთვა დაუყოვნებლივ + 0000002D: E0D4 LDI R29.0X04 დატვირთვა დაუყოვნებლივ + 0000002E: BFDE Out 0x3e, R29 Out to I / O საიდან + 0000002F: BFCD Out 0x3D, R28 Out to I / O მდებარეობა

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

00000032: 940C0041 JMP 0x00000041 გადასვლა

გადადით Saaaeaee- ის პროგრამის დასასრულს და იქ გვაქვს შეფერხების აკრძალვა და მჭიდროდ თავად:

1 2 +00000041: 94F8 CLI გლობალური შეწყვეტა გამორთვა +00000042: CFFF RJMP PC-0x0000 ნათესავი ნახტომი

00000041: 94F8 CLI გლობალური შეწყვეტა გამორთვა +00000042: CFFF RJMP PC-0x0000 ნათესავი ნახტომი

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

1 +000034: 940C0000 JMP 0x00000000 გადასვლა

00000034: 940C0000 JMP 0x00000000 გადასვლა

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

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

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24.0X33 დატვირთვა დაუყოვნებლივ +000037: B989 Out 0x09, R24 Out to I / O საიდან 15: Ubrrh \u003d Hi (Bauddivider); +000038: BC10 Out 0x20, R1 out to I / O საიდან 16: UCSRA \u003d 0; +000039: B81B out 0x0b, R1 გარეთ I / O საიდან 17: UCSRB \u003d 1<

და აქ არის ჯემი:

1 2 3 + 0000003E: E080 LDI R24.0X00 დატვირთვა დაუყოვნებლივ + 0000003F: E090 LDI R25.0X00 დაუყოვნებლივ +00000040: 9508 Ret Subroutine დაბრუნება

0000003E: E080 LDI R24.0X00 დატვირთვა დაუყოვნებლივ + 0000003F: E090 LDI R25.0X00 დატვირთვა დაუყოვნებლივ +00000040: 9508 Ret Subroutine დაბრუნება

კითხვაზე, თუ რატომ ამ კომპილერს ასრულებს ასეთი ტოპმასტერი? და ეს არაფერია, თუ არა დაბრუნების 0, მაშინ ჩვენ გამოვკვეთეთ როგორც int main (ბათილად). ასე რომ, ოთხი ბაიტი მე არ მესმის, რა :) და თუ ბათილად მთავარ (ბათილად), ეს იქნება მხოლოდ ret, მაგრამ Damning იქნება. რას ამბობენ, რომ ჩვენ არ ვაპირებთ ძირითად ფუნქციას. ზოგადად, ამის გაკეთება მოგწონს :)

გართულებულია? როგორც ჩანს, არ არის. მე გამოვდივარ ნაბიჯ-ნაბიჯ შესრულებას disassembler რეჟიმში და პოკერში, როგორც პროცესორი ასრულებს ინდივიდუალურ ინსტრუქციებს, რაც ხდება რეგისტრაციით. როგორ გადაადგილება ბრძანებები და საბოლოო looping.

გაგრძელება რამდენიმე დღეში ...

Offtop:
Alexei78. Gang Fixing Plugger for Firefox ხელს უწყობს ნავიგაცია ჩემს საიტზე და ფორუმზე.
დისკუსია და ჩამოტვირთვა

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

სტატიის მომდევნო ნაწილში აღწერილია SI- ში დაწერილი პროგრამების AVR სტუდია გარემოს შესახებ.

AVR სტუდია პაკეტს აქვს მყარი განვითარების ისტორია, რომელიც აისახება არსებული ვერსიების რაოდენობებში. 2003 წლის ბოლოს, 4.08 გამოვიდა, რომელსაც აქვს რამდენიმე სასარგებლო დამატებები, ხოლო 2004 წლის დასაწყისში განახლება (სერვისის პაკეტი 1) გაათავისუფლეს და AVEGA48- ის მესამე თაობის AVR- კონტროლერების მხარდაჭერას ოჯახი. ამ ოჯახის ჩიპების წარმოება 2004 წლის მეორე ნახევრისთვის არის დაგეგმილი.

პაკეტის განაწილება და მომსახურების პაკეტი შეიძლება გადმოწერილი www.atmel.com- დან ან მიიღოთ CD ამ დისტრიბუციის შესახებ რუსული დისტრიბუტორიდან.

AVR სტუდია პაკეტის მუშაობა მოხერხებულად განიხილავს რაიმე კონკრეტულ პროგრამას. როგორც მოსაზრება, ჩვენ განვიხილავთ პროექტს მარტივი პროგრამისთვის, რომელიც, თავის მხრივ, ორი LED- ების შუქზე იქნება. განსაზღვრული, მიიღოს microcircuit ATMEGA128. და დააკავშირებს ორ LED- ებს დასკვნების 31 და 32 (ეს არის ბიტი 6 და 7 პორტი D ჩიპი ATMEGA128). AVR კონტროლერები აქვს ძლიერი გამომავალი კასკადები, თითოეული გამომავალი ტიპიური მიმდინარე არის 20 MA, მაქსიმალური გამომავალი მიმდინარე არის 40 ma, და ეს ეხება ორივე მიედინება და მიედინება მიმდინარე. ჩვენს მაგალითში, LED- ები უკავშირდება ანდებს კონტროლერის დასკვნებს და კათოდებს, რომლებიც დაკავშირებულია რეზისტენტობის მეშვეობით. ეს იმას ნიშნავს, რომ LED არის ემოტირებული კვების "1" შესაბამისი პორტის გამომავალი. სქემატური დიაგრამა ნაჩვენებია ფიგურაში. დიაგრამა ასევე აჩვენებს ორ ღილაკს, რომელიც გამოიყენება ერთ-ერთ პროგრამაში.

აქ არის შესაფერისი, რათა პატარა digression არჩევის ტიპის ჩიპი მარტივი მაგალითი. მართლაც, ერთი შეხედვით, ეს შეიძლება ჩანდეს უცნაური, რატომ გჭირდებათ ასეთი ძლიერი კრისტალი 64-pin შემთხვევაში, სადაც არის საკმარისი 8 PIN ჩიპი Attiny12. ? თუმცა, ამ მიდგომაში არის ლოგიკა. ცნობილია, რომ თითქმის ნებისმიერი AVR კონტროლერის გულში იგივე ბირთვია. დიდი და დიდი, კონტროლერები განსხვავდება მეხსიერებაში, I / O პორტების რაოდენობა და პერიფერიული მოდულების კომპლექტი. თითოეული კონკრეტული კონტროლერის მახასიათებლები - სავალდებულო ლოგიკური სახელი / გამომავალი რეგისტრაცია ფიზიკური მისამართები, ჩარევის ვექტორების მისამართები, პორტის ბიტების იდენტიფიცირება და ა.შ. აღწერს ფაილებს Extension.Inc, რომელიც შედის AVR სტუდია პაკეტში. შესაბამისად, კონკრეტული ტიპის ბროლის გამოყენებით, შეგიძლიათ პროგრამის გაფორმება და ნებისმიერი ახალგაზრდა კრისტალისთვის. გარდა ამისა, თუ თქვენ იყენებთ ყველაზე უფროსი კრისტალი, როგორც გამართვის, დღეს ეს არის ATMEGA128, შეგიძლიათ გამართოთ პროგრამა თითქმის ნებისმიერი AVR კონტროლერი, თქვენ უბრალოდ უნდა გამოვიყენოთ ტექნიკის რესურსები, რომლებიც არ არის დაკარგული სამიზნე microcontroller. ამდენად, მაგალითად, თქვენ შეგიძლიათ გამართოთ პროგრამა, რომელიც შესრულდება ATMEGA128- ზე Attiny13. . ამ შემთხვევაში, კოდის კოდექსი პრაქტიკულად იგივე დარჩება, მხოლოდ 128DEF.Inc- სთან დაკავშირებული ფაილის სახელით შეიცვლება TN13DEF.Inc- ზე. ეს მიდგომა ასევე მისცემს თავის უპირატესობას. მაგალითად, "დამატებითი" I / O პორტები შეიძლება გამოყენებულ იქნას დაკავშირება. LCD მაჩვენებელი რომელიც შეგიძლიათ გამართოთ Debug ინფორმაცია. ან, გამოიყენეთ Intrahemum emulator, რომელიც აკავშირებს Jtag Port of Atmega128 ჩიპი (Attiny13 კონტროლერი არ აქვს ამ პორტი). ამდენად, შესაძლებელია გამოვიყენოთ ერთი DEBUG- ის საბჭო, რომელზეც "უფროსი" AVR კონტროლერი დამონტაჟებულია, ნებისმიერი ახლად განვითარებული სისტემების გაფორმება, ბუნებრივია, AVR Microcontrollers- ზე. ერთ-ერთი ამ ფორუმს ეწოდება AS-MEGAM. ეს იყო ის, რომ გამოყენებული იყო სტატიაში მოცემული პროგრამების მაგალითები. ეს არის უნივერსალური ერთჯერადი კონტროლერი, რომელიც ეფუძნება ATMEGA128 ჩიპზე, რომელიც შეიცავს გარე RAM- ს, ორ პორტს RS-232. , პორტი დამაკავშირებელი LCD ინდიკატორი, Intrahemnoe პროგრამისტი და emulator At jtag ice . გამგეობას ასევე აქვს ადგილი Flash-ROM სერიის ჩიპის გაყოფაზე At45 Housings Tsop32 / 40/48 და ორი არხის სერია DAC AD5302 / AD5312 / AD5322 . ახლა, AVR Monster- ის გამოყენების მიზეზების შემდეგ, Swatodiodes- ის წყვილი, შეგიძლიათ შემდგომი.

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

  • კოლექცია
  • პროექტის შექმნა იწყება პროექტის "ახალი პროექტის მენიუს" შერჩევით. "ახალი პროექტის" ფანჯრის "შექმნა ფანჯარა, რომელიც იხსნება, თქვენ უნდა მიუთითოთ პროექტის სახელი, (ჩვენს შემთხვევაში - Sample1) და ინიციალიზაციის ფაილის სახელი. "შემდეგი" ღილაკის დაჭერით, SELECT DEBUG პლატფორმა და მოწყობილობის ფანჯარა იხსნება, სადაც DEBUG პლატფორმა (სიმულატორი ან emulator) შერჩეულია და Microcontroller- ის ტიპი.

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

    ; მაგალითი "LED კონტროლი"; დაწერილი AS-MEGAM DEBUG BOARD; პარამეტრის გენერატორის სიხშირეა 7.37 MHz; LED- ები უკავშირდება PD6 და PD7 დასკვნებს და რეზისტენტებს - საერთო მავთულხლართებს. ; Atmega128 Circuit I / O დეტალების ფაილი "M128DEF.INC"; დაწყების პროგრამის დასაწყისი:; პირველი ოპერაცია - დასტის ინიციალიზაცია; თუ ეს არ არის გაკეთებული, მაშინ მოვუწოდებთ subroutine ან interrupt; არ დაბრუნდება კონტროლის უკან; დასტის ბოლოს დასტის ბოლოს დაინიშნა შიდა RAM - Ramend LDI R16, დაბალი (Ramend) SPL, R16 LDI R16, მაღალი (Ramend) SPH, R16; PD6 და PD7 დასკვნებთან დაკავშირებული LED- ების კონტროლის მიზნით; აუცილებელია ამ დასკვნის გამოტანის გამოცხადება. ; ამისათვის DDRD რეესტრის (Datadirection) LDI R16- ის შესაბამისი ბიტიდან "1" დაწერეთ "1"<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

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

    პროექტის შედგენა ხდება \\ პროექტის \\ აშენების ბრძანება ან F7 ღილაკზე დაჭერით. "გამომავალი" ფანჯარაში შედგენილი პროცესი გამოჩნდება. ეს ფანჯარა შეიძლება იყოს "უბიძგებს" \\ View \\ output ბრძანება.

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

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

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

    AVR Studio Package შეიცავს მძლავრი ინსტრუმენტები შიდა რეესტრებისა და I / O პორტების განახლებული მიკროკონტროლერის, აგრეთვე პროგრამის შესრულების შესახებ. მათთვის ხელმისაწვდომობა ხორციელდება "I / O" ფანჯარაში.

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

    ჩვენი მაგალითის შესასწავლად, პორტების წვდომისათვის, თქვენ უნდა გამოავლინოთ I / O Atmega128 სიმებიანი და შემდეგ პორტფტის ხაზი. ახლა ამ პორტის სამივე რეესტრი, პორტდა, DDRD და Pind ხილულია. სანახავად, ბიტი და მისამართი, თქვენ უნდა გააფართოვოთ ფანჯრის მარჯვენა საზღვრის გაფართოება, ფანჯრის ოფლიანობა პროგრამის წყაროზე.

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

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

    ; მაგალითი "Buttons- ის კონტროლი"; დაწერილი AS-MEGAM DEBUG BOARD; LED- ები უკავშირდება PD6 და PD7 დასკვნებს და რეზისტენტებს - საერთო მავთულხლართებს. ; ღილაკები - On PE4 და PE5 .INCLUDE "M128DEF.INC"; დაწყება ძირითადი პროგრამა :; Stack ინიციალიზაცია LDI R16, დაბალი (ramend) out SPL, R16 LDI R16, მაღალი (ramend) out SPH, R16; LED LEDS R16- ის ინიციალიზაცია (1<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

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

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

    მთავარი ფანჯრის მენიუში AVR სტუდია, თქვენ უნდა აირჩიოთ Customize;

    Customize window, აირჩიეთ ინსტრუმენტები ნივთი;

    თაგვის ღილაკზე დაჭერით ან კლავიატურაზე ჩასმა დაჭერით, დაამატეთ ახალი ბრძანება სიაში და დარეკეთ "AS2 Programmer";

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

    ახლა ინსტრუმენტები მენიუ გამოჩნდება "პროგრამისტი AS2".

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

    "AVR- ის სამშობლოს" სტუმრობისას - ნორვეგიის ოფისმა, სტატიის ერთ-ერთმა ავტორმა ლარს ქენერთან, პროგრამის ჯგუფის ხელმძღვანელთან, რომელიც შეიქმნა და AVR სტუდიის პაკეტს უწყობს ხელს. ეს ადამიანი, კლასიკური პროგრამისტი, ერთად წვერი, სვიტრი და ნაქსოვი წინდები sandals, ისაუბრა პერსპექტივები განვითარების პაკეტი. მომდევნო ვერსიაზე (4.09), ინტერფეისი საშუალებას მისცემს ახალ Intrahemnoe emulator- ისთვის - Jtagice Mkii (მას ასევე მოუწოდა Jtagice2), რომელიც წლის მეორე ნახევარში შეიცვლება Jtagice. ამ ემულატორს აქვს ორი არსებითი განსხვავება. ერთის მხრივ, მხარდაჭერილი მხარდაჭერა ახალი ერთჯერადი მავთულის გამართვის ინტერფეისი ახალგაზრდა AVR კონტროლერები, debugwire. ეს ინტერფეისი საინტერესოა, რადგან ის არ იკავებს მიკროკონტროლერის დამატებით დასკვნებს მისი მუშაობისთვის, რადგან იგი იყენებს რესეტი მიკროკონტროლერის გამომავალს! მეორეს მხრივ (თქვენ შეგიძლიათ გაიგოთ ეს გამოთქმა), როდესაც Jtagice2 Emulator გამოჩნდება, საბოლოოდ, USB ინტერფეისი კომპიუტერთან კომუნიკაციისთვის.

    ლიტერატურა

    1. AVR ტექნიკური სწავლების ტექნიკური სემინარის მასალები. ატლან. ნორვეგია. Deceptber 2003.
    2. ნიკოლაი კოროლევი, დიმიტრი კოროლევი მეორე თაობის AVR-Microcontrollers: დეველოპერის საშუალო. // კომპონენტები და ტექნოლოგიები, 2003 № 7
    3. მეორე თაობის AVR-Microcontrollers: ახალი აპარატურის შესაძლებლობები // კომპონენტები და ტექნოლოგიები. 2003. №4.
    4. ნიკოლაი კოროლევი, დიმიტრი კოროლევი. AVR Microcontrollers: დიდი მცირე. // სქემერი ", 2001, №5
    5. ნიკოლაი კოროლევი, დიმიტრი კოროლევი. AVR Microcontrollers: პროგრამული უზრუნველყოფა // კომპონენტები და ტექნოლოგიები, 2000. №4.
    6. ნიკოლაი კოროლევი. AVR: დეველოპერის აპარატურა / კომპონენტები და ტექნოლოგიები, 1999 № 1
    7. ნიკოლაი კოროლევი. Atmel Risc-Microcontrollers // ჩიპი- news 1998, №2
    8. ნიკოლაი კოროლევი, დიმიტრი კოროლევი AVR: კომპანია ATMEL // მიკროპროცესორების მიმოხილვის ახალი 8-ბიტიანი მიკროკონტროლერები, 1998, №1

    რატომღაც დაუყოვნებლივ გამოყვანილია რჩევა AVR კონტროლერების პროგრამების გარემოს არჩევანის შესახებ. უბრალოდ არ ჩააგდოს ჩემში sneakers. მე საკმაოდ ცოტა ვარ

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

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

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

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

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

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

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

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

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


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


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

    (ეწვია 7 377 ჯერ, 1 ვიზიტი დღეს)

    პროგრამირების კონცეფცია LPT პორტზე ნაჩვენებია ფიგურაში. როგორც საბურავი ყოფილი, გამოიყენეთ 74AC 244 ან 74HC244 ჩიპი (K1564AP5), 74LS244 (K5555AP5) ან 74ES244 (K1533AP5).

    VD1 LED მიუთითებს microcontroller ჩაწერის რეჟიმი,

    vD2 LED - კითხვა,

    vD3 LED - თანდასწრებით დიაგრამა.

    სქემის დაფარვისათვის საჭირო ძაბვა იღებს ISP Connector- სგან, I.E. პროგრამირებადი მოწყობილობიდან. ეს სქემა არის რეციკლირებული STK200 / 300 პროგრამისტი (დამატებულია LED- ები მარტივი ოპერაციისთვის), ამიტომ შეესაბამება ყველა PC პროგრამისტს, რომელიც მოქმედებს STK200 / 300 სქემით. ამ პროგრამით მუშაობისთვის გამოიყენეთ პროგრამა CVAVR.

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




    პროგრამისტთან მუშაობა, მოსახერხებელია პორტის LPT extresslannnt- ის გამოყენება, რაც ადვილია საკუთარ თავზე (მაგალითად, Cableronix კაბელის პრინტერისთვის), მთავარია "არ არის სინანული" დირიჟორები დედამიწა (18-25 ფეხები კონექტორი) ან ყიდვა. პროგრამისტს და პროგრამირებულ მიკროკაცის შორის საკაბელო არ უნდა აღემატებოდეს 20-30 სმ.

    გამარჯობა, ძვირფასო ჰაბრაარიტები!

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

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

    1. პროგრამისტი
    ბაზარზე ბევრი ვარიანტია - ყველაზე იაფი ISP (სისტემური პროგრამირების) პროგრამებიდან რამდენიმე დოლარისთვის, ძლიერი დუბლირების პროგრამისტებისათვის რამდენიმე ასეული. ამ საკითხში უფრო დიდი გამოცდილების გარეშე, პირველ რიგში გადავწყვიტე ერთ-ერთი ყველაზე იოლი და იაფი - usbasp. მე შეიძინა ერთ დროს eBay $ 12, ახლა თქვენ შეგიძლიათ იპოვოთ კი $ 3-4. სინამდვილეში, ეს არის თომას ფისჩლის პროგრამის ჩინური ვერსია. რა შემიძლია ამის შესახებ? მხოლოდ ერთი რამ - მუშაობს. გარდა ამისა, არსებობს საკმაოდ ბევრი AVR კონტროლერები ATMEGA და Attiny სერია. Linux- ზე არ საჭიროებს მძღოლს.

    Firmware, თქვენ უნდა დააკავშიროთ VCC, GND, RESET, SCK, MOSI, Miso პროგრამისტი შედეგები შესაბამისი microcontroller შედეგები. სიმარტივისთვის, მე შეგროვებული დამხმარე სქემა უფლება მამრობითი:

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

    2. მიკროკონტროლერი
    Microcontroller- ის არჩევანი, მე არ შემეხო და არატო-23 I / O ფიჭვისგან, ორი 8-ბიტიანი ქრონომეტრი, ერთი 16-ბიტიანი, სიხშირე - 16 MHz, მცირე მოხმარება (1-3.6 MA) , იაფი ($ 2). ზოგადად, დაწყებისათვის - საკმარისზე მეტი.

    Linux- ზე, რათა შეადგინოს და ჩამოტვირთოთ firmware on კონტროლერი, AVR-GCC + Avrdede Bundle მუშაობს შესანიშნავად. სამონტაჟო ტრივიალური. ინსტრუქციის შემდეგ, შეგიძლიათ დააყენოთ ყველაფერი რამდენიმე წუთში. ერთადერთი neans, რომელიც უნდა გადაიხადოს - Avrdude (პროგრამული უზრუნველყოფა ჩაწერის კონტროლერი) შეიძლება მოითხოვოს სუპერ მომხმარებლის უფლება წვდომის პროგრამისტი. გასვლა - Sudo- ს მეშვეობით (არ არის ძალიან კარგი იდეა), ან სპეციალური UDEV- ის უფლებები. სინტაქსი შეიძლება განსხვავდებოდეს OS- ის სხვადასხვა ვერსიებში, მაგრამ ჩემს შემთხვევაში (Linux Mint 15) უკვე გაკეთდა შემდეგი წესის დასამატებლად /etc/udev/rules.d/41-atmega.rules ფაილი:

    # Usbasp პროგრამისტი ქვესისტემის \u003d\u003d "USB", attr (idvendor) \u003d\u003d "16C0", attr (idproduct) \u003d\u003d "05DC", GROUP \u003d "Plugdev", Mode \u003d "0666"

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

    ქვეშ Windows მოუწევს მიწოდება მძღოლი. დანარჩენი პრობლემები არ არის. სამეცნიერო ინტერესისთვის, მე შევეცადე AVR სტუდია + ექსტრემალური Burner Bundle Windows. კიდევ ერთხელ, ყველაფერი მუშაობს bang.

    ჩვენ ვიწყებთ პროგრამირებას

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

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

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

    Colcessing ფრენის

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

    Int main (void) (init_io (); init_data (); sound_off (); sei (1); ხოლო (1) (handle_buttons ();) დაბრუნება 0;)
    თითოეული ფუნქცია ცალკე.

    VOID INIT_IO () (// კომპლექტი გამომავალი ddrb \u003d 0xff; ddrd \u003d 0xff; / / Set input ddrc \u003d 0b11100000; // Pull-up რეზისტორების პორტალი | \u003d 0b00011111; // Timer interrupts Timsk \u003d (1<

    I / O პორტების შექმნის ძალიან მარტივია - DDRX- ის რეესტრში (სადაც X არის წერილი, პორტის აღნიშვნა) რიცხვი, რომელთა რაოდენობაც არის თუ არა შესაბამისი PIN შეყვანის მოწყობილობა (შეესაბამება 0) ან გამომავალი (შეესაბამება 1). ამდენად, Seasushal in DDRB და DDRD ნომერი 0xff, ჩვენ B და D გამომავალი პორტები. შესაბამისად, DDRC \u003d 0B11100000 ბრძანება; გამოდის პირველი 5 პორტების პორტი C შეყვანის ქინძისთავები და დარჩენილი შაბათ. გუნდი პორტალი | \u003d 0B00011111; მოიცავს შიდა გამკაცრებულ რეზისტენტებს კონტროლერის 5 შეყვანის შესახებ. სქემის მიხედვით, ღილაკები დაკავშირებულია ამ საშუალებებთან, რომლებიც, როდესაც დაჭერილი არიან დედამიწაზე. ამდენად, კონტროლერი ესმის, რომ ღილაკი დაჭერილია.

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

    დამუშავების შეფერხება

    ISR (display (); თუ (_buzzer\u003e 0) (_buzzer -; თუ (_buzzer \u003d\u003d 0) sound_off ())) ISR (timer1_compa_vect) (თუ (ActiveTimer \u003d\u003d 1 && timer1\u003e 0) (timer1 - ; თუ (Timer1 \u003d\u003d 0) Process_timeoff ();) თუ (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (Timer2 -; თუ (Timer2 \u003d\u003d 0) პროცესი_ტაპიუმი ();

    როდესაც ტაიმერი გამოიწვია, კონტროლი გადაეცემა შესაბამის დარღვევას. ჩვენს შემთხვევაში, ეს არის timer0_ovf_vect პროცესორი, რომელიც იწვევს დროის გამომავალი პროცედურის ინდიკატორებს და Timer1_Compa_vect- ს, რაც პროცესს ატარებს.

    დასკვნა ინდიკატორებზე

    ძალადაკარგული ჩვენება (display_number ((Timer1 / 60) / 10, 0b00001000); _delay_ms (0.25); display_number ((Timer1 / 60)% 10, 0B00000100); _delay_Ms (0.25); display_number (((Timer1% 60) / 10, 0B00000010); _delay_ms (0.25); display_number ((Timer1% 60)% 10, 0b00000001); _delay_ms (0.25); display_number ((Timer2 / 60) / 10, 0B10000000); _delay_ms (0.25); display_number ((Timer2 / 60)% 10, 0B01000000); _delay_Ms (0.25); display_number ((Timer2% 60) / 10, 0b00100000); _delay_ms (0.25); display_number (((Timer2% 60)% 10, 0b00010000); _delay_Ms (0.25) პორტდა \u003d 0;) ბათილად display_number (int ნომერი, int ნიღაბი) (portb \u003d number_mask (ნომერი); portdd \u003d ნიღაბი;)

    ეკრანის ფუნქცია იყენებს დინამიურ მითითებას. ფაქტია, რომ თითოეულ ინდივიდუალურ მაჩვენებელს აქვს 9 კონტაქტი (7 სეგმენტების კონტროლისთვის, 1 წერტილი და 1 ელექტრომომარაგებისათვის). 4 ციფრის კონტროლი 36 კონტაქტს მიიღებს. ძალიან wasteful. აქედან გამომდინარე, მრავალრიცხოვანი ციფრი მაჩვენებლის განმუხტვის გამომავალი ორგანიზებულია შემდეგი პრინციპით:

    ძაბვა მონაცვლეობით ყოველი საერთო კონტაქტისთვის, რომელიც საშუალებას გაძლევთ გამოაგზავნოთ სასურველი ფიგურა შესაბამისი მაჩვენებლით იგივე 8 საკონტროლო კონტაქტის გამოყენებით. საკმარისად მაღალი გამომავალი სიხშირით, როგორც ჩანს, სტატიკური სურათი. ამიტომაა, რომ დიაგრამაზე ორივე ინდიკატორის ყველა 8 მიწოდების კონტაქტები უკავშირდება 8 პორტს დ, ხოლო 16 საკონფერენციო კონტროლის სეგმენტებს უკავშირდება წყვილებს და უკავშირდება 8 პორტს ბ. ამდენად, ჩვენების ფუნქცია 0.25 MS მონაცვლეობით აჩვენებს სასურველ ნომერს თითოეულ ინდიკატორს. დასასრულს, ყველა შედეგები, რომლებიც შესანახი ძაბვის მაჩვენებლებზე გამორთულია (ბრძანება Portdd \u003d 0;). თუ ეს არ არის გაკეთებული, მაშინ ბოლო ჩვენება ციფრი გაგრძელდება დამწვრობის სანამ მომდევნო ზარის ეწოდება ჩვენების ფუნქცია, რომელიც გამოიწვევს მისი ნათელი luminescence შედარებით დანარჩენი.

    მკურნალობის პრეპარატები

    ბათილი handle_buttons () (handle_button (key_setup); handle_button (key_reset); handle_button (key_pause); handle_button (key_player1); handle_button (key_player2);) ძალადაკარგულად handle_button (int bit) (int bit) (key_setup: bit \u003d Setup_bit; შესვენება; bit \u003d reset_bit; bit \u003d key_pause: Bit \u003d pause_bit; შესვენება; bit \u003d player1_bit; bit \u003d player2_bit; bit \u003d player2_bit (bit_is_clear); Button_PIN, BIT)) (თუ (_ressed \u003d\u003d 0) (_delay_ms (debounce_time); თუ (bit_is_clear); თუ (bit_is_pin, bit)) (_pressed | \u003d გასაღები; / ძირითადი სამოქმედო შეცვლა (Key_Setup: Process_setup (); შესვენება; საქმე Key_Reset : Process_Reset (); შესვენება; საქმე Key_pause: Process_pause (); BREAK_PLAYER1: PROCESPOPLAYER1 (); BREAKE_PLAYER2: Process_player2 ();) Sound_on (15); ;))

    ეს ფუნქცია თავის მხრივ, გამოკითხვაში ყველა 5 ღილაკს და პროცესების პრესა, თუ ასეთი მოხდა. დაჭერით რეგისტრირებულია BIT_IS_CLEAR- ის შემოწმება (BUTTON_PIN, BIT), I.E. ღილაკი დაჭერილია იმ შემთხვევაში, თუ მასთან დაკავშირებულ შეყვანა დაკავშირებულია ადგილზე, რომელიც მოხდება სქემის მიხედვით, როდესაც დააჭირეთ ღილაკს. დაგვიანებული დაგვიანებით Duration_time და ხელახალი შემოწმება საჭიროა კონტაქტების აღსაზრდელების გამო მრავალჯერადი ზედმეტი რეაგირების თავიდან ასაცილებლად. პრესის სტატუსის შენახვა შესაბამის ცვლადი ბიტი _pressed გამოიყენება აღმოფხვრას ხელახლა გამკლავება ხანგრძლივი პრესის ღილაკით.
    დაჭერით ფუნქციები საკმაოდ ტრივიალურია და მჯერა, რომ დამატებით კომენტარებში არ სჭირდება.

    სრული ტექსტური პროგრამა

    #Define f_cpu 4000000l #include #Include. #Include. #define debounce_time 20 #define button_pin pinc #define setup_bit pc1 #define reset_bit pc1 #define reset_bit pc1 #define player_bit pc2 #define player1_bit pc3 #define player1_bit pc3 #define player2_bit pc4 #define key_setup 0b00000001 #define key_reset 0b00000010 #define key_pause 0b00000100 #define key_player2 0b00010000 არასტაბილური int ActiveTimer \u003d 0; Volatile int timer1 \u003d 0; Volatile int timer2 \u003d 0; არასტაბილური int _buzzer \u003d 0; არასტაბილური int _pressed \u003d 0; // ფუნქციის დეკლარაციები გაუქმება init_io (); გაუქმება init_data (); Int number_mask (int num); ძალადაკარგულად handle_buttons (); ძალადაკარგულად handle_button (int გასაღები); ძალადაკარგული პროცესი _Setup (); ძალადაკარგული პროცესი _reset (); ძალადაკარგული პროცესი _ ძალადაკარგული პროცესი_ტაპი (); ძალადაკარგული Process_Player1 (); ძალადაკარგული პროცესი aplayer2 (); ბათილად ჩვენება (); ბათილად display_number (int ნიღაბი, int ნომერი); ძალადაკარგულად sound_on (int ინტერვალი); ძალადაკარგული sound_off (); // interrupts ISR (display (_buzzer\u003e 0) (_buzzer -; თუ (_buzzer \u003d\u003d 0) sound_off ())) isr (timer1_compa_vect) (თუ (ActiveTimer \u003d\u003d 1 && timer1\u003e 0) Timer1--; თუ (timer1 \u003d\u003d 0) პროცესი_ტაქსიფი ();) თუ (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (Timer2 -; თუ (Timer2 \u003d\u003d 0) პროცესი_ტაპიუმი ();) int main (ბათილია) (init_io (); init_data (); sound_off (); sei (1); ხოლო (1) (handle_buttons ();) დაბრუნება 0;) void_io () (/ / set output ddrb \u003d 0xff; ddrd \u003d 0xff; INPUT DDRC \u003d 0B11100000; // Pull-up Resistors პორტალი | \u003d 0B00011111; // ტაიმერი interrupts timsk \u003d (1< 5940 || Timer2\u003e 5940) (Timer1 \u003d 0;) VIOD PROCESS_RESET () (INIT_DATA ();) ძალადაკარგულად დამუშავების პროცესი_ტაპი () (init_data (30); live_on (30);) ძალადაკარგულად დამუშავებისას () (ActiveTimer \u003d 0;) ძალადაკარგულად დამუშავების პროცესი _Player2 () (ActiveImer \u003d 1;) ძალადაკარგულად handle_button (int key_setup: bit \u003d setup_bit; bit \u003d reset_bit; შესვენება; Case Key_pause: Bit \u003d pause_bit; შესვენება; bit \u003d player1_bit; bit \u003d player1_bit; შესვენება; საქმე key_player2: bit \u003d player2_bit; შესვენება; თუ (bit_is_pin, bit)) (თუ (_pressed \u003d\u003d 0) (თუ _delay_ms (debounce_time); თუ (bit_is_clear (buttone_pin, bit)) (_pressed | \u003d გასაღები; // key_setup: პროცესი _Setup (); BREAK_RESET: PROCESS_RESET (); BREAK_PAUSE (); BREAK_PLAYER1 : Process_Player1 (); შესვენება; საქმე Key_Player2: Process_player2 ();) Sound_on (15);))) სხვაგან (_pre Ssed & \u003d ~ გასაღები; ) ბათილი handle_buttons () (handle_button (key_setup); handle_button (key_reset); handle_button (key_pause); handle_button (key_player1); handle_button (key_player2);) ბათილი ჩვენება () (Display_number ((Timer1 / 60) / 10, 0B00001000) ; _delay_Ms (0.25); display_number ((Timer1 / 60)% 10, 0B00000100); _delay_ms (0.25); display_number ((Timer1% 60) / 10, 0b00000010); _delay_Ms (0.25); display_number ((((Timer1% 60) 10, 0b00000001); _delay_Ms (0.25); display_number ((Timer2 / 60) / 10, 0B10000000); _delay_ms (0.25); display_number ((Timer2 / 60)% 10, 0B01000000); _delay_Ms (0.25); display_number (( Timer2% 60) / 10, 0b00100000); _delay_ms (0.25); display_number (((Timer2% 60)% 10, 0b00010000); _delay_ms (0.25); portdd \u003d 0;) ბათილად display_number (int number_mask) (portb \u003d number_mask ( ნომერი); PORTD \u003d ნიღაბი;) ძალადაკარგულად sound_on (int ინტერვალით) (_buzzer \u003d ინტერვალი; / / buzzer pin მაღალი პორტალი | \u003d 0b00100000;) ძალადაკარგულად sound_off () (/ / buit buzzer pin დაბალი პორტატული და \u003d ~ \u200b\u200b0B00100000;)

    პროტოტიპი შეიკრიბა გადაყრილი ფორუმში.