Kolme kanaliga termostaat, termostaat, taimer ATmega8-l. Köögitaimer ATmega8-l Taimeri töörežiimide kirjeldus

01.11.2023 Veesoojendid

See seade on kasulik kõigile, kes peavad pidevalt süüa tegema, ja kaitseb teie kööki usaldusväärselt liigse suitsu eest. See seade, nagu nimigi ütleb, on köögitaimer. See on mõeldud intervallide lugemiseks erinevate roogade valmistamisel. Taimeril on mitu klahvi, mille abil saate hõlpsalt aega seada 1 minutist 99 tunnini. Pöördloendus algab automaatselt 3 sekundit pärast kellaaja määramist. Tänu valjule piiksule kuulete kindlasti, kui roog on valmis. Seade on kokku pandud ATMega8 mikrokontrolleri baasil.

Disaini kirjeldus

Seadme südameks on mikrokontroller U1 () kvartsresonaatoriga X1 (16 MHz) ja kahe kondensaatoriga C1 (22 pF) ja C2 (22 pF). Stabilisaator U2 () kondensaatoritega C3 (100 µF) ja C4 (47 µF) stabiliseerib 5 V toitepinget, mis on vajalik mikrokontrolleri ja sellega seotud komponentide korrektseks tööks. Zas-pistikule antakse pinge 7-12 V. Kui teil on toiteallikas pingega 5-6 V, võite pinge stabilisaatori vooluringist välja jätta. Helisignaali B1 ja kuvaanoode W1 juhivad transistorid T1 - T5 (), takistitega R1 - R8 (3,3 kOhm), R17 (3,3 kOhm) ja R18 (3,3 kOhm). Takistid R9 - R16 (330 oomi) piiravad kuvasegmente läbivat voolu. Programmeerija ühendamiseks kasutatakse Prog-pistikut ja ühte R-pistikut. Taimeri klaviatuur on ühendatud Sw-pistikuga.

Tootmine

Seadme trükkplaadi joonis on artikli lõpus olevas arhiivis. Osade paigaldamine algab kahe hüppaja jootmisega. Seejärel paigaldatakse kõik takistid ja muud elemendid järjekorras väikseimast suurimani. Quartz X1 peab olema "madal" - see on paigaldatud ekraani alla - muidu see lihtsalt ei mahu sinna. B1 sumisti saab plaadile joota nagu fotodel näha, kuid hiljem avastati, et pärast korpuse sulgemist oli heli liiga vaikne (hoolimata korpusesse puuritud aukudest). Sumisti on parem liimida korpuse ühele küljele (nagu on näidatud viimasel fotol) ja ühendada see juhtmetega tahvliga. Klaviatuur koosneb 5 mittefikseerivast 12x12mm nupust otse korpuse esiküljel, nii et nende tõukurid on korpuse pinnast veidi kõrgemal. Selle seadme puhul on hea kasutada toiteallikana telefoni laadijat selle kerge kaalu ja suuruse tõttu.

Allikas: cxem.net


Seda diagrammi vaadatakse sageli ka:

See taimer on loodud säriajaks 5 sekundist 100 minutini. Selle väljundis on üsna võimas elektromagnetrelee, mis võimaldab lülitada voolu kuni 30A pingel 12V ja voolu kuni 10A pingel 220V. Tänu elektromagnetrelee kasutamisele saab taimer juhtida mitte ainult kütte- või valgustusseadmeid, vaid ka vahelduvvoolu toitepinge jaoks kriitilise tähtsusega elektroonilisi seadmeid. Trafo toiteallikas koos releega tagab taimeri elektroonilise ahela täieliku galvaanilise isoleerimise võrgust.

