Programmeerimine mk nullist. AVR programmeerimine

Ma ei ole üks kord ja mitte kaks, öeldes, et MK uuring tuleks alustada kokkupanekuga. See oli pühendatud kogu kursuse kohapeal (kuigi see ei ole väga järjekindel, kuid järk-järgult ma kammitud selle piisava tüüpi). Jah, see on raske, tulemus ei ole esimesel päeval, kuid sa õpid aru saama, mis teie kontrolleris toimub. Te teate, kuidas see toimib, mitte ahv kopeeri teiste inimeste allikate ja proovige mõista, miks see äkki lõpetas töö. Lisaks on SI palju lihtsam ületada keskele, mis tulevad välja kahvliga kõige inoparune hetkel.

Kahjuks tahab igaüks tulemust kohe. Seetõttu otsustasin ma teise käega minna - SI koolituse korraldamiseks, kuid tema aluspesu näitamisega. Hea programmeerija kättemaks hoiab alati oma rauda Squall jaoks, andmata talle samm-sammult ilma loata. Nii et see on nii koodi alguses, siis mis on koostaja sündinud ja kuidas see tegelikult tegelikult toimib :)

Teiselt poolt, si tugev külg See on porseafüüli kood. Kui muidugi kirjutate kõike õigesti. Töö algoritmide ja nende raua rakenduste eraldamine projekti erinevates osades. Seejärel, algoritmi ülekandmiseks teisele MK-ni, piisab ainult liidese kihi ümberkirjutamiseks, kus kõik nääre kaebuse esitamine on kirjutatud ja jätnud kogu töökoodeksi see. Ja muidugi loetavus. Sash Source Source on lihtsam mõista esmapilgul (kuigi .. I, näiteks ei hooli sellest, mida flirtiks on vähemalt SI, vähemalt AFM :)), kuid jälle, kui sa kirjutad kõik õigesti. Selle hetkega maksan ka tähelepanu.

Nagu juhtiva riistvara, millele lõviosa kõigist näidetest on minu debug-tasu.

Esimene programm C-le AVR-le

Koostaja valimine ja keskkonna paigaldamine
AVR-i jaoks on palju erinevaid C-komplaatorid:
Kõigepealt see IAR AVR C. - peaaegu unikaalselt tunnustatud kui parim kompilaator AVR, sest Kontroller ise loodi IAR tihedas koostöös atmeli ja spetsialistide tihedas koostöös. Aga kõik, mida pead maksma. Ja see kompilaator ei ole piisav sellest, mis on kallis kaubanduslik tarkvara, omab ka selliseid hommikusöögi seadeid, mis lihtsalt võtta ja koostada seda selles tuleks kiirustada. Ma tõesti ei olnud temaga sõprust, projekt oli sidestusetapis kummaliste vigade purjus (hiljem avastas, et see oli crack-kõver).

Teine on tulemas WAVVR GCC. - Võimas optimeerimine kompilaator. Täielik avaneb, platvorm, üldiselt kõik elu rõõmud. Ta integreerib suurepäraselt AVR-stuudios, mis võimaldab teil sealt siluda, mis põrgu on mugav. Üldiselt valisin selle.

Samuti on olemas CodeVision AVR C.- Väga populaarne kompilaator. Ta sai populaarseks seoses tema lihtsusega. Tööprogramm Te saate mõne minuti jooksul saada - algkoodi kaptenit edendatakse oluliselt igasuguste kõrvade initsialiseerimise templi. Ausalt öeldes, mul on kahju kahtlus temaga - kuidagi ma pidin selle kompilaatori kirjutatud prog lahti võtma, mingisugune, kuid mitte kood ei saadud. Kohutamatut tarbetuid televisiiti ja toiminguid, mis valati kergekoodidesse ja aeglaselt. Siiski oli DNA-s ilmne viga, mis kirjutas algse püsivara. Pluss ta tahab raha. Mitte palju nagu IAR, kuid märgatav. Ja Demozhim annab mitte rohkem kui 2KB koodi.
Murg muidugi seal on, aga kui sa varastada, nii miljoni, mõttes IAR :)

On olemas ka Pildi käsitöö AVR C ja Microc mikroelektroonika. Ei kasuta ühtegi muud kasutamist, vaid siin SWG. Väga kündmine Mikrovaal-Sulata on kohutavalt mugav programmeerimiskeskkond ja raamatukogu. Ma arvan, et mikroc ei ole halvem, vaid ka makstud.

Nagu ma ütlesin, valin ma WAVAVR. Kolme põhjusel: tasuta, see on integreeritud AVR-stuudiosse ja see on kirjutatud lihtsalt valmis koodi jaotus kõikide sündmuste jaoks.

Nii et alla laadida ennast paigaldada Winavr C ja AVR Stuudio. Siis asetatakse stuudio esmalt, seejärel rullib Winavr stuudioonile plugina kujul üle ja klambrid. Soovitan tungivalt installida WAVAVR-i lühidalt, midagi C: WINAVR seeläbi, seeläbi väldite probleemide hunnikut.

Projekti loomine
Niisiis, stuudio tarnitakse, SI on kinnitatud, on aeg proovida midagi programmi. Alustame lihtsa ja lihtsamaga. Käivitage stuudio, valige seal uus projektKompilaator AVR GCC ja sisestage projekti nimi.

Avab töövälja tühja * .c-failiga.

Nüüd ei takista see stuudio vahekaartide teede kuvamise konfigureerimist. Selleks kaldu:
Tööriistad menüü - Valikud - General - Filetabs ja valige rippmenüüst "FileName". Vastasel juhul ei ole võimalik töötada - vahekaardil on faili täielik tee ja ekraanil ei ole rohkem kui kahte vahekaarti.

Projekti seadistamine
Üldiselt luuakse faili loomine, milles kõiki sõltuvusi kirjeldatakse. Ja see on ilmselt õige. Aga ma kasvasin üles täielikult integreeritud IDE-s uvision või AVR-stuudio. Selline lähenemine on sügavalt välismaalane. Seetõttu ma teen omal moel kõik stuudiod.

Haavandiga nupp.


Need on teie projekti seaded või pigem auto automaatse põlvkonna seadistamine. Esimesel lehel peate lihtsalt sisestama sageduse, millele teie MK töötab. See sõltub bittide kaitsmetest, mistõttu usume, et sagedus on 8000000GZ.
Samuti pöörake tähelepanu optimeerimisringile. Nüüd on olemas --os optimeerimine suurus. Kuigi lahkumine, nagu see on, siis võite proovida mängida selle parameetriga. -O0 on üldse eemaldatav optimeerimine.

Järgmine samm on seadistamise seadistamine. Esimene asi, et lisada oma projekti kataloogi - te panete seal kolmanda osapoole raamatukogu. Nimekiri ilmub ". \\ T

Tee faili loodud, näete seda oma projekti vaikimisi kausta, lihtsalt jookseb läbi oma silmad, vaata, mis seal on.


See on kõik. Jim kõikjal ok ja minna allikale.

Probleemi kujundamine
Tühi leht on nii kõvenenud, et kehastada mõnda keerulist ideed, kuna dioodi banaalne vilkumine ei sisesta. Lähme kohe härja sarvede eest ja rakendame ühendust arvutiga - see on esimene asi, mida ma teen.

See töötab sellisena:
COM-sadama saabumisel valgustab seade (kood 0x31) diodiooni ja kui süttib nulli saabumist (kood 0x30). Veelgi enam, kõik tehakse kõik katkestusi ja tausta ülesanne vilgub teise dioodi. Lihtsalt ja tähendusega.

Koguge kava
Me peame ühendama USB-UST-konverteri mooduli Microcontroller USART-muunduritega. Selleks võtke kahe juhtmestiku hüppaja ja asetage rist risti risti. See tähendab, et RX-regulaator ühendab TX-konverteriga ja TX muundur Rx kontrolleriga.

Tulemusena selgub, et see on selline skeem:


Muude järelduste, toitumise, heakskiidu ühendamine on standard

Me kirjutame koodi

Kohe teha reservatsiooni, et ma ei süvendada konkreetselt kirjelduses SI keel ise. Selleks on lihtsalt tohutu hulk materjali, alates klassika "SI programmeerimiskeel" alates K & R-st ning lõpeb erinevate meetoditega.

Üks selline meetod leiti minus kärgstruktuuris, ma uurisin seda keelt selle keelt. Seal kõik on lühike, arusaadav ja juhul. Ma lähen selle järk-järgult oma saidile ümber ja ümber korraldada.

Seal pole tõesti kõiki peatükki edasi lükatud, kuid ma arvan, et see ei ole pikka aega.

On ebatõenäoline, et ma kirjeldan paremini, nii et koolituskursus, selle asemel, et siniste nüansside üksikasjaliku kokkupuute asemel annan lihtsalt otseseid linke selle tehnika teatud lehekülgedele.

Lisa raamatukogud.
Esiteks lisame vajalikud raamatukogud ja pealkirjad definitsioonidega. Lõppude lõpuks on SI universaalne keel ja ta peab selgitama, et me töötame AVR-iga, seega sisestage allika liin:

1 #Include.

#Include.

See fail on kaustas WAVAVR. Ja see sisaldab kõigi kontrolleri registrite ja sadamate kirjeldust. Ja seal kõigil salakaval, viidates konkreetsele kontrollerile, mida kompilaator edastab läbi tegema Fail parameetris MCU. Ja selle muutuja põhjal oma projekti, päise faili kirjeldus aadresside kõik sadamad ja registrid on selles kontroller. Kuidas! Ilma selleta on ka võimalik, kuid siis ei saa te kasutada registrite sümboolseid nimesid nagu Sregi või UDR-i ja peate meeles pidama iga sellise aadressi "0xc1" ja see on pea.

Sama meeskond ise #Include.<имя файла> Võimaldab lisada oma projekti sisu mis tahes tekstifaili, näiteks faili, mis kirjeldab funktsioone või tükk teise koodi. Ja nii, et direktiiv oleks selle faili leidnud, näitasime meie projekti jaoks viise (Winavr Directory on juba seal kirjutatud).

Põhifunktsioon.
SI keele programm koosneb funktsioonidest. Neid saab manustada ja tõi üksteisest mis tahes järjekorras ja erinevalt. Igal funktsioonil on kolm nõutavat parameetrit:

  • Näiteks tagastamise väärtus sin (x) Tagastab x sinuse väärtuse. Nagu matemaatikas, lühikese.
  • Edastatud parameetrid, sama X.
  • Keha funktsioon.

Kõik edastatud ja tagastatud väärtused peavad olema mis tahes tüüpi, sõltuvalt andmetest.

Iga programm C peab sisaldama funktsiooni peamine. Põhiprogrammi sisenemise punktina ei ole see Nifiga NIFIGA SI :). Vastavalt Põhi kohalolek kellegi teise allikas miljonilt faili, võib mõista, et see on juht programmi, kus kõik algab. Nii et küsime:

1 2 3 4 5 Int peamine (tühimik) (tagastamine 0;)

int peamine (tühimik) (tagastamine 0;)

Kõik, esimene lihtsaim programm on kirjutatud, see ei ole oluline, et ta ei tee midagi, me just alustasime.

Me analüüsime seda, mida me tegime.
int. Seda tüüpi andmeid, mida peamine funktsiooni tagastab.

Muidugi, mikrokontrolleris peamine. Ma ei saa midagi põhimõtteliselt ja teoorias tühine peamine (void)Kuid GCC esialgu teritatud arvutisse ja seal saab programmi tagastada operatsioonisüsteemi väärtuse lõpetamisel. Seetõttu GCC tühine peamine (void) HOIATUS.

See ei ole viga, see toimib, kuid mulle ei meeldi varged.

tühine. Seda tüüpi andmeid, mida me sellel juhul funktsioonile edastame peamine. Samuti ei saa luuletaja midagi väljastpoolt võtta tühine. - Dummy. Pistik rakendatakse, kui midagi või tagasipöördumist ei ole vaja edastada.

Need on { } Joonis sulgudes on tarkvara plokk, antud juhul keha funktsioon peamine.Seal on kood.

tagasi. - See on tagastamise väärtus, et peamine funktsioon annab lõpetamisel, sest me oleme INT, see tähendab, et number, mida me peame tagastama. Kuigi see ikka ei ole mõtet, sest Mikrokontrolleril peamine, me välja arvatud kuhugi. Ma naasen nulli. Nonfig jaoks. Ja kompilaator on tavaliselt arukas ja kood ei tekita koodi.
Kuigi siis, kui te perverte, siis peamine. Võite minna MC - näiteks langeda bootloaderi sektsiooni ja täita seda, kuid seal on juba madala taseme püsivara korjamisega, et kohandada üleminekuaadressid. Allpool näete ja mõistate, kuidas seda teha. Milleks? See on veel üks küsimus, 99,999% juhtudest See Nafig ei ole vajalik :)

Tehtud, läks edasi. Lisa muutuja, see ei ole eriti vajalik meile ja see ei ole vaja kehtestada muutujaid, kuid me õpime. Kui muutujad lisatakse funktsiooni kehasse - siis on need kohalikud ja eksisteerivad ainult selles funktsioonis. Kui lahkute funktsiooni, need muutujad eemaldatakse ja mälu RAM antakse olulisematele vajadustele. .

1 2 3 4 5 6 Int Main (tühimik) (allkirjastamata CHE I; tagastamine 0;)

int Main (tühimik) (allkirjastamata CHE I; tagastamine 0;)

allkirjastamata Nii kasumatu. Fakt on see, et binaarses esinduses on meil kõrgem natuke märgi jaoks, mis tähendab ühel baitil (Char) numbrit + 127 / -128, kuid kui märkide äraviskab see on juba 0 kuni 255. Tavaliselt on märk ei ole vajalik. Nii et allkirjastamata.
i. - See on lihtsalt muutuja nimi. Mitte rohkem.

Nüüd peate sadamate vormindama ja UART.. Loomulikult saate raamatukogu võtta ja ühendada ja ühendada mingi Uartinit (9600); Aga siis te ei tea, mis tegelikult juhtus.

Me teeme seda:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Int peamine (tühimik) (allkirjastamata CHAR I; #define xtal 8000000l #define baudrate 9600L #Define baudddddider (xtal / (16 * baudrate) -1) #Define hi (x) (x) (x) \u003e\u003e 8) #define lo (x) ((x) & 0xff) ubrrl \u003d lo (bauddddivider); UBRRH \u003d Hi (Bauddddivider); Ucsra \u003d 0; UCSRB \u003d 1.<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

iNT peamine (tühimik) (allkirjastamata CHE I; #define xtal 8000000L #define baudrate 9600L #define bauddditer (xtal / (16 * baudrate) -1) #define hi (x) (x) \u003e\u003e 8) #define lo ( X) ((x) & 0XFF) ubrrl \u003d lo (bauddddider); ubrrh \u003d hi (bauddddider); ucsra \u003d 0; ucsrb \u003d 1<

Hirmutav? Tegelikult on tegelik kood siin ainult viis viimast rida. Kõik, et #Define See on makro-keele eelprocessor. Peaaegu samad topid nagu kokkupanemisel, kuid süntaks on mõnevõrra erinev.

Need hõlbustavad teie tavapäraseid operatsioone vajalike koefitsientide arvutamiseks. Esimeses piirkonnas ütleme seda selle asemel Xtal Saate ohutult asendada 80 000 000 ja L.- tüüpi spetsifikatsioon, pikk kaubanduskeskus on protsessori kella sagedus. Samasugune baudraat. - UART andmete sagedus.

bauddddider. Juba keerulisem on kahe eelmise valemiga arvutatud väljend asendatakse selle asemel.
Hästi ja Lo. ja TERE Selle tulemusega võtab nooremad ja vanemad baitid, sest Ühel bait ei pruugi see selgelt sobiv. Sisse TERE Icse Shift on tehtud (sisendparameeter Macro) kaheksa korda paremal, selle tulemusena ainult vanim bait jääb. A B. Lo. Teeme partii ja numbriga 00ffiga, selle tulemusena jääb ainult noorim bait.

Nii et kõik, mis on tehtud #Define Saate ohutult välja visata ja soovitud numbrite arv kalkulaatorisse ja sisestada need kohe UBBRL \u003d read .... ja UBBRH \u003d ... ..

Saab. Aga! Tee seda See on kategooriliselt võimatu!

Samuti töötab see tööle, kuid teil on nn maagilised numbrid - Väärtused arusaamatult, kust see ei ole selge, miks ja kui te annetate sellise projekti paari aasta pärast, siis on raske mõista, et see on kuradi see. Jah, ja nüüd soovite muuta kiirust või muuta kvartsisagedust ja kõik peavad ümber arvutama ja nii muutnud paari tsiferoki koodi ja kõike ise. Üldiselt, kui te ei soovi Bydlokoodri nautida, siis tehke kood nii, et seda oleks lihtne lugeda, see oli arusaadav ja kergesti modifitseeritud.

Siis kõik on lihtne:
Kõik need "UBRRL ja CO" on saatja konfiguratsiooni registrid, millega me maailma suhtleme. Ja nüüd oleme määranud vajalikud väärtused soovitud kiiruse ja parema režiimi konfigureerimisega.

Salvestusvaade 1< Tähendab järgmist: võtke 1 ja pane see kohale Rxen. Lendamisel. Rxen. See on neljas ruudus UCSRB.nii et 1< moodustab binaarse numbri 00010000, Txen. - See on kolmas natuke ja 1< DAST 00001000. Single "|" See on katki Võinii 00010000 | 00001000 \u003d 00011000. Ülejäänud vajalikud konfiguratsioonibittid eksponeeritakse samal viisil ja lisatakse üldisele kobarale. Selle tulemusena on montaaži number kirjutatud UCSRB-sse. Detailid on kirjutatud MC-s andmetes USART-sektsioonis. Nii et ärge häirige tehnilisi üksikasju.

Valmis, on aeg näha, mis juhtus. Emulatsiooni koostamisel ja käivitamisel (Ctrl + F7).

Silumine
Igasuguseid edusamme baarid jooksid, stuudio muutus ja peamise funktsiooni lähedal ilmnes kollane nool. See on koht, kus protsessor on praegu praegune ja pausi simulatsioon.

Fakt on see, et esialgu seisis see tegelikult UBRRL \u003d LO (Baudddivider); Lõppude lõpuks, asjaolu, et meil on määratleda see ei ole kood, vaid lihtsalt esialgsed arvutused, siis simulaator kinnitas veidi. Aga nüüd ta mõistis, esimene juhendamine on lõpetatud ja kui sa ronida puu I / O Vaata, USART sektsioonis ja võita seal UBBRL bait, näete, et seal on juba olemas! 0x33.

Tehke veel üks samm. Vaadates, kuidas teise registri muutmise sisu. Nii et kaitsme neid kõiki, pöörama tähelepanu asjaolule, et kõik näidatud bitid on öelnud, nagu ma ütlesin, ja see on kogu bait jaoks korraga määratud. Järgmine tulu ei tööta, programm on lõppenud.

Avamine
Nüüd lähtestage simulatsiooni nulliga. Klõpsa seal Lähtesta (Shift + F5). Avatud demonteerimine noteering, nüüd näete, mis toimub kontrolleris tegelikult. Vaade -\u003e Disponebleblebler. Ja mitte Yyaaaa !!! Assamblee !!! Uzhos !!! Aga sa pead. Nii et hiljem, kui midagi läheb valesti, ei julge koodi ja ei küsi Foorumite kaubaküsimusi ja ronis kohe kahjumisse ja vaatasin, kus teil on varisemine. Seal pole midagi kohutavat.

Esiteks on see seeria ülemine osa:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A hüpata 00000002: 940C0034 JMP 0x00000034 hüpata 00000004: 940C0034 JMP 0x00000034 hüpata 00000006: 940C0034 JMP 0x00000034 hüpata 00000008: 940C0034 JMP 0x00000034 hüpata + 0000000A: 940C0034 JMP 0x00000034 hüpata + 0000000C: 940C0034 JMP 0x00000034 hüpata + 0000000E: 940C0034 JMP 0x00000034 hüpata 00000010: 940C0034 JMP 0x00000034 hüpata 00000012: 940C0034 JMP 0x00000034 hüpata 00000014: 940C0034 JMP 0x00000034 hüpata 00000016: 940C0034 JMP 0x00000034 hüpata 00000018: 940C0034 JMP 0x00000034 hüpata + 0000001A: 940C0034 JMP 0x00000034 hüpata + 0000001C : 940C0034 JMP 0x00000034 hüpata + 0000001E: 940C0034 JMP 0x00000034 hüpata 00000020: 940C0034 JMP 0x00000034 hüpata 00000022: 940C0034 JMP 0x00000034 hüpata 00000024: 940C0034 JMP 0x00000034 hüpata 00000026: 940C0034 JMP 0x00000034 hüpata 00000028: 940C0034 JMP 0x00000034 hüpata

00000000: 940C002A JMP 0x0000002A hüpata 00000002: 940C0034 JMP 0x00000034 hüpata 00000004: 940C0034 JMP 0x00000034 hüpata 00000006: 940C0034 JMP 0x00000034 hüpata 00000008: 940C0034 JMP 0x00000034 hüpata + 0000000A: 940C0034 JMP 0x00000034 hüpata + 0000000C: 940C0034 JMP 0x00000034 hüpata + 0000000E : 940C0034 JMP 0x00000034 hüpata 00000010: 940C0034 JMP 0x00000034 hüpata 00000012: 940C0034 JMP 0x00000034 hüpata 00000014: 940C0034 JMP 0x00000034 hüpata 00000016: 940C0034 JMP 0x00000034 hüpata 00000018: 940C0034 JMP 0x00000034 hüpata + 0000001A: 940C0034 JMP 0x00000034 hüpata + 0000001C: 940C0034 JMP 0x00000034 hüpata + 0000001E: 940C0034 JMP 0x00000034 hüpata 00000020: 940C0034 JMP 0x00000034 hüpata 00000022: 940C0034 JMP 0x00000034 hüpata 00000024: 940C0034 JMP 0x00000034 hüpata 00000026: 940C0034 JMP 0x00000034 hüpata 00000028: 940C0034 JMP 0x00000034 hüpata

See on katkematu vektorite tabel. Me tuleme tagasi sellele, kuigi me lihtsalt näha ja meeles pidada, et see on. Esimene veerg on välklambi välklambi aadress, kus käsk asub kolmanda mnemonilise meeskonna teise käsu kood, sama koostaja juhendamine, meeskonna kolmas operatsioon. Noh, automaatne kommentaar.
Niisiis, kui te vaatate, siis on tahke üleminekud. Ja JMP käsu kood on neli baiti, see sisaldab tagaküljega salvestatud üleminekuatet - noorema bait nooremate baitide jaoks ja ülemineku käsu 940c kood

0000002B: be1f välja 0x3f, R1 I / O asukohale

Selle nulli salvestamine 0x3f aadressile, kui näete I / O vaade veerus, siis näete, et 0x3f aadress on Sregi lipu registri kontrolleri registri aadress. Need. Me lähtestage SREG-i programmi null tingimustes.

1 2 3 4 + 0000002C: E5CF LDI R28.0X5F Load Vahetu + 0000002D: E0D4 LDI R29.0X04 LOAD VÄLJA + 0000002E: BFDE OUT 0X3E, R29 OUT I / O Asukoht + 0000002F: BFCD OUT 0X3D, R28 OUT I / O Asukoht

0000002C: E5CF LDI R28.0X5F LOAD LOAD VÄLJA + 0000002D: E0D4 LDI R29.0X04 LOAD VÄLJA + 0000002E: BFDE OUT 0X3E, R29 OUT I / O Asukoht + 0000002F: BFCD OUT 0X3D, R28 OUT I / O Asukoht

See on virna pointeri laadimine. Vahetult laevandus I / O registrid ei saa ainult vahepealse registri kaudu. Seetõttu esimene LDI vahepealne ja seejärel sealt I / O. Ma ütlen teile ka rohkem virna eest. Vahepeal on teada, et see on selline dünaamiline mälupiirkond, rippus RAM-i lõpus ja hoiab aadressid ja vahepealsed muutujad. Nüüd me märkisime, kus meil on virna.

00000032: 940C0041 JMP 0x00000041 hüpata

Hüppa programmi Saaseaee lõpuni ja seal on meil katkestusi ja silmusega keelustamine tihedalt:

1 2 +00000041: 94F8 CLI globaalne katkestus Keela +00000042: CFFF RJMP PC-0x0000 Suhteline hüpata

00000041: 94F8 CLI globaalne katkestus Keela +00000042: CFFF RJMP PC-0x0000 Suhteline hüpata

See on ettenägematute asjaolude korral, näiteks põhifunktsioonist väljund. Sellisest silmusest saab kontrollerit kuvada kas riistvara lähtestamise teel või mis on tõenäoline, valvekoer koera - valvekoer. Noh, või nagu ma eespool ütlesin, korrigeerige need kohad Hex redaktoris ja marsruutides, kus meil on hing. Samuti pöörake tähelepanu asjaolule, et on olemas kahte tüüpi JMP ja RJMP üleminekud Esimene on otsene üleminek aadressile. See võtab neli baiti ja saab otse otsese ülemineku vältel kogu mälupiirkonnas. Teine üleminekutüübi - RJMP - suhteline. Tema meeskond võtab kaks baiti, kuid üleminek see teeb praegusest positsioonist (aadressid) 1024 sammu edasi või tagasi. Ja selle parameetrites on näidatud nihe praegusest punktist. Kasutatakse sagedamini, sest Flushis kulub kaks korda vähem ja pikad tegurid on harva vajalikud.

1 +000034: 940C0000 JMP 0x00000000 hüpata

00000034: 940C0000 JMP 0x00000000 hüpata

Ja see on hüpata koodi alguses. Taaskäivitage omamoodi. Saate kontrollida, kõik vektorid hüpata siin. Sellest väljundist - Kui lubate teil katkestada katkestusi (nad on vaikimisi keelatud) ja te katkestate, kuid puudub käitleja, siis on programmi lähtestamine - programm viskab programmi algusesse.

Põhifunktsioon. Kõik on sarnane, võite isegi kirjeldada. Vaadates ainult registritele, mis on juba arvutatud numbrit. Preprocessor kompilaatori taksod !!! Niisiis ei ole "magic" numbrid!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24.0x33 Laadige kohene +000037: B989 OUT 0X09, R24 OUT I / O Asukoht 15: UBRRH \u003d HI (BAUDDUDIDEJ); +000038: BC10 OUT 0x20, R1 OUT I / O Asukoht 16: Ucsra \u003d 0; +000039: B81B OUT 0X0B, R1 OUT I / O Asukoht 17: UCSRB \u003d 1<

Ja siin on Jamb:

1 2 3 + 0000003E: E080 LDI R24.0x00 Load Vahetu + 0000003F: E090 LDI R25.0x00 Load Vahetu +00000040: 9508 RE-alampromeetika

0000003E: E080 LDI R24.0x00 Load Vahetu + 0000003F: E090 LDI R25.0x00 Load lähedale +00000040: 9508 RE-alampromeetika

Küsib, miks see kompilaator lisab sellise topmasteri? Ja see pole midagi muud kui tagasipöördumine 0, siis oleme tuvastanud INT peamiseks (tühine). Nii et ma võitsin rohkem kui neli baiti, ei saa aru, mis :) ja kui teete tühimiku peamist (tühine), on see ainult ret, kuid vars on. Mida nad ütlevad, et me ei tagasta põhifunktsiooni midagi. Üldiselt tehke seda nagu sina :)

Keeruline? Tundub, et see ei ole. I vahele samm-sammult toimivust Discaster-režiimis ja Pokericy kui protsessor teostab individuaalseid juhiseid, mis juhtub registritega. Kuidas liikuda käskudel ja lõplik silmus.

Jätkamine järgneb paari päeva jooksul ...

Offtop:
Alexei78. Gang Firefoxi fikseerimisproovimiseks minu saidi ja foorumi navigeerimise hõlbustamiseks.
Arutelu ja allalaadimine

Programmeerimise AVR mikrokontrollerite jaoks on siiski palju arenguvahendeid, aga kõige populaarsem, kahtlemata pakett tuleks tunnustada AVR-stuudio. . Sellise populaarsuse jaoks on mitmeid põhjuseid - see on ettevõtte poolt välja töötatud tasuta pakett Atmel See ühendab tekstiredaktor, kokkupanek ja simulaator. AVR-stuudiopaketti kasutatakse ka koos kinnitusega riistvaraga. Kavandatavas artiklis peavad näited kaaluma tehnikaid töötama paketiga, mis aitab algaja programmeerijatel mõista AVR-stuudio individuaalsete komponentide koostoimet.

Artikli järgmises osas kirjeldatakse SI-s kirjutatud programmide AVR-stuudio keskkonnas silumist.

AVR-stuudiopaketis on tahke arengu ajalugu, mis kajastub olemasolevate versioonide arvus. 2003. aasta lõpus vabastati versioon 4.08, millel on mitmeid kasulikke täiendusi ja 2004. aasta alguses on vabastatud värskendus (hoolduspakett 1), lisades toetuse ANT-i ANMEGA48 kolmanda põlvkonna AVR-kontrolleritele toetust perekond. Selle pere kiipide tootmine on planeeritud 2004. aasta teisel poolel.

Pakendi jaotus- ja hoolduspaketti saab alla laadida aadressilt www.atmel.com või saada CD-le selle levitamise CD-le atli turustajalt.

AVR-i stuudiopaketi töö vaadatakse mugavalt läbi iga konkreetse programmi. Arvamusena kaalume projekti lihtsama programmi loomist, mis omakorda on kerge kahe LED-i poole. Määratlema, võtke mikrotsircuit ATMEGA128. Ja ühendage kaks LED-i järeldustes 31 ja 32 (need on portde d bitti 6 ja 7 bitti 6 ja 7). AVR-kontrollerid Omage võimas väljundkapsas, iga väljundi tüüpiline vool on 20 mA, maksimaalne väljundvool on 40 mA ja see viitab nii voolavale ja voolavale voolule. Meie näites on LED-i ühendatud anodeedega vastutava töötleja järeldustega ja katoodid kustutatavate takistete kaudu on ühendatud maapinnaga. See tähendab, et LED-i süttitakse söötmise "1" vastava sadama väljundiga. Skemaatiline diagramm kuvatakse joonisel. Diagramm näitab ka kahte nuppu, mida kasutatakse ühes programmis.

Siin on asjakohane teha väikese digressioon kiibi tüübi valimisel kõige lihtsam näide. Tõepoolest, esmapilgul võib tunduda kummaline, miks teil on vaja sellist võimsat kristalli 64-pin-juhtumiga, kus on piisavalt 8-pin-kiipi Attyy12. ? Sellisel lähenemisviisis on loogika. On teada, et peaaegu iga AVRi kontrolleri keskmes asub sama tuum. Suured ja suured, kontrollerid erinevad mälus, I / O sadamate arv ja perifeersete moodulite kogum. Iga konkreetse kontrolleri omadused - siduvad loogiline nimi / väljundregistrid füüsilistele aadressidele, katkestada vektorite aadressidele, sadama bitide tuvastamisele jne. Kirjeldab laiendiga failides, mis kuuluvad AVR-stuudio pakendis. Järelikult, kasutades konkreetse tüüpi kristallide, saate siluda programmi ise ja iga noorema kristalli. Lisaks, kui te kasutate kõige vanemat kristalli silumist, täna on see atma128, saate debug programmi peaaegu iga AVRi kontroller, sa lihtsalt vaja kasutada riistvara ressursse, mis puudub sihtmärgi mikrokontroller. Seega saate näiteks programmi siluda ATMEGA128-s Attyy13. . Sellisel juhul jääb lähtekood praktiliselt samaks, ainult ühendatud faili nimi 128def.inc'iga TN13DEF.INC'iga. Sellisel lähenemisviisil on ka selle eelised. Näiteks saab ühendamiseks kasutada "Extra" I / O porte. LCD-indikaator mida saate debug-teavet tagasi võtta. Või kasutage Intrahemumi emulaatorit, mis ühendab atma128 kiibi JTAG-pordiga (Atty13 kontrolleril ei ole seda sadamat). Seega on võimalik kasutada ühte debug pardal, millel "vanem" AVR-kontroller on paigaldatud, et siluda äsja väljatöötatud süsteemid, loomulikult AVR-mikrokontrolleritel. Üks neist plaatidest nimetatakse AS-Megamisse. See oli see, mida kasutati artiklis esitatud programmide näidete loomiseks. See on universaalne üheaudase kontroller, mis põhineb ATMEGA128 kiipil, mis sisaldab välist RAM-i, kaks sadamat RS-232. , LCD-indikaatorit, INtrahenmbari programmeerija ja emulaator ühendamiseks Kell jtag jääl . Juhatusel on ka koht Flash-ROM-seeria kiibi jagamiseks AT45 Korpuses Tsop32 / 40/48 ja kahe kanali seeria DAC AD5302 / AD5312 / AD5322 . Nüüd, pärast AVR-i monster'i kasutamise põhjuste selgitamist, et süttida swatodiidi paari, saate edasi minna.

Kui programmeerimine AVR-stuudio keskkonnas, peate täitma tavapärase tegevuse järjestuse:

  • koostamine
  • Projekti loomine algab projekti uue projekti menüüst. In "Loo uus projekt" aken, mis avaneb, peate täpsustama projekti nime, (meie puhul - proovi1) ja initsialiseerimisfaili nime. Pärast nupu "Järgmise" vajutamist avatakse valige debug platvorm ja seadme aken, kus valitud on debug platvorm (simulaator või emulaator) ja mikrokontrolleri tüüp.

    Võite valida ühe pakutava Intrahemny emulaatorite, märgime, et iga emulaator on oma nimekirja mikrokiire toetatud. Sest vaatlusaluse eeskujuks valime debug-platvormi AVR-simulaatorina ja atma128 kiibina. Pärast nupu "Finish" vajutamist ilmub meie väljund AVR-stuudiopaketi tööaknad, samas kui tühi. See järgib paremat akent, et asetada programmi lähteteksti. Seda saab teha kahel viisil või vali kõik tekst otse redaktori aknas või allalaadimiseks olemasoleva faili alla. Allpool on kõige lihtsama programmi täielik tekst kommentaaridega.

    ; Näide "LED-juhtimine"; kirjutatud AS-Megam Debug pardal; Parameetri generaatori sagedus on 7,37 MHz; LED-failid on ühendatud PD6 ja PD7 järeldustega ning vastupanu kaudu - jagatud traadil. ; ATMEGA128 Circuit I / O-detailide ühendamine Fail "M128DEF.ING"; Alustava programmi algus :; Esimene toiming - Stack initsialiseerimine; Kui seda ei tehta, siis helistage subroutiini või katkestada; ei tagasta kontrolli tagasi; Pointer lõpus virna on seatud viimasele aadressile sisemise RAM-i - Ramend LDI R16, madal (Ramend) välja SPL, R16 LDI R16, kõrge (Ramend) välja SPH, R16; PD6 ja PD7 järeldustega seotud LEDide juhtimiseks; On vaja kuulutada need järeldused toodangu. ; Selleks kirjutage "1" DDRD registri vastavatesse bittile (Datadiirclection) LDI R16 (1 "<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

    Projekt võib koosneda mitmest failist, samas kui üks fail on peamiseks määratud. Kõik toimingud on mugavad toota kasutades konteksti nuppu hiire. Pärast lähtefaili ühendamist on akendel järgmine vorm.

    Projekti koostamist teeb käsu käsu või vajutades nuppu F7. Kompileerimisprotsess kuvatakse aknas "väljund". See aken võib olla "tõmmates" vaateväljundi käsku.

    Põhimõtteliselt oleme juba saanud väljastusfaili formaadis.hex, mis võib juba laadida mikrotsircuiti ja jälgida usaldusisikute LED-i. Artikli eesmärk on siiski näidata täielikku töötsüklit AVR-i stuudio keskkonnas, nii et me läheme debug-etapile. Seda tehakse silumismeeskonna poolt.

    Nüüd seadistage Quartzsageduse sagedus 7,3728 MHz "Simulator Options" aken, et täpselt mõõta programmi täitmise aega.

    Ülejäänud valikuid tuleks jätta samaks. Nüüd saate rakendada programmi etapis-sammult režiimis hiire või F11 nupu abil.

    AVR-stuudiopakett sisaldab võimas tööriistu sisemiste registrite seisundi vaatamiseks ja redigeerimiseks ja dekugeeritud mikrokontrolleri ja aja, programmi täitmise aja vaatamiseks ja redigeerimiseks. Juurdepääs neile viiakse läbi akna "I / O" kaudu.

    Tegelikult on AVR-stuudiopaketi vaatamise kaudu kättesaadava teabe kogus nii suur, et maksimaalse mugavuse saamiseks on vaja kasutada arvutit kahe monitori konfiguratsioonis.

    Silata meie näite, et pääseda sadamate d bittile, peate paljastama I / o atmega128 stringi ja seejärel portdeliini. Nüüd on kõik kolm selle sadama, portdi, DDRD ja Pind registrit nähtav. Et näha väärtuse, bittide ja aadressi väljad, peate laiendama akna õiget piiri, higistades akent programmi lähtetekstiga.

    Nüüd, edastades programmi samm-sammult režiimis, näete nende registrite praeguste riikide muutmist bitti valdkonnas. Sadamaregistrite olekut on võimalik kiiresti muuta ja seda saab teha kas väärtusvaldkonnas uue koodi kirjutamise teel või otse, klõpsates otse soovitud registrile.

    Sõltumatute harjutuste jaoks pakutakse välja järgmine programm, mis erineb eelmisest, et valgusdioodide süttimist kontrollib kaks nuppu.

    ; Näide "LED-juhtimine nupud"; kirjutatud AS-Megam Debug pardal; LED-failid on ühendatud PD6 ja PD7 järeldustega ning vastupanu kaudu - jagatud traadil. ; Nupud - PE4 ja PE5 .include "M128def.inc"; Alusta põhiprogrammi: Stack initsialiseerimine LDI R16, madal (Ramend) välja SPL, R16 LDI R16, kõrge (Ramend) välja SPH, R16; LED-LEDide R16 initsialiseerimine (1<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

    Seega on lihtsaimate programmide näitel näidatud mõned AVR-stuudiopaketi omadused. On vaja mõista, et see on ainult esimene tuttav, mis võimaldab teil kiiresti kasutada põhipakettide käskudega. Vahepeal on vaatlusaluse paketi võimalused palju laiemad. Näiteks siin saab siluda programmid, mis on kirjutatud kõrgetasemelistes keeltes. Eelkõige kasutab ettevõtte ImageCraft'i C-kompilaator AVR-stuudio Silugerit "Native". Selleks, kui koostamisel lähtekoodi, peate seadistama väljundfaili genereerimise valik vormis ühilduva AVR Studio. Samal ajal on lähtekoodides siluda.

    Teine AVR-stuudio paketi paljudest omadustest on võime ühendada väliseid programme. Näiteks, et tagada, et AS2 inspekteerimisprogrammeerija on vaja mitme lihtsa toimingu tegemiseks.

    Põhi akna menüüs AVR-stuudio menüüs peate valima kohandamata;

    Valige aknas kohandatud tööriistade üksus;

    Topeltklõpsates hiire nupule või klaviatuuri sisestamisele sisestamisele, lisage loendisse uus käsk ja kutsuge seda "AS2 programmeerija";

    Määrake rada programmeerija käivitatavale failile, sisestades selle otse "käsu" sisendväljale või klõpsates nuppu "..." selle valdkonna paremale;

    Nüüd ilmub menüü Tööriistad "programmeerija AS2".

    AVR Studio 4.08 Pakett võimaldab teil ühendada abiprogramme - pluginad. AVR-i stuudio esimene plugin on graafiline redaktori programm, mis lihtsustab LCD-indikaatorit initsialiseerimisprotsessi, mis suudab otseselt juhtida AVR-kontrolleri ATMEGA169. LCD-indikaatorit maksimaalne loogika suurus on 100 segmenti, iga indikaatorielement on valmistatud vastavalt kontrolleri eriregistrisse. Lihtsustada teatud bittide rutiinse sidumise protseduuri iga segmendi jaoks, saate kasutada ülalmainitud programmi.

    Kuigi külastades "AVR-i kodumaa" - Norra atmeli atmelisatsiooni, rääkis üks artikli üks autoritest Larsi quener, programmeerija juhi juht, mis loodi ja toetab AVR-stuudiopaketti. See inimene, klassikaline programmeerija, habemega, kampsun ja kootud sokid sandaalid, rääkis väljavaadete väljavaateid pakendi. Järgmisel versioonil (4.09) on liidese sisse lülitatud uue intrahenmbandi emulaatori jaoks - jtagice mkii jaoks (seda kutsutakse ka Jtagice2), mis aasta teisel poolel asendatakse Jtageice'is. Sellel emulaatoril on kaks olulist erinevust. Ühelt poolt toetata toetatud toetust uue ühe juhtmeta silumisliides nooremate AVR kontrollerid, Debugwire. See liides on huvitav, sest see ei hõivata täiendavaid järeldusi mikrokontrolleri oma tööks, kuna see kasutab vahetada väljundi lähtestamise mikrokontroller! Teisest küljest (saate seda väljendit sõna otseses mõttes aru), ilmub JTagice2 emulaatoris, lõpuks USB-liides arvutiga suhtlemiseks.

    Kirjandus

    1. AVR Tehniline koolitus Tehnilised seminari materjalid. Atmel. Norra. Deceptber 2003.
    2. Nikolai Korolev, Dmitri Korolev AVR-mikrokontrollerid teise põlvkonna: arendaja keskmise. // komponendid ja tehnoloogiad, 2003 nr 7
    3. Teise põlvkonna AVR-mikrokontrollerid: Uued riistvara võimalused // Komponendid ja tehnoloogiad. 2003. nr 4.
    4. Nikolay Korolev, Dmitri Korolev. AVR mikrokontrollerid: suur väike. // Scesmery ", 2001, №5
    5. Nikolay Korolev, Dmitri Korolev. AVR mikrokontrollerid: tarkvara // komponendid ja tehnoloogiad, 2000. nr 4.
    6. Nikolay Korolev. AVR: Arendaja riistvara // Komponendid ja tehnoloogiad, 1999 № 1
    7. Nikolay Korolev. Atmel RISC-mikrokontrollerid // Chip-Uudised 1998, №2
    8. Nikolay Korolev, Dmitri Korolev AVR: Uued 8-bitised RISC-mikrokontrollerid ettevõtte atmel // mikroprotsessori ülevaade, 1998, №1

    Kuidagi kohe tõmmata, et anda nõu AVR-kontrollerite programmeerimiskeskkonna valiku kohta. Lihtsalt ärge visake mind tossud. Ma olen natuke natuke

    Keelte programmeerimine mikrokontrolleritele palju. Programmeerimismeedia ei piisa ka ja võrrelda nendega valesti. Puuduvad paremad programmeerimiskeeli. Seega peate valima teie ja programmeerimiskeskkonna kõige sobivama keele.

    Kui olete hetkel, seisake valiku ees, selle kohta, mida töö alustada, siin on mõned soovitused.

    Endine programmeerimiskogemus. Ärge unustage endise kogemusi programmeerimise kogemusi. Isegi kui see oli Baisik. Isegi kui see oli pikka aega koolis. Programmeerimine nagu jalgratta sõit - sa pead lihtsalt alustama ja kiiresti mäletama kõike unustatud. Alusta Beysika - varjatud - hiljem on lihtsam valida oma eesmärkidel midagi sobivamat.

    Aidata keskkonda.Kas teie sõbrad kirjutavad Pascalile? Teie jaoks on küsimus lahendatud - kirjutage Pascalile! Te alati aidata nõukoguga, raamatukogud visatakse raamatukogudesse, annab valmis projekte. Üldiselt võetakse oma kogukonnale õnnelik õnnelik. Kui te vastupidi, saada vastupidine tulemus. Sõbrad näeb teid meelelahutusega, kes otsustas kokkupanekut uurida. Ära oota abi.

    Hea AVR programmeerimise raamat See aitab väga hästi. Kahjuks on väga vähe neist. Kui te oma kätes sai raamatu ja te arvate, et kõik on selles väga saadaval. - Proovige. Ma ei soovita õppida e-raamatute poolt viimase abinõuna, printida. Väga ebamugav vahetada keskkonda ja teksti failifaili. Palju meeldivam lugemine raamatu kohe proovida ilma häirida lülitades, lisaks saate teha märgi väljade, kirjutada ideid, mis on tekkinud.

    Programmeerimise keskmise lihtsam. Kui teie keele programmeerimise mitme programmide valik on valik - ärge kahtle, valige see, mis on lihtsam. Olgu see vähem funktsionaalne. Olgu see kompileerida hirmutav pumbatud kood. Peaasi on lihtsalt töötamise alustamine. Kui olete lihtsas keskkonnas lahja, siis saate hõlpsasti arenenud ja "paremale" keskkonda. Ja ärge kuulake neid, kes ütlevad, et te kaotate rohkem aega - nad on valed. Junior klasside õpilased ei paluta lugeda "sõda ja rahu", mida nad annavad neile raamatute lihtsamaks - piltidega.

    Raamatukogud. Raamatukogude olemasolu on keele õppimise vastuoluline. Muidugi hõlbustavad nad oluliselt elu, kuid esimesel "mustadel kastides" on arusaamatu ja mitte väga aidates keele mõistmist. Teisest küljest muudab see programmi lugemise lihtsamaks ja võimaldada uustulnuka, eriti pingul, ehitada keerukaid programme. Niisiis, nende kohalolek ei ole eriti igav. Vähemalt alguses.

    Tõhus kood. Programmeerimiskeskkonna valimine programmeerimise uurimiseks ainult selle abil, kui tõhus koodi kood on halb mõte. Te lõpetate mugavalt õppimist - et kümnes asi on "väljumisel". Muidugi saate hiljem sellega töötada.

    Visard.Kristallide pardal olev seade peab olema konfigureeritud sadamate abil. Menetlus on üsna jõulised ja andmelehed on vajalikud. Lisaks on nüansse, kus uustulnuk ei ole lihtsalt anda. Seetõttu on keskmises väga soovitav teadete olemasolu jaoks väga soovitav. Väljaanded on automaatsed SPI, I2C, USART jne Automaatsed seadistused. Mida rohkem seadmeid toetatakse, seda parem. Avage vajalikud perifeersed parameetrid ja visard ise tekitab koodi, mis pakuvad määratud parameetreid. Väga lihtsustab elu.


    Üldised soovitused Selline programmeerimine esialgses etapis peaks olema võimalikult lihtne (isegi kui primitiivne). Programmeerimiskeskkond peaks olema lihtne õppida (nagu te vajate, alustada, õppida programmeerimist ja ei raiska aega seadistuste valimisel). See on soovitatav veneldajale. Samuti ei takista Venemaa käsiraamatut ja programmide näiteid. Kristallide püsivara võimalus keskmisest on soovitav. Järgmisena, kui nad lahkuvad programmeerimise põhialusest, saate liikuda keerukamatele kestadele.


    Teine soovitus, lõpuks töö tõelise kristalliga. Ärge kartke seda põletada. Parandada praktilist kogemust. Töötades emulaatorid (näiteks Proteus), kuigi see vabastab jooteraud, kuid ei saa kunagi anda rahulolu, et sa saad teenitud programmi, esimesed kruusid LED! Mõistmine, mida te oma käega tegite, reaalne töölülitus annab usalduse ja stiimuli liikumise!

    (Külastas 7 377 korda, 1 külastust täna)

    Programmeerija kontseptsioon LPT sadamas kuvatakse joonisel. Rehvide endisena kasutage 74AC 244 või 74HC244 kiipi (K1564AP5), 74LS244 (K555555AP5) või 74als244 (K1533AP5).

    VD1 LED näitab mikrokontrolleri salvestusrežiimi,

    vD2 LED-lugemine,

    vD3 LED - diagrammi olemasolu.

    Skeemi käivitamiseks vajalik pinge võtab ISP-pistikust, st programmeeritavast seadmest. See skeem on ringlussevõetud STK200 / 300 programmeerija (lisatud LED-i lihtne töötamine), seega on see ühilduv kõigi PC programmeerija programmidega, mis töötavad STK200 / 300 skeemiga. Selle programmeerija töötamiseks kasutage programmi CVAVR.

    Programmeerijat saab teha trükkplaadil ja asetage see LPT-liidese korpusesse, nagu on näidatud piltides:




    Programmeerijaga töötamiseks on mugav kasutada sadama LPT-itensienteli, mida on lihtne ennast teha (näiteks CABLERONIX-kaabel printeri jaoks), peamine asi on "mitte kahetseda" dirigendid Maa (18-25 jalga pistikust) või osta. Kaabel programmeerija ja programmeeritava mikrotsircuit vahel ei tohi ületada 20-30 cm.

    Tere, kallis HABRARITES!

    Selles artiklis tahan rääkida sellest, kuidas ühel päeval otsustasin alustada programmeerimist mikrokontrolleritele, mis oli selle jaoks vajalik ja et lõpuks selgus.

    Teema mikrokontrollerite huvitatud mind pikka aega, aasta 2001. Aga siis saada programmeerija elukohas oli problemaatiline ja ei olnud ostu internetis ja kõne. Ma pidin sel juhul edasi lükkama, kuni parimad ajad. Ja nii, ühel päeval avastasin, et parimad ajad tulid ilma maja lahkumata, saate osta kõik, mida ma vajasin. Ma otsustasin proovida. Niisiis, mida me vajame:

    1. Programmeerija
    Turul on palju võimalusi - kõige odavamast ISP-st (in-System programmeerimine) programmeerijad mitu dollarit, võimsate silumisprogrammide jaoks paar sada. Ilma suurema kogemuseta selles küsimuses otsustasin kõigepealt proovida ühte lihtsamaid ja odavamaid - usbasp. Ostsin korraga eBay $ 12 eest, nüüd leiate isegi $ 3-4 eest. Tegelikult on see programmeerija hiina versioon Thomas Fischlist. Mida ma saan teda öelda? Ainult üks asi - see toimib. Lisaks on üsna palju AVR-kontrollerid Ameti ja Atty seeria. Linuxi all ei nõua juht.

    Firmware jaoks peate ühendama VCC, GND, lähtestamise, SCK, MOSI, MISO programmeerija väljundid vastavate mikrokontrolleri väljunditega. Lihtsuse jaoks kogusin abikava õigesti meessoost:

    Lahkus laual - sama mikrokontroller, mida me hakkame vilkuma.

    2. Mikrokontroller
    Mis valik mikrokontroller, ma ei eriti viitsinud ja võttis Ameti8 atmel - 23 I / O PINE, kaks 8-bitine taimerid, üks 16-bitine sagedus - kuni 16 MHz, väike tarbimine (1-3,6 mA) , Odav ($ 2). Üldiselt algus - rohkem kui piisav.

    Linuxi all Controller'i püsivara kompileerimiseks ja allalaadimiseks töötab AVR-GCC + AVRDEDE kimp suurepäraselt. Paigaldamine triviaalne. Pärast juhiseid saate installida kõik, mida vajate mõne minuti jooksul. AINULT NEANS, mis tuleks maksta - AvrDude (tarkvara salvestamise tarkvara), võivad nõuda programmeerija juurdepääsuõigust. Välju - joosta läbi sudo (mitte väga hea idee) või registreerige UDV-õigused. Süntaks võib OS-i erinevates versioonides erineda, kuid minu puhul on tehtud (Linuxi piparmünt 15), lisades järgmine reegel /etc/udev/Rules.d/41-atmega.Rulesi faili:

    # USBASP programmeerija alamsüsteem \u003d\u003d "USB", attra (Idvendor) \u003d\u003d "16c0", attra (IDproduct) \u003d\u003d "05DC", grupp \u003d "plugindev", režiim \u003d "0666"

    Pärast seda on vaja loomulikult teenuse taaskäivitamist.
    Service UDEV taaskäivitage.
    Saate koostada ja välkida ilma probleemideta otse käsurealt (kes kahtleksid), kuid kui on palju projekte, on mugavam panna plugina ja teha kõik otse Eclipse keskkonnast.

    Windowsi all peavad draiver varustama. Ülejäänud ei ole probleeme. Teadusliku huvi jaoks proovisin Windowsis AVR-stuudio + äärmusliku põleti kimp. Jällegi töötab kõik pauguga.

    Alustame programmeerimist

    Programmeerimine AVR-kontrollerid võivad olla nii kokkupanekul (AVR-assettkel) ja C. Siinkohal arvan, et kõik peavad oma valiku enda valiku tegema, sõltuvalt konkreetsest ülesandest ja selle eelistustest. Isiklikult hakkasin esmalt kokkupanekut valides. Kui programmeeritakse kokkupanekut, muutub seadme arhitektuur selgemaks ja tunne näib, et nad kaevavad otse kontrolleri sees. Lisaks usun, et eriti kriitilistes programmides võib kokkupaneku teadmised olla väga kasulikud. Pärast AVR-assembriga tutvumist ma nihutades SI-s.

    Pärast arhitektuuri ja aluspõhimõtete tutvustamist otsustasin ma koguda midagi kasulikku ja huvitavat. Minu tütar aitas mind, ta tegi males ja üks ilus õhtu deklareeris, et ta tahab mõnda aega partiide jaoks aega vaadata. Batz! Siin on - idee esimese projekti! Neid oli võimalik tellida samal eBay-s, aga ma tahtsin teha oma kella, must ... uh ... indikaatorite ja nuppudega. Pole varem öelnud!

    Ekraanina otsustati kasutada kahte 7-segmendi dioodi indikaatorit. Selle kontrollimiseks oli piisav 5 nuppu - "Player 1", "Player 2", "Reset", "Seadistus" ja "Paus". Noh, ärge unustage mängu heli näitajat. Vaata niimoodi. Alltoodud joonisel on näidatud mikrokontrolleri ühendamise üldskeem indikaatorid ja nupud. Ta vajab programmi lähtekoodi parsimisel:

    Colcessing Flight

    Alustame, kuna see peaks olema programmi sisenemispunktist - peamised funktsioonid. Tegelikult ei ole midagi tähelepanuväärne selles, et see ei ole - sadamate seadistamine, andmete initsialiseerimine ja lõpmatu nupp vajutades nuppe. Noh, SEI () Call on katkestuste töötlemise resolutsioon nende kohta veidi hiljem.

    Int peamine (tühimik) (init_io (); init_data (); Sound_off (); SEI (); samal ajal (1) (käepide_buttons ();) Tagasi 0;)
    Mõtle iga funktsiooni eraldi.

    VOID init_IO () (// Set väljund DDRB \u003d 0XFF; DDRD \u003d 0XFF; // Set sisend DDRC \u003d 0B11100000; // pull-up takistid Portc | \u003d 0B00011111; // taimer katkestab timsk \u003d (1<

    I / O sadamate seadmine on DDRX-i registrisse väga lihtne (kus x on kiri, tähistab porti) number, millest igaüks tähendab, kas vastav PIN-kood on sisendseade (vastab 0-le) või väljundile kuni 1). Seega tegime SEASHAL DDRB ja DDRD-numbri 0XFF-i, tegime B- ja D väljundporti. Seega DDRC \u003d 0B11100000 käsk; Lülitab esimese viie porti sadama C sisendrükid ja järelejäänud nädalavahetusel. Meeskonna portfc | \u003d 0B00011111; Sisaldab sisemise karmistamise takisti 5 kontrolleri sisendile. Kava kohaselt on nupud ühendatud nende sisenditega, mis suletakse need maa peal. Seega mõistab kontroller, et nuppu vajutatakse.

    Järgmisena järgite kahe taimerite, TIMER0 ja TIMER1 seadistust1. Me kasutame kõigepealt indikaatorite uuendamise ja teise ajakohastamise ajakohastamise ajakohastamise ajakohastamise ja selle eest, pärast selle käivitamise alustamist iga sekundi järel. Üksikasjalik kirjeldus kõik konstandid ja taimeri seadistusmeetod teatud intervalli võib leida dokumentatsiooni ATMEGA8.

    Töötlemise katkestus

    ISR (ekraan (); kui (_Buzzer\u003e 0) (_Buzzer--; ; kui (taimer1 \u003d\u003d 0) protsess_timeoff ();) Kui (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (Timer2--; If (Timer2 \u003d\u003d 0) protsess_Tuuleoff ();)

    Kui taimer käivitub, edastatakse juhtkontroll vastava katkestuse käitlejale. Meie puhul on see TIMER0_OVF_VECT protsessor, mis põhjustab aja toodangu protseduuri näitajatele ja taimer1_compa_vectile, mis töötleb loendust.

    Järeldus näitajatele

    Voidide kuvamine () (DISPLAY_NUMBER ((TIMER1 / 60) / 10, 0B00001000); _Delay_MS (0,25); Display_Number ((TIMER1 / 60)% 10, 0B00000100); _Delay_MS (0,25); Display_Number ((taimer1% 60) / 10, 0B00000010); _Delay_ms (0,25); Display_Number ((taimer1% 60)% 10, 0B00000001); _Delay_ms (0,25); Display_Number ((TIMER2 / 60) / 10, 0B10000000); _Delay_MS (0,25); DISPLAY_NUMBER (TIMER2) / 60)% 10, 0B01000000); _delay_ms (0,25); Display_Number ((TIMER2% 60) / 10, 0B00100000); _Delay_MS (0,25); Display_Number (((TIMER2% 60)% 10, 0B00010000); _Delay_ms (0,25) PORTD \u003d 0;) void Display_Number (int number, int mask) (portb \u003d number_mask (number); portrdd \u003d mask;)

    Ekraani funktsioon kasutab dünaamilist näidustusmeetodit. Fakt on see, et iga individuaalne indikaatoril on 9 kontakti (7 segmentide juhtimiseks, 1 punkti ja 1 toiteallika jaoks). Et juhtida 4 numbrit see võtab 36 kontakti. Liiga raiskav. Seetõttu on mitmekohalise indikaali heitmete väljund korraldatud vastavalt järgmisele põhimõttele:

    Pinge toidetakse vaheldumisi iga jagatud kontaktile, mis võimaldab teil tuua esile soovitud näitaja vastava indikaatoris sama 8 juhtimiskontakti abil. Piisavalt suure väljundsagedusega näeb see välja nagu staatiline pilt. Seetõttu on kõik diagrammi mõlema näitaja 8 tarnekontaktid ühendatud 8 sadamaga D-sadamaga D ja 16 kontaktkontrollisegmendid on ühendatud paarikaupadega ja ühendatud 8 port B-pordiga. Seega on ekraani funktsioon 0,25 viivitusega. MS kuvab igale indikaatorile soovitud numbri. Lõpu all kõik väljundid, mis toituvad indikaatorite pinget välja lülitatud (käsklusport \u003d 0;). Kui seda ei tehta, siis viimane ekraani number põleb, kuni järgmine kõne nimetatakse ekraanifunktsiooniks, mis toob kaasa oma heledama luminestsentsi võrreldes ülejäänud.

    Presside töötlemine

    Tühine juhtimine_buttons () (käepide_button (Key_Seep); käepide_Button (key_resett); käepide_Button (key_paus); juhtimine_button (key_player1); juhtimine_button (key_player2);) tühine juhtimine_button (INT-klahv) (bitti) \u003d Setup_bit; Break; Case Key_reset: Bit \u003d reset_bit; vaheaeg; Casey Key_Pause: Bit \u003d Pause_bit; pausi; Button_pin, bitt))) (kui (_pressioon \u003d\u003d 0) (_delay_ms (tühja_ame); : Process_reset (); vaheaeg; Case Key_Pause: protsess_paus (); vaheaeg; CASE key_Player1: protsess_Player1 (); pausi )

    See funktsioon omakorda küsitlustes kõik 5 nuppu ja protsessid vajutage, kui selline juhtus. Vajutades on registreeritud Bit_is_clear (Button_pin, Bit) kontrollimine, st. Nuppu vajutatakse, kui see sisend vastab sellele on ühendatud maapinnaga, mis juhtub vastavalt skeemile, kui vajutate nuppu. Viivitusega viivitus Ductury_time ja uuesti kontrollimine on vajalik, et vältida kontaktide rattlesi tõttu mitmeid tarbetuid vastuseid. Pressi oleku salvestamine sobivates varieeruvatel bittides _pressioonis kasutatakse pikema nupuga taaskasutamise kõrvaldamiseks.
    Vajutades funktsioone on üsna triviaalne ja uskuge, et täiendavates kommentaarides ei ole vaja.

    Täistekstiprogramm

    #Define f_cpu 4000000l #include #Include. #Include. #define tühistamise_ame 20 #define button_pin pcin #define setup_bit pc0 #define reset_bit pc1 #define paus_bit pc2 #define mängija1_bit pc3 #define mängija2_bit pc3 #define mängija2_bit pc4 #define key_Seep 0B00000001 #define key_reset 0B00000010 #definey_paus 0B00000100 #definey ActiveTimer \u003d 0; Volatiilne int taimer1 \u003d 0; Volatiilne int taimer2 \u003d 0; volatiilne int _buzzer \u003d 0; Volatiilne int _pressioon \u003d 0; // funktsioonide deklaratsioonid void init_io (); void init_data (); Int number_mask (int num); tühine juhtimine_buttons (); tühine juhtimine_button (int võti); Tühine protsess_semep (); Tühine protsess_reset (); tühine protsess_paus (); tühine protsess_tuurioff (); Tühine protsess_player1 (); Tühine protsess_player2 (); tühine ekraan (); Void Display_Number (int mask, int number); Void Sound_on (int intervall); Void Sound_off (); // katkestab ISR-i (ekraan (); kui (_Buzzer\u003e 0) (_Buzzer--; Taimer1--; (init_IO (); init_data (); Sound_off (); SEI (); samal ajal (1) (käepide_buttons ();) Tagasi 0;) VOID_IO () (// Set väljund DDRB \u003d 0XFF; DDDD \u003d 0XFF; // Set Sisend DDRC \u003d 0B11100000; // pull-up takisti Portc | \u003d 0B00011111; // taimer katkestab timsk \u003d (1< 5940 || TIMER2\u003e 5940) (taimer1 \u003d 0; taime2 \u003d 0;)) tühine protsess_reset () (init_data ();) VOID protsess_Tuuleoff () (init_data (); Sound_on (30);) VOID protsess_paus () (ActiveTimer \u003d 0;) tühine protsess_player1 () (activeTimer \u003d 2;) void protsess_player2 () (aktiivne) _player2 () (aktiivne) Case Key_Pause: Bit \u003d Paus_bit; pausi; Case Key_Player1: Bit \u003d Player1_bit; Bit Key_Player2: Bit \u003d mängija2_bit; pausi; Vaikimisi: tagasipöördumine;) Kui (Bit_is_pin, bitt)) (kui (_pressioon \u003d\u003d 0)) _Delay_ms (tühistamise_time); kui (bit_is_clear (bit_pin, bitt)) (_pressioon : Process_player1 (); vaheaeg; Case Key_Player2: protsess_Player2 () Sked & \u003d ~ võti; )) Tühine juhtimine_buttons () (käepide_button (Key_Seetup); käepide_Button (key_reset); käepide_button (key_Player1); käepide_Button (key_player2);) tühimiku kuvamine () (Displar1 / 60) / 10, 0B00001000) ; _delay_ms (0,25); Display_Number ((taimer1 / 60)% 10, 0B00000100); _Delay_ms (0,25); Display_Number ((taimer1% 60) / 10, 0B00000010); _delay_ms (0,25); Display_Number ((taimer1% 60) % 10, 0B00000001); _delay_ms (0,25); DISPLAY_NUMBER ((TIMER2 / 60) / 10, 0B10000000); _Delay_MS (0,25); Display_Number ((TIMER2 / 60)% 10, 0B01000000); _Delay_MS (0,25); Display_Number ((( Taimer2% 60) / 10, 0B00100000); _delay_ms (0,25); DISPLAY_NUMBER (((TIMER2% 60)% 10, 0B00010000); _Delay_ms (0,25); PORTDD \u003d 0;) VOID Display_Number (int number_mask) (portb \u003d number_mask) Number); PORTD \u003d mask;) VOID SOUND_ON (INT intervall) (_Buzzer \u003d intervall; // pane buzzer pin kõrge portfc | \u003d 0B00100000;) VOID SOUND_OFF () (// Pane Buzzer PIN LOW PORTC & \u003d ~ 0B00100000;)

    Prototüüp monteeriti dumpinguametile.