Atmega8 ühendus. Kaugusandur URM37 - ühendus AVR-iga ja arvutiga (USB kaudu)

Artiklis käsitletakse LED-ide ühendamist mikrokontrolleriga, portidega töötamist ja programmi kirjutamist SI-s. Artikkel on mõeldud eelkõige algajatele, kes on äsja AVR-i mikrokontrollerite kätte võtnud.

Kõigepealt peate valima mikrokontrolleri. Minu puhul on see ATmega8535. IN antud juhul Võite võtta mis tahes mikrokontrolleri, kuna see ülesanne Kergesti rakendatav mis tahes MK all. Saate kirjutada programmi mikrokontrolleri jaoks Assemblys, SI-s, Pascalis ja Bascomis. Ma kasutasin SI keelt, kõik need keeled on erinevad.
Konkreetset erinevust C ja Pascali vahel näete allpool.

//Vilkuv LED void main() ( ddrB = 0b11111111; //seadke pordid B väljundpordiks B = 0b11111111; //vaikimisi on kõik väljas while(1) ( portB = ˜portB; //lülitage LED-i olek vastupidiseks delay_ms(100 ); //viivitus 100 millisekundit ) )

Programm esimene; algus ddrB:= $FF; //määra port B väljundpordiks B:= $FF; //vaikimisi ei põle midagi while(1) do begin portB:= not(portB); //lülita LED-i olek vastupidiseks delay_ms(100); //teha lühikese viivituse lõpp;

lõppu.

Radioelementide loetelu Määramine Tüüp Denominatsioon KogusMärkusPood
Minu märkmik U1

MK AVR 8-bitine

1 ATmega8535
Märkmikusse R1-R8

Takisti

8 ATmega8535
220 oomi - 1 kOhm R1-R8

R9-R11

3 ATmega8535
10 kOhm V1-V8 8 ATmega8535
LED 3

Taktinupp

Emuleerisime Proteuse programmis vooluringi, vilgutasime LED-i ja õppisime oma virtuaalset mikrokontrollerit vilkuma. Kindlasti tekkis paljudel lugejatel mõte: “Kas MK-ga ühendatud nupu abil on võimalik LED-i vilkuda?


Jah, loomulikult on see võimalik. Üsna lihtne rakendada. Lisaks saate jäljendada nuppu fikseerimisega või ilma. Lisaks saate programmis Proteus kasutada mõlemat tüüpi nuppe, kasutades sama identset nupu makrot. Millistel juhtudel võib see olla kasulik? Näiteks peame valima seadme töörežiimid. Vaatame lähemalt, kuidas seda mikrokontrolleri abil rakendada ja Proteuse programmis emuleerida. Selleks, et oleks et meil on tõesti valida kahe režiimi vahel, paneme kokku lihtsa skeemi 4 LED-iga ühe nupuvajutusega. Esimeses valikus süttivad vaheldumisi esimene kuni neljas LED-tuli. Teise võimalusega sama asi, kuid vastupidises järjekorras, st neljandast esimeseni. Ainus asi, mida ma tahan selgitada, on see, et meie nupule vajutatakse või vabastatakse ainult enne efekti algust. Kuni efekt on oma töö lõpetanud, ei reageeri programm nupu vajutamisele ega vabastamisele.

Nii et asja juurde. Selline näeb meie diagramm välja Proteuse programmis (suurendamiseks klõpsake):

Selles skeemis näeme juba erinevusi eelmises artiklis kogutud skeemist. Diagrammi vasakul küljel näeme nupu ja +5 V toiteallika tähistusi.

Nagu oleme juba arutanud, võtame võimu ja maandume vahekaardile "Terminal". Me nimetame need vastavalt Power ja Ground.

Ahela toiteallikat tähistame kolmnurgaga, mille kõrgus jagab joone. Lähedal, joonisel, on nupu tähis. Nupust paremal näeme täidetud punast ringi kahepoolse noolega. Kui klõpsate sellel emuleerimise ajal, fikseeritakse nupp ja seda vajutatakse pidevalt. Pärast selle uuesti vajutamist eemaldatakse kinnitus.


Enne kasutamist peame valima raamatukogus nupu samamoodi nagu muud osad. Selleks tippige väljale "Mask" sõna "aga". Seejärel sisestage väljale "Tulemused" sõna "NUPP":


Pärast seda kuvatakse nupp meie loendis koos projektis kasutatud valitud osadega.

Milliseid porte me projektis kasutame? Alloleval joonisel näeme väljuvaid liine pordidest PA0, PB0, PB1, PB2 ja PB3. Meil on LED-id ühendatud pordiga B ja nupp pordiga A.

Nii et vajutamisel sulgeme ahela, mis ühendab +5 volti PA0 pordi ja takisti ülemise klemmiga. Miks meil siia üldse takisti paigaldatud on? Fakt on see, et nuppude ahel peab olema suletud. Pärast takisti paigaldamist liigub vool toiteallikast positiivselt läbi nupu, takisti ja edasi maapinnale.

Piisab, kui võtta takisti väärtuseks 200 oomi. Seega, kui me nuppu vajutame, ühendame PA0 pordi +5 volti toiteallikaga ja kui küsime PA0 kontaktilt pinge olemasolu või puudumist, saame mõjutada oma programmi täitmist.

Olen esitanud ekraanipildid meie programmi tekstiga allpool:


Seega, erinevused eelmisest projektist seisnevad selles, et konfigureerime sisendiks RA pordi kõik 8 viiku, väljundiks konfigureerime pordi kontaktid PB0 - PB3 ja sisendiks PB4 - PB7.


Seejärel kasutame oma programmis seisunditesti " kui"


Niisiis näeme sulgudes olevas real pärast „kui” täitmise tingimust. Allolev kood käivitatakse, kui meil on PA0 pordis loogiline null või null volti. See sulgudes olev tekst on pordibiti nihe. Analüüsime seda ühes järgmistest artiklitest, kuid praegu piisab sellest, kui usume, et seda tehes küsime push-up. Siis sisse lokkis traksid on programmi tekst, mis täidetakse tingimuse tõenemisel. Kui tingimus ei ole tõene, jätkab programm täitmist, jättes vahele sulgudes oleva teksti.

Samamoodi, kasutades tingimust „kui”, valime nupu sisse vajutades. Pange tähele, et sulgudes olev tekst on muutunud. See tähendab, et kui meil on PIN-koodis PA0 loogiline ühik, täidame tingimuse, see tähendab, et sulgudes olev tekst. See tähendab, et kui nuppu vajutada, süttivad ja kustuvad ükshaaval LED-id esimesest neljandani ning all hoides süttivad ja kustuvad LED-id neljandast kuni esimeseni. Seega saame programmi täitmist mõjutada, vajutades nuppu, küsides sellel loogilise nulli või loogilise nulli olemasolu

Samuti, mis sisaldab faili "Sishnik", HEX ja Proteuse faili.

Ja siin on video

Kella meetodid

Kanooniline viis MK kellatamiseks on ühendada kvartsresonaator vastavatele järeldustele (joon. 18.11, a). Kondensaatorite C1 ja C2 mahtuvus peaks tüüpilisel juhul olema 22-36 pF (kvartsi kaasamise kohta vt ptk 15). Enamikul Tiny ja Mega mudelitel on spetsiaalne konfiguratsioonibitt, mis võimaldab tarbimist reguleerida. Kui selle biti väärtuseks on seatud üks (programmeerimata), siis võnkeamplituud väheneb, kuid võimalik sagedusvahemik ja üldine mürakindlus kitseneb, seega pole selle režiimi kasutamine soovitatav (vt allpool). Kasutada võib ka madalsageduslikku kvartsresonaatorit (näiteks “kell” 32 768 Hz), samas kui kondensaatoreid C1 ja C2 pole vaja paigaldada, kuna kallaku seadmisel väärtusele O olid kaasas sisemised 36 pF kondensaatorid. MC-s on ühendatud.

Kvartsresonaatori asemel võib kasutada keraamilist resonaatorit. Nende ridade autor suutis MK-d käivitada mittestandardsetel sagedustel, kasutades samas ühenduses kvartsi asemel miniatuurset induktiivsust (selle väärtusega 4,7 μH ja kondensaatori mahtuvustega 91 pF on sagedus umbes 10 MHz).

Riis. 18.11. Meetodid AVR mikrokontrolleri taktsageduseks, kasutades: a - kvartsresonaatorit; b - väline generaator; c - RC ketid

Loomulikult saab MK-d taktida ka välisest generaatorist (joon. 18.11, b). See on eriti mugav, kui teil on vaja MK-d väliste komponentidega sünkroonida või sobivate generaatorite kasutamisel (näiteks Epsoni SG-8002 seeria) on väga täpne taktsagedus.

Vastupidi, kui täpsust ei nõuta, võite kasutada välist LAN-ahelat (joonis 18.11, c). Selles vooluringis peab mahtuvus C1 olema vähemalt 22 pF ja takisti R1 on valitud vahemikus 3,3-100 oomi. Sel juhul määratakse sagedus valemiga F = 2/3 RC, CI-d ei saa üldse seadistada, kui kirjutate SCR-i konfiguratsioonilahtrisse loogilise nulli, ühendades sellega sisemise 36 pF kondensaatori.