Taimeri ja operaatori vaheliseks suhtlemiseks on neljakohaline LED-indikaator, mis sisaldab nelja väga vana 7-segmendilist AL304 maatriksit, mis on maatriksiks ühendatud samanimeliste segmenditihvtide ühendamisega. Loomulikult saate kasutada kaasaegsemaid LED-indikaatoreid ja isegi valmis neljakohalisi maatriksiid dünaamilise kuva jaoks.

Taimerit juhitakse nuppudega S1, S2, S3, S4. Kui vajutate nuppu S1, lülitub laadimine sisse ja taimer käivitub. Aja määramiseks, mille jooksul koormus peaks töötama, peate vajutama S4. Ekraanil hakkavad vilkuma kaks kõige olulisemat numbrit (minutit). Nüüd saate minutite määramiseks kasutada nuppe S2 ja S3. Seejärel peate uuesti vajutama S4. Nüüd hakkavad kõige vähemtähtsamad numbrid vilkuma ja saate sekundite määramiseks kasutada nuppe S2 ja S3. Seadete salvestamiseks vajutage uuesti S4. Nüüd näitab indikaator määratud säriaega. Taimeri käivitamiseks peate vajutama S1. Koormus lülitatakse sisse ja indikaatori näidud hakkavad vähenema. Niipea kui määratud aeg on möödas, ilmub näidikule "OFF" ja elektromagnetrelee lülitab koormuse välja. Kordamiseks vajutage kaks korda nuppu S1. Kui vajutate esimest korda “OFF”, kuvatakse määratud aeg ja teisel korral käivitub taimer. Relee juhtimine kontakti 23 D1 kaudu. Sisselülitamine on loogiline üksus. VT5 ja VT6 võti juhib elektromagnetreleed K1. Selliseid releesid kasutatakse autoalarmi ahelates. Nad saavad lülitada nii alalisvoolu (12V) kui ka vahelduvvoolu (220V), kuna neil on hea isolatsioon.

Toiteallikas on valmistatud väikese võimsusega trafo abil. Kuna trafo sekundaarmähis on koputatud keskelt (12-0-12), tehakse alaldi mitte silda kasutades, vaid täislaineahelat kasutades kahte dioodi VD2 ja VD3. Kui trafol on 12V mähis ilma kraanita, siis on vaja alaldi silda. Relee toide saab otse alaldi väljundist ja ülejäänud vooluring läbi 5V pingeregulaatori A1.

Püsivara vilkumisel peate selle töötama koos sisemise 8 MHz ostsillaatoriga.

Ahel on kokku pandud ostetud prototüübi trükkplaadile, ühel pool on mikroskeem ja muud osad ning teisel pool nupud ja indikaatorid. Toitetrafo väljaspool plaati.

KT315 transistoreid saab asendada KT3102 või mis tahes analoogidega. KT815 transistori saab asendada KT817, KT604 vastu. Diood KD521 - peaaegu iga analoog. Alaldi KD209 dioodid on mis tahes alaldi dioodid alalisvoolu jaoks, mis ei ole madalam kui 150 mA. Integreeritud stabilisaatori 7805 saab asendada mis tahes 5-voldise stabilisaatoriga, näiteks KR142EN5A. Või tehke stabilisaator parameetrilise ahela abil, kasutades kahte transistori ja 5 V zeneri dioodi. Näitajate osas öeldi eespool. Need võivad olla mis tahes seitsmesegmendilised indikaatorid, millel on ühine anood (katood).

Arhiiv artiklile "Atmega8 ja LED-indikaatorite taimer"
Kirjeldus: Püsivara failid
Faili suurus: 5,58 KB Allalaadimiste arv: 4 319

Selles õpetuses räägime taimeritest.

See teema on otseselt seotud mikrokontrolleri kellastamise teemaga. Seetõttu soovitan enne selle õppetunni lugemist eelmine läbi lugeda.

Miks me siis taimerit vajame?

Mikrokontrolleritele projektide ehitamisel on sageli vaja mõõta täpseid ajavahemikke. Näiteks soov vilgutada LED-i teatud sagedusega või küsitleda nupu olekut vajalike ajavahemike järel.

Taimerid aitavad ülesandeid lahendada. Kuid AVR-i mikrokontrolleri taimerid ei tea, mis on sekund, minut või tund. Samas teavad nad väga hästi, mis on taktitunne! Need töötavad täpselt tänu kontrolleri kella olemasolule. See tähendab, et taimer loendab kontrolleri tsüklite arvu, mõõtes seeläbi ajavahemikke. Oletame, et kontroller töötab taktsagedusel 8 MHz, see tähendab, et kui taimer loeb 8 000 000-ni, möödub üks sekund, 16 000 000-ni lugedes möödub 2 sekundit jne.

Siin tuleb aga esimene takistus. Meie registrid on 8-bitised, see tähendab, et saame arvestada maksimaalselt 255-ni ja 16-bitise taimeriga maksimaalselt kuni 65535. See tähendab, et ühe sekundi jooksul peame taimeri lähtestama. tohutult palju kordi! Muidugi saate seda teha, kui teil pole muud teha. Kuid lihtsalt aja mõõtmine võimsa mikrokontrolleriga pole üldse huvitav, ma tahan teha midagi enamat. Siin tuleb meile appi eeljagaja. Üldiselt on see vahelüli taimeri ja kontrolleri taktsageduse vahel. Eelskaalaja muudab meie ülesande lihtsamaks, võimaldades meil jagada kella sagedus teatud arvuga enne selle andmist taimeriga. See tähendab, et kui seadistate eelskaalaja väärtusele 8, loeb meie taimer 1 sekundiga 8 000 000 asemel 1 000 000-ni (muidugi kontrolleri taktsagedusega 8 MHz). See on juba huvitavam, kas pole? Ja me saame jagada mitte ainult 8-ga, vaid ka 64-ga ja isegi 1024-ga.

Nüüd on aeg vooluring kokku panna, taimer, eelskaalaja seadistada ja teha vähemalt midagi kasulikku!

Ja täna valmistame LED-idest "jooksutuled". See tähendab, et süütame ükshaaval 3 LED-i perioodiga 0,75 sekundit (see tähendab, et ühe LED-i tööaeg on 0,25 sekundit). Paneme kokku järgmise diagrammi:

Arvutage ise takistite R 1-R 3 väärtused.

Järgmiseks vaatame taimerite töötamise eest vastutavaid registreid. Kokku on AtMega 8-l 3 taimerit.Kaks 8-bitist (Taimer 0, Taimer 2) ja üks 16-bitine (Taimer 1). Vaatleme 16-bitise taimeri 1 näidet.

Paar registrit, 8-bitised registrid TCNT 1H ja TCNT 1L, moodustavad koos 16-bitise registri TCNT 1. See register on avatud nii kirjutamiseks kui lugemiseks. Kui taimer 1 töötab, muutub selle registri väärtus iga loendusega ühe võrra. See tähendab, et register TCNT 1 salvestab kella tsüklite arvu, mille taimer on loendanud. Siia võime kirjutada ka suvalise arvu vahemikus 0 kuni 2 kuni 16. astmeni. Sel juhul loendatakse kellatsükleid mitte nullist, vaid registreeritud numbrist.

TIMSK register vastutab mikrokontrolleri taimerite töötamisel tekkivate katkestuste eest. Katkestus on millegi muutumisel vastuvõetava erisignaali töötleja.. Mis tahes mikrokontrolleri katkestusi saab lubada või keelata. Lubatud katkestuse korral põhiprogrammi käik katkestatakse ja seda signaali töödeldakse. Kui ilmneb keelatud katkestus, programmi voogu ei katkestata ja katkestust ignoreeritakse. TOIE 1 bitt (Timer 1 Overflow Interrupt Enable) vastutab taimeri 1 loendusregistri TCNT 1 ületäitekatkestuse lubamise eest. Sellele bitile 1 kirjutamisel on katkestus lubatud ja 0 kirjutamisel keelatakse. Selle katkestuse genereerib registri TCNT 1 maksimumväärtuse saavutamisel taimer 1. Katkestuste kohta räägime lähemalt järgmises tunnis.

