Atmega8 programmēšana. AVR mikrokontrolleru programmēšana. MK interfeiss programmēšanas režīmā

Lai pārsūtītu no datora uz mikrokontrolleri, mums ir nepieciešama USBasp un programma AVRDUDE.Mūsdienās ir plašs programmētāju klāsts, kas paredzēts programmēšanai AVR mikrokontrolleri. Starp tiem var atrast daudzus paštaisītus, kurus diez vai pat var saukt par programmētājiem, jo ​​tie ir tieši savienoti ar COM portu, izmantojot tikai dažus rezistorus. Tomēr mūsdienu datori un portatīvie datori praktiski vairs nav aprīkoti ar COM pieslēgvietām, tāpēc viens no galvenajiem kritērijiem programmētāja izvēlē ir iespēja to savienot ar USB ports. Lētākais, vienkāršākais un visizplatītākais ir USBasp programmētājs. To var iegādāties gandrīz jebkurā radio veikalā pieejamu cenu. Tās izmaksas ir Ķīniešu internets Veikals svārstās no $ 1,5 līdz $ 3.

Programmētājs USBasp

Dators sazinās ar mikrokontrolleri, izmantojot USBasp programmētāju, izmantojot USB portu, un dati tiek pārsūtīti caur interfeisu SPI S seriāls P erifēra es saskarne(seriālais perifērijas interfeiss). Lai sazinātos MK ar programmētāju, tiek izmantotas īpašas tapas: MOSI, MISO, SCK, RESET, VCC, GND. Lai gan SPI pieņem, ka tiks izmantotas tikai trīs tapas MOSI, MISO un SCK, bet mēs izmantosim visas sešas tapas.

Veicot datu apmaiņu, izmantojot interfeisu SPI Mikrokontrolleris var vienlaicīgi saņemt (MISO pin) vai pārsūtīt datus (MOSI pin). Datu saņemšanas vai pārsūtīšanas režīma iestatīšana tiek veikta, pieliekot noteiktu impulsu SCK tapai.

Programmētāja savienotājam, kā likums, ir 10 tapas, un tas ir savienots ar mikrokontrolleru, izmantojot 10 vadu kabeli. Tomēr ērtāk ir izmantot kabeļus ar 6 kontaktu adapteri, jo šajā gadījumā visi kontakti ir aizņemti. Desmit kontaktu savienotājam viens kontakts paliek neaizņemts, un četri kontakti ir savienoti ar kopējo vadu (GND).

Lai dators varētu noteikt programmētāju, jāinstalē USBasp draiveris.

Tālāk ir parādīts programmētāja fotoattēls, kas savienots ar mikrokontrolleru ATmega8.

Vienīgais šī programmētāja trūkums vai, pareizāk sakot, nelielas neērtības ir tas, ka to neatbalsta (bez dažādiem trikiem) Atmel Studio, tāpēc jums ir jāizmanto trešās puses programma. Visvairāk pārbaudītais ir AVRDUDE.

Iestatījumi

Tagad mums tikai jāpabeidz pēdējais posms. Palaidiet programmu AVRDUDE. Pēc noklusējuma tiek atvērta cilne Programma. Loga apakšdaļā izvēlnē Iestatījumi atlasiet programmētāja veidu usbasp. Nākamais kategorijā Mikrokontrolleris izvēlieties mūsu ATmega8 mikrokontrolleri. Zemāk kategorijā Zibspuldze noklikšķiniet uz elipses ikonas un atvērtajā izvēlnē norādiet ceļu uz kompilēto failu ar paplašinājumu hex. Ceļš uz failu un pašu failu būs tāds pats, kā mēs iepriekš norādījām .

Lai pārliecinātos, ka operētājsistēma ir atklājusi programmētāju (programmētāja draiveris ir pareizi instalēts) un ir pareizi savienots ar mikrokontrolleru, noklikšķiniet uz pogas Lasīšana. Ja kļūdu nav, parādīsies logs ar ierakstu " Ģeneratora kalibrēšanas šūnas ir nolasītas! Un heksadecimālais skaitlis tiks parādīts augšējā logā. Katram MK ir savs numurs.

Pirms ierakstīšanas jauna programma Ieteicams notīrīt mikrokontrollera atmiņu. To var izdarīt, noklikšķinot uz pogas Dzēst visu. Rezultātā parādīsies logs, kas norāda, ka kristāls ir tīrs.

Tagad noklikšķiniet uz programmas pogas kategorijā Zibspuldze. Kad programma ir veiksmīgi ierakstīta MK, tiek parādīts logs ar ierakstu zemāk.

Ierakstītās vai, kā mēdz teikt, programmaparatūras programmas rezultāts ir iedegta LED, kas savienota ar mūsu mikrokontrollera PC0 tapu.

Laba diena. Turpināsim. Pēc tam, kad iepazināmies ar programmas atkļūdošanas procesu, ko uzrakstījām “atmel studio” un virtuāli salikām ķēdi ar vienu LED “proteus”, pienāca laiks salikt ķēdi aparatūrā un mirgot mikrokontrolleri.

Lai programmētu prototipu ( atmega 8) izmantosim USBASP programmētāju. Tas izskatās šādi:

Savienotājam tiks pievienots kabelis, kurā ir pievienoti džemperi, kas savukārt tiks savienoti ar maizes paneļa ligzdām, uz kuras ir uzstādīts mikrokontrolleris:

Pirmā tapa uz savienotāja ir atzīmēta ar bultiņu.


Pēc tam, kad mēs izdomājām programmētāju. Pāriesim pie ķēdes montāžas aparatūrā. Mēs uzstādām mikrokontrolleri uz maizes dēļa. Atgādināšu, ka pirmais posms uz MK ir atzīmēts ar nelielu apli.

Uzdevums ir savienot programmētāja tapas ar “akmens” tapām.

Mēs savienojam džemperus ar 10 kontaktu savienotāju. Mēs izmantojam šādas tapas MOSI, RST, SCK, MISO, VTG (VCC), GND.

Es ceru, ka esat jau lejupielādējis datu lapu vietnē atmega8. Ja nē, varat to lejupielādēt. Mēs skatāmies uz mikrokontrollera tapu spraudni.

Mēs savienojam džemperus ar šādām tapām:

  • VCC uz MK 7. tapu;
  • SCK pie MK 19. tapas;
  • MISO uz MK 18. tapu;
  • MOSI uz MK 17. tapu;
  • GND (programmētāja tapa 10) uz MK 8. tapu;
  • RST līdz 1 MK tapai;

Turpmākai veiksmīgai darbībai operētājsistēma, pirmo reizi startējot shaitan mašīnu (programmētāju), piedāvās instalēt ierīces darbībai nepieciešamos draiverus.

Strādājot ar expediter, nevajadzētu rasties problēmām. Lejupielādēt. Izveidojiet mapi, kurā mēs izsaiņojam lejupielādēto arhīvu. Pēc tam aparatūras instalēšanas vednī mēs norādām ceļu uz mapi ar izspiesto draiveri.

Ja izmantojat operētājsistēmu Windows 7 vai jaunāku versiju, var rasties nelielas grūtības. Programmētāja draiveri ir diezgan veci, tāpēc viņiem nav Digitālais paraksts. Mēģinot instalēt šādu draiveri, operētājsistēma parādīs kaut ko līdzīgu šim *

“Vajadzīgais draiveru ciparparaksts no šīs ierīces. Plkst pēdējās izmaiņas aprīkojums vai programmatūra nepareizi parakstīts vai bojāts fails vai ļaunprogrammatūra nezināma izcelsme. (Kods 52)."

Lai labotu situāciju, jums ir jāatspējo draivera ciparparaksta pārbaude. Es neaprakstīšu, kā to atspējot (katram ir sava operētājsistēma), tos var atrast internetā.

Kad esat atspējojis paraksta verifikāciju, aparatūras instalēšanas vednī norādiet ceļu uz mapi, kurā ir izspiests draiveris.

Ceru, ka jums viss izdevās un programmētājs ir gatavs darbam.

Pāriesim pie ķēdes montāžas ar LED.

Lai mirgotu mikrokontrollera programmaparatūru, mēs izmantosim programmu “avrdudeprog”. Tas atrodas vispārējā arhīvā.

Mikrokontrolleru sarakstā atlasiet atmega8. Pēc MK izvēles parādīsies logs, kas informēs, ka drošinātājs un bloķēšanas biti ir iestatīti pēc noklusējuma.

Pēc tam atveriet cilni Drošinātāji. Vienkāršiem vārdiem sakot Drošinātāji ir MK konfigurācijas iestatījumi, ar kuriem vislabāk nav spēlēt. Gadījumā, ja iegādājāties tādu pašu kontrolieri kā es un jums nav ārējā kvarca rezonatora (jūs izmantojat iekšējo oscilatoru pulksteņa frekvence), atzīmējiet tieši tās pašas rūtiņas, kā parādīts attēlā. Blakus vienumam “apgrieztais” ir jābūt atzīmei.

Konfigurētie iestatījumi "pavēl" Atmega8A veikt savu darbu, ņemot vērā pulksteņa signālu no iekšējā oscilatora (pulksteņa frekvence 8 MHz). Lai iestatījumi stātos spēkā, jums jānoklikšķina uz pogas “Programmēšana”. Bet pirms nospiešanas vēlreiz pārbaudiet, vai viss ir pareizi iestatīts.

Atgriezieties lapā "Programma".

Kad mēs jau esam pateikuši programmai, kuru mikrokontrolleri mēs mirgosim, mēs atlasām programmaparatūras failu, kuru rakstījām pēdējā nodarbībā. Tam ir HEX paplašinājums. Atrodas mapē "Atkļūdošana".

Pirms “oļu” mirgošanas noklikšķiniet uz pogas “Dzēst visu”. Tas pasargās jūs no nesaprotamām kļūdām (ja nu akmens jau ir sašūts):

Baudam sava darba rezultātu :) Turpinājums...

Esmu ne reizi vai divas reizes teicis, ka studēt MK jāsāk ar montētāju. Tam tika veltīts vesels kurss mājaslapā (lai gan tas nav īpaši konsekventi, bet pamazām ķemmēju to līdz adekvātam izskatam). Jā, tas ir grūti, rezultāts nebūs pirmajā dienā, bet jūs iemācīsities saprast, kas notiek jūsu kontrolierī. Jūs zināt, kā tas darbojas, nevis kopēt citu cilvēku avotus kā mērkaķis un mēģināt saprast, kāpēc tas pēkšņi pārstāja darboties. Turklāt C ir daudz vieglāk izveidot redneck kodu, kas iznāks ar dakšiņu visnepiemērotākajā brīdī.

Diemžēl visi vēlas rezultātus nekavējoties. Tāpēc nolēmu iet citu ceļu - uztaisīt pamācību par C, bet ar viņa apakšveļas atrādīšanu. Labs iegulšanas programmētājs vienmēr cieši tur savu aparatūras daļu aiz skrūves, neļaujot tai spert nevienu soli bez atļaujas. Tātad vispirms būs C kods, tad tas, ko kompilators radīja un kā tas viss faktiski darbojas :)

No otras puses, Sji stiprā puseŠī ir koda pārnesamība. Ja, protams, visu uzrakstīsi pareizi. Darba algoritmu un to aparatūras implementāciju sadalīšana dažādās projekta daļās. Pēc tam, lai pārsūtītu algoritmu uz citu mikrokontrolleri, pietiks pārrakstīt tikai interfeisa slāni, kurā tiek ierakstīti visi izsaukumi uz aparatūru, un atstāt visu darba kodu kā ir. Un, protams, lasāmība. C pirmkods ir vieglāk saprotams no pirmā acu uzmetiena (lai gan... piemēram, man ir vienalga, uz ko norādīt - vai tas būtu C vai ASM :)), bet atkal, ja viss ir uzrakstīts pareizi. Es arī pievērsīšu uzmanību šiem punktiem.

Lauvas tiesa no visiem piemēriem būs mana kā testa paraugs, uz kura tiks uzstādīta lauvas tiesa no visiem piemēriem. attīstības padome.

Pirmā C programma AVR

Kompilatora izvēle un vides iestatīšana
AVR ir daudz dažādu C kompilatoru:
Vispirms tas IAR AVR C- gandrīz noteikti ir atzīts par labāko AVR kompilatoru, jo pats kontrolieris tika izveidots, cieši sadarbojoties Atmel un IAR speciālistiem. Bet par visu ir jāmaksā. Un šis kompilators ir ne tikai dārga komerciāla programmatūra, bet arī tam ir tik daudz iestatījumu, ka ir nepieciešams daudz pūļu, lai to vienkārši apkopotu tajā. Man tiešām ar viņu nebija izveidojušās draudzības; projekts sabruka dīvainu kļūdu dēļ saistīšanas posmā (vēlāk uzzināju, ka tā bija šķība plaisa).

Otrais nāk WinAVR GCC- spēcīgs optimizācijas kompilators. Pilnībā atvērtā koda, starpplatformu, kopumā visi dzīves prieki. Tas arī lieliski iekļaujas AVR studijaļaujot atkļūdot tieši tur, kas ir sasodīti ērti. Kopumā es to izvēlējos.

Ir arī CodeVision AVR C ir ļoti populārs kompilators. Tas kļuva populārs savas vienkāršības dēļ. Darba programma Jūs varat to iegūt tikai dažu minūšu laikā — sākuma koda vednis lieliski palīdz, štancējot standartus visu veidu uart inicializēšanai. Godīgi sakot, man tas ir diezgan aizdomīgs - reiz, kad man bija jāizjauc šī kompilatora rakstītā programma, tas izrādījās kaut kāds haoss, nevis kods. Briesmīgi daudz nevajadzīgu kustību un operāciju, kā rezultātā radās ievērojams koda daudzums un lēna veiktspēja. Tomēr, iespējams, bija kļūda tās personas DNS, kura uzrakstīja sākotnējo programmaparatūru. Turklāt viņš grib naudu. Ne tik daudz kā IAR, bet pamanāms. Un demonstrācijas režīmā tas ļauj rakstīt ne vairāk kā 2 kb koda.
Protams, ir plaisa, bet, ja jūs gatavojaties zagt, tas ir miljons IAR nozīmē :)

Ir arī Image Craft AVR C Un MicroC no mikroelektronikas. Man nevajadzēja izmantot nevienu, bet S.W.G.ļoti slavinoši MicroPascal, saka, šausmīgi ērta programmēšanas vide un bibliotēkas. Es domāju, ka MicroC nebūs sliktāks, bet tas ir arī apmaksāts.

Kā jau teicu, es izvēlējos WinAVR trīs iemeslu dēļ: tas ir bezmaksas, tas integrējas AVR Studio un ir paredzēts tam. gatavs kods visiem gadījumiem.

Tāpēc lejupielādējiet WinAVR instalāciju, izmantojot AVR Studio. Tālāk vispirms tiek instalēta studija, pēc tam WinAVR tiek uzvilkta virsū un pievienota studijai spraudņa veidā. Es ļoti iesaku instalēt WinAVR uz īsa ceļa, piemēram, C:\WinAVR, tādējādi jūs izvairīsities no daudzām problēmām ar ceļiem.

Projekta izveide
Tātad, studija ir uzstādīta, C ir ieskrūvēts, ir pienācis laiks mēģināt kaut ko ieprogrammēt. Sāksim ar vienkāršāko, vienkāršāko. Atveriet studiju, izvēlieties tur jauns projekts, kā AVR GCC kompilatoru un ievadiet projekta nosaukumu.

Tiek atvērts darba lauks ar tukšu *.c failu.

Tagad nenāks par ļaunu konfigurēt ceļu parādīšanu studijas grāmatzīmēs. Lai to izdarītu, dodieties uz:
Izvēlnes rīki - Opcijas - Vispārīgi - Failu cilnes un nolaižamajā sarakstā atlasiet "Tikai faila nosaukums". Pretējā gadījumā nebūs iespējams strādāt - cilnē būs pilns faila ceļš, un ekrānā būs ne vairāk kā divas vai trīs cilnes.

Projekta iestatīšana
Kopumā tiek uzskatīts, ka ir klasisks izveidot make failu, kurā ir aprakstītas visas atkarības. Un tas droši vien ir pareizi. Bet man, kas uzauga ar pilnībā integrētiem IDE, piemēram uVision vai AVR studijašī pieeja ir dziļi sveša. Tāpēc darīšu pēc sava prāta, visu izmantojot studijas līdzekļus.

Ieduriet pogu ar pārnesumu.


Šie ir jūsu projekta iestatījumi vai drīzāk iestatījumi make faila automātiskai ģenerēšanai. Pirmajā lapā jums vienkārši jāievada frekvence, kādā jūsu MK darbosies. Tas ir atkarīgs no drošinātāju bitiem, tāpēc mēs pieņemam, ka mūsu frekvence ir 8000000Hz.
Pievērsiet uzmanību arī optimizācijas līnijai. Tagad ir -Os - tā ir izmēru optimizācija. Pagaidām atstājiet to kā ir, tad varat mēģināt spēlēt ar šo parametru. -O0 nav optimizācijas vispār.

Nākamais solis ir ceļu konfigurēšana. Pirmkārt, pievienojiet tur savu projekta direktoriju - tur pievienosit trešo pušu bibliotēkas. Ceļš “.\” parādīsies sarakstā.

Make fails ir ģenerēts, varat to apskatīt sava projekta noklusējuma mapē, vienkārši ieskatieties un skatiet, kas tur ir.


Tas pagaidām ir viss. Visur noklikšķiniet uz Labi un dodieties uz avotu.

Problēmas formulēšana
Tukša papīra lapa vilina īstenot kādu viltīgu ideju, jo banāla diodes mirkšķināšana vairs nedarbojas. Tūlīt ņemsim vērsi pie ragiem un ieviesīsim savienojumu ar datoru – tas ir pirmais, ko daru.

Tas darbosies šādi:
Kad caur COM portu pienāk viens (kods 0x31), mēs ieslēgsim diodi, un, kad pienāk nulle (kods 0x30), tā izslēdzas. Turklāt viss tiks darīts ar pārtraukumiem, un fona uzdevums būs citas diodes mirgošana. Vienkārši un jēgpilni.

Ķēdes montāža
Mums ir jāpievieno USB-USART pārveidotāja modulis ar mikrokontrollera USART tapām. Lai to izdarītu, paņemiet džemperi no diviem vadiem un novietojiet to uz tapām šķērsām. Tas ir, mēs savienojam kontroliera Rx ar pārveidotāja Tx, bet pārveidotāja Tx - ar kontroliera Rx.

Galu galā šī ir diagramma:


Es neapsveru iespēju pievienot atlikušās tapas, barošanu vai atiestatīšanu, tas ir standarts.

Koda rakstīšana

Uzreiz atļaušos izdarīt atrunu, ka pašas C valodas aprakstā īpaši neiedziļināšos. Šim nolūkam ir vienkārši milzīgs daudzums materiālu, sākot no klasiskās “C programmēšanas valodas” no K&R līdz dažādām rokasgrāmatām.

Es atradu vienu šādu metodi savā krātuvē; reiz es to izmantoju, lai pētītu šo valodu. Tur viss ir īss, skaidrs un precīzs. Es to pakāpeniski salieku kopā un velku uz savu vietni.

Tiesa, visas nodaļas vēl nav pārsūtītas, bet domāju, ka tas nebūs ilgi.

Maz ticams, ka es to varēšu aprakstīt labāk, tāpēc no apmācības kurss, tā vietā, lai sniegtu detalizētu informāciju par niansēm, es vienkārši sniegšu tiešas saites uz atsevišķām šīs rokasgrāmatas lapām.

Bibliotēku pievienošana.
Pirmkārt, mēs pievienojam nepieciešamās bibliotēkas un galvenes ar definīcijām. Galu galā C ir universāla valoda, un mums viņam jāpaskaidro, ka mēs strādājam tieši ar AVR, tāpēc ierakstiet rindiņu avota kodā:

1 #iekļauts

#iekļauts

Šis fails atrodas mapē WinAVR un tajā ir visu kontroliera reģistru un portu apraksts. Turklāt viss tur ir viltīgs, ar piesaisti konkrētam kontrolierim, ko kompilators pārraida caur veidot fails parametrā MCU un pamatojoties uz šo mainīgo, jūsu projektam ir pievienots galvenes fails ar visu šī konkrētā kontrollera portu un reģistru adrešu aprakstu. Oho! Arī bez tā tas ir iespējams, taču tad nevarēsit izmantot simboliskus reģistru nosaukumus, piemēram, SREG vai UDR, un jums būs jāatceras katra adrese, piemēram, “0xC1”, kas būs galvassāpes.

Pati komanda #iekļauts<имя файла> ļauj projektam pievienot jebkāda veida saturu teksta fails, piemēram, fails ar funkciju aprakstu vai cita koda daļa. Un, lai direktīva varētu atrast šo failu, mēs norādījām ceļu uz mūsu projektu (WinAVR direktorijs jau ir reģistrēts tur pēc noklusējuma).

Galvenā funkcija.
C programma pilnībā sastāv no funkcijām. Tos var ligzdot un saukt vienu no otra jebkurā secībā un Dažādi ceļi. Katrai funkcijai ir trīs obligātie parametri:

  • Atgriešanas vērtība ir piem. grēks (x) atgriež x sinusa vērtību. Īsumā kā matemātikā.
  • Pārraidītie parametri ir tie paši X.
  • Funkciju korpuss.

Visām pārsūtītajām un atgrieztajām vērtībām ir jābūt noteikta veida atkarībā no datiem.

Jebkurā C programmā ir jābūt funkcijai galvenais kā ieejas punkts galvenajā programmā, pretējā gadījumā tas nemaz nav C :). Pēc galvenā klātbūtnes kāda cita avota kodā no miljons failiem, jūs varat saprast, ka šī ir galvenā programmas daļa, ar kuru viss sākas. Tātad jautāsim:

1 2 3 4 5 int main(void) (atgriež 0 ; )

int main(void) (atgriež 0; )

Tas viss, pirmkārt vienkāršākā programma rakstīts, nav svarīgi, ka tas neko nedara, mēs esam tikko sākuši.

Izdomāsim, ko mēs izdarījām.
starptŠis ir datu tips, ko atgriež galvenā funkcija.

Protams, mikrokontrollerī galvenais principā neko nevar atdot un teorētiski tam vajadzētu būt nederīgs galvenais (neesošs), bet GCC sākotnēji bija paredzēts personālajam datoram, un tur programma var atgriezt vērtību operētājsistēma pēc pabeigšanas. Tāpēc GCC ieslēgts nederīgs galvenais (neesošs) zvēr ar Brīdinājumu.

Tā nav kļūda, tā darbosies, bet man nepatīk brīdinājumi.

nederīgsŠis ir datu veids, ko mēs nododam funkcijai, šajā gadījumā galvenais arī nevar pieņemt neko no ārpuses, tāpēc nederīgs- manekens. Stubs tiek izmantots, ja nekas nav jāpārraida vai jāatgriež.

Šeit tie ir { } cirtaini breketes ir programmas bloks, šajā gadījumā funkcijas pamatteksts galvenais, kods atradīsies tur.

atgriezties- šī ir atgriešanas vērtība, ko galvenā funkcija atgriezīs pēc pabeigšanas, jo mums ir int, tas ir, skaitlis, tad mums ir jāatgriež skaitlis. Lai gan tam joprojām nav jēgas, jo... uz mikrokontrollera, mēs varam tikai nekur no galvenā. Es atgriežu nulli. Jo tas nav svarīgi. Bet kompilators parasti ir gudrs un šim gadījumam kodu neģenerē.
Lai gan, ja perverss, tad no galvenais Varat doties uz MK - piemēram, iekļūt sāknēšanas ielādes sadaļā un izpildīt to, taču, lai labotu pārejas adreses, būs nepieciešama zema līmeņa programmatūra programmaparatūras darbība. Tālāk jūs redzēsiet pats un sapratīsit, kā to izdarīt. Par ko? Tas ir cits jautājums, 99.999% gadījumu tas nav nepieciešams :)

Mēs to izdarījām un devāmies tālāk. Pievienosim mainīgo, mums tas nav īsti vajadzīgs un bez tā nav jēgas ieviest mainīgos, bet mēs mācāmies. Ja funkcijas pamattekstā tiek pievienoti mainīgie, tie ir lokāli un pastāv tikai šajā funkcijā. Izejot no funkcijas, šie mainīgie tiek dzēsti un RAM atmiņa tiek piešķirta svarīgākām vajadzībām. .

1 2 3 4 5 6 int main(void) (neparakstīts char i; return 0;)

int main(void) ( neparakstīts char i; return 0; )

neparakstīts nozīmē neparakstīts. Fakts ir tāds, ka binārajā attēlojumā zīmei tiek piešķirts visnozīmīgākais bits, kas nozīmē, ka skaitlis +127/-128 iekļaujas vienā baitā (char), bet, ja zīmi atmet, tas ietilps no 0 līdz 255. Parasti zīmi nevajag. Tātad neparakstīts.
i ir tikai mainīgais nosaukums. Vairāk ne.

Tagad mums ir jāinicializē porti un UART. Protams, jūs varat paņemt un savienot bibliotēku un izsaukt kaut kādu UartInit(9600); bet tad tu nezināsi, kas īsti notika.

Mēs to darām:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void ) ( unsigned char i; #define XTAL 8000000L #define baudrate 9600L #define bodu dalītāju (XTAL/(16*baudrate)-1)#define HI(x) ((x)>>8) #define LO(x) ((x)& 0xFF) UBRRL = LO(bauddalītājs) ; UBRRH = HI(bauddalītājs) ; UCSRA = 0; UCSRB = 1<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main(void) ( unsigned char i; #define XTAL 8000000L #define bodrate 9600L #define boddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO (bauddalītājs); UBRRH = HI (bauddalītājs); UCSRA = 0; UCSRB = 1<

Baisi? Faktiski ir tikai piecas pēdējās reālā koda rindas. Viss, tas #definēt tā ir priekšprocesora makro valoda. Gandrīz tādas pašas lietas kā Assembly, taču sintakse nedaudz atšķiras.

Tie atvieglos jūsu ikdienas nepieciešamo koeficientu aprēķināšanas operācijas. Pirmajā rindā mēs to sakām XTAL jūs varat droši aizstāt 8000000, un L- tipa norāde, sakot, ka garš ir procesora takts frekvence. Tas pats pārraides ātrumu— datu pārraides biežums, izmantojot UART.

bodu dalītājs jau sarežģītāk, tā vietā tiks aizstāta izteiksme, kas aprēķināta pēc formulas no divām iepriekšējām.
Nu un L.O. Un SVEIKI no šī rezultāta tiks ņemti zemie un augstie baiti, jo Acīmredzot tas var neietilpst vienā baitā. IN SVEIKI X (makro ievades parametrs) tiek pārvietots astoņas reizes pa labi, kā rezultātā paliek tikai nozīmīgākais baits. Un iekšā L.O. mēs veicam bitu UN ar numuru 00FF, kā rezultātā paliks tikai zemais baits.

Tātad viss, kas izdarīts, ir kā #definēt jūs varat to droši izmest un aprēķināt nepieciešamos skaitļus kalkulatorā un nekavējoties ievadīt tos rindās UBBRL = …. un UBBRH = .....

Var. Bet! Dari šo PILNĪGI NEIESPĒJAMI!

Darbosies tā vai tā, bet tev būs t.s burvju skaitļi- vērtības, kas ņemtas no nekurienes un nezināmu iemeslu dēļ, un, ja jūs atverat šādu projektu pēc pāris gadiem, būs sasodīti grūti saprast, kas tās ir. Arī tagad, ja vēlaties mainīt ātrumu vai mainīt kvarca frekvenci, viss būs jāpārrēķina vēlreiz, bet jūs nomainījāt pāris ciparus kodā un viss. Kopumā, ja nevēlaties tikt apzīmēts kā kodētājs, izveidojiet savu kodu tā, lai tas būtu viegli lasāms, saprotams un viegli modificējams.

Tad viss ir vienkārši:
Visi šie “UBRRL un Co” ir UART raidītāja konfigurācijas reģistri, ar kuru palīdzību mēs sazināsimies ar pasauli. Un tagad mēs esam piešķīruši tiem vajadzīgās vērtības, iestatot tos vajadzīgajā ātrumā un režīmā.

Ieraksta veids 1< Nozīmē sekojošo: paņemiet 1 un ievietojiet to vietā RXEN baitā. RXENšis ir reģistra 4. bits UCSRB, Tātad 1< veido bināro skaitli 00010000, TXEN- šis ir 3. bits un 1< dos 00001000. Single "|" tas ir bitiski VAI, tātad 00010000 | 00001000 = 00011000. Tādā pašā veidā atlikušie nepieciešamie konfigurācijas biti tiek iestatīti un pievienoti vispārējai kaudzei. Rezultātā savāktais numurs tiek reģistrēts UCSRB. Sīkāka informācija ir aprakstīta MK datu lapā USART sadaļā. Tāpēc nenovērsīsim uzmanību no tehniskām detaļām.

Gatavs, laiks redzēt, kas noticis. Noklikšķiniet uz kompilācijas un sāciet emulāciju (Ctrl+F7).

Atkļūdošana
Cauri skrēja visādas progresa joslas, mainījās studija un pie galvenās funkcijas ieejas parādījās dzeltena bultiņa. Šeit pašlaik darbojas procesors, un simulācija ir apturēta.

Fakts ir tāds, ka sākotnēji tas bija rindā UBRRL = LO (bauddalītājs); Galu galā tas, kas mums ir definē, nav kods, bet vienkārši provizoriski aprēķini, tāpēc simulators ir nedaudz blāvs. Bet tagad viņš saprata, pirmā instrukcija ir izpildīta un ja jūs kāpt kokā I/O skats, uz USART sadaļu un paskatieties uz UBBRL baitu tur, redzēsiet, ka vērtība jau ir! 0x33.

Sniedziet to vienu soli tālāk. Skatiet, kā mainās otra reģistra saturs. Tāpēc apskatiet tos visus, pievērsiet uzmanību tam, ka visi norādītie biti ir iestatīti tā, kā es jums teicu, un tie tiek iestatīti vienlaikus visam baitam. Tas netiks tālāk par Atgriešanos - programma ir beigusies.

Atvēršana
Tagad atiestatiet simulāciju uz nulli. Noklikšķiniet tur Atiestatīt (Shift+F5). Atveriet izjaukto sarakstu, tagad redzēsit, kas patiesībā notiek kontrollerī. Skatīt -> Demontētājs. Un ne YYAAAAAA!!! Montētājs!!! ŠAUSMAS!!! UN TAS IR VAJAG. Lai vēlāk, kad kaut kas noiet greizi, tu nebūtu stulbs kodā un neuzdotu lamu jautājumus forumos, bet uzreiz iedziļinātos un redzētu, kur esi iestrēdzis. Tur nav nekā biedējoša.

Vispirms būs topi no sērijas:

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 Lēciens +00000002: 940C0034 JMP 0x00000034 Pārlēciens +00000004: 940C0034 JMP 0x000MP00603400MP0603 0x00000034 lēciens +00000008: 940C0034 JMP 0x00000034 lēciens +0000000A: 940C0034 JMP 0x00000034 lēciens +0000000C: 9400000C: 940 JMP000x 0000000E: 940C0034 JMP 0x00000034 Pārlēkt +00000010: 940C0034 JMP 0x00000034 Pārlēkt +00000012: 940C0034 JMP 0x000mp00C40:03400mp001403 0x00000034 lēciens +00000016: 940C0034 JMP 0x00000034 lēciens +00000018: 940C0034 JMP 0x00000034 lēciens +0000001A: Jump : 940C0034 JMP 0x00000034 Pārlēkt +0000001E: 940C0034 JMP 0x00000034 Pārlēkt +00000020: 940C0034 JMP 0x00000034 Pārlēkt 0x00000034 Pārlēkt 34 Lēciens +00000024: 940C0034 JMP 0x00000034 Lēciens +00000026: 940C0034 JMP 0x00000034 Lēciens +00000028: 940C0034 JMP 0x304

00000000: 940C002A JMP 0x0000002A Lēciens +00000002: 940C0034 JMP 0x00000034 Pārlēciens +00000004: 940C0034 JMP 0x000MP0060340000C40 0x00000034 Pārlēkt +00000008: 940C0034 JMP 0x00000034 Pārlēkt +0000000A: 940C0034 JMP 0x00000034 Pārlēkt +0000000C: Jump +0000000C: Jump : 940C0034 JMP 0x00000034 Pārlēkt +00000010: 940C0034 JMP 0x00000034 Pārlēkt +00000012: 940C0034 JMP 0x00000034 Pārlēkt +00000034 JMP 34 Lēciens +00000016: 940C0034 JMP 0x00000034 Lēciens +00000018: 940C0034 JMP 0x00000034 Lēciens +0000001A: 940C0034 JMP 0x0300 JMP 0x00300 : 940C0034 JMP 0x00000034 Pārlēkt +0000001E: 940C0034 JMP 0x00000034 Pārlēkt +00000020: 940C0034 JMP 0x00000034 Pārlēkt 0x00000034 Pārlēkt 34 Lēciens +00000024: 940C0034 JMP 0x00000034 Lēciens +00000026: 940C0034 JMP 0x00000034 Lēciens +00000028: 940C0034 JMP 0x304

Šī ir pārtraukumu vektoru tabula. Mēs pie tā atgriezīsimies vēlāk, bet pagaidām vienkārši paskatieties un atcerieties, ka tā pastāv. Pirmā kolonna ir zibatmiņas šūnas adrese, kurā atrodas komanda, otrā ir komandas kods, trešā ir komandas mnemonika, tā pati montāžas instrukcija, trešā ir komandas operandi. Nu automātiskais komentārs.
Tātad, ja paskatās, ir nepārtrauktas pārejas. Un JMP komandas kods ir četri baiti, tajā ir lēciena adrese, kas rakstīta atpakaļ - zemais baits zemajā adresē un lēciena komandas kods 940C

0000002B: BE1F OUT 0x3F, R1 Out uz I/O atrašanās vietu

Šīs nulles ierakstīšana adresē 0x3F. Ja paskatās uz I/O skata kolonnu, jūs redzēsit, ka adrese 0x3F ir SREG reģistra adrese - kontrollera karoga reģistrs. Tie. mēs atiestatām SREG, lai programmu palaistu nulles apstākļos.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Tūlītēja ielāde +0000002D: E0D4 LDI R29,0x04 Tūlītēja ielāde +0000002E: BFDE OUT 0x3E,R29 Izeja uz I/O atrašanās vietu +0000002F: BFCD uz I/O atrašanās vieta

0000002C: E5CF LDI R28,0x5F Tūlītēja ielāde +0000002D: E0D4 LDI R29,0x04 Tūlītēja ielāde +0000002E: BFDE OUT 0x3E,R29 Izeja uz I/O atrašanās vietu +0000002F: BFCD uz I/O atrašanās vieta

Tiek ielādēts steka rādītājs. Jūs nevarat tieši ielādēt I/O reģistros, tikai caur starpreģistru. Tāpēc vispirms LDI uz starpproduktu un pēc tam OUT uz I/O. Vēlāk arī pastāstīšu vairāk par steku. Pagaidām ziniet, ka šī ir dinamiska atmiņas apgabals, kas karājas RAM beigās un saglabā adreses un starpposma mainīgos. Tagad mēs esam norādījuši, no kurienes sāksies mūsu kaudze.

00000032: 940C0041 JMP 0x00000041 Pārlēkt

Pārejiet uz pašām programmas beigām, un tur ir aizliegts pārtraukt un cieši cilpot sevi:

1 2 +00000041: 94F8 CLI globālā pārtraukuma atspējošana +00000042: CFFF RJMP PC-0x0000 Relatīvais lēciens

00000041: 94F8 CLI globālā pārtraukuma atspējošana +00000042: CFFF RJMP PC-0x0000 Relatīvais lēciens

Tas notiek neparedzētu apstākļu gadījumā, piemēram, aizejot no galvenās funkcijas. Kontrolieri var izņemt no šādas cilpas, veicot aparatūras atiestatīšanu vai, visticamāk, atiestatot no sargsuņa. Nu, vai, kā jau teicu iepriekš, izlabojiet to hex redaktorā un dodieties uz turieni, kur vien mūsu sirds vēlas. Ņemiet vērā arī to, ka ir divu veidu pārejas: JMP un RJMP; pirmā ir tieša pāreja uz adresi. Tas aizņem četrus baitus un var tieši pāriet pa visu atmiņas apgabalu. Otrs pārejas veids ir RJMP – relatīvs. Viņa komanda aizņem divus baitus, bet viņš pārvietojas no pašreizējās pozīcijas (adreses) 1024 soļus uz priekšu vai atpakaļ. Un tā parametri norāda nobīdi no pašreizējā punkta. To lieto biežāk, jo vienā līmenī aizņem pusi vietas, un reti ir vajadzīgas garas pārejas.

1 +00000034: 940C0000 JMP 0x00000000 lēciens

00000034: 940C0000 JMP 0x00000000 Pārlēkt

Un tas ir lēciens uz koda sākumu. Sava veida atsāknēšana. Šeit varat pārbaudīt, vai visi vektori pārlec. Secinājums no tā ir tāds, ka, ja jūs tagad iespējojat pārtraukumus (pēc noklusējuma tie ir atspējoti) un jūsu pārtraukums notiek, bet nav apstrādātāja, tad notiks programmatūras atiestatīšana - programma tiks atgriezta pašā sākumā.

Galvenā funkcija. Viss ir līdzīgi, pat nevajag to aprakstīt. Paskatieties, kā jau aprēķinātais skaitlis tiek ievadīts reģistros. Kompilatora priekšprocesors satriec!!! Tātad bez "maģiskiem" skaitļiem!

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

00000036: E383 LDI R24,0x33 Tūlītēja ielāde +00000037: B989 OUT 0x09,R24 Out uz I/O vietu 15: UBRRH = HI (bauddalītājs); +00000038: BC10 OUT 0x20,R1 Out uz I/O vietu 16: UCSRA = 0; +00000039: B81B OUT 0x0B,R1 Out uz I/O vietu 17: UCSRB = 1<

Un šeit ir kļūda:

1 2 3 +0000003E: E080 LDI R24.0x00 Tūlītēja ielāde +0000003F: E090 LDI R25.0x00 Tūlītēja ielāde +00000040: 9508 RET Apakšprogrammas atgriešana

0000003E: E080 LDI R24.0x00 Tūlītēja ielāde +0000003F: E090 LDI R25.0x00 Tūlītēja ielāde +00000040: 9508 RET Apakšprogrammas atgriešana

Jautājums, kāpēc kompilators pievieno tādus topus? Un tas nav nekas vairāk kā Return 0, funkciju definējām kā int main(void) un tā mēs velti iztērējām vēl četrus baitus :) Un ja uztaisīsi void main(void) tad paliks tikai RET, bet parādīsies brīdinājums , ka mūsu galvenā funkcija neko neatgriež. Vispār dari kā gribi :)

Grūti? Acīmredzot nē. Noklikšķiniet uz soli pa solim izpilde disassembler režīmā un skatiet, kā procesors izpilda atsevišķas instrukcijas, kas notiek ar reģistriem. Kā notiek kustība caur komandām un galīgā cilpa?

Turpinājums pēc pāris dienām...

Ārpus augšpusē:
Aleksejs78 Es izveidoju Firefox spraudni, kas atvieglo navigāciju manā vietnē un forumā.
Diskusija un lejupielāde,

Uzdevums: Izstrādāsim programmu vienas gaismas diodes vadīšanai. Nospiežot pogu, iedegas gaismas diode, un, atlaižot, tā nodziest.

Vispirms izstrādāsim ierīces shematisku diagrammu. I/O porti tiek izmantoti, lai mikrokontrolleram pievienotu jebkādas ārējās ierīces. Katrs no portiem var darboties gan kā ievade, gan izvade. Savienosim LED ar vienu no pieslēgvietām un pogu ar otru. Šim eksperimentam mēs izmantosim kontrolieri Atmega8. Šajā mikroshēmā ir 3 I/O porti, tai ir 2 astoņu bitu un 1 sešpadsmit bitu taimeris/skaitītājs. Uz kuģa ir arī 3 kanālu PWM, 6 kanālu 10 bitu analogo-digitālo pārveidotājs un daudz kas cits. Manuprāt, mikrokontrolleris lieliski noder programmēšanas pamatu apguvei.

Lai savienotu LED, mēs izmantosim līniju PB0, un, lai nolasītu informāciju no pogas, mēs izmantosim līniju PD0. Diagramma parādīta 1. att.

Rīsi. 1

Caur rezistoru R2 plus barošanas spriegums tiek piegādāts ieejai PD0, kas atbilst loģiskam signālam. Kad poga ir aizvērta, spriegums nokrītas līdz nullei, kas atbilst loģiskai nullei. Nākotnē R2 var izslēgt no ķēdes, aizstājot to ar iekšējo slodzes rezistoru, ievadot programmā nepieciešamos iestatījumus. Gaismas diode ir savienota ar porta PB0 izeju caur strāvu ierobežojošo rezistoru R3. Lai iedegtu LED, jums jāpieliek loģisks viens signāls PB0 līnijai. Mēs izmantosim iekšējo galveno pulksteņa ģeneratoru pie 4 MHz, jo ierīcei nav augstas prasības attiecībā uz frekvences stabilitāti.

Tagad mēs rakstām programmu. Programmēšanas vidi izmantoju programmu rakstīšanai AVR studija Un WinAvr. Atveriet AVR Studio, uznirst sveiciena logs, noklikšķiniet uz pogas "Izveidot jaunu projektu", pēc tam atlasiet projekta veidu - AVR GCC, ierakstiet projekta nosaukumu, piemēram, "cod1", atzīmējiet gan "Izveidot projekta mapi" un "Izveidot". inicializācijas fails" izvēles rūtiņas , noklikšķiniet uz pogas "Tālāk", kreisajā logā atlasiet "AVR Simulator" un labajā logā ierakstiet mikrokontrolleri "Atmega8", noklikšķiniet uz pogas "Pabeigt", tiek atvērts redaktors un projekta kategoriju koks - sākotnējie iestatījumi ir pabeigti.

Vispirms pievienosim standarta apraksta tekstu Atmega8, izmantojot operatoru ārējo failu pievienošanai: #iekļauts

direktīvas sintakse #iekļauts

#iekļauts<имя_файла.h>
#include “faila nosaukums.h”

Leņķa kronšteini< и >norādiet kompilatoram, ka iekļautie faili vispirms ir jāmeklē standarta WinAvr mapē ar nosaukumu include. Dubultās pēdiņas “ un “ liek kompilatoram sākt meklēšanu direktorijā, kurā tiek glabāts projekts.

Katram mikrokontrollera veidam ir savs galvenes fails. ATMega8 šī faila nosaukums ir iom8.h, ATtiny2313 — iotn2313.h. Katras programmas sākumā mums ir jāiekļauj mūsu izmantotā mikrokontrollera galvenes fails. Bet ir arī kopīgs galvenes fails io.h. Priekšapstrādātājs apstrādā šo failu un, atkarībā no projekta iestatījumiem, iekļauj mūsu programmā nepieciešamo galvenes failu.

Mums pirmā programmas rinda izskatīsies šādi:

#iekļauts

Jebkurā C programmā ir jābūt vienai galvenajai funkcijai. To sauc par galveno. Programmas izpilde vienmēr sākas ar galvenās funkcijas izpildi. Funkcijai ir galvene — int main(void) un pamatteksts — to norobežo cirtaini iekavas ().

int galvenais (neesošs)
{
funkcionējošais ķermenis
}

Mēs pievienosim savu kodu funkcijas pamattekstam. Atgriešanas veids ir norādīts pirms funkcijas nosaukuma. Ja funkcija neatgriež vērtību, tiek izmantota atslēga nederīgs.

starpt- tas ir 2 baitu vesels skaitlis, vērtību diapazons ir no - 32768 līdz 32767

Pēc funkcijas nosaukuma parametri, kas tiek nodoti funkcijai, kad tā tiek izsaukta, ir norādīti iekavās (). Ja funkcijai nav parametru, tiek izmantots atslēgvārds nederīgs. Funkcija galvenais satur komandu kopu, sistēmas iestatījumus un galveno programmas cilpu.

Tālāk mēs konfigurējam portu D pie ieejas. Ostas darbības režīmu nosaka reģistra saturs DDRD(informācijas nodošanas virzienu reģistrs). Šajā reģistrā mēs ierakstām skaitli "0x00" (0b0000000 - binārā formā); šim portam nav pievienots nekas, izņemot pogu, tāpēc mēs konfigurējam visu portu D kā ievadi. Portu var konfigurēt pa bitiem, katrā reģistra bitā ierakstot skaitļus 0 vai 1 (0-ieeja, 1-izeja), piemēram, DDRD = 0x81 (0b10000001) - porta D pirmā un pēdējā rinda darbojas kā izvade, pārējais kā ievade. Jāpievieno arī iekšējais slodzes rezistors. PORTx reģistrs kontrolē, vai iekšējie rezistori tiek ieslēgti vai izslēgti, kad ports ir ievades režīmā. Tur rakstīsim vienības.

Ostas iestatīšana B uz izeju. Ostas darbības režīmu nosaka reģistra saturs DDRB. Nekas cits kā LED uz portu B nav pievienots, tāpēc visu portu var konfigurēt kā izvadi. Tas tiek darīts, rakstot uz reģistru DDRB cipari "0xFF". Lai gaismas diode neiedegtos, kad pirmo reizi to ieslēdzat, rakstiet uz portu B loģiskās nulles. Tas tiek darīts, ierakstot PORTB= 0x00;

Lai piešķirtu vērtības, tiek izmantots simbols "=", un to sauc par piešķiršanas operatoru, ko nedrīkst sajaukt ar "vienādības" zīmi.

Porta konfigurācija izskatīsies šādi:

DDRD = 0x00;
PORTD = 0xFF;
DDRB = 0xFF;
PORTB = 0x00;

Mēs rakstām programmas galveno cilpu. kamēr(“while” no angļu valodas) - šī komanda organizē cilpu, daudzas reizes atkārtojot cilpas pamattekstu, līdz nosacījums ir izpildīts, tas ir, kamēr iekavās esošā izteiksme ir patiesa. Programmā C izteiksme tiek uzskatīta par patiesu, ja tā nav vienāda ar nulli, un par nepatiesu, ja tā ir.

Komanda izskatās šādi:

kamēr (stāvoklis)
{
cilpas korpuss
}

Mūsu gadījumā galvenā cilpa sastāvēs tikai no vienas komandas. Šī komanda piešķir reģistru PORTB reģistra vērtība, kas jāapgriež PORTD.

PORTB = ~PIND; //paņemiet vērtību no porta D, apgrieziet to un piešķiriet to PORTB (rakstiet uz PORTB)

// C izteiksmes tiek lasītas no labās uz kreiso pusi

PIND informācijas ievades reģistrs. Lai nolasītu informāciju no kontrollera ārējās izejas, vispirms ir jāpārslēdz vēlamais porta bits ievades režīmā. Tas ir, rakstiet uz atbilstošo reģistra bitu DDRx nulle. Tikai pēc tam uz šo kontaktu var piegādāt digitālo signālu no ārējās ierīces. Pēc tam mikrokontrolleris nolasīs baitu no reģistra PINx. Atbilstošā bita saturs atbilst signālam uz porta ārējās tapas. Mūsu programma ir gatava un izskatās šādi:

#iekļauts int main (void) ( DDRD = 0x00; //ports D - ieeja PORTD = 0xFF; //pievienojiet slodzes rezistoru DDRB = 0xFF; //ports B - izeja PORTB = 0x00; //iestatiet izvadi uz 0 while(1 ) ( PORTB = ~PIND; //~ bitu inversijas zīme ) )

Komentāri tiek plaši izmantoti C valodā. Ir divi rakstīšanas veidi.

/*Komentārs*/
//Komentārs

Šajā gadījumā sastādītājs nepievērsīs uzmanību komentārā rakstītajam.

Ja izmantojat to pašu programmu un mikrokontrolleram pievienojat 8 pogas un 8 gaismas diodes, kā parādīts 2. attēlā, tad būs skaidrs, ka katrs porta bits D atbilst tā porta bitam B. Nospiežot pogu SB1, iedegas HL1, nospiežot pogu SB2, iedegas HL2 utt.

2. attēls

Rakstā izmantoti materiāli no A.V.Belova grāmatas. "Pamācība AVR ierīču izstrādātājiem"

Atmega8 mikrokontrolleri ir populārākie savas ģimenes pārstāvji. Daudzējādā ziņā viņi to ir parādā, no vienas puses, darbības vienkāršībai un saprotamai struktūrai, un, no otras puses, diezgan plašajai funkcionalitātei. Šajā rakstā tiks apskatīta Atmega8 programmēšana iesācējiem.

Galvenā informācija

Mikrokontrolleri ir visur. Tos var atrast ledusskapjos, veļasmašīnās, tālruņos, rūpnīcas iekārtās un ļoti daudzās citās tehniskajās ierīcēs. Mikrokontrolleri ir no vienkāršiem līdz ārkārtīgi sarežģītiem. Pēdējie piedāvā ievērojami vairāk funkciju un funkcionalitātes. Bet jūs nevarēsit saprast sarežģītas tehnoloģijas uzreiz. Sākumā jums ir jāapgūst kaut kas vienkāršs. Un Atmega8 tiks ņemts par paraugu. Programmēšana tajā nav grūta, pateicoties tās kompetentajai arhitektūrai un draudzīgajam interfeisam. Turklāt tam ir pietiekama veiktspēja, lai to izmantotu lielākajā daļā, turklāt tos izmanto pat rūpniecībā. Atmega8 gadījumā programmēšanai ir nepieciešamas tādas valodas kā AVR (C/Assembler). Kur sākt? Šīs tehnoloģijas apgūšana ir iespējama trīs veidos. Un katrs pats izvēlas, kur sākt strādāt ar Atmega8:

  1. Programmēšana caur Arduino.
  2. Gatavās ierīces iegāde.
  3. Mikrokontrollera pašmontāža.

Mēs apsvērsim pirmo un trešo punktu.

Arduino

Šī ir ērta platforma, kas izstrādāta formā, kas piemērota dažādu ierīču ātrai izveidošanai. Platē jau ir viss nepieciešamais paša mikrokontrollera, tā instalācijas un programmētāja veidā. Ejot šo ceļu, persona saņems šādas priekšrocības:

  1. Zema sliekšņa prasības. Lai izstrādātu tehniskās ierīces, nav jābūt īpašām prasmēm.
  2. Savienošanai bez papildu sagatavošanas būs pieejams plašs elementu klāsts.
  3. Ātrs attīstības sākums. Izmantojot Arduino, varat uzreiz sākt ierīču izveidi.
  4. Pieejams liels skaits mācību materiālu un dažādu dizainu realizācijas piemēru.

Bet ir arī daži trūkumi. Tādējādi Arduino programmēšana Atmega8 neļauj dziļāk ienirt mikrokontrollera pasaulē un izprast daudzus noderīgus aspektus. Turklāt jums būs jāapgūst programmēšanas valoda, kas atšķiras no AVR (C/Assembler) lietotajām. Un vēl viena lieta: Arduino ir diezgan šaurs modeļu klāsts. Tāpēc agri vai vēlu radīsies nepieciešamība izmantot mikrokontrolleri, ko dēļos neizmanto. Bet kopumā šī ir laba iespēja darbam ar Atmega8. Programmēšana, izmantojot Arduino, dos jums pārliecinošu sākumu elektronikas pasaulē. Un diez vai cilvēks padosies neveiksmju un problēmu dēļ.

Pašmontāža

Pateicoties draudzīgajam dizainam, jūs varat tos izgatavot pats. Galu galā tas prasa lētas, pieejamas un vienkāršas sastāvdaļas. Tas ļaus kārtīgi izpētīt Atmega8 mikrokontrollera dizainu, kura programmēšana pēc salikšanas šķitīs vienkāršāka. Tāpat, ja nepieciešams, jūs varat patstāvīgi izvēlēties citus komponentus konkrētam uzdevumam. Tiesa, šeit ir zināms trūkums - sarežģītība. Nav viegli patstāvīgi salikt mikrokontrolleri, ja nav nepieciešamo zināšanu un prasmju. Mēs apsvērsim šo iespēju.

Kas nepieciešams montāžai?

Vispirms jums jāiegūst pats Atmega8. Mikrokontrolleri programmēt bez tā, jūs zināt, nav iespējams. Tas maksās vairākus simtus rubļu - vienlaikus nodrošinot pienācīgu funkcionalitāti. Ir arī jautājums par to, kā tiks ieprogrammēts Atmega8. USBAsp ir diezgan laba ierīce, kas ir sevi pierādījusi kā ļoti labu. Bet jūs varat izmantot kādu citu programmētāju. Vai arī salieciet to pats. Bet šajā gadījumā pastāv risks, ka, ja tas ir izveidots slikti, tas pārvērtīs mikrokontrolleri par nefunkcionālu plastmasas un dzelzs gabalu. Nenāktu par ļaunu arī maizes dēlis un džemperi. Tie nav nepieciešami, taču ietaupīs jūsu nervus un laiku. Visbeidzot, jums ir nepieciešams 5 V barošanas avots.

Atmega8 programmēšana iesācējiem, izmantojot piemēru

Apskatīsim, kā vispārēji tiek izveidota ierīce. Tātad, pieņemsim, ka mums ir mikrokontrolleris, gaismas diode, rezistors, programmētājs, savienojošie vadi un barošanas avots. Pirmais solis ir programmaparatūras rakstīšana. Tas tiek saprasts kā mikrokontrollera komandu kopums, kas tiek pasniegts kā galīgais fails īpašā formātā. Ir nepieciešams norādīt visu elementu savienojumu, kā arī mijiedarbību ar tiem. Pēc tam jūs varat sākt ķēdes montāžu. VCC tapai jābūt darbinātai. Jebkuram citam, kas paredzēts darbam ar ierīcēm un elementiem, vispirms ir pievienots rezistors un pēc tam gaismas diode. Šajā gadījumā pirmā jauda ir atkarīga no otrās jaudas prasībām. Varat izmantot šādu formulu: R=(Up-Ups)/Is. Šeit p ir jauda un s ir LED. Iedomāsimies, ka mums ir gaismas diode, kas patērē 2V un prasa 10 mA barošanas strāvu, pārveidosim to matemātiskām darbībām ērtākā formā un iegūstam 0,01A. Tad formula izskatīsies šādi: R=(5V-2V)/0.01A=3V/0.01A=300 Ohm. Bet praksē bieži vien nav iespējams izvēlēties ideālo elementu. Tāpēc tiek ņemts vispiemērotākais. Bet jums ir jāizmanto rezistors, kura pretestība ir lielāka par matemātiski iegūto vērtību. Pateicoties šai pieejai, mēs pagarināsim tā kalpošanas laiku.

Ko tālāk?

Tātad mums ir neliela diagramma. Tagad atliek tikai savienot programmētāju ar mikrokontrolleru un ierakstīt tā atmiņā izveidoto programmaparatūru. Šeit ir viens punkts! Veidojot ķēdi, ir jāizveido tā, lai mikrokontrolleri varētu zibināt bez atlodēšanas. Tas ietaupīs laiku, nervus un pagarinās elementu kalpošanas laiku. Ieskaitot Atmega8. Jāpiebilst, ka programmēšana ķēdē prasa zināšanas un prasmes. Bet tas arī ļauj jums izveidot sarežģītākus dizainus. Galu galā bieži gadās, ka atlodēšanas laikā elementi tiek bojāti. Pēc tam diagramma ir gatava. Var pielikt spriegumu.

Svarīgi punkti

Iesācējiem vēlos sniegt noderīgus padomus par Atmega8 programmēšanu. Nemainiet iebūvētos mainīgos un funkcijas! Ierīci ieteicams mirgot ar izveidoto programmu pēc tam, kad ir pārbaudīts, vai tajā nav “mūžīgo cilpu”, kas bloķēs jebkādus citus traucējumus, un izmantojot labu raidītāju. Ja šajos nolūkos izmantojat paštaisītu produktu, jums jābūt garīgi sagatavotam mikrokontrollera neveiksmei. Kad mirgojat ierīci, izmantojot programmētāju, jums jāpievieno atbilstošās izejas VCC, GND, SCK, MOSI, RESET, MISO. Un nepārkāpjiet drošības pasākumus! Ja tehniskajās specifikācijās ir noteikts, ka barošanas avotam jābūt 5 V, tad jums ir jāievēro tieši šis spriegums. Pat 6V elementu izmantošana var negatīvi ietekmēt mikrokontrollera veiktspēju un saīsināt tā kalpošanas laiku. Protams, 5V baterijām ir zināmas atšķirības, taču, kā likums, viss ir saprātīgās robežās. Piemēram, maksimālais spriegums tiks saglabāts 5,3 V.

Apmācība un prasmju pilnveide

Par laimi, Atmega8 ir ļoti populārs mikrokontrolleris. Tāpēc atrast domubiedrus vai vienkārši zinošus un prasmīgus cilvēkus nebūs grūti. Ja nevēlaties izgudrot riteni no jauna, bet vienkārši vēlaties atrisināt noteiktu problēmu, varat meklēt nepieciešamo shēmu plašajā globālajā tīmeklī. Starp citu, neliels mājiens: lai gan robotika ir diezgan populāra krievvalodīgo segmentā, ja atbildes nav, tad tā jāmeklē angliski runājošo segmentā – tajā ir par kārtu vairāk informācijas. Ja ir zināmas šaubas par esošo ieteikumu kvalitāti, tad var meklēt grāmatas, kurās tiek runāts par Atmega8. Par laimi, ražošanas uzņēmums ņem vērā savu izstrādņu popularitāti un apgādā tos ar specializētu literatūru, kur pieredzējuši cilvēki stāsta, kas un kā, kā arī sniedz piemērus, kā ierīce darbojas.

Vai ir grūti sākt radīt kaut ko savu?

Pietiek ar 500-2000 rubļiem un dažiem brīviem vakariem. Šoreiz ir vairāk nekā pietiekami, lai iepazītos ar Atmega8 arhitektūru. Pēc nelielas prakses jūs varat viegli izveidot savus projektus, kas veic konkrētus uzdevumus. Piemēram, robota roka. Ar Atmega8 vien vajadzētu būt vairāk nekā pietiekamam, lai nodotu pirkstu un roku motoriskās pamatfunkcijas. Protams, tas ir diezgan grūts uzdevums, taču tas ir diezgan iespējams. Nākotnē būs iespējams izveidot sarežģītas lietas, kurām būs nepieciešami desmitiem mikrokontrolleru. Bet tas viss ir priekšā, pirms tam jums jāiegūst labas prakses skola par kaut ko vienkāršu.