Სარჩევი:

AVR Assembler Tutorial 9: 7 ნაბიჯი
AVR Assembler Tutorial 9: 7 ნაბიჯი

ვიდეო: AVR Assembler Tutorial 9: 7 ნაბიჯი

ვიდეო: AVR Assembler Tutorial 9: 7 ნაბიჯი
ვიდეო: AVR Ассемблер. Урок 9. USART. AVR Assembler. Lesson 9. USART. 2024, ნოემბერი
Anonim
AVR Assembler Tutorial 9
AVR Assembler Tutorial 9

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

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

ჩვენ ვიყენებთ ჩვენს კლავიატურას მე –7 სამეურვეოდან

ამ გაკვეთილის გასაკეთებლად, სტანდარტული ნივთების გარდა, დაგჭირდებათ:

  1. 7 სეგმენტიანი დისპლეი

    www.sparkfun.com/products/8546

  2. 4 ციფრიანი ეკრანი

    www.sparkfun.com/products/11407

  3. დასაჭერი ღილაკი

    www.sparkfun.com/products/97

  4. ჩვენების მონაცემების ფურცლები, რომელთა გადმოწერაც შესაძლებელია მათი შესაბამისი გვერდებიდან ზემოთ.
  5. 68 pf კერამიკული კონდენსატორი, რამდენიმე 104 კონდენსატორი, რამოდენიმე რეზისტორი, ორი 2N3904 NPN ტრანზისტორი.

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

ნაბიჯი 1: 7-ნიშნიანი ეკრანის გაყვანილობა

გაყვანილობა 7-seg ჩვენების
გაყვანილობა 7-seg ჩვენების
გაყვანილობა 7-seg ეკრანი
გაყვანილობა 7-seg ეკრანი
გაყვანილობა 7-seg ჩვენების
გაყვანილობა 7-seg ჩვენების

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

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

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

სადაც სეგმენტების ასოები ნაჩვენებია სურათზე pinout– ით, რომელიც შეესაბამება საერთო 5V– ს და თითოეული LED სეგმენტი ათწილადის ჩათვლით (dp) ეკრანის ქვედა მარჯვენა კუთხეში. ამის მიზეზი ის არის, რომ ჩვენ შეგვიძლია შევიტანოთ მთელი რიცხვი ერთ რეგისტრში და გამომავალი, რომელიც რეგისტრირდება B და D პორტებში სეგმენტების გასანათებლად. როგორც ხედავთ, ბიტები დანომრილია თანმიმდევრულად 0 -დან 7 -მდე და ასე რომ, ისინი მიემართება სწორ ქინძისთავებზე, ცალკეული ბიტების დაყენებისა და გასუფთავების გარეშე.

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

უნდა დავამატო, რომ თქვენ უნდა დააყენოთ რეზისტორი ეკრანის საერთო ანოდსა და 5V სარკინიგზო ხაზს შორის. მე ავირჩიე 330 ოჰმიანი რეზისტორი, როგორც ყოველთვის, მაგრამ თუ გნებავთ, შეგიძლიათ გამოთვალოთ მინიმალური წინააღმდეგობა, რომელიც საჭიროა ეკრანიდან მაქსიმალური სიკაშკაშის გამოღების გარეშე. აქ მოცემულია, თუ როგორ უნდა გავაკეთოთ ეს:

ჯერ გადახედეთ მონაცემთა ფურცელს და შეამჩნიეთ, რომ პირველ გვერდზე ის იძლევა ეკრანის სხვადასხვა თვისებებს. მნიშვნელოვანი რაოდენობაა "წინსვლა დენი" (I_f = 20mA) და "წინ ძაბვა" (V_f = 2.2V). ეს გითხრათ, რომ გსურთ ეკრანზე ძაბვის ვარდნა იყოს, თუ დენი უდრის წინამორბედ დენს. ეს არის მაქსიმალური დენი, რომელსაც ეკრანი მიიღებს შეწვის გარეშე. შესაბამისად, ეს არის მაქსიმალური სიკაშკაშე, რომლის ამოღებაც შეგიძლიათ სეგმენტებიდან.

მოდით გამოვიყენოთ ომის კანონი და კირჩოფის მარყუჟის წესი იმის გასარკვევად, თუ რა მინიმალური წინააღმდეგობის გაწევა დაგვჭირდება სერიის ეკრანზე მაქსიმალური სიკაშკაშის მისაღებად. კირჩოფის წესი ამბობს, რომ წრეში დახურული მარყუჟის გარშემო ძაბვის ცვლილებების ჯამი უდრის ნულს და ომის კანონი ამბობს, რომ ძაბვის ვარდნა წინააღმდეგობის R წინააღმდეგობისას არის: V = I R, სადაც I არის დენი, რომელიც მიედინება რეზისტორში.

ამრიგად, V- ის წყაროს ძაბვის გათვალისწინებით და ჩვენი წრეწირის გარშემო, ჩვენ გვაქვს:

V - V_f - I R = 0

რაც ნიშნავს (V - V_f)/I = R. მაშასადამე, მაქსიმალური სიკაშკაშის მისაღებად საჭირო წინააღმდეგობა (და ალბათ სეგმენტების გახეხვა) იქნება:

R = (V - V_f)/I_f = (5.0V - 2.2V) /0.02A = 140 ohms

ასე რომ, თუ მოინდომებდით, სიხარულით შეძლებდით 150 ოჰმის გამოყენებას უპრობლემოდ. თუმცა, მე ვფიქრობ, რომ 140 ohms ძალიან ნათელს ხდის ჩემს სურვილს და ამიტომ ვიყენებ 330 Ohms (რაც არის ჩემი პირადი Goldilocks წინააღმდეგობა LED- ებისთვის)

ნაბიჯი 2: ასამბლეის კოდი და ვიდეო

მე დავამატე ასამბლეის კოდი და ვიდეო, რომელიც აჩვენებს კლავიატურის მუშაობას ეკრანზე. როგორც ხედავთ, ჩვენ უბრალოდ შევადგინეთ ხელახალი ღილაკი "r", ფლეშ ღილაკი "F", ვარსკვლავი "A" და ჰეშის ნიშანი "H". ეს შეიძლება იყოს ასახული სხვადასხვა ოპერაციებში, როგორიცაა უკანა სივრცე, შეყვანა და სხვა რა, თუ გინდათ რომ გააგრძელოთ კლავიატურის გამოყენება LCD ეკრანებზე ან ოთხნიშნა ეკრანებზე ციფრების აკრეფისათვის. ამჯერად კოდს ხაზზე არ გავივლი, რადგან ის ძალიან ჰგავს იმას, რაც ჩვენ უკვე გავაკეთეთ წინა გაკვეთილებში. განსხვავებები ძირითადად უფრო იგივეა, რაც ჩვენ უკვე ვიცით როგორ გავაკეთოთ, როგორიცაა შეფერხებები და საძიებელი მაგიდები. თქვენ უბრალოდ უნდა გაიაროთ კოდი და დაათვალიეროთ ახალი რამ, რაც ჩვენ დავამატეთ და ის, რაც ჩვენ შევცვალეთ და გაარკვიეთ იქიდან. ჩვენ დავუბრუნდებით ხაზგარეშე ანალიზს მომდევნო გაკვეთილში, როდესაც AVR მიკროკონტროლერებზე შევიტანთ ასამბლეის ენის კოდირების ახალ ასპექტებს.

მოდით შევხედოთ ოთხნიშნა ეკრანს.

ნაბიჯი 3: 4 ციფრიანი ეკრანის გაყვანილობა

4-ნიშნა ეკრანის გაყვანილობა
4-ნიშნა ეკრანის გაყვანილობა
4-ნიშნა ეკრანის გაყვანილობა
4-ნიშნა ეკრანის გაყვანილობა

მონაცემთა ფურცლის თანახმად, ოთხნიშნა ეკრანს აქვს 60 mA წინსვლის დენი და წინამორბედი ძაბვა 2.2 ვოლტი. ამრიგად, იგივე გაანგარიშებით, როგორც ადრე, სურვილის შემთხვევაში შემეძლო გამომეყენებინა 47 ohm რეზისტორი. სამაგიეროდ მე ვაპირებ გამოვიყენო… hrm.. ნება მომეცით ვნახო… როგორ დაახლოებით 330 ohms.

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

