AVR. სასწავლო კურსი

13.10.2023

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

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

მაშ, რა რაკი გველოდება საათის კვარცის გაშვებისას?

1 მიკროსქემის დიზაინი.
1.1 კონდენსატორები.
მიკროკონტროლერის მონაცემთა ფურცელი გარკვეულ სიგრძეზე მიუთითებს, რომ კონდენსატორები უნდა იყოს დაკავშირებული საათის კვარცთან, მაგრამ ზოგადად რთულია მათი ტევადობის გარკვევა. საათის კვარცი, სავარაუდოდ, იმუშავებს კონდენსატორების გარეშე, მაგრამ უკეთესია მათი დაყენება, ეს გააუმჯობესებს სიხშირის სტაბილურობას და დაეხმარება კვარცის უფრო სწრაფად გაშვებას.
კონდენსატორების ტევადობა უნდა იყოს 12-22 pF დიაპაზონში.

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

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

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

2 პროგრამირება.
2.1 ასინქრონული ტაიმერის რეჟიმის ინიცირება.

იმისათვის, რომ ქრონომეტრმა იმუშაოს საათის კვარციდან, ის (ტაიმერი) უნდა გადავიდეს ასინქრონულ რეჟიმში. ტაიმერის გადასართავად (თითქმის ყველა მიკროკონტროლერისთვის ეს არის ტაიმერი 2) ამ რეჟიმში, თქვენ უნდა ჩაწეროთ 1 AS2 ბიტზე. მაგრამ ყველაფერი ასე მარტივი არ არის, თქვენ უნდა დაიცვას გარკვეული გაშვების ალგორითმი. მონაცემთა ცხრილის მიხედვით, ტაიმერი 2-ისთვის ასინქრონული რეჟიმის ჩართვის პროცედურა შემდეგია:
1. გამორთეთ შეფერხებები ტაიმერიდან/მრიცხველიდან 2 - OCIE2x, TOIE2;
2. გადართე ასინქრონულ რეჟიმში 1 -> AS2;
3. ჩაწერეთ ახალი მნიშვნელობები TCNT2, OCR2x და TCCR2x რეგისტრებში;
4. დაელოდეთ TCN2UB, OCR2xUB და TCR2xUB დროშების გადატვირთვას;
5. გადატვირთეთ ტაიმერი/მრიცხველი 2 შეწყვეტის დროშები;
6. ჩართეთ შეფერხებები (საჭიროების შემთხვევაში).

დარწმუნდით, რომ დაიცავით ეს თანმიმდევრობა. აქ მოცემულია ტაიმერის 2-ის ასინქრონული რეჟიმის სწორი ინიციალიზაციის ჩამონათვალი.

/* შეფერხებების გამორთვა */ cli() ; /* 1. გამორთეთ Timer/Counter2 შეფერხებები OCIE2x-ისა და TOIE2-ის გადატვირთვის გზით. */ TIMSK2 &= ~((1<< OCIE2A) | (1 << OCIE2B) | (1 << TOIE2) ) ; /* 2. დააყენეთ Timer/Counter2 ასინქრონულ რეჟიმში AS2-ის დაყენებით. */ ASSR = (1<< AS2) ; /* მიეცით ცოტა დრო გენერატორის სტაბილიზაციას (შეიძლება გამოტოვოთ). */ _დაყოვნება_ms(1000); /* 3. დაწერეთ ახალი მნიშვნელობები TCNT2, OCR2x და TCCR2B. */ TCNT2 = 0; /* დააყენეთ შემზღუდველი = 128 32.768 kHz / 128 / 256 = გადადინება წამში ერთხელ. */ TCCR2B |= (1<< CS22) | (1 << CS20) ; /* 4. იმისათვის, რომ დარწმუნდეთ, რომ საათმა დაიწყო მუშაობა, დაელოდეთ ბიტების გასუფთავებას: TCN2UB, OCR2AUB, OCR2BUB, TCR2AUB და TCR2BUB. */ხოლო (ASSR & 0x1F) ; /* 5. გადატვირთეთ Timer/Counter2 შეწყვეტის დროშები. */ TIFR2 |= ((1<< OCF2A) | (1 << OCF2B) | (1 << TOV2) ) ; /* 6. ჩართეთ ტაიმერი 2 გადადინების შეწყვეტა */ TIMSK2 |= (1<< TOIE2) ; /* ჩართეთ შეფერხებები */ sei() ;

/* შეწყვეტის გათიშვა */ cli();<

