jfpoilpret'i aktsepteeritud vastus on väga hästi kirjutatud, täiesti kehtiv ja 99% juhtudest teen täpselt seda, mida ta selgitab. Tema lahendused vastavad teie määratletud parameetritele, nii et need peaksid töötama väga hästi. Kuid mis on parem kui " väga hästi "? Täiuslikkus! Lõppude lõpuks on küsimus täpse väärtuse loomises. Nagu öeldud, on enamasti piisavalt lähedal (väidetavalt kõik) piisavalt lähedal ja isegi kui tegelete millegagi kelladena, kui 1 sekund peab olema 1 sekund, peate ikkagi kannatama pärilike osade puuduste all.
Mida ma soovitada ei ole alati võimalik. Mõnel juhul on see võimalik, kuid palju rohkem vaeva ja vaeva kui antud juhul. Kas see on väärt, sõltub juhtumipõhiselt. Minu eesmärk on enamasti näidata tulevaste viidete jaoks alternatiivi, mis on mõnevõrra erandjuhtudel parem. See on kirjutatud algajaid Arduino kasutajaid silmas pidades, kellel pole laialdast elektroonikakogemust.
Edasijõudnutele tundub see ilmselt liiga sisukas ja tummaks tehtud. Aga ma usun, et need samad inimesed ilmselt juba teavad seda ega vaja seda vastust. See kehtib ka iga mikrokontrolleri ning iga tootja ja arhitektuuri kohta. Kuid teiste mikrokontrollerite puhul peate nõuetekohaste registrite ning eelskalasse kuuluvate nimede ja väärtuste väljaselgitamiseks pöörduma õige andmelehe poole.
Teie puhul vajate kindlat sagedust ja tore on see, et täpselt 56 kHz saab tegelikult saavutada väga lihtsalt (arvestamata osade praktilisi puudusi). Nii et see on ka suurepärane näide.
Signaali genereerimine sõltub mikrokontrolleri taimeritest ja kella allikast, nagu jfpoilpret hästi selgitab. Tema vastus käsitleb ainult ühe vaatenurga probleemi ja see on taimeritega möllamine. Kuid võite ka kella allikaga sebida või veelgi parem nii sünergia kui ka suurepäraste tulemuste saavutamiseks. Keskkonna parameetrite muutmisega, antud juhul süsteemi häkkimisega ja kella allika asendamisega saame konkreetse probleemiga toime tulla palju, palju hõlpsamalt ja lihtsamalt.
Kõigepealt tuleb meelde tuletada, kuna lülitamine toimub pin-olekus, peate ISR-i käivitama kaks korda rohkem kui signaali sagedus. See on 112 000 korda sekundis. 56 000 ja 16 000 000 ei liida eriti kenasti, nagu juba märgitud. Peame muutma kas signaali sagedust või taktitihedust. Tegeleme praegu muutumatu signaali sagedusega ja leiame parema taktsageduse.
Kõige lihtsam oleks valida kell, mille suurusjärk on suurem kui 56 kHz (või 112 kHz, kuid see on praktiliselt sama), kuna lisate ainult nulli ja selline matemaatika on enamiku inimeste jaoks kõige lihtsam. Kahjuks on kõik siin maailmas mingi kompromiss millegagi. Kõik väärtused ei tööta.
Esimene näide on liiga väikese taktigeneraatori kiirusega.
Kui valite kella 56 000 Hz, ei saa te enam midagi teha peab igal tsüklil helistama ISR-ile ega saa midagi muud teha. See on täiesti kasutu. Kui valite kümme korda suurema kiiruse (560 kHz), on teie töö tegemiseks 9 (10 tsüklit, kuni taimer saavutab maksimaalse väärtuse - üks tsükkel ISR-funktsiooni kutsumiseks) mikrokontrolleri tsüklid ja see võib täiesti olla ebapiisav. Teil on sageli vaja rohkem arvutusvõimsust.
Kui valite teisest küljest liiga suure väärtuse, kuna 56 MHz ei saa mikrokontroller sellega lihtsalt töötada. See on liiga kiire. Nii et ka poe suurima väärtuse valimine ei vähenda seda.
Originaalse Arduino Uno R3 aktsiakell on 16 MHz, nii et kõik aeglasem, mis töötab, on garanteeritud. Järgmine väärtus, mis on suurusjärgus suurem kui 56 ja väiksem kui 16 MHz, on 5,6 MHz. See võimaldab ISR-ile helistada iga 50 tsükli järel ja loob täiusliku 112 000 Hz taimeri sageduse. Ja teie signaal on täpselt 56 kHz. Teil on 49 MCU tsüklit programmi käivitamiseks ISR-i kõnede vahel, kuid see on endiselt umbes 1/3 algse kella kiirusest. Võib kasutada alusena 112 ja 11,2 MHz kella ning see annab umbes 2/3 põhivarustusega 16 MHz resonaatorist. ISR-funktsiooni kutsutakse iga 100 tsükli järel ja see loob endiselt täiusliku 56 kHz signaali.
Nende väärtustega on siiski kaks peamist probleemi.
-
Esimene probleem sõltub tõsiselt teie vajadustest: ohverdate umbes 1/3 (kiirusega 11,2 MHz) oma maksimaalsest arvutusvõimsusest, et saada täpne signaali sagedus, mis kasutab hõlpsasti leitavat registriväärtust (OCR iirc ). Võib juhtuda, et sellega läheb hästi või mitte.
-
Teine probleem on kõva showstopper : väärtuste leidmine on väga lihtne, kuid väga sageli neid lihtsalt ei eksisteeri valmistatud kella allikana. See on Farnelli resonaatori veebileht , millel pole lihtsalt nii 5,6 MHz kui ka 11,2 MHz.
Sellest möödahiilimiseks saame vaadake saadaolevaid resonaatori väärtusi ja uurige midagi muud, mida saab kasutada täpselt soovitud väärtuste genereerimiseks. Kui jagame 56 4-ga, saame 14 ja õnneks on olemas 14 MHz resonaator. See annab meile palju suurema kiiruse ja suurema võimsuse ning sama hõlpsasti leitava registriväärtuse. ISR-i helistamiseks 112 000 korda sekundis peame OCR-i registrisse lisama kümnendkoha väärtuse 124 või kuueteistkümnendkoha väärtuse 0x7C, nii et loendades ISR-i helistamiseks 124 tsüklit + 1, saame soovitud täiusliku väärtuse.
NB
- ISR - katkestage teenuse rutiin (see on kood, mis käivitatakse ainult loodud katkestustel)
- Kui suur võib teie programm olla, sõltub mälu suurusest! Sellel pole mingit pistmist taktsagedusega ega midagi pistmist ISR-i helistamise sagedusega.
-
Kui mikrokontroller käivitab programmi käsklusega, suureneb loendur. Katkestuse tekitamise korral kutsutakse ISR ja see väärtus salvestatakse spetsiaalsesse registrisse. Kui ISR-kood on lõpule jõudnud, taastatakse programmiloenduri väärtus sellest spetsiaalsest registrist ja programm jätkub sealt, kus see katkestati, nagu poleks seda kunagi juhtunud.
Toon äärmiselt tummaks muudetud näite . Kui olete purist, hoiatan teid: võib tekkida nina- ja silmaverejooks.
Kujutage ette, et peate kuskilt kuhugi kõndima. Üksikasjalikud marsruudi juhised on teie peamine programm ja selle käsud. See, kui kiiresti te kõnnite või joostate, sõltub teie "kella kiirusest", kuid mitte marsruudi juhistest (30 sammu edasi, 1 pööret 90 grad. Vasakule, 10 sammu edasi, 45 grad. Paremale jne.) Need on alati samad . Kujutage nüüd ette, et mõni väike laps või ahne korrumpeerunud kohalik poliitik võtab teie kingad vahel lahti. See on sündmus, mis tekitab katkestuse. Siis peatud pärast viimast sammu, põlvitad ja seod oma kinga uuesti kinni. See on teie ISR-i programm.
Seejärel jätkate peatatud kohast; sa ei alusta otsast peale. Kui kõnnite ilma hoolitsuseta kogu maailmas ja kogu aeg, pole teil vahet, isegi kui peate oma jalanõu igal teisel sammul kinni siduma. Kui teete seda siiski ajaliste piirangutega, näiteks olümpiamängudel 100 meetri jooks (või jookseb näljase lihasööja kiskja eest), võivad jalanõude peatamisel ja sidumisel olla kohutavad tagajärjed. Sama on mikrokontrolleritega. Isegi kui täidate ainult ühe koodirea, jätkub teie programm, ehkki aeglaselt. Kui sa ei hooli kiirusest üldse, pole see probleem. Kui peate tegema mõnda aega, näiteks kasutama muid taimerist sõltuvaid toiminguid, võib sekkumine olla väga soovimatu ja problemaatiline.
-
Vähem on rohkem! Kiirem kell pole alati parem. Aeglasema kellaga seadmed kasutavad tunduvalt vähem energiat. See võib olla patareidega töötava seadme oluline punkt.
-
Vajalikud tsüklid tuletatakse järgmistest valemitest:
(taktsagedus / (eelskaaleri väärtus * vajalik ISR) helistamissagedus)) - 1