Taimeri 1 konfigureerimise eest vastutab register TCCR 1B. Sel juhul määrame bittide CS 10-CS 12 abil eelskaalaja väärtuse vastavalt järgmisele tabelile.

Ülejäänud bitid ei paku meile praegu huvi.

Samuti on olemas register TCCR 1A, mis võimaldab seadistada muid taimerite töörežiime, näiteks PWM, kuid nende kohta eraldi artiklis.

Ja nüüd kood C-s:

#define F_CPU 16000000UL #include #kaasa uint8_t arv=0; ISR(TIMER1_OVF_vect) ( PORTD=(1<2) ( num=0; ) TCNT1=61630;//Taimeri esialgne väärtus ) int main(void) ( DDRD|=(1)<

#define F_CPU 16000000UL

#kaasa

#kaasa

uint8_t arv = ;

ISR (TIMER1_OVF_vect)

PORTD = (1<< num ) ;

arv++ ;

kui (arv > 2)

arv = ;

TCNT1 = 61630; //Taimeri esialgne väärtus

int main(tühine)

DDRD |= (1<< PD0 ) | (1 << PD1 ) | (1 << PD2 ) ;

TCCR1B |= (1<< CS12 ) | (1 << CS10 ) ; //Eelskaalaja = 1024

TIMSK |= (1<< TOIE1 ) ; //Luba taimer 1 ülevoolukatkestus

TCNT1 = 61630; //Taimeri esialgne väärtus

sei(); //Luba katkestused

samal ajal (1)

//Programmi põhitsükkel, see on tühi, kuna kogu töö on katkestuses

ASM kood:

Kokkupanek (x86)

Kaasake "m8def.inc" rjmp start .org OVF1addr rjmp TIM1_OVF algus: ldi R16,LOW(RamEnd) out SPL,R16 ldi R16,HIGH(RamEnd) out SPH,R16 ldi R16,1 ldi R16,1 ldi R17,0110 R17,0b00000101 välja TCCR1B,R17 ldi R17,0b11110000 välja TCNT1H,R17 ldi R17,0b10111110 välja TCNT1l,R17 ldi R17,0b000001001 pealoomp7 nohloop _OV F: out PORTD,R16 lsl R16 cpi R16,8 brlo etikett_1 ldi R16,1 etikett_1: ldi R17,0b10111110 välja TCNT1L, R17 ldi R17,0b11110000 välja TCNT1H, R17 reti

Kaasake "m8def.inc"

Rjmp algus

Organisatsiooni OVF 1adr

Rjmp TIM 1_OVF

algus:

Ldi R 16, LOW (RamEnd)

Väljas SPL, R 16

Ldi R 16, HIGH (RamEnd)

Väljas SPH, R 16

Ldi R 16, 1

Ldi R 17, 0b00000111

Väljas DDRD, R 17

Ldi R 17, 0b00000101

Väljas TCCR 1B, R 17

Ldi R 17, 0b11110000

Väljas TCNT 1H, R 17

Ldi R 17, 0b10111110

Taimer aitab teil täpselt mõõta ajavahemikku vahemikus 1 sekund kuni 24 tundi.

Täna ei üllata te kedagi taimeri disainiga, sest... Sarnaseid seadmeid on müügil ja Internetis nii palju kui soovite. Ja kõik taimerid tunduvad olevat üksteisega sarnased. Ja kui hakkate vooluringi funktsioone üksikasjalikumalt kaaluma, leiate sellest enda jaoks ebamugavusi.

Nendel põhjustel koostasin taimeriprogrammi, mis vastab järgmistele parameetritele:
– kompaktne disain ja lihtne vooluring;
– töökorras nuppude juhtimine;
– nuppude juhtimisel toimingute dubleerimine LCD-ekraanil;
– aja seadmine sekundi täpsusega;
– loendusvahemik 1 sekund kuni 24 tundi;
– käivitamise, pausi funktsioon;
– pöördloenduse lähtestamise ja ajaväärtuste seadmise funktsioon;
– väärtuse 00.00.00 saavutamisel lülitatakse täiturmehhanism sisse;

Selles projektis viidi ellu kõik määratud ülesanded.

10. õppetund

Taimerid-loendurid. Katkestab

Täna saame teada, mis see on taimerid-loendurid mikrokontrollerites ja miks neid vaja on ning mis on katkestab ja miks neid ka vaja on.

Taimerid-loendurid- need on mikrokontrolleri seadmed või moodulid, mis, nagu nimigi ütleb, loevad pidevalt midagi. Neid loetakse kas teatud väärtuseni või nende bitisügavusega võrdse väärtuseni. Nad loevad pidevalt sama kiirusega, mikrokontrolleri taktsageduse kiirusega, mis on kohandatud sagedusjagajatele, mille me konfigureerime teatud registrites.

Ja need taimerite loendurid loevad pidevalt, kui me need lähtestame.

Taimerid MK-s Atmega8 kolm.

Kaks neist on kaheksabitine taimerid, st need, mis suudavad lugeda maksimaalselt ainult 255-ni. Sellest väärtusest meile ei piisa. Isegi kui me kasutame maksimaalset sagedusjagajat, ei saa me mitte ainult sekundit lugeda, vaid isegi poolt sekundit. Ja meie ülesanne on täpselt see: loendada kuni 1 sekund, et kontrollida LED-indikaatori arvu suurenemist. Muidugi võib kasutada ka muutuja suurendamist teatud väärtuseni, aga ma tahaks täiesti riistvaralist arvutust.

Kuid on veel üks taimer - see on täieõiguslik 16-bitine taimer. Ta mitte ainult 16-bitine, kuid sellel on siiski teatud võlusid, mida teistel taimeritel pole. Nende võimalustega tutvume hiljem.

Just seda 16-bitist taimerit me täna uurime ja kasutame. Peale selle, et olete selle taimeriga tuttavaks saanud, ei maksa teile midagi kahe teise töö iseseisvaks uurimiseks, kuna need on palju lihtsamad. Sellegipoolest kaalume tulevikus ka 8-bitiste taimerite kasutamist, kuna ühest taimerist ei piisa keerulisemate ülesannete täitmiseks.

Nüüd lühidalt katkestustest.

Katkestab (Katkestused) on mehhanismid, mis katkestavad koodi sõltuvalt teatud tingimustest või teatud keskkonnast, mis dikteerib teatud mikrokontrolleris asuvaid seadmeid, mooduleid ja siine.

Meie Atmega8 kontrolleris on 19 tüüpi katkestusi. Siin on need kõik kontrolleri tehnilise dokumentatsiooni tabelis

Mis tüüpi tingimused võivad olla? Meie puhul näiteks luges taimer teatud väärtuseni või näiteks bait ja muud tingimused saabusid mõnele siinile.

Hetkel töötleme katkestust, mis asub ülaltoodud tabelis positsioonil 7 - TIMER1 COMPA, kutsuti aadressil 0x006.

Vaatame nüüd meie 16-bitist taimerit või TAIMER1.

Siin on selle plokkskeem

Näeme seal registrit TCNTn, milles arv on pidevas muutumises, st kasvab pidevalt. Praktikas on see loendur. See tähendab, et see register salvestab numbri, milleni taimer on loendanud.

Ja registritesse OCRnA Ja OCRnB(tähed n on taimeri number, meie puhul on see 1) - need on registrid, kuhu sisestame numbri, millega TCNTn registris olevat numbrit võrreldakse.

Näiteks sisestasime mingi numbri OCRnA registrisse ja niipea, kui see arv langeb kokku loendusregistris oleva väärtusega, tekib katkestus ja me saame seda töödelda. Katkestustega taimerid on väga sarnased tavalise koodi viivitusega, ainult siis, kui oleme viivituses, ei saa me sel ajal ühtegi koodi käivitada (noh, jällegi piltlikult "meie", tegelikult ALU). Ja kui taimer loeb, käivitatakse sel ajal vaikselt kogu meie programmi kood. Seega võidame tohutult, laskmata kontrolleri tohututel ressurssidel sekundit ega isegi pool sekundit jõude olla. Sel ajal saame hakkama nupuklõpsudega, millega saame hakkama ka taimeris ja palju muud.

Samuti on olemas TCCR register. See register on kontrollregister. Seal on konfigureeritud teatud bitid, mis vastutavad taimeri konfiguratsiooni eest.

Taimeril on ka mitu režiimi, millega samuti veidi hiljem tutvume.

See koosneb kahest poolest, kuna meie kontroller on 8-bitine ja sellel ei saa olla 16-bitisi registreid. Seetõttu salvestatakse registri kõrgem osa registri ühes pooles (ja füüsiliselt ühes registris), madal osa aga teises pooles. Võite seda nimetada ka registripaariks, mis koosneb kahest eraldi registrist TCCR1A ja TCCR1B. Number 1 tähendab, et register kuulub taimerile 1.

See TCCR-register vastutab jagaja seadistamise eest, et taimer ei loeks nii kiiresti, samuti vastutab (õigemini selle teatud bitid) teatud režiimi seadistamise eest.

WGM-bitid vastutavad režiimi seadistamise eest

Näeme siin palju erinevaid režiime.

Tavaline- see on tavarežiim, taimer loeb lõpuni.

PWM- See PWM ainult erinevad sordid, see tähendab, et taimer võib mängida rolli impulsi laiuse modulaator. Tutvume selle tehnoloogiaga hilisemates tundides.

CTC- see lähtestamine on juhuslikult täpselt see, mida me vajame. Siin võrreldakse TCNT ja OCR registreid. Selliseid režiime on kaks, vajame esimest, teine ​​töötab erineva registriga.

Me ei uuri selles õppetükis kõiki režiimide liike. Kui meil on neid režiime vaja, siis mõtleme selle välja.

No ärgem piinakem end dokumentatsiooniga ja proovime lõpuks mingitesse registritesse midagi sisestada.

Kood, nagu alati, loodi eelmisest projektist. Proteuse jaoks kopeeriti ja nimetati kood ümber ka viimasest õppetunnist ning kontrolleri atribuutides märgiti tee uue püsivara juurde. Nimetame projektid Test07.

Proovime nagu alati koodi kompileerida ja Proteuses käivitada. Kui kõik töötab hästi, hakkame uut koodi lisama.

Lisame veel ühe funktsiooni, kuna õppisime, kuidas funktsioone lisada viimases õppetükis. Funktsiooni kood paigutatakse funktsiooni segchar järele ja põhifunktsiooni ette. Hiljem, kuna kutsume funktsiooni segchar oma uue funktsiooni sees.

Pealegi loome mitte ühe funktsiooni, vaid kaks. Asetame kogu oma taimeri lähtekoodi ühte funktsiooni ja teine ​​funktsioon on taimeri katkestuse töötleja ning sellised funktsioonid on spetsiifilised ja neid ei pea kutsuma. Kui vajadus tekib, helistavad nad ise sõltuvalt teatud ülaltoodud tingimustest.

Seetõttu kutsume esimest funktsiooni timer_ini

//———————————————

tühinetimer_ini( tühine)

{

}

//———————————————

Eraldagem ka meie funktsioonid, aga ka mõned globaalsete muutujate deklaratsiooniga täisplokid funktsiooni prototüüpidega, nende ridade kaupa, mida kahe ees oleva kaldkriipsu olemasolu tõttu kompilaator ei töötle ja hakkab võtke neid kommentaaridena. Nende piiritlemiste tõttu näeme, kus üks funktsioon lõpeb ja teine ​​algab.

Sellel funktsioonil, nagu näeme, pole argumente - ei sisendit ega tagastamist. Kutsume seda funktsiooni kohe funktsioonis main().

allkirjastamatacharbutcount=0,butstate=0;

timer_ini();

Nüüd hakkame seda funktsiooni aeglaselt koodiga täitma.

Alustame taimeri juhtimisregistrist, näiteks TCCR1B. Kasutades oma lemmikoperatsiooni "OR", sisestame selle teatud registri bitti

tühinetimer_ini( tühine)

TCCR1B|= (1<< WGM12);

Kommentaarist näeme, et töötame režiimibittidega ja nendest määrame ainult WGM12 biti, jättes ülejäänud nullideks. Selle põhjal konfigureerisime selle režiimi:

Taimeril on ka järgmine register: TIMSK. See register vastutab katkestusmaskide eest - Katkestusmask. See register on saadaval kõigi taimerite jaoks, mitte ainult esimese jaoks, see on tavaline. Selles registris määrame biti OCIE1A, mis võimaldab meile vajalikku katkestust TIMER1 COMPA

TCCR1B|= (1<< WGM12); // määrake CTC režiim (lähtestatakse juhuslikult)

TIMSK|= (1<< OCIE1A);

Nüüd mängime võrdlusregistrite endaga OCR1A (H ja L). Selleks peate natuke matemaatikat tegema. Registreeri OCR1AH salvestab võrdluseks numbri esiosa ja registri OCR1AL- Noorim.

Kuid enne loendamist kirjutame selle registri mis tahes väärtustega koodi ja seejärel parandame seda, kuna siis lähtestame jagaja ja see osaleb ka vajaliku loendusaja arvutamisel. Ilma jagaja loendab taimer liiga kiiresti.

TIMSK|= (1<< OCIE1A); //seadke 1. loenduri katkestuse lubamise bitt kattuma OCR1A(H ja L)

OCR1AH= 0b10000000;

OCR1AL= 0b00000000;

TCCR1B|= ( ); //määra jagaja.

Me ei määra veel jagajat, kuna me pole seda veel välja arvutanud. Teeme ära.

Hetkel meie registris OCR1A leitakse arv 0b1000000000000000, mis vastab kümnendarvule 32768.

Meie mikrokontroller töötab, nagu kokku leppisime, sagedusel 8 000 000 Hz.

Jagage 8 000 000 32 768-ga, et saada ligikaudu 244,14. See on sagedus hertsides, millega meie taimer töötab, kui me jagajat ei kasuta. See tähendab, et meie numbrid muutuvad 244 korda sekundis, nii et me ei näe neid isegi. Seetõttu peate kasutama taimeriga sagedusjagurit. Valime jagaja 256-ga. See sobib meile ja siis korrigeerime seda võrdlusnumbri abil täpselt kuni 1 Hz.

Siin on 1 taimeri jagajad:

Olen tabelis esile toonud meile vajaliku jagaja. Näeme, et peame määrama ainult biti CS12.

Kuna meie sagedusjagur on 256, jagame selle jagajaga 8000000, saame 31250 ja see on number, mille peame TCNT-sse sisestama. Meie taimer loeb kuni selle numbrini, et lugeda 1 sekundini. Arv 31250 on binaarses esituses 0b0111101000010010. Paneme selle numbri registripaari ja rakendame ka jagajat

OCR1AH= 0b 01111010 ; //kirjutada võrdluseks registrisse number

OCR1AL= 0b 00010010 ;

TCCR1B|= (1<< CS12 ); //määra jagaja.

Selle funktsiooniga on kõik.

Nüüd on järgmiseks funktsiooniks kokkusattumustaimeri katkestuse töötleja. See on kirjutatud nii

ISR( TIMER1_COMPA_vect)

{

}

Ja selle funktsiooni põhiosa täidetakse arvude kokkulangemise korral ise.

Meil on vaja muutujat. Deklareerime seda globaalselt, faili alguses

#kaasa

//———————————————

allkirjastamatachari;

//———————————————

Sellest lähtuvalt eemaldame funktsiooni main() koodist sama muutuja

intpeamine( tühine)

allkirjastamatachari;

Kommenteerime ka kogu lõpmatu tsükli koodi. Selle rolli hakkab nüüd mängima taimer ja ma arvan, et see tuleb sellega sama hästi ja veelgi paremini toime, ilma "keegi" segamata.

samal ajal(1)

{

// for(i=0;i<10;i++)

// {

// while (butstate==0)

// {

// kui (!(PINB&0b00000001))

// {

// if(butcount< 5)

// {

//agacount++;

// }

//muu

// {

// i=0;

//butstate=1;

// }

// }

//muu

// {

// if(butcount > 0)

// {

//butcount—;

// }

//muu

// {

//butstate=1;

// }

// }

// }

// segchar(i);

// _delay_ms(500);

//butstate=0;

// }

Nüüd tegelikult käitleja funktsiooni keha. Siin kutsume funktsiooni segchar. Siis suurendame 1 muutuja võrra i. Ja et see ei ületaks ühekohalist numbrit, lähtestame selle sellel tingimusel nullile

ISR( TIMER1_COMPA_vect)

kui( i>9) i=0;

segchar( i);

i++;

Nüüd parandame veidi funktsiooni main() alguses olevat koodi. Port D, mis vastutab segmentide oleku eest, seame selle nii, et selle sisselülitamisel indikaator ei sütti, kuna sellel on ühine anood. Seejärel paneme siia globaalsesse muutujasse i numbri 0, lihtsalt järjekorras. Üldiselt on käivitamisel initsialiseerimata muutujad reeglina alati nullid. Kuid me selle ikkagi initsialiseerime. Ja mis kõige tähtsam, et taimeri katkestus töötaks, ei piisa selle lisamisest taimeri lähtestamisele. Samuti peavad üldiselt kõigi katkestuste toimimiseks olema lubatud globaalsed katkestused. Selleks on spetsiaalne funktsioon sei() — määrake katkestus.

Nüüd on kood selline

DDRB= 0x00;

PORTD= 0b 11111111 ;

PORTB= 0b00000001;

i=0;

sei();

samal ajal(1)

Peame faili algusesse lisama ka katkestuse teegi faili

#kaasa

#kaasa

#kaasa

Samuti ei vaja me veel nupu jaoks muutujaid, kuna me ei tööta selle nupuga täna. Kommenteerime neid

intpeamine( tühine)

//signed char butcount=0, butstate=0;

timer_ini();

Paneme oma koodi kokku ja kontrollime selle toimivust esmalt Proteuses. Kui kõik töötab hästi, siis kontrollime seda ka vooluahelas

Kõik töötab meie jaoks. Suurepärane!

Selline sai stopper. Kuid kuna meil pole isegi kvartsresonaatorit, ei saa seda stopperit täpseks nimetada.

Sellest hoolimata õppisime täna palju. Õppisime katkestustest, õppisime ka nende töötlemist, õppisime taimeritega töötamist, mitut uut mikrokontrolleri registrit seadistama, enne seda tegelesime ainult pordiregistritega. Samuti oleme tänu sellele kõigele oluliselt kergendanud oma mikrokontrolleri aritmeetika-loogilist seadet.

Vaata VIDEOÕPETUST

Postituse vaatamisi: 17 258