/* 1. გამორთეთ Timer/Counter2 შეფერხებები OCIE2x-ისა და TOIE2-ის გადატვირთვის გზით. */ TIMSK2 &= ~((1
2.2 ტაიმერის ლიმიტი 2.

იმისათვის, რომ ტაიმერი 2-ის გადინება წამში ერთხელ მოხდეს, ლიმიტერის მნიშვნელობა უნდა იყოს 128. (128 ლიმიტერი * 256 გადინება = 32768 კვარცის სიხშირე).
2.3 საათის მუშაობა PowerSave ძილის რეჟიმში.

ძალიან მაცდურია მიკროკონტროლერის ძილის რეჟიმში გადაყვანა მეორე შეფერხებებს შორის პაუზებში, ამ შემთხვევაში მიკროკონტროლერის დენი დაეცემა 6-7 μA-მდე. ასეთ შემთხვევაში არსებობს PowerSave დაბალი მოხმარების რეჟიმი, რომლის დროსაც ტაიმერი 2 აგრძელებს მუშაობას საათის კვარციდან და აღვიძებს მიკროკონტროლერს შეფერხებით. ამ ოპერაციული რეჟიმის ალგორითმი მარტივია: ძილის რეჟიმიდან ტაიმერის შეფერხებით გამოსვლის შემდეგ, შეფერხების დამუშავების პროცედურაში ჩვენ „ვნიშნავთ“ საათს, გამოვდივართ შეფერხებიდან და კვლავ ვაძლევთ ძილის ბრძანებას (SLEEP). აქ არის ძალიან მნიშვნელოვანი ნიუანსი. კვლავ გადახედეთ მიკროკონტროლერის მონაცემთა ცხრილს განყოფილებაში დაბალი მოხმარების რეჟიმებისა და ასინქრონული რეჟიმის მუშაობის შესახებ. იმისათვის, რომ ტაიმერმა ნორმალურად დაიწყოს ფუნქციონირება გაღვიძების შემდეგ და შეძლოს მიკროკონტროლერის გამოღვიძება ძილიდან მომდევნო შეფერხებისას, საჭიროა გარკვეული დრო დაელოდოთ ძილის ბრძანებას. იმისათვის, რომ დარწმუნდეთ, რომ გენერატორი ნორმალურად მუშაობს, თქვენ უნდა ჩაწეროთ ტაიმერის ნებისმიერ რეესტრში, რომელიც არ შეაფერხებს საათს (მაგალითად, OCR2x-ში) და დაელოდოთ ამ რეესტრის მზადყოფნის დროშების გადატვირთვას (OCR2xUB). . დროშის გადატვირთვის შემდეგ, შეგიძლიათ უსაფრთხოდ ჩართოთ მიკროკონტროლერი ძილის რეჟიმში.<

/* გამოსვლის წერტილი ტაიმერ2-ის გადინების შეფერხებისთვის */ /* ჩაწერეთ ნებისმიერი მნიშვნელობა OCR2A-ზე. */ OCR2A = 0;
/* დაელოდეთ OCR2AUB-ის გადატვირთვას. */ ხოლო (ასსრ და (1 3 სხვადასხვა.

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

3.2 და ბოლოს


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

ზოგჯერ სასარგებლოა სისტემაში საათის ქონა, რომელიც დროს ითვლის წამებში და თანაც მაღალი სიზუსტით. ხშირად, სპეციალური RTC (Real Time Clock) მიკროსქემები, როგორიცაა . უბრალოდ, ეს არის დამატებითი შემთხვევა და ზოგჯერ ღირს იმდენი, რამდენიც თავად MK, თუმცა ამის გარეშე შეგიძლიათ. უფრო მეტიც, ბევრ MK-ს აქვს ჩაშენებული RTC ერთეული. მართალია, AVR-ს არ აქვს, მაგრამ აქვს ასინქრონული ტაიმერი, რომელიც ემსახურება როგორც ნახევარფაბრიკატს საათის დასამზადებლად.

უპირველეს ყოვლისა, ჩვენ გვჭირდება საათის კვარცი 32768 ჰერცზე.

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

ასინქრონული ტაიმერის რეჟიმი
გახსოვთ, როგორ მუშაობს ტაიმერები? საათის სიხშირე ძირითადი საათის გენერატორიდან (RC გარე ან შიდა, გარე კვარცი ან გარე ოსცილატორი) მიდის პრესკალერებზე, ხოლო პრესკალერების გამომავალიდან ის უკვე აწკაპუნებს TCNT რეგისტრის მნიშვნელობებზე. ან შეყვანის სიგნალი მოდის დათვლის შეყვანიდან Tn და ასევე დააჭერს TCNT რეგისტრს

ამისათვის კვარცის რეზონატორი დაკიდებულია TOSC2 და TOSC1 ქინძისთავებზე. დაბალი სიხშირე, ჩვეულებრივ საათში კვარცი 32768 ჰც. იგი დამონტაჟებულია კონტროლერის მარჯვნივ და დაკავშირებულია ჯემპერებთან. უფრო მეტიც, პროცესორის საათის სიხშირე უნდა იყოს მინიმუმ ოთხჯერ მეტი. შიდა ოსცილატორიდან გვაქვს საათი 8 MHz, ასე რომ ეს მდგომარეობა საერთოდ არ გვაწუხებს :)

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


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

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

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

OCR2 შედარების რეგისტრები და TCCR2 კონფიგურაციის რეგისტრი ასევე ბუფერულია

როგორ გავარკვიო მონაცემები უკვე შეყვანილია ტაიმერში თუ შუალედურ უჯრედებშია ჩამოკიდებული? დიახ, ეს ძალიან მარტივია - ასსრ რეესტრში დროშების გამოყენებით. ეს არის TCN2UB, OCR2UB და TCR2UB ბიტები - თითოეული პასუხისმგებელია საკუთარ რეესტრზე. როდესაც ჩვენ, მაგალითად, ჩავწერთ მნიშვნელობას TCNT2-ზე, TCNUB ხდება 1 და როგორც კი ჩვენი რიცხვი შუალედური რეგისტრიდან გადავა რეალურ მთვლელ რეგისტრში TCNT2 და დაიწყებს მონიშვნას, ეს დროშა ავტომატურად აღდგება.

ამრიგად, ასინქრონულ რეჟიმში, TCNT2, OCR2 და TCCR2 რეგისტრებზე ჩაწერისას, ჯერ უნდა შეამოწმოთ TCN2UB, OCR2UB და TCR2UB დროშები და ჩაწეროთ მხოლოდ თუ ისინი ნულის ტოლია. წინააღმდეგ შემთხვევაში, შედეგი შეიძლება იყოს არაპროგნოზირებადი.

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

  • გამორთეთ შეფერხებები ამ ტაიმერიდან
  • სასურველ რეჟიმზე გადასვლა (სინქრონული ან ასინქრონული)
  • საჭიროებისამებრ ისევ დავაყენეთ ტაიმერი. იმათ. საჭიროების შემთხვევაში დააყენეთ TCNT2 წინასწარ დაყენებული, ხელახლა დააკონფიგურირეთ TCCR2
  • თუ გადავალთ ასინქრონულ რეჟიმზე, მაშინ ველოდებით სანამ ყველა TCN2UB, OCR2UB და TCR2UB დროშა გადატვირთულია. იმათ. პარამეტრები გამოყენებულია და მზად არის წასასვლელად.
  • ტაიმერის/მრიცხველის შეწყვეტის დროშების გადაყენება. იმიტომ რომ ყველა ამ არეულობასთან ერთად ისინი შეიძლება შემთხვევით დასახლდნენ
  • ჩართეთ შეფერხებები ამ ტაიმერიდან

ამ თანმიმდევრობის შეუსრულებლობა იწვევს არაპროგნოზირებად და ძნელად გამოვლენილ ხარვეზებს.

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

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

მაგალითები:
კონტროლერი იყენებს ენერგიის დაზოგვას და ბირთვის გამორთვის რეჟიმს და იღვიძებს ასინქრონული ტაიმერის შეფერხებით. აქ უნდა გავითვალისწინოთ ის ფაქტი, რომ თუ შევცვლით TCNT2, OCR2 და TCCR2 რეგისტრების მნიშვნელობებს, მაშინ ჰიბერნაცია უნდა განხორციელდეს მხოლოდ TCN2UB, OCR2UB და TCR2UB დროშების დაცემის შემდეგ. წინააღმდეგ შემთხვევაში, ასეთი არეულობა გამოვა - ასინქრონულ ტაიმერს ჯერ არ ჰქონდა დრო, რომ აეღო მონაცემები შუალედური რეგისტრებიდან (ეს არის ნელი, ასობით ჯერ უფრო ნელი ვიდრე ბირთვი) და ბირთვი უკვე გათიშულია . და კარგი იქნებოდა ახალი კონფიგურაცია რომ არ იყოს გამოყენებული, ეს სისულელეა.

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

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

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

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

  • გაიღვიძა
  • მათ გააკეთეს რაღაც საჭირო
  • ჩაეძინა

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

  • გაიღვიძა
  • მათ გააკეთეს რაღაც საჭირო
  • უბრალოდ გასართობად, ჩვენ დავწერეთ რაღაც ბუფერულ რეგისტრებში. მაგალითად, TCNT-ში იყო 1 და ჩვენ ისევ ჩავწერეთ 1. არაფერი შეცვლილა, მაგრამ მოხდა ჩანაწერი, აღმართულია TCN2UB დროშა, რომელიც გარანტირებულია ნელი გენერატორის სამ ციკლს.
  • დაელოდეთ სანამ დროშა დაეცემა
  • დავიძინეთ.

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

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

და, სტატიის ბოლოს, პატარა მაგალითი. ასინქრონული ტაიმერის გაშვება Atmega16-ზე (როგორ გამოიყენება დაფა პოლიგონის მიერ)

პროექტი სტანდარტულია, დაფუძნებულია დისპეტჩერზე, ერთადერთი განსხვავება ისაა, რომ დისპეტჩერი გადაყვანილია timer0-ზე ტაიმერ2-ის გასათავისუფლებლად.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 int main(void) (InitAll(); // პერიფერიულის ინიცირება InitRTOS() ; // ბირთვის ინიცირება RunRTOS(); // ბირთვის დაწყება. UDR = "R" ; // დაწყების მარკერი, გამართვისთვის SetTimerTask(InitASS_Timer, 1000);// ვინაიდან ტაიმერი ასინქრონულ რეჟიმში // იწყება ნელა, ვაკეთებთ // ტაიმერის ინიციალიზაციის დაწყების დაყოვნება.ხოლო (1) // მთავარი დისპეჩერის მარყუჟი(wdt_reset() ; // ძაღლის ტაიმერის გადატვირთვა TaskManager() ;

// დისპეტჩერის დარეკვა

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 void InitASS_Timer(void ) ( თუ (ASSR & (1<< AS2) ) //თუ ეს მეორე შეყვანაა მაშინ(თუ (ასსრ და (1<< TCN2UB | 1 << OCR2UB | TCR2UB) ) // შეამოწმეთ არის თუ არა მინიმუმ ერთი დროშის ბიტი( SetTask (InitASS_Timer) ; // თუ არსებობს, მაშინ მას ვუგზავნით განმეორებით მოლოდინის ციკლს) სხვა // თუ ყველაფერი ნათელია, მაშინ შეგიძლიათ აწარმოოთ შეფერხებები( TIFR |= 1<< OCF2 | 1 << TOV2; // შეწყვეტის დროშების გადატვირთვა, ყოველი შემთხვევისთვის. TIMSK |= 1<< TOIE2; // გადინების შეწყვეტის ჩართვადაბრუნება ;<< OCIE2 | 1 << TOIE2) ; ) ) TIMSK &= ~(1// გამორთე ტაიმერი 2 შეფერხებები<< AS2; ASSR = 1// ასინქრონული რეჟიმის ჩართვა<< CS20; TCNT2 = 0; TCCR2 = 5// 128-ზე 32768-ზე პრესკალერი მისცემს 256 ტკიპს წამში // რომელიც მისცემს 1 გადადინებას წამში. }

SetTask (InitASS_Timer) ;<

// გაუშვით დისპეტჩერის მეშვეობით ხელახლა შესვლისთვის.

void InitASS_Timer(void) ( if(ASSR & (1

ISR(TIMER2_OVF_vect) // ტაიმერი 2 გადადინების შეწყვეტა ( UDR = i; i++; )
შესაძლებელი იყო საათები:წუთები:წამების შემცველი ცვლადების გაკეთება და ამ ცვლადებზე დაწკაპუნება მთელი საათის/წუთის გადადინების ლოგიკით, მაგრამ ძალიან ზარმაცი ვიყავი. და ასე რომ, ყველაფერი ნათელია.

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

მზად ხარ? მოდით წავიდეთ!



შესავალი

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

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

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

ჩვენ ვაშლით საათს

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


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

საათს ვიღებთ კეისიდან.


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

ჩვენ ვხსნით ოთხ ხრახნს - სამს უჭირავს 2016 წლის ლითიუმის ბატარეა, ერთს უჭირავს ზამბარის ჩანართი ტვიტერზე სიგნალის გასაგზავნად.


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

პინცეტის გამოყენებით, ფრთხილად ამოიღეთ დაფა პლასტმასის დამჭერიდან.


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

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


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


დაფაზე კვარცს ვსვამთ. ჯდება. კვარცი ჩავსვით გალიაში, ისიც ჯდება! დიდი! მოდით შევიცვალოთ!

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


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

ხელახალი შეკრება

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


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

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

ისე ეს არის!
დიდი პრობლემა დავძლიეთ )))

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

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

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

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

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

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

+16-ის ყიდვას ვაპირებ დაამატეთ რჩეულებში მიმოხილვა მომეწონა +91 +166