Lõpuks saate ilma ühegita hakkama välised komponendid- kasutage sisseehitatud IG generaatorit, mis võib töötada neljal sagedusel, ligikaudu 1, 2, 4 ja 8 MHz. Seda funktsiooni on kõige parem kasutada madalate moodulite puhul (1x Tiny, saadaval 8-kontaktilises pakendis - siis saab resonaatori või välise ostsillaatori ühendamiseks mõeldud kontakte kasutada muul otstarbel, näiteks tavalistes I/O-portides. Klassikaline perekond sisseehitatud RC-ostsillaatoril ei olnud.

Vaikimisi on Tiny ja Mega perekondade MK-d seadistatud töötama koos sisseehitatud ostsillaatoriga sagedusel 1 MHz (cksel = oooi), nii et muudes režiimides töötamiseks peate vastavalt seadistama cksel-i konfiguratsioonirakud (vt tabelit 18.1). Kuidas seda praktikas teha, arutatakse peatükis 19. Nende elementide soovitatav väärtus tavapäraste resonaatorite jaoks alates 1 MHz ja enam on cksel rakkudes üks ja stroti puhul null.

Üksikasjad

Lahtrite paigaldamisel tuleb arvestada, et olek cksel = oooo (peegel kvartsresonaatori enimkasutatava väärtuse suhtes iiii) paneb MK välisest ostsillaatorist kellarežiimile ja selles olekus ei saa see isegi programmeerida ilma välist sagedust rakendamata. Samuti, kui proovite režiimi seada madala sagedusega resonaatoriga, siis kõrgsageduslik MC ei käivitu enam ja kõik programmeerijad ei saa sellisega töötada. madalad sagedused kellaaeg. Seetõttu peate rakkude ja mitte ainult ckseliga manipuleerimisel olema äärmiselt ettevaatlik ja omama head ettekujutust sellest, mida täpselt installite. Sellest on täpsemalt juttu järgmises peatükis.

Tabel 18.1. CKSEL-i konfiguratsioonilahtrite seadistamine sõltuvalt kellarežiimidest

Kella allikas

Väline sagedus

Sisseehitatud /?C-generaator

Sisseehitatud RC-ostsillaator

Sisseehitatud /?C-generaator

Sisseehitatud RC-ostsillaator

Väline RC kett

Väline /?C-kett

Väline RC kett

Väline RC kett

Madalsagedusresonaator

Tabel 16.1 (lõpp)

Kella allikas

Keraamiline resonaator

Keraamiline resonaator

kvartsresonaator

Kvartsresonaator

Paralleelsed I/O pordid

I/O-pordid (kordume, et neid ei tohiks segi ajada ei sisend- ja väljundregistrite ega MK jadaportidega teabe vahetamiseks välisseadmetega) erinevad mudelid võib olla 1 kuni 7. Nominaalselt on pordid 8-bitised, mõnel juhul on bitisügavus piiratud korpuse tihvtide arvuga ja võib olla alla kaheksa. Porte tähistatakse tähtedega A, B, C, D jne ja mitte tingimata järjekorras: madalamates mudelites võivad olla näiteks ainult pordid B ja D (nagu ATtiny2313 puhul) või üldiselt ainult üks port B (nagu ATtinylx-is).

Korpuses olevate kontaktide arvu vähendamiseks on portidele vastavatel välistel tihvtidel lisaks põhifunktsioonile (kahesuunaline sisend/väljund) ka täiendav. Pange tähele, et kui see võib töötada alternatiivses režiimis, pole spetsiaalset pordi viigu vahetamist vaja, välja arvatud lähtestusviik. Kui näiteks lähtestate oma programmis UART-jadapordi, siis vastavad pordi tihvtid (näiteks ATmega8335 puhul on need PDO ja PD1 pordi tihvtid) töötavad alternatiivse funktsioonina, UART sisendi ja väljundina. Veelgi enam, selliste vaheaegadel erikasutus tihvtid, saab neid põhimõtteliselt kasutada nagu tavalisi kahesuunalisi tihvte. Praktikas on funktsioonide üksteisest eraldamiseks vaja kasutada vooluahela projekteerimise meetmeid, mistõttu ei ole soovitatav seda funktsiooni kuritarvitada.

Pordi kontaktid on piisavalt autonoomsed ja nende režiimi saab seadistada üksteisest sõltumatult. Vaikimisi toite sisselülitamisel kõik lisaseadmed on keelatud ja pordid töötavad sisendina ning on suure kiirusega kolmandas olekus (st suure sisendtakistus). Väljundi jaoks töötamine nõuab spetsiaalseid juhiseid, mille jaoks programmis tuleb andmesuunaregistris määrata soovitud väljundile vastav bitt (seda registrit tähistatakse DDRx, kus x on konkreetset porti tähistav täht, näiteks port A see on ddra). Kui bitt lähtestatakse (see tähendab, et see on võrdne loogilise nulliga), töötab väljund sisendina (nagu vaikimisi, kui see on seatud (st võrdne loogilisega), siis see töötab väljundina).

Väljundi ühesse olekusse seadmiseks tuleb pordi andmeregistris eraldi määrata vastav bitt (tähistatakse portx-ga) ja O väärtuse seadmiseks see bitt lähtestada. Väljundi töösuunda (sisend-väljund, DDRx register) ja selle olekut (O-1, portx) ei tohi segi ajada.

Portx-i andmeregister on tegelikult vaid väljundpuhver, mis sinna kirjutatakse, väljastatakse kohe. Kui aga seada sisendiks pordi viik (st kirjutada ddrx suunaregistrisse loogiline null), nagu vaikimisi tehakse, siis mängib portx andmeregister veidi teist rolli – selle bittide nullimine tähendab, et sisend on kolmandas olekus koos kõrge vastupidavus, ja selle ühele seadmine ühendab terminaliga 35-120 kOhmi takistusega ülestõmbetakisti.

Märkused veeristel

Enamikul juhtudel ei piisa usaldusväärseks tööks sisseehitatud tõmbetakistist - MC võib häirete tõttu tõrgeteta ja parem on selle sisemise takistiga paralleelselt paigaldada täiendav väline takisti takistusega 1 kuni 5 kOhm (tarbimise seisukohalt kriitilistel juhtudel võib selle väärtust tõsta 20-30 kOhmini). Näiteks kui ühendate sisendiga välise kahe viiguga nupu, mis on maandatud või kui kontakt töötab kaugseadmetega "ühissiinil" (asub teisel plaadil) või kui kontakt täidab väline katkestus (vt allpool), siis tuleb selline lisatakisti ühendada.

Pordipistiku taseme lugemise protseduur, kui see on sisendolekus, ei ole täiesti triviaalne. On kiusatus lugeda andmeid portx-i andmeregistrist, kuid see ei tee midagi - loete ainult seda, mida olete varem sinna kirjutanud. Ja selleks, et lugeda, mis on sisendis (otse mikroskeemi väljundis) tegelikult saadaval, on ette nähtud veel üks võimalus. Selleks tuleb ligi pääseda mõnele massiivile, mida tähistatakse pinxiga. Juurdepääs toimub samamoodi nagu tavaliste RVV-de üksikud bitid (vt peatükk 19\ kuid pinx ei ole register, see on lihtsalt teatud aadresside vahemik, millest lugemine võimaldab juurdepääsu pordi sisendis olevale puhverelementidele). Aadressidele piNx midagi kirjutada pole muidugi võimalik.

Katkestab

Nagu personaalarvutites, on ka mikrokontrollerites kahte tüüpi katkestusi. Kuid kui arvutis jagunevad katkestused riistvaraks (näiteks taimerist või klaviatuurilt) ja tarkvaraks (tegelikult mitte katkestused, vaid BIOS-i kirjutatud alamprogrammid - Windowsi levikuga on see kontseptsioon programmeerija praktikast peaaegu kadunud), siis MK-s on loomulikult kõik katkestused riistvaralised ja need jagunevad sise- ja välisteks. Igasugune katkestus eraldi, aga ka nende esinemise võimalus üldiselt nõuab eelnevat eriluba.

Tuleb kindlalt mõista, et mis tahes katkestuse lähtestamiseks peate programmis tegema nelja asja: lubama katkestused üldiselt (vaikimisi on need keelatud), seejärel lubage see konkreetne katkestus, määrake selle jaoks üks saadaolevatest režiimidest ja lõpuks. , määrake katkestusvektor: pointer to label , mille ääres paikneb katkestuse käitleja alamprogrammi protseduur. Ja loomulikult peate pärast seda kirjutama käitleja ise, vastasel juhul juhtub see kõik asjata. Sellest on täpsemalt juttu 19. peatükis.

Sisemised katkestused võivad tekkida mis tahes seadmest, mis on lisaks süsteemi tuumale - taimeritest, analoogkomparaatorist, jadapordist jne. Sisemine katkestus on sündmus, mis toimub süsteemis ja katkestab põhiprogrammi täitmise. AVR-i sisemine katkestussüsteem on üsna ulatuslik ja kujutab endast peamist süsteemi seadmete interaktsiooniks süsteemituumaga ning me pöördume selle probleemi juurde rohkem kui üks kord.

AVR MK-l on vähemalt kaks välist katkestust, INTO, INT1 (enamikul Megadel on kolmas - ICHT2). Väline katkestus on sündmus, mis tekib siis, kui signaal ilmub ühte spetsiaalselt selleks otstarbeks loodud sisenditest. Katkestusi põhjustavaid sündmusi on kolme tüüpi ja neid saab programmis määrata: see võib olla madal tase pinge, samuti positiivne või negatiivne serv vastaval tihvtil. Huvitav on see, et kõigi nende sündmuste katkestused käivitatakse isegi siis, kui vastav pordi viik on konfigureeritud väljundina.

Vaatame lühidalt nende režiimide kasutamise funktsioone. Madala taseme katkestus (režiim on vaikimisi seatud, selle lähtestamiseks lihtsalt lubage vastav katkestus) tekib alati, kui vastav sisend on madal. “Iga kord” tähendab, et tõesti iga kord, st kui negatiivne impulss kestab mõnda aega, korratakse katkestuse töötlemise protseduuri pärast lõppemist ikka ja jälle, takistades põhiprogrammi töötamist. Seetõttu on selle välise katkestusrežiimi kasutamise tavaline skeem selle ilmnemisel kohe keelata (algatatud töötlemisprotseduur lõpetatakse üks kord) ja uuesti lubamine alles siis, kui välismõju peaks juba lõppema (näiteks kui tegemist on nupuvajutusega, siis ühe või kahe sekundi pärast peaks taimer selle uuesti lubama).

Seevastu tõusvaid või langevaid katkestusi täidetakse üks kord. Kontakti põrgatuse eest muidugi kaitset ei ole ega saagi olla, sest MK ei suuda eristada põrgatust lühikeste impulsside seeriast. Kui see on kriitilise tähtsusega, peate kasutama väliseid meetmeid, et kaitsta põrke eest, või kasutama sama meetodit nagu taseme katkestuse korral – katkestuste käitleja protseduuris keelake katkestus ise esimese käsuga ja mõne aja pärast mõnes teises protseduuris ( taimeri või mõne muu sündmuse abil), et see uuesti lahendada (see põrkevastane meetod on tegelikult identne ühekordse seadme kasutamisega, vt 15. peatükk).

Üksikasjad

Tähelepanelikul lugejal tekib õigustatud küsimus – milleks on meil üldse vaja välise taseme katkestusrežiimi? Fakt on see, et kõigis mudelites tehakse seda asünkroonselt - hetkel, kui MK väljundis ilmub madal tase. Muidugi saab katkestuste tuvastamine toimuda ainult praeguse käsu lõpus, seega võivad väga lühikesed impulsid kaduda. Kuid INTO ja INT1 katkestused servajuhtimisrežiimis määratakse enamiku mudelite puhul vastupidi, ainult sünkroonselt - kontrolleri taktsignaali tasemete erinevuse hetkel, nii et nende kestus ei tohiks olla lühem kui üks taktiperiood. . Kuid see pole kõige olulisem: üldiselt poleks neil režiimidel erinevusi, kui mitte asjaolu, et sünkroonrežiim nõuab kindlasti just selle kellasignaali olemasolu. Seetõttu võib asünkroonne väline katkestus vastavalt "äratada" ühes sügavas energiasäästurežiimis oleva kontrolleri, kui kella generaator ei tööta, kuid sünkroonne mitte. Ja tavalisi MCU-sid, nagu Classicu perekonna AT90S8515 (aga mitte selle megaanaloog!), saab sügavast unest äratada ainult välise taseme katkestuse abil, mida pole alati mugav kasutada. Enamikul Meda perekonna mudelitel (noorematel mudelitel - välja arvatud ATmegaS) on veel üks katkestus INT2, mis esineb ainult servadel (tase järgi ei saa), kuid erinevalt INTO-st ja INT1-st asünkroonselt. ATtiny2313-s (aga mitte selle “klassikalises” analoogis!) võib selline asünkroonne katkestus tekkida signaaliga mis tahes pordi B 8 viigust. See suurendab oluliselt kontrolleri kasutatavust energiasäästurežiimis.

Taimerid-loendurid

Enamikul AVR MK-del on kaks või kolm taimerloendurit, millest üks on 16-bitine ja ülejäänud 8-bitine (vanemates Mega mudelites võib loendurite koguarv olla kuni 6). Kõigil loenduritel on väärtuste eellaadimise võimalus ja neid saab juhtida otse kella sagedus(SC) protsessori või sellest, jagatud 8, 64, 256 või 1024-ga (in mõnel juhul veel 16 ja 32), samuti välisest signaalist. Üldiselt sarnaneb MK taimerite disain, nagu me ütlesime, 561HEU/14 loenduritega (vt 15. peatükk), ainult nende funktsionaalsus on oluliselt laienenud.

AVR-i arhitektuuris on 8-bitistele loenduritele omistatud numbrid O ja 2 ning 16-bitistele numbrid 1, 3 ja nii edasi. Mõned 8-bitised loendurid (tavaliselt taimer 2, kui neid on kaks) võivad töötada asünkroonses režiimis eraldi kella generaatorist ja jätkata töötamist isegi siis, kui ülejäänud MCU on "uinuvas" olekus, mis võimaldab neil töötada. kasutada reaalajas kellana.

Kui kasutada loendurit tavaliste väliste impulsside loendurina (ja reaktsioon on võimalik nii langemisel kui ka impulsi serval), ei tohiks loendatavate impulsside sagedus ületada poolt MK-taktgeneraatori sagedusest (ja asümmeetriline väline meander, juhised soovitavad piirava sageduse veelgi madalamat väärtust - 0,4 alates kellast). See on tingitud asjaolust, et väliste impulsside loendamisel tuvastatakse nende servad sünkroonselt (taktsignaali positiivse serva hetkedel). Lisaks tasub arvestada, et loenduri sisu uuendamise viivitus pärast välise impulsi saabumist võib olla kuni 2,5 taktiperioodi.

Need on üsna tugevad piirangud, seetõttu ei ole näiteks MK kasutamine universaalse sagedusmõõtjana kuigi mugav - kiireid vooluahelaid on parem projekteerida sobival kombinatsioonloogikal või FPGA-del (programmeeritavad loogika-integraallülitused).

Kui tekib loenduri ületäitumine, toimub sündmus, mis võib põhjustada vastava katkestuse. 8-bitine Timer O loendur on mõnel juhul selle funktsiooniga piiratud. Taimer 2, kui see on olemas, võib samuti käivitada katkestuse, kui loendatud väärtus vastab mõnele etteantud väärtusele. 16-bitised loendurid on "täiustatud" ja võivad põhjustada katkestusi, kui need langevad kokku kahe sõltumatult määratud arvuga A ja B. Sel juhul saab loendurid nullida või jätkata loendamist ning impulsse saab genereerida spetsiaalsetel viigudel ( riistvara, programmis osalemata).

Lisaks saavad 16-bitised loendurid spetsiaalsele tihvtile "püüda" väliseid üksikuid impulsse. Sel juhul saab välja kutsuda katkestuse ja loenduri sisu paigutatakse teatud registrisse. Loenduri enda saab nullida ja loendamist uuesti alustada või lihtsalt loendamist jätkata. Seda režiimi on mugav kasutada välise signaali perioodi mõõtmiseks või teatud ebaregulaarsete sündmuste (nt osakeste läbimine Geigeri loenduris) loendamiseks. On oluline, et selliste sündmuste allikaks võib olla ka sisseehitatud analoogkomparaator, mida seejärel kasutatakse impulsi kujundajana.

Kõik loendurtaimerid saavad töötada nn. PWM-režiimid, st 8-, 9-, 10- või 16-bitiste impulsilaiuse modulaatoritena (PWM) ja üksteisest sõltumatult, mis võimaldab rakendada mitme kanaliga PWM-i. Tehnilises dokumentatsioonis on nende keerukuse, mitmekülgsuse ja kohmakuse tõttu nendele režiimidele pühendatud palju lehekülgi. Nende režiimide lihtsaimat kasutamist heli taasesitamiseks käsitletakse lühidalt peatükis 22 seoses häälsignalisatsiooniga. Pange tähele, et heli süntees ei ole PWM-režiimide ainus ega isegi kõige olulisem eesmärk. Neid saab kasutada ka võimsuse või voolu reguleerimiseks (näiteks akude laadimisel), mootorite juhtimiseks, signaali alaldamiseks ja digitaal-analoogmuundamiseks; .

Lisaks taimer-loenduritele on eranditult kõigil AVR-kontrolleritel Watchdog-taimer. See on mõeldud peamiselt MK energiasäästurežiimist eemaldamiseks teatud ajaintervalli järel, kuid seda saab kasutada ka MK hädaolukorra taaskäivitamiseks. Näiteks kui programmi töö sõltub väliste signaalide saabumisest, siis nende kadumise korral (näiteks liinikatkestuse tõttu) võib MK “ripuda” ja Watchdog taimer toob selle välja. sellest olekust.

Jadapordid

Jadapordid andmete vahetamiseks välisseadmetega on ilma nendeta MK kõige olulisem komponent, selle "suhtlus" välismaailmaga on järsult piiratud. Neid nimetatakse järjestikusteks, kuna korraga edastatakse ainult üks bitt (mõnel juhul on samaaegne edastamine ja vastuvõtt võimalik, kuid siiski ainult üks bitt korraga). Jadaportide kõige olulisem eelis paralleelsete portide ees (kui vahetatakse korraga terveid baite või tetradnibble) on ühenduste arvu vähenemine. Kuid see pole ainus: paradoksaalselt, aga jadaliideseid anda paralleelsele edumaa suured kiirused, kui edastuskiirust hakkavad mõjutama liinide viivitused. Viimaseid ei saa rangelt ühesuguseks teha ja see on üks põhjusi, miks nüüd hakkavad domineerima jadaliidesed (tüüpilised näited on COM asemel USB ja FireWire, LPT ja SCSI või Serial ATA IDE asemel).

Meie andmemahuga mikrokontrolleriseadmetes puudutab edastuskiirus meid muidugi teisejärguliselt, kuid ühendusjuhtmete arv on väga kriitiline tegur. Seetõttu on kõigil välisseadmetel, mida selles raamatus käsitleme, jadaliidesed.

Peaaegu iga jadaporti saab tavaliste MK-tihvtide abil tarkvaras simuleerida. Kunagi tehti seda isegi kõige populaarsema noptoB-de - UART-i puhul. Kuid sellest ajast peale on MK-d omandanud riistvaralised jadapordid, mis aga ei tähenda nende absoluutse kasutamise vajadust. Teine eelis on jadaportide tarkvara simuleerimise lihtsus.

Kõigist AVR MCU-s esineda võivatest portidest pöörame erilist tähelepanu UART-Universal Asynchronous Receiver-Transmitterile, "universaalsele asünkroonsele transiiverile". UART on kõigi RS-232 protokolli toetavate seadmete põhiosa, kuid mitte ainult see (pole asjata, et see on "universaalne") - näiteks UART-i kaudu rakendatakse ka tööstusstandardeid RS-485 ja RS-422. , kuna need erinevad RS-232-st ainult elektriliste parameetrite ja lubatud kiiruste, mitte üldise ehitusloogika poolest. Personaalarvutitel on COM-port, mis töötab sama RS-232 protokolli kasutades ja UART-sõlm on samuti selle põhiosa.

Seetõttu on UART peamine viis andmete vahetamiseks MK ja arvuti vahel. Pange tähele, et COM-pordi puudumine enamikus kaasaegsetes arvutimudelites pole takistuseks: selleks on olemas USB-COM-adapterid ja lauamudelisse saab sisestada COM-portidega lisakaardi.

Märkused veeristel

Miks see meile nii oluline on? Fakt on see, et ühendades seadme paigutuse arvutiga, on isegi siis, kui seadme funktsionaalsus ei võimalda andmevahetust, palju lihtsam programmi siluda, sisestades lihtsalt ajutiselt programmi õigetesse kohtadesse saatmise toimingu. kaasatud registrite väärtused arvutisse ja nende reaalajas vastuvõtmine mõne või terminali emulaatorprogrammi abil. See on palju mugavam kui mahuka AVR Studio valdamine ja isegi mõne kalli silumisplaadiga komplektis. Seetõttu on minu nõuanne teha endale koheselt silumisplaat, mis sisaldab programmeerimispistikut (vt järgmist peatükki) ja UART/RS-232 tasememuundurit, millel on pistik nullmodemi kaabli ühendamiseks (vt ptk 21).

UART-i praktikas kasutamist käsitletakse peatükis 21. Lisaks UART-ile sisaldavad peaaegu kõik AVR MCU-d kõigist jadaportidest kõige lihtsamat - SPI-d (Serial Peripheral Interface). SPI-seadme põhimõtet mainiti peatükis 16. Osaliselt mängis halba rolli selle põhimõtteline lihtsus: raske on leida kahte seadet, kus SPI-protokollid oleksid täiesti samad, tavaliselt kaasneb selle pordi vahetusega üks või teine ​​“; kellad ja viled”. Tuleb märkida, et AVR programmeerimine toimub ka SPI kaudu, kuid üldiselt on see liides ja andmevahetuse SPI erinevad asjad, kuigi enamasti on neil samad kontaktid.

Kuid selle raamatu peatükis 21 vaatleme keerukamat, ehkki aeglasemat I^C-liidest, mida on vaja sagedamini, kuna nii paljud välisseadmed töötavad selle kaudu.

Konkreetsete vooluahelate esitlemisel vaatleme mõnda muud AVR-i mikrokontrollerite perekonna komponenti (näiteks ADC-d) - nii on see selgem. Siin lõpetame oma pika sissejuhatuse mikrokontrolleri kohta ja liigume edasi küsimuse juurde, kuidas seda programmeerida.

Täna proovime kasutada lihtsamat mikrokontrollerit ATtiny2313 ja ühendage sellega LCD-ekraan, mis sisaldab kahte 16 tähemärgist koosnevat rida.

Ühendame ekraani standardsel viisil 4-bitine viis.

Kõigepealt alustame muidugi mikrokontrollerist, kuna oleme ekraaniga juba varasematest õppetundidest väga tuttavad.

Avame kontrolleri andmelehe ATtiny2313 ja vaata selle otsa

Me näeme seda see kontroller on olemas kahte tüüpi juhtudel, kuid kuna see sattus minu kätte DIP-korpuses, kaalume seda konkreetset korpuse versiooni ja põhimõtteliselt ei erine need palju, välja arvatud välimus, kuna jalgade arv on sama - 20. aastal.

Kuna seal on 20 jalga võrreldes ATMega8 kontrolleri 28 jalaga, millega oleme kogu aeg tegelenud ja töötame edasi, siis vastavalt jääb ka võimalusi vähemaks.

Põhimõtteliselt on siin kõik, mis ATmega8-l oli, ainuke asi, et portsu küüniseid on vähem. Kuid kuna meie ees seisev ülesanne on proovida see SPI-siini kaudu mõne teise kontrolleriga ühendada, siis see meid eriti ei suru.

On ka teisi erinevusi, kuid need on väikesed ja me saame nendega tutvuda vastavalt vajadusele.

Paneme kokku sellise vooluringi (pildi suurendamiseks kliki pildil)

Ekraan on ühendatud pordi D kontaktidega. PD1 ja PD2 on juhtsisenditega ning ülejäänud on ühendatud kuvamooduli D4-D7 tihvtidega.

Loome projekti nimega TINY2313_LCD, teisaldame sinna kõik peale põhimooduli kuvari Atmega8-ga ühendamise projektist.

Muidugi tuleb mõned asjad ümber teha. Selleks peate hoolikalt uurima, milline jalg on millega ühendatud. Ekraani E-siin on ühendatud PD2-ga ja RS-siin on ühendatud PD1-ga, nii et teeme failis muudatused lcd.h

#määratlee1PORTD|=0b0000 01 00 // määra rea ​​E väärtuseks 1

#määratlee0PORTD&=0b1111 10 11 // määra rea ​​E väärtuseks 0

#määratlers1PORTD|=0b00000 01 0 // määrake RS-rea väärtuseks 1 (andmed)

#määratlers0PORTD&=0b11111 10 1 // määrake RS-rea väärtuseks 0 (käsk)

Nagu valikust näeme paksus kirjas, pole meil nii drastilisi muutusi olnud.

Nüüd infosisendid. Siin kasutame jalgu PD3-PD6, see tähendab, et need on Atmega8 ühendusega võrreldes 1 punkti võrra nihutatud, seega parandame failis ka midagi LCD.c funktsioonis saata poolbaiti

PORTD&=0b 1 0000 111; // kustutage teave sisendite DB4-DB7 kohta, ülejäänud jätke rahule

Kuid see pole veel kõik. Varem nihutasime edastatud andmeid 4 võrra, kuid nüüd peame ülaltoodud muudatuste tõttu neid nihutama vaid 3 võrra. Seetõttu parandame samas funktsioonis ka kõige esimest rida

c<<=3 ;

See on kõik muudatused. Nõus, need pole nii suurepärased! See saavutatakse sellega, et püüame alati kirjutada universaalset koodi ja kasutada makroasendusi. Kui me poleks sellele korraga aega kulutanud, oleksime pidanud koodi parandama peaaegu kõigis oma raamatukogu funktsioonides.

Põhimoodulis ei puuduta me pordi D lähtestamist, laseme kogu moodulil minna väljundolekusse, nagu õppetükis 12.

Proovime projekti kokku panna ja tulemust esmalt Proteuses näha, kuna tegin sellele ka projekti, mis jääb ka lisatud arhiivi koos Atmel Stuudio projektiga

Meil töötab kõik suurepäraselt! Nii saate ühe kontrolleri projekti kiiresti teise jaoks ümber teha.

Proteus on väga hea, kuid alati on toredam vaadata tõelisi detaile. Kogu vooluahel pandi kokku leivaplaadile, kuna ma ei teinud ega monteerinud selle kontrolleri jaoks silumisplaati. Me ühendame programmeerija sellise standardse pistiku kaudu

Siin on kogu diagramm

Siin on kõik standardne. Tõmbetakisti RESET-ile jne.

Nüüd, enne kontrolleri vilkumist avrdude'is, peame valima kontrolleri ja lugema selle välkmälu

Seejärel minge vahekaardile FUSES ja seadke kaitsmed õigesti. Kuna meil kvartsresonaatorit pole, paigaldame kaitsmed sel viisil

LED-i ühendamine I/O-pordi liiniga

Pärast selle materjali uurimist, milles kõike on üksikasjalikult kirjeldatud suure hulga näidetega, saate hõlpsasti meisterdada ja programmeerida AVR-i mikrokontrollerite sisend-/väljundporte.

  • Osa 2. LED-i ühendamine I/O-pordi liiniga
  • Osa 3. Transistori ühendamine I/O pordi liiniga
Vaatleme näidet mikrokontrolleri kohta ATMega8 .

Kirjutame programmi sisse Atmel Studio 6.0 .

Me emuleerime vooluringi Proteus 7 Professional .

Esimene näide mikrokontrollerite uurimisel on LED-i ühendamine ja juhtimine. See on kõige lihtsam ja ilmsem näide. Sellest näitest on saanud mikrokontrollerite uurimise klassika, nagu programm "Tere maailm!". teiste programmeerimiskeelte õppimisel.
Maksimaalne vool, mida iga I/O port suudab läbida, on 40 mA.
Maksimaalne vool, mida iga I/O pordiliin suudab kanda, on 20 mA.
Enne koormuse, sealhulgas LED-i, ühendamist I/O-pordi liinidega peate teadma, et võite mikrokontrolleri põletada, kui ületate I/O-pordiliini lubatud koormust.
Mikrokontrolleri I/O-pordi liinide kaudu voolava voolu piiramiseks peate arvutama ja ühendama takisti.

Joonis: LED-i pistikupesa.

Joonis: LED-anoodi ühendamine mikrokontrolleriga.

Joonis: LED-katoodi ühendamine mikrokontrolleriga.

LED-i ühendamisel sisend-/väljundportide liinidega ühendatud voolu piirava takisti takistus arvutatakse järgmise valemiga:

Kus:
- Vs- toiteallika pinge;
- Vsp- pingelangus I/O pordiliinil;
- Vd- otsene pingelang LED-il;
- ID- LED-i alalisvool;
- Kn- LED-i töökindluse koefitsient;

Näide:
- toitepinge - 5V;
- otsene pingelang LED-il - 2B ;
10mA (Võetud andmelehelt LED-ile);
- LED-robotite töökindluskoefitsient 75% (Võetud andmelehelt LED-ile);
- pingelangus I/O-pordi liinil - 0,5 V (Andmelehelt mikrokontrollerisse võetud: Vol (väljund madalpinge) – kui vool voolab sisse ja Voh (väljund kõrge pinge) – kui vool voolab välja);

Seega takisti väärtus R = 166,66 oomi, valitakse lähim kõrgem takistuse väärtus.

Kui LED-i päripinge pole teada, saab takistuse arvutada Ohmi seaduse alusel.

Kus:
- U- vooluahela osale rakendatud pinge;
- I

Näide:
4,5 V;
– I/O pordiliini nimivool – 20mA.

Olles määranud takisti väärtuse R, on vaja arvutada võimsus P, mõõdetuna vattides, mis eraldub takistis soojuse kujul, kui vooluringis voolab.

Kus:
- U– vooluahela osale rakendatud pinge;
- I- I/O pordiliini nimivool.

Näide:
- vooluahela osale rakendatud pinge - 4,5 V;
- LED-i edasivool - 20mA.

Olles arvutanud takistile eraldatud võimsuse, valime takisti võimsusele lähima suurema väärtuse. Kui takisti võimsuse hajumine on ebapiisav, võib see ebaõnnestuda.

- väikese võimsusega LED-anoodi ühendamine I/O-pordi liiniga:

#kaasa // Põhiprogramm int main(void) ( // Sisend-/väljundportide konfigureerimine DDRC = 0b11111111; // Konfigureerige kõik pordi C bitid režiimi "Output" PORTC = 0b11111111; // Seadistage kõik pordi C bitid logima "1" (Pinge pordi väljundis võrdub Vcc) // Igavene silmus, samas kui (1) ( ) )

- Katoodiga väikese võimsusega LED-i ühendamine I/O pordi liiniga:

// Kaasa välised teegid #include #kaasa // Põhiprogramm int main(void) ( // Sisend-/väljundportide konfigureerimine DDRC = 0b11111111; // Konfigureeri kõik pordi C bitid režiimile "Output" PORTC = 0b00000000; // Määra kõik pordi C bitid logima "0" (Pinge pordi väljundis on võrdne GND-ga) // Igavene silmus, samas kui (1) ( ) )

- anoodi ja katoodiga väikese võimsusega LED-i ühendamine I/O pordi liiniga:

// Kaasa välised teegid #include #kaasa // Põhiprogramm int main(void) ( // Sisend-/väljundportide konfigureerimine DDRD = 0b11111111; // Konfigureeri kõik pordi D bitid režiimi "Output" PORTD = 0b11111111; // Määra kõik pordi D bitid logima "1" (pordi väljundis on pinge võrdne Vcc-ga) DDRC = 0b11111111 //Seadke kõik pordi C bitid režiimile "Output" PORTC = 0b00000000 //Seadke kõik pordi C bitid loogikale "; 0” (pordi väljundis on pinge võrdne GND-ga) / / Igavene silmus, samas kui (1) ( ) )