ჯერჯერობით, მოდით შევამოწმოთ, რომ ყველა სეგმენტი მუშაობს.

მოათავსეთ თქვენი 330 ოჰმეტიანი რეზისტორი თქვენი პურის დაფის პოზიტიურ რელსსა და ეკრანზე პირველ ანოდს შორის. მონაცემთა ფურცელი გვეუბნება, რომ ქინძისთავები დანომრილია 1 – დან 16 – ის ისრის საწინააღმდეგოდ საათის ისრის მიმართულებით ქვემოდან მარცხნივ (როდესაც თქვენ ნორმალურად უყურებთ ჩვენებას.. ათწილადებით ბოლოში) და მასში ნათქვამია, რომ ანოდები არის პინ ნომრები 6, 8, 9 და 12.

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

ახლა ჩადეთ თქვენი GND მავთული ერთ ქინძისთავში, რომ აანთოთ ერთი სეგმენტი და ამჯერად გადაიტანეთ რეზისტორი სხვა 3 ანოდზე და ნახეთ, რომ ერთი და იგივე სეგმენტი ანათებს თითოეულ სხვა ციფრზე.

რამე უჩვეულო?

გამოდის, რომ მონაცემთა ფურცელზე პინოტი არასწორია. ეს იმიტომ ხდება, რომ ეს არის მონაცემთა ცხრილი და პინუტი 12 პინიანი, 4 ციფრიანი ეკრანისთვის. ანუ ერთი მსხვილი ნაწლავის ან ათწილადის გარეშე. ეკრანი, რომელიც მივიღე შეკვეთისას, არის 16 პინიანი, 4 ციფრიანი ეკრანი. ფაქტობრივად, ჩემზე, სეგმენტის ანოდები არის 1, 2, 6 და 8. ქინძისთავებში

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

სეგმენტის რუქის კოდირება ზუსტად ისეთია, როგორც ზემოთ მოყვანილი ერთნიშნა 7 სეგმენტიანი ეკრანით-ჩვენ არ გვჭირდება რაღაცის შეცვლა კოდში, ერთადერთი რასაც ჩვენ ვცვლით არის ის, თუ როგორ არის დაკავშირებული მავთულები დაფაზე. უბრალოდ შეაერთეთ მიკროკონტროლერის სწორი პორტის პინი შესაბამის ციფრულ ეკრანზე 4 ნიშნაზე ისე, რომ, მაგალითად, PB0 კვლავ მიდის სეგმენტის a- ს შესაბამისი PIN, PB1 გადადის B სეგმენტზე და ა.

ერთადერთი განსხვავება ისაა, რომ ახლა ჩვენ გვჭირდება 4 დამატებითი ქინძისთავი ანოდებისთვის, რადგან ჩვენ აღარ შეგვიძლია 5V სარკინიგზო ხაზზე გადასვლა. ჩვენ გვჭირდება მიკროკონტროლი, რომ გადავწყვიტოთ რომელი ციფრი იღებს წვენს.

ასე რომ, ჩვენ გამოვიყენებთ PC1, PC2, PC3 და PD4 4 ციფრის ანოდების გასაკონტროლებლად.

თქვენ შეიძლება ასევე წავიდეთ წინ და შეაერთოთ მავთულები. (არ დაივიწყოთ ანოდის მავთულზე 330 ოჰმიანი რეზისტორები!)

ნაბიჯი 4: ოთხნიშნა ეკრანის კოდირება

4 ციფრიანი ეკრანის კოდირება
4 ციფრიანი ეკრანის კოდირება

მოდით ვიფიქროთ იმაზე, თუ როგორ გვინდა ამ ეკრანის კოდირება.

ჩვენ გვსურს, რომ მომხმარებელმა დააჭიროს კლავიატურის ღილაკებს და რიცხვები თანმიმდევრულად გამოჩნდეს ეკრანზე თითოეული ღილაკის დაჭერისას. ასე რომ, თუ მე დავაყენებ 1 – ს, რასაც მოყვება 2, ის გამოჩნდება ეკრანზე 12. მე ასევე მინდა შევინახო ეს მნიშვნელობა, 12, შიდა გამოყენებისთვის, მაგრამ ამას ცოტა მოგვიანებით მივიღებთ. ახლა მე უბრალოდ მინდა დავწერო ახალი მაკრო, რომელიც იღებს თქვენს კლავიშებს და აჩვენებს მათ. თუმცა, ვინაიდან ჩვენ მხოლოდ 4 ციფრი გვაქვს, მინდა დავრწმუნდე, რომ ის მხოლოდ ოთხი ციფრის აკრეფის საშუალებას გაძლევთ.

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

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

ჟღერს მაღალი შეკვეთა?

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

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

ნაბიჯი 5: Push 'n Pop

Push 'n Pop
Push 'n Pop

არსებობს მხოლოდ რამდენიმე "ზოგადი დანიშნულების რეგისტრი", რომელიც ჩვენ გვაქვს ჩვენს განკარგულებაში და მათი გამოყენების შემდეგ აღარ არის. ასე რომ, კარგი პროგრამირების პრაქტიკაა მათი გამოყენება მხოლოდ რამდენიმე ცვლადისათვის, რომლებიც გამოიყენება როგორც დროებითი საცავი, რომელიც გჭირდებათ პორტებისა და SRAM– ის წასაკითხად და დასაწერად, ან სხვაგვარად, რომელიც დაგჭირდებათ ყველგან ქვეგანაკვეთებში და ასე რომ თქვენ დაასახელეთ ისინი. ასე რომ, რაც მე გავაკეთე, ახლა, როდესაც ჩვენ დავიწყეთ და ვსწავლობთ სტეკის გამოყენებას, არის კოდის გავლა და დასახელებული ზოგადი დანიშნულების რეგისტრების პოვნა, რომლებიც გამოიყენება მხოლოდ ერთი ქვეპროგრამის შიგნით ან შეწყვეტისას და სხვაგან არსად კოდში და შეცვლა მათ აქვთ ჩვენი ერთ – ერთი ტემპერატურის რეგისტრატორი და ბიძგი და გასროლა დასტისკენ. ფაქტობრივად, თუ გადახედავთ მცირე მიკროკონტროლერებისთვის დაწერილ კოდს, ან თუ დაბრუნდებით იმ დროში, როდესაც ყველა ჩიპი უფრო პატარა იყო, ნახავთ მხოლოდ რამდენიმე ზოგადი დანიშნულების რეგისტრს, რომელიც უნდა გამოეყენებინათ ყველაფრისთვის, ასე რომ თქვენ არ შეგიძლიათ უბრალოდ შეინახეთ მნიშვნელობა იქ და დატოვეთ მარტო, რადგან დარწმუნებული იყავით, რომ ეს რეგისტრაცია სხვა ნივთებისთვის გჭირდებათ. ასე რომ თქვენ იხილავთ pushin 'და poppin' ყველგან კოდი. იქნებ მე უნდა დავარქვა ჩვენი დროებითი ზოგადი დანიშნულების რეგისტრები AX და BX როგორც წარსულის საპატიო პატივი.

მაგალითი დაეხმარება ამის გარკვევას.

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

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

წმინდა შედეგი არის ის, რომ ჩვენ "ვისესხეთ" temp და temp2 დროებითი გამოყენებისთვის და შემდეგ დავამუშავეთ ისინი წინა მნიშვნელობებზე, როდესაც დავასრულებთ.

აქ არის ADC_int შეწყვეტის რუტინა ამ ცვლილების განხორციელების შემდეგ:

ADC_int:

ბიძგის ტემპერატურა; ტემპერატურის შენახვა, რადგან ჩვენ აქ ვცვლით მას push2; შეინახეთ temp2 lds temp2, ADCH; კლავიშის დაჭერა ldi ZH, მაღალი (2*ნომერი) ldi ZL, დაბალი (2*ნომერი) cpi temp2, 0 breq დაბრუნება; თუ ხმაურის გამომწვევი ფაქტორები არ შეცვლიან 7 ნომერზე მითითებულ ღილაკს: lpm ტემპერატურა, Z+; ჩატვირთვა ცხრილიდან და დამატების დამატება clc cp temp2, temp; კლავიშის შედარება მაგიდასთან brlo PC+4; თუ ADCH უფრო დაბალია, ხელახლა სცადეთ lpm 7 რიცხვი, Z; წინააღმდეგ შემთხვევაში, ჩატვირთეთ საკვანძო მნიშვნელობის ცხრილი inc ციფრი; რიცხვითი რიცხვის გაზრდა rjmp დაბრუნება; და დააბრუნე adiw ZH: ZL, 1; ზრდა Z rjmp setkey; და დაბრუნდი დაბრუნება დაბრუნება: pop temp2; temp2 პოპ ტემპერატურის აღდგენა; ტემპერატურის რეტის აღდგენა

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

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

ნაბიჯი 6: დაბალი გამავლობის ფილტრები და ძაბვის გამაძლიერებელი

დაბალი გამავლობის ფილტრები და ძაბვის გამაძლიერებელი
დაბალი გამავლობის ფილტრები და ძაბვის გამაძლიერებელი
დაბალი გამავლობის ფილტრები და ძაბვის გამაძლიერებელი
დაბალი გამავლობის ფილტრები და ძაბვის გამაძლიერებელი

იმისათვის, რომ ხმაური ოდნავ გაასუფთაოთ და ჩვენი კლავიატურა უკეთესად იმუშაოს, ჩვენ გვინდა დავამატოთ რამდენიმე დაბალი გამავლობის ფილტრი. ეს ფილტრავს მაღალი სიხშირის ხმაურს და იძლევა დაბალი სიხშირის სიგნალის გავლის საშუალებას. არსებითად, ამის საშუალება არის უბრალოდ დავამატოთ 68 pf კონდენსატორი ჩვენს ანალოგიურ შეყვანასა და მიწას შორის და ასევე 0,1 მიკროფარადის (ანუ 104) კონდენსატორი ჩვენს PD4 (INT0) წყვეტს და მიწას შორის. თუ თქვენ თამაშობთ მათთან ერთად კლავიატურაზე ღილაკების დაჭერისას, თქვენ ნახავთ რას აკეთებენ ისინი.

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

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

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

თუ გადახედავთ დიაგრამას, რომელიც მე მიმაგრებულია ამ საფეხურზე, ნახავთ როგორ მუშაობს ძაბვის გამაძლიერებელი. ჩვენ ვიყენებთ რამდენიმე რეზისტორს და ორ ტრანზისტორს. ტრანზისტორების მუშაობის მეთოდი (იხ. მონაცემების ფურცლები!) არის მინიმალური ძაბვა, რომელიც თქვენ უნდა შეიყვანოთ ტრანზისტერზე (შუა პინზე), რომელიც გაჯერებს მას და საშუალებას მისცემს დენის ნაკადს კოლექტორის პინსა და გამცემს შორის პინი. 2N3904 ტრანზისტორის შემთხვევაში, რომელსაც ჩვენ აქ ვიყენებთ, ძაბვა არის 0.65V. ახლა ჩვენ ვიღებთ ამ ძაბვას ჩვენი გამომავალიდან კლავიატურიდან და არ გვინდა ამ გამომუშავების შეცვლა, ამიტომ ჩვენ დავდებთ დიდ რეზისტორს კლავიატურის გამომავალსა და პირველი ტრანზისტორის ფუძეს შორის (მე გამოვიყენე 1 მოჰამი). მე დიაგრამაში ამას მივაწერე R_1. შემდეგ ჩვენ გვსურს დავამყაროთ ძაბვის გამყოფი ისე, რომ ტრანზისტორის ბაზა უკვე "თითქმის" იყოს 0.65 ვოლტზე და მხოლოდ მოზარდმა ცოტა უფრო მეტად გადააგდოს იგი ზემოდან და გაჯერდეს. ეს მოზარდი weeny ცოტა გამოვა საწყისი გამომავალი კლავიატურა როდესაც ჩვენ დააჭირეთ ღილაკს. ვინაიდან კლავიატურის ქვედა კლავიშები მხოლოდ მცირე ძაბვას გამოსცემს, ჩვენ უკვე ძალიან ახლოს უნდა ვიყოთ გაჯერებასთან, რომ საკმარისი იყოს. ძაბვის გამყოფ წინააღმდეგობას დიაგრამაზე ეწერება R_a და R_b. მე გამოვიყენე R_a = 1Mohm და R_b = 560Kohm, მაგრამ თითქმის დარწმუნებული ვარ, რომ თქვენ მოგიწევთ ამ ციფრებთან თამაში, რომ სწორად მიიღოთ თქვენი კონფიგურაცია.შეიძლება დაგჭირდეს კედლის მახლობლად თავი დაარტყა და ორი ან სამი ჭიქა სკოჩი ხელში (მე გირჩევ ლაფროიგს - ძვირია, მაგრამ ღირს თუ მოწევა გიყვარს. BV და დასახლდით ღამით)

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

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

დააკვირდით რა არის აქ წმინდა შედეგი. თუ ჩვენ ვაჭერთ 1 ღილაკს, ჩვენ ვიღებთ 5V– ს PD4– ზე, ADC0– ზე გამოსვლის მნიშვნელოვნად შეცვლის გარეშე, და რაც მთავარია, მაშინაც კი, თუ ვარსკვლავს, 0, Hash ან ხელახლა ვიძახებთ, ჩვენ ასევე ვიღებთ 5V სიგნალს INT0– ზე და ასევე იწვევს შეფერხებას! ეს მნიშვნელოვანია, რადგან თუ ჩვენ უბრალოდ მივდივართ უშუალოდ კლავიატურის გამომავალიდან INT0 პინზე, ეს გასაღებები თითქმის არ წარმოქმნის ძაბვას და ისინი არ იქნება საკმარისი ამ შეწყვეტის პინის გასააქტიურებლად. ჩვენმა ძაბვის გამაძლიერებელმა გადაჭრა ეს პრობლემა.

ნაბიჯი 7: 4 ციფრიანი ჩვენების კოდი და ვიდეო

ეს ყველაფერი მე –9 გაკვეთილისთვის! მე დავამატე კოდი და ვიდეო, რომელიც აჩვენებს ოპერაციას.

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

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

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

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

პროექტი: გააკეთე კალკულატორი! გამოიყენეთ ჩვენი ოთხნიშნა ეკრანი და კლავიატურა და დაამატეთ გარე ღილაკი, რომელიც იმოქმედებს როგორც "შესვლის" გასაღები. შეადგინეთ ვარსკვლავი ვარსკვლავებზე "ჯერ", ჰაში "გაყავით" ხელახალი აკრეფა "პლუსზე" და განათება "მინუს" და დაწერეთ კალკულატორი, რომელიც მოქმედებს როგორც HP- ის ერთ -ერთი ძველი "უკუპრიალების" გამომთვლელი, რომელიც ყველა ინჟინერს ჰქონდა უკან დღეში. ანუ მათი მუშაობის პრინციპი არის ის, რომ შეიყვანოთ ნომერი და დააჭიროთ ღილაკს "enter". ეს უბიძგებს ამ რიცხვს დასტაზე, შემდეგ თქვენ შეიყვანთ მეორე რიცხვს და უბიძგებთ "enter" - ს, რომელიც უბიძგებს მეორე რიცხვს დასტაზე. დაბოლოს, თქვენ დააჭერთ ერთ ოპერაციას, როგორიცაა X, /, + ან - და ის გამოიყენებს ამ ოპერაციას დასტის ზედა ორ რიცხვზე, აჩვენებს შედეგს და შედეგს დააგდებს სტეკზე ისე, რომ თქვენ კვლავ გამოიყენოთ იგი მომწონს მაგალითად 2+3 რომ დაამატოთ თქვენ გააკეთებთ: 2, "enter", 3, "enter", "+" და ეკრანი წაიკითხავს 5. თქვენ იცით როგორ გამოიყენოთ სტეკი, ჩვენება, კლავიატურა და თქვენ ფონის კოდის უმეტესობა უკვე დაწერილია. უბრალოდ დაამატეთ შეყვანის გასაღები და კალკულატორისთვის საჭირო ქვეგეგმები. ეს ცოტა უფრო რთულია, ვიდრე თავდაპირველად წარმოგიდგენიათ, მაგრამ ეს სახალისო და გასაკეთებელია.

Შეხვედრამდე!

გირჩევთ: