Სარჩევი:

AVR Assembler Tutorial 6: 3 ნაბიჯი
AVR Assembler Tutorial 6: 3 ნაბიჯი

ვიდეო: AVR Assembler Tutorial 6: 3 ნაბიჯი

ვიდეო: AVR Assembler Tutorial 6: 3 ნაბიჯი
ვიდეო: AVR Ассемблер. Урок 4. АЦП. AVR Assembler. Lesson 4. ADC. 2024, ნოემბერი
Anonim
AVR Assembler Tutorial 6
AVR Assembler Tutorial 6

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

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

ამ გაკვეთილში დაგჭირდებათ:

  1. შენი პროტოტიპის დაფა
  2. თქვენი კამათელი ამოთხარი მეოთხე სახელმძღვანელოდან
  3. თქვენი რეგისტრაციის ანალიზატორი მე –5 სახელმძღვანელოდან
  4. ორი დამაკავშირებელი მავთული
  5. სრული მონაცემების ასლი (2014 წლის გადასინჯვა):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. ინსტრუქციის ნაკრების სახელმძღვანელოს ასლი (2014 წლის გადასინჯვა):

    www.atmel.com/images/atmel-0856-avr-instruc…

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

ნაბიჯი 1: როგორ შეგვიძლია მივიღოთ ორი მიკროკონტროლერი ერთმანეთთან სასაუბროდ?

როგორ შეგვიძლია მივიღოთ ორი მიკროკონტროლი, რომ ესაუბრონ ერთმანეთს?
როგორ შეგვიძლია მივიღოთ ორი მიკროკონტროლი, რომ ესაუბრონ ერთმანეთს?

ვინაიდან ჩვენ ვიწყებთ ჩვენი პროექტის გაფართოებას ისე, რომ ჩვენი საბოლოო პროდუქტი შედგება მცირე ნაწილების კოლექციისგან, ჩვენ დაგვჭირდება მეტი ქინძისთავები, ვიდრე ერთი Atmega328P უზრუნველყოფს. ამიტომ ჩვენ ვაპირებთ გავაკეთოთ საერთო პროექტის თითოეული ნაწილი ცალკეულ მიკროკონტროლერზე და შემდეგ ვაძლევთ მათ მონაცემებს მათ შორის. ამრიგად, პრობლემა, რომელიც ჩვენ უნდა გადავწყვიტოთ, არის ის, თუ როგორ უნდა მივიღოთ მარტივი მეთოდი, რომ კონტროლერებმა ერთმანეთთან ისაუბრონ და მონაცემები გადასცენ მათ შორის? ამ კონტროლერებთან დაკავშირებით ერთი რამ არის ის, რომ თითოეული ასრულებს 16 მილიონ ინსტრუქციას წამში. ეს არის ზუსტად განსაზღვრული დრო და ჩვენ შეგვიძლია გამოვიყენოთ ეს დრო მონაცემების გადასაცემად. თუ ჩვენ გამოვიყენებთ მილიწამიან დაყოვნებას მონაცემების შესაქმნელად, ჩვენ ნამდვილად არ უნდა ვიყოთ ზუსტად ასე, რადგან პროცესორი ასრულებს 16,000 ინსტრუქციას ერთ მილიწამში. სხვა სიტყვებით რომ ვთქვათ, მილიწამი არის მარადისობა პროცესორისთვის. მოდით ვცადოთ კამათლის რულეტებით. მსურს კამათლების გორგოლაჭების შედეგი გადავიტანო კამათლის როლიკებიდან ჩამრთველ ანალიზატორზე. დავუშვათ, რომ თქვენ იდგნენ ქუჩის გასწვრივ და მე მინდოდა თქვენთვის სიგნალი გამეკეთებინა ჩემი გადაღებული წყვილი კამათლის შედეგი. ერთი რამ, რისი გაკეთებაც შემეძლო, ორივეს საათი გვქონდა, არის ის, რომ შემიძლია ფანარი ჩავრთო, მაშინ როცა მზად იქნები ჩემი მონაცემების მისაღებად, ჩართავ ფანარს და ჩვენ ორივე ვიწყებთ ჩვენს საათებს. შემდეგ ფანარს ვინახავ მილიწამების ზუსტი რაოდენობისას კამათლის გადაყრისას და შემდეგ ვთიშავ. ასე რომ, თუ მე გადავატრიალებ 12 -ს, მე შევინარჩუნებ ჩემს შუქს 12 მილიწამში. ახლა ზემოთქმულის პრობლემა იმაშია, რომ ჩემთვის და შენთვის, ჩვენ არავითარ შემთხვევაში არ გვექნება დრო, რომ ზუსტად გავზომოთ საგნები 5 მილიწამიდან 12 -მდე მილიწამი მაგრამ რა შეიძლება ითქვას ამის შესახებ: დავუშვათ, რომ ჩვენ გადავწყვიტეთ, რომ მე დავტოვებდი შუქს ერთი წლის განმავლობაში კამათელის თითოეულ ნომერზე? მაშინ, თუ მე 12 -ს გადავაგორებ, მე 12 წლით გამოანათებ შენს შუქს და ვფიქრობ, დამეთანხმები, რომ არ არსებობს შესაძლებლობა, რომ შეცდომა დაუშვა რიცხვის გარკვევაში? შეგიძლიათ დაისვენოთ და ითამაშოთ ბეისბოლის თამაში, თქვენ კი შეგიძლიათ თამაშოთ კრეპსი ვეგასში 6 თვის განმავლობაში, რამდენადაც წლის განმავლობაში რაღაც მომენტში გადახედე ქუჩას და ნახე თუ არა შუქი, არ გამოტოვებ დათვლას. ეს არის ზუსტად ის, რასაც ჩვენ ვაკეთებთ მიკროკონტროლერებისთვის! ერთი მილიწამი CPU– ს ჰგავს წელიწადს. ასე რომ, თუ სიგნალს 12 მილიწამზე გავააქტიურებ, თითქმის არ არსებობს შანსი, რომ სხვა მიკროკონტროლერი აურიოს მას 10 ან 11 -ით, რაც არ უნდა შეუშალოს ხელი და რა არ მოხდეს ამასობაში. მიკროკონტროლერებისთვის მილიწამი არის მარადიულობა. აი, რას გავაკეთებთ პირველი ჩვენ ვირჩევთ ორ პორტს კონტროლერზე, რომ იყოს ჩვენი საკომუნიკაციო პორტი. მე გამოვიყენებ PD6 მონაცემების მისაღებად (ჩვენ შეგვიძლია მას ვუწოდოთ Rx თუ გვსურს) და მე ვირჩევ PD7 მონაცემების გადასაცემად (ჩვენ შეგვიძლია მას Tx ვუწოდოთ, თუ მოგვწონს). ანალიზატორი ჩიპი პერიოდულად ამოწმებს მის Rx ქინძისთავს და თუ ხედავს სიგნალს, ის დაეცემა "საკომუნიკაციო ქვეპროგრამას" და შემდეგ გადასცემს დაბრუნების სიგნალს კამათლების როლიკზე და ამბობს, რომ მზად არის მისაღებად. ისინი ორივე დაიწყებენ დროს და კამათლების ამრევი გადასცემს სიგნალს (ანუ 5V) მილიწამზე თითო რიცხვზე კამათელზე. ასე რომ, თუ რულეტი იყო ორმაგი ექვსეული, ან 12, მაშინ კამათლის ამორტიზატორი დააყენებდა PD7– ს 5V– ზე 12 მილიწამში და შემდეგ ისევ 0V– ზე დააბრუნებდა. ანალიზატორი ამოწმებს თავის PD6 პინს ყოველ მილიწამში, ითვლის ყოველ ჯერზე, და როდესაც ის ბრუნდება 0V- ზე, მაშინ გამოსცემს მიღებულ რიცხვს ანალიზატორის ეკრანზე, აჩვენებს თორმეტს ორობითი შუქდიოდებით. ასე რომ, ეს არის გეგმა. ვნახოთ შევძლებთ თუ არა მის განხორციელებას.

ნაბიჯი 2: საკომუნიკაციო ქვეპროგრამები

პირველი რაც ჩვენ უნდა გავაკეთოთ არის ორი კონტროლერის დაკავშირება. ასე რომ, აიღეთ მავთული PD6– დან ერთზე და დააკავშირეთ იგი PD7– ზე მეორეზე და პირიქით. შემდეგ ინიციალიზაცია მოახდინეთ PD7– ზე OUTPUT ორივეზე და PD6– ით INPUT ორივეზე. საბოლოოდ ყველა მათგანი 0V- ზე დააყენეთ. კერძოდ, თითოეულ მიკროკონტროლერზე დაამატეთ კოდის Init ან Reset განყოფილება:

sbi DDRD, 7; PD7 დაყენებულია გამომავალზე

cbi PortD, 7; PD7 თავდაპირველად 0V cbi DDRD, 6; PD6 დაყენებულია შეყვანის cbi PortD, 6; PD6 თავდაპირველად 0V clr სულ; სულ კამათელზე თავდაპირველად 0

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

შემდეგ დაწერეთ ქვეპროგრამა ანალიზატორთან დასაკავშირებლად:

კომუნიკაცია:

cbi PortD, 7 sbi PortD, 7; გაგზავნეთ მზა სიგნალის ლოდინი: sbic PinD, 6; წაიკითხეთ PinD და გამოტოვეთ, თუ 0V rjmp დაელოდეთ 8; სინქრონიზაციის დაგვიანება (ეს ექსპერიმენტულად იქნა ნაპოვნი) გაგზავნა: შემცირება სულ დაგვიანებით 2; შეფერხება თითოეული სიკვდილის რაოდენობა cpi სულ, 0; 0 აქ ნიშნავს "სულ" ნომრების შეფერხებებს გაიგზავნა breq PC+2 rjmp send cbi PortD, 7; PD7 დან 0V clr სულ; გადააყენეთ კამათელი სულ 0 ბრუნამდე

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

clr ანალიზატორი; მოემზადეთ ახალი ნომრისთვის

sbic PinD, 6; შეამოწმეთ PD6 5V სიგნალი rcall კომუნიკაცია; თუ 5V მიდის მოძრაობის ანალიზატორის დასაკავშირებლად, სულ; გამომავალი ანალიზატორი ჩვენების rcall ანალიზატორი

და შემდეგ ჩაწერეთ საკომუნიკაციო ქვეპროგრამა შემდეგნაირად:

კომუნიკაცია:

clr სულ; გადატვირთეთ ჯამში 0 დაყოვნებით 10; დაგვიანების მოშორება sbi PortD, 7; დააყენეთ PB7 5V- ზე სიგნალი მზა მიღებისათვის: დაგვიანებით 2; დაელოდეთ მომდევნო რიცხვს ჯამში; ნამატი სულ sbic PinD, 6; თუ PD6 ბრუნდება 0V- ზე ჩვენ დავასრულეთ rjmp მიღება; სხვაგვარად მარყუჟის სარეზერვო ასლი მეტი მონაცემებისთვის cbi PortD, 7; გადატვირთვისას PD7 გადატვირთვა

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

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

სავარჯიშო 1: ნახეთ, შეძლებთ თუ არა უკეთესი მეთოდის დანერგვას და გამოიყენეთ იგი კამათლების რულეტის გადასაცემად, როგორც 8 ბიტიანი ორობითი რიცხვი.

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

ნაბიჯი 3: დასკვნა

დასკვნა
დასკვნა

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

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

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

სავარჯიშო 2: იმის ნაცვლად, რომ გამოიყენოთ მზა სიგნალი იმის დასანახად, თუ როდის არის კამათელი როლიკერი გადასასვლელი და სხვა როდესაც ანალიზატორი მზადაა მიიღოს, გამოიყენეთ "გარე შეწყვეტა" სახელწოდებით "Pin Change Interrupt". ქინძისთავები atmega328p შეიძლება გამოყენებულ იქნას ამ გზით, რის გამოც მათ აქვთ PCINT0 მათ შორის PCINT23 მათ გვერდით pinout დიაგრამაში. თქვენ შეგიძლიათ განახორციელოთ ეს როგორც შეფერხება ანალოგიურად, როგორც ჩვენ გავაკეთეთ ტაიმერის გადატვირთვის შეფერხებით. ამ შემთხვევაში შეფერხების "დამმუშავებელი" იქნება ქვეგეგმა, რომელიც კომუნიკაციას უწევს კამათლის ამორტიზატორს. ამ გზით თქვენ არ გჭირდებათ რეალურად დარეკოთ საკომუნიკაციო ქვეპროგრამას მთავარიდან: ის იქ წავა ნებისმიერ დროს, როდესაც ამ პინზე მდგომარეობის შეცვლის შედეგად მოდის შეფერხება.

სავარჯიშო 3: ერთი მიკროკონტროლერს შორის მონაცემების კომუნიკაციისა და გადაცემის ბევრად უკეთესი გზა სხვათა კოლექციაში არის მიკროკონტროლერზე ჩაშენებული 2 მავთულიანი სერიული ინტერფეისის გამოყენება. შეეცადეთ წაიკითხოთ მონაცემთა ცხრილის 22 -ე ნაწილი და ნახოთ თუ შეგიძლიათ გაარკვიოთ როგორ განახორციელოთ იგი.

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

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

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

შემდეგ ჯერზე…

გირჩევთ: