Programmēšana MK no nulles. AVR programmēšana

Man nav vienreiz, un nav divi sakot, ka pētījums par MK jāsāk ar montētāju. Tas tika veltīts veselam kursam vietnē (lai gan tas nav ļoti konsekventi, bet pakāpeniski es ķemmētu to atbilstošu tipu). Jā, tas ir grūti, rezultāts nebūs pirmajā dienā, bet jūs iemācīsieties saprast, kas notiek jūsu kontrolierī. Jūs zināt, kā tas darbojas, nevis uz pērtiķu kopēt citu cilvēku avotus un mēģināt saprast, kāpēc tas pēkšņi pārtrauca darbu. Turklāt SI ir daudz vieglāk pārspīlēt ar vidu oflood, kas iznāks ar dakšām pie visvairāk nepreceportune brīdi.

Diemžēl visi vēlas rezultātu nekavējoties. Tāpēc es nolēmu iet no otras puses - veikt apmācību par SI, bet ar viņa apakšveļa. Labs programmētājs-Imbedder vienmēr tur savu dzelzs gabalu, lai squall, nesniedzot viņai soli, lai soli bez atļaujas. Tātad tas būs sākumā, tā kodu, tad tas, kas dzimis kompilators un kā tas tiešām darbojas patiesībā :)

No otras puses, si spēcīga puse Tas ir nepārvietojamības kods. Ja, protams, rakstīt visu pareizi. Darba algoritmu un to dzelzs ieviešanas atdalīšana dažādās projekta daļās. Tad, lai pārsūtītu algoritmu uz citu MK, tas ir pietiekami, lai pārrakstītu tikai saskarnes slāni, kur ir uzrakstīts visa pievilcība dziedzerim un atstāj visu darba kodu, kā tas ir. Un, protams, lasāmība. Sash avota avots ir vieglāk saprast no pirmā acu uzmetiena (lai gan .. Es, piemēram, nerūpējos par to, ko flirtē ir vismaz SI, vismaz AFM :)), bet, atkal, ja jūs rakstāt visu pareizi. Ar šiem brīžiem es pievērsīšos arī uzmanību.

Kā vadošais aparatūras gabals, kurā lauva ir daļa no visiem piemēriem, būs mans debug maksa.

Pirmā programma C AVR

Izvēloties kompilatoru un uzstādīšanu vides
Par AVR, ir daudz dažādu C kompilatoru:
Pirmkārt, tas ir IAR AVR C. - gandrīz unikāli atzīts par labāko AVR kompilatoru, jo Pārzinis pats tika izveidots ar ciešo kooperatoru Atmel un speciālistu no IAR. Bet par visu, kas jums ir jāmaksā. Un šis kompilators nav pietiekami daudz par to, kas ir dārga komerciāla programmatūra, tai ir arī tādas brokastu iestatījumus, kas vienkārši ņem un apkopo to tajā, būtu jāsteidzas. Man tiešām nebija draudzības ar viņu, projekts bija piedzēries dīvainas kļūdas pie saiknes posmā (vēlāk uzzināja, ka tas bija kreka līkne).

Otrais nāk Winavr GCC. - spēcīgs optimizējošs kompilators. Full atveras, pārrobežu platformu kopumā, visi dzīves prieki. Viņš arī pilnībā integrējas AVR studijā, kas ļauj jums atkļūdot tieši tur, ka ellē ir ērta. Kopumā es to izvēlējos.

Arī ir CodeVision AVR C.- Ļoti populārs kompilators. Viņš kļuva populārs saistībā ar viņa vienkāršību. Darba programma Jūs varat saņemt tajā dažu minūšu laikā - sākuma koda maģistrs ir ļoti popularizēts, visu veidu ausu veidu inicializācijas zīmogs. Godīgi sakot, es atvainojos ar aizdomām Viņam - kaut kā man bija jādefinē šī kompilatora rakstīts prog rakstīts, kaut kas domāts, bet ne kods tika iegūts. Briesmīgs daudzums nevajadzīgu televīziju un darbību, kas tika ielej nelielu kodu un lēnu ātrumu. Tomēr, iespējams, DNS bija kļūda rakstīja sākotnējo programmaparatūru. Kā arī viņš vēlas naudu. Nav daudz kā IAR, bet ievērojams. Un demozhim nepiešķir ne vairāk kā 2KB kodu.
Protams, ir, bet, ja jūs nozagt, tik miljons, kas nozīmē orm \u200b\u200b:)

Ir arī Image Craft Avr C un Mikrosols no mikroelektronikas. Ne izmantot citus lietojumus, bet šeit SKG. Ļoti aršana MikropaskopsIzkausēšana ir briesmīgi ērta programmēšanas vide un bibliotēka. Es domāju, ka mikrocs nebūs sliktāks, bet arī samaksāts.

Kā jau teicu, es izvēlos Winavr. Trīs iemeslu dēļ: bezmaksas, tas ir integrēts AVR studijā, un tas ir rakstīts vienkārši sadalījums pabeigta koda visiem gadījumiem.

Tāpēc lejupielādējiet sevi, lai instalētu Winavr C un AVR Studio. Tad studija vispirms tiek likts, tad no augšas, Winavr ruļļos atkal un piestiprina studijā spraudņa veidā. Es stingri iesaku Instalēt Winavr īsā veidā, kaut kas līdzīgs C: Winavr tādējādi jūs izvairīties no pāļiem problēmām ar veidiem.

Projekta izveide
Tātad, studija tiek piegādāta, si ir piestiprināts, ir pienācis laiks kaut ko izmēģināt programmai. Sāksim ar vienkāršu, vienkāršāko. Uzsākt studiju, izvēlieties tur jauns projekts, kā kompilators AVR GCC un ievadiet projekta nosaukumu.

Atver darba laukumu ar tukšu * .c failu.

Tagad tas neliedz konfigurēt demonstrēšanas ceļus studijas cilnes. Lai to panāktu:
Izvēlne Rīki - Iespējas - Vispārīgi - Filetabs un nolaižamajā sarakstā izvēlieties "Filename". Pretējā gadījumā nebūs iespējams strādāt - cilnē būs pilns faila ceļš, un ekrānā nebūs ne vairāk kā divas cilnes.

Projekta uzstādīšana
Kopumā izveidotā faila izveide, kurā tiks aprakstītas visas atkarības. Un tas, iespējams, ir pareizs. Bet es uzaugu uz pilnībā integrētu IDE uvision. vai AVR studija. Šī pieeja ir dziļi svešs. Tāpēc es darīšu savā veidā, visas studijas.

Pāļi pogā ar pārnesumu.


Tie ir jūsu projekta iestatījumi, vai drīzāk veidošanas faila automātiskās ģenerēšanas iestatīšana. Pirmajā lapā, kas jums vienkārši ir jāievada frekvence, kurā darbosies jūsu MK. Tas ir atkarīgs no bitu drošinātājiem, tāpēc mēs uzskatām, ka biežums ir 8000000Gz.
Pievērsiet uzmanību arī optimizācijas virknei. Tagad ir is --os ir optimizācija lieluma. Lai atvaļinājumu, kā tas ir, tad jūs varat mēģināt spēlēt ar šo parametru. -O0 ir noņemama optimizācija vispār.

Nākamais solis ir konfigurēt ceļus. Pirmā lieta, lai pievienotu jūsu projekta direktoriju - jūs nodosiet trešās puses bibliotēku tur. Saraksts parādīsies ". \\" \\ T

Izveidojiet failu, jūs varat to redzēt savā projekta noklusējuma mapē, vienkārši palaist caur acīm, skatiet tur, kas ir tur.


Tas ir viss. Jim visur labi un dodieties uz avotu.

Problēmas formulēšana
Tukša lapa ir tik viļņota, lai iemiesotu kādu sarežģītu ideju, jo diodes banāls neietilpst. Pieņemsim uzreiz veikt bullis par ragiem un ieviest savienojumu ar datoru - tas ir pirmā lieta, ko es daru.

Tas darbosies šādi:
COM ostas ierašanās ierīce (kods 0x31) iedegsies diodi un kad nulles ierašanās (kods 0x30) tiek dzēsts. Turklāt viss tiks darīts pārtraukumos, un fona uzdevums mirgo citu diodi. Vienkārši un ar nozīmi.

Savākt shēmu
Mums ir nepieciešams savienot USB-USART Converter moduli ar mikrokontrolleru USART pārveidotājiem. Lai to izdarītu, ņemiet divu vadu džemperi un ielieciet krustu krusta tapās. Tas ir, RX kontrolieris savieno ar TX Converter un TX Converter ar RX kontrolieri.

Izrādās, kā rezultātā šī ir šāda shēma:


Savienojot citus secinājumus, uzturu, izlādi, tas ir standarts

Mēs rakstām kodu

Nekavējoties veiciet atrunu, ka es nepārprotami nepaziņos SI valodu aprakstā. Šim nolūkam ir vienkārši milzīgs materiāls, sākot no klasikas "SI programmēšanas valodas" no K & R un beidzot ar dažādām metodēm.

Viena šāda metode tika atrasts Meycomb, es reiz mācījos šo valodu par to. Tur viss ir īss, saprotams un šajā gadījumā. Es pakāpeniski to izveidoju un pārkārtoju uz manu vietni.

Tur tiešām ne visas nodaļas atlikta, bet es domāju, ka tas nav ilgi.

Maz ticams, ka es labāk aprakstīšu, tāpēc no mācību kursa, nevis detalizētu zilo smalkumu iedarbību, es vienkārši sniegšu tiešas saites uz dažām šīs metodes lapām.

Pievienojiet bibliotēkas.
Pirmkārt, mēs pievienojam nepieciešamās bibliotēkas un nosaukumus ar definīcijām. Galu galā, SI ir universāla valoda, un viņam ir jāpaskaidro, ka mēs strādājam ar AVR, tāpēc ieiet avota līnijā:

1 #Include.

#Include.

Šis fails ir mapē Winavr. Un tajā ir iekļauti visi kontroliera reģistri un ostas. Un tur visi viltīgi, atsaucoties uz konkrētu kontrolieri, ko apkopo kompilators veidot Failu parametru Mcu. Un, pamatojoties uz šo mainīgo jūsu projektā, šajā kontrollā ir galvenes fails ar visu ostu un reģistru adreses aprakstu. Kā! Bez tam arī tas ir iespējams, bet tad jūs nevarēsiet izmantot reģistru simboliskos vārdus, piemēram, SREG vai UDR, un ir jāatceras katras, piemēram, "0xC1" adrese, un tas ir galva.

Tā pati komanda pati #Include.<имя файла> Ļauj pievienot jūsu projektam jebkura teksta faila saturu, piemēram, failu, kas apraksta funkcijas vai kādu citu kodu. Un tā, ka direktīva varētu atrast šo failu, mēs norādījām veidus mūsu projektam (Winavr katalogs jau ir uzrakstīts tur).

Galvenā funkcija.
Programma SI valodā sastāv no funkcijām. Tie var tikt iestrādāti un nogādāti viens no otra jebkurā kārtībā un dažādos veidos. Katrai funkcijai ir trīs nepieciešamie parametri:

  • Atgriešanās vērtība, piemēram, grēks (x) Atgriež X sinusa vērtību. Tāpat kā matemātikā, īsi sakot.
  • Pārraidītie parametri, tas pats X.
  • Ķermeņa funkcija.

Visām nosūtītajām un atgrieztajām vērtībām jābūt jebkura tipam atkarībā no datiem.

Jebkurai programmai C ir jāietver funkcija galvenā. Kā ieejas punkts galvenajā programmā, pretējā gadījumā tas ir nifiga nav si :). Saskaņā ar klātbūtni galvenā kādā citā avotā no miljoniem failu, var saprast, ka tas ir programmas vadītājs, kurā viss sākas. Tāpēc lūdziet:

1 2 3 4 5 Int galvenais (tukšums) (atgriezties 0;)

int galvenais (tukšums) (atgriezties 0;)

Viss, pirmā vienkāršākā programma ir rakstīta, nav svarīgi, ka viņa neko nedara, mēs tikko sākām.

Mēs analizēsim to, ko mēs darījām.
int. Šāda veida dati, ko galvenā funkcija atgriežas.

Protams, mikrokontrollerā galvenā. Es nevaru atgriezties neko principā, un teorētiski vajadzētu būt void galvenais (tukšums)Bet GCC sākotnēji ir asināts datorā, un tur programma var atgriezt operētājsistēmas vērtību pēc pabeigšanas. Tāpēc GCC ON void galvenais (tukšums) Zvērināts brīdinājums.

Tā nav kļūda, tas darbosies, bet man nepatīk varniņi.

void. Šāda veida dati, ko mēs nosūtām uz funkciju šajā gadījumā galvenā. Arī nevar neko no ārpuses, dzejnieks void. - manekens. Plug tiek izmantots, ja nav nepieciešams nodot neko vai atgriezties.

Šie ir { } Attēlu kronšteini ir programmatūras bloks, šajā gadījumā ķermeņa funkcija galvenā., Būs kodekss.

atgriezties. - Šī ir atgriešanās vērtība, ka galvenā funkcija sniegs pēc pabeigšanas, jo mēs esam int, tas ir, numurs, kas mums ir jāatdod numurs. Lai gan tas joprojām nav jēgas, jo Uz mikrokontrollera no galvenā, mēs, izņemot nekur. Es atgriežu nulli. Par nonfig. Un kompilators parasti ir gudrs, un kods nerada kodu.
Lai gan, ja jūs izdzerat, tad no galvenā. Jūs varat doties uz MC - piemēram, iekrist bootloader sadaļā un izpildīt to, bet jau ir zema līmeņa programmaparatūras izvēle, lai pielāgotu pārejas adreses. Zemāk jūs redzēsiet un saprast, kā to izdarīt. Priekš kam? Šis ir vēl viens jautājums, 99,999% gadījumu šī Nafig nav nepieciešama :)

Veikts, turpinājās. Pievienojiet mainīgo, tas nav īpaši nepieciešams mums, un nav nepieciešams ieviest mainīgos lielumus, bet mēs mācāmies. Ja mainīgie ir pievienoti funkcijas korpusā - tad tie ir vietējie un pastāv tikai šajā funkcijā. Kad jūs atstāt funkciju, šie mainīgie ir noņemti, un atmiņa RAM tiek dota svarīgākas vajadzības. .

1 2 3 4 5 6 Int galvenais (tukšums) (neparakstīts char i; atgriešanās 0;)

int galvenais (tukšums) (neparakstīts char i; atgriešanās 0;)

neparakstīts. Tik nesalīdzināmi. Fakts ir tāds, ka binārā attēlojumā mums ir vecākais apzīmējums, kas nozīmē vienā baitā (char) numura + 127 / -128, bet, ja zīme tiek izņemtas, tas jau ir no 0 līdz 255. Parasti zīme ir nav vajadzīgs. Tā, ka neparakstīts..
i. - Tas ir tikai mainīgais nosaukums. Vairāk ne.

Tagad jums ir nepieciešams inicializēt ostas un UART.. Protams, jūs varat veikt un savienot bibliotēku un zvanīt kāda veida uartinit (9600); Bet tad jūs nezināt, kas noticis faktiski.

Mēs to darām:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Int galvenais (tukšums) (neparakstīta char i; #define xtal 8000000l #define bulrate 9600l #Define bauddivider (XTAL / (16 * bļauj) -1) #Define hi (x) ((x) \u003e\u003e 8) #define lo (x) ((x) & 0xff) ubrrl \u003d lo (bauddivider); Ubrrh \u003d hi (bauddivider); UCSRA \u003d 0; UCSRB \u003d 1.<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int galvenais (tukšums) (neparakstīta char i; #define xtal 8000000l #define bulrate 9600l #define baudriver (Xtal / (16 * bļauj) -1) #define hi (x) ((x) \u003e\u003e 8) #define lo ( x) (x) & 0xff) ubrrl \u003d lo (bauddivider); ubrrh \u003d hi (bauddivider); ucsra \u003d 0; ucsrb \u003d 1<

Scary? Faktiski, īstais kods šeit ir tikai piecas pēdējās līnijas. Viss, ka #Define Tas ir makrorvalodu preprocessor. Gandrīz tie paši topi kā montētājs, bet sintakse ir nedaudz atšķirīga.

Tie atvieglos jūsu ikdienas operācijas, lai aprēķinātu nepieciešamos koeficientus. Pirmajā rindā mēs to sakām tā vietā Xtal Jūs varat droši aizstāt 80 000 000, un L.- Tips Specifikācija, Long Mall ir procesora pulksteņa frekvence. Tāds pats pārraides ātrumu. - datu biežums ar UART.

bauddivider. Jau sarežģītāka, tā vietā tiks aizstāta izteiksme, ko aprēķina divu iepriekšējo formula.
Labi un Lo. un SVEIKI No šī rezultāta būs jaunāki un vecākie baiti, jo Vienā baitā tas skaidri nevar piemērot. Iebildums SVEIKI ICSE maiņa tiek veikta (makro ievades parametrs) astoņas reizes labajā pusē, kā rezultātā paliks tikai vecākā baits. B. Lo. Mēs veidojam partiju un ar numuru 00ff, kā rezultātā, tikai jaunākais baits paliks.

Tātad viss, kas tiek darīts kā #Define Jūs varat droši izmest, un vēlamo numuru skaitu uz kalkulatoru un nekavējoties ievadiet tos UBBRL \u003d Lines .... un ubbrh \u003d ... ..

Var. Bet! Dari šo Tas ir kategoriski neiespējami!

Tas arī strādās, lai strādātu, bet jums būs tā sauktais burvju numuri - vērtības, kas veiktas nesaprotami no kurās nav skaidrs, kāpēc un ja jūs ziedojat šādu projektu pāris gadu laikā, tad ir grūti saprast, ka tas būs nopelt to. Jā, un tagad jūs vēlaties mainīt ātrumu vai mainīt kvarca biežumu, un viss būs jāpārrēķina, un tā mainīja pāris tsiferok kodā un viss pats. Kopumā, ja jūs nevēlaties baudīt ByDlokoder, tad veiciet kodu tā, lai to būtu viegli lasīt, tas bija saprotams un viegli mainīts.

Tad viss ir vienkāršs:
Visi šie "UBRRL un CO" ir raidītāja konfigurācijas reģistri, ar kuriem mēs sazināsimies ar pasauli. Un tagad mēs esam piešķiruši nepieciešamās vērtības, konfigurējot vēlamo ātrumu un pareizo režīmu.

Ierakstīšanas skatījums 1< Nozīmē: veikt 1 un ievietojiet to vietā Rxen. Lidot. Rxen. Tas ir 4. biti no reģistra UCSRB., tā, ka 1< veido bināro numuru 00010000, Txen. - tas ir 3. bits, un 1< Dailt 00001000. Single "|" Tas ir salauzts VaiSO 00010000 | 00001000 \u003d 00011000. Atlikušie nepieciešamie konfigurācijas biti tiek izstādīti tādā pašā veidā un pievienoti vispārējam ķekaram. Tā rezultātā montāžas numurs ir rakstīts UCSRB. Sīkāka informācija tiek uzrakstīta datu lapas sadaļā MC. Tātad, nesaņemiet apjucis ar tehniskām detaļām.

Gatavs, ir pienācis laiks redzēt, kas noticis. Kauliņi uz emulācijas apkopošanas un uzsākšanas (Ctrl + F7).

Atkļūdošana
Visu veidu progresa bāri skrēja, studija mainījās un dzeltena bultiņa parādījās pie galvenās funkcijas. Tas ir, ja procesors pašlaik ir aktuāls, un simulācija pauzi.

Fakts ir tāds, ka sākotnēji tas bija uz rindas Ubrrl \u003d Lo (Baudivider); Galu galā, tas, ka mums ir definēt, tas nav kods, bet vienkārši provizoriskie aprēķini, tad simulators nedaudz piestiprināja. Bet tagad viņš saprata, pirmā instrukcija ir pabeigta, un, ja jūs uzkāpt kokā I / o skats, USART sadaļā un uzvariet tur uz UBBRL baitu, jūs redzēsiet, ka jau jau ir jau! 0x33.

Veikt vēl vienu soli. Aplūkojot, kā cita reģistra saturs mainās. Tātad drošināt tos visus, pievērsiet uzmanību tam, ka visi norādītie biti ir izstādīti, kā es teicu, un tas ir noteikts laikā, lai visu baitu. Nākamā atgriešanās nedarbojas, programma ir beigusies.

Atklāšana
Tagad atiestatiet simulāciju nullē. Noklikšķiniet tur Reset (Shift + F5). Atvērt demontāža sarakstā, tagad jūs redzēsiet, kas notiek kontrolierī. Skatīt -\u003e DISASSSEMBLER. Un ne yyaaaa !!! Montētājs !!! Uzhos !!! Bet jums ir jābūt. Tātad, lai vēlāk, kad kaut kas noiet greizi, neuzdrošinājās kodeksā un neprasīja lamer jautājumus forumos un nekavējoties uzkāpa zaudējumos un noskatījos, kur jums ir stends. Tur nav nekas briesmīgs.

Pirmkārt, tas būs virkne 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 Jump 00000002: 940C0034 JMP 0x00000034 Jump 00000004: 940C0034 JMP 0x00000034 Jump 00000006: 940C0034 JMP 0x00000034 Jump 00000008: 940C0034 JMP 0x00000034 Jump + 0000000A: 940C0034 JMP 0x00000034 Jump + 0000000C: 940C0034 JMP 0x00000034 Jump + 0000000E: 940C0034 JMP 0x00000034 Jump 00000010: 940C0034 JMP 0x00000034 Jump 00000012: 940C0034 JMP 0x00000034 Jump 00000014: 940C0034 JMP 0x00000034 Jump 00000016: 940C0034 JMP 0x00000034 Jump 00000018: 940C0034 JMP 0x00000034 Jump + 0000001A: 940C0034 JMP 0x00000034 Jump + 0000001C : 940C0034 JMP 0x00000034 Jump + 0000001E: 940C0034 JMP 0x00000034 Jump 00000020: 940C0034 JMP 0x00000034 Jump 00000022: 940C0034 JMP 0x00000034 Jump 00000024: 940C0034 JMP 0x00000034 Jump 00000026: 940C0034 JMP 0x00000034 Jump 00000028: 940C0034 JMP 0x00000034 Jump

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

Tas ir pārtraukšanas vektoru galds. Mēs atgriezīsimies pie tā, vienkārši redzējām un atcerieties, ka tas ir. Pirmā kolonna ir zibspuldzes flash adrese, kurā atrodas komanda, trešās mnemonijas komandas otrais komanda, tas pats montētājs norādījums, komandas trešais operands. Nu, automātisks komentārs.
Tātad, ja paskatās, tad ir cietas pārejas. Un JMP komandu kods ir četri baiti, tajā ir pārejas adrese, ko ieraksta atpakaļ - jaunākais baits jaunākajai adresei un pārejas komandas 940c kodam

0000002b: BE1F OUT 0X3F, R1 OUT līdz I / O atrašanās vieta

Ierakstot šo nulli līdz 0x3F adresi Ja redzat I / O view kolonnu, tad jūs redzēsiet, ka 0x3F adrese ir adrese SRREG - Flag Reģistrēties kontroliera reģistru. Tiem. Mēs atiestatām SRER, lai palaistu programmu nulles apstākļos.

1 2 3 4 + 0000002C: E5CF LDI R28.0x5F Load Tūlītēja + 0000002D: E0D4 LDI R29.0X04 Ielādēt tūlītējo + 0000002E: BFDE OUT 0X3E, R29 OUT līdz I / O Atrašanās vieta + 0000002F: BFCD OUT 0X3D, R28 OUT I / O atrašanās vieta

0000002C: E5CF LDI R28.0x5F Load Tūlītēja + 0000002D: E0D4 LDI R29.0x04 Ielādēt tūlītējo + 0000002E: BFDE OUT 0X3E, R29 OUT I / O Atrašanās vieta + 0000002F: BFCD OUT 0X3D, R28 OUT I / O atrašanās vietā

Tas ir iekraušana kaudze rādītājs. Tieši kuģniecība I / O reģistros nevar, tikai izmantojot starpniecības reģistru. Tāpēc, pirmais mazumtirdzniecība starpproduktu, un pēc tam no tā, kas atrodas I / O. Es arī pastāstīšu jums vairāk par kaudze. Tikmēr ir zināms, ka tas ir tik dinamiska atmiņas zona, karājas, kas galā RAM un saglabā adreses un starpposma mainīgos. Tagad mēs norādījām, kur mums būs kaudze.

00000032: 940C0041 JMP 0x00000041 Jump

Pārlēkt uz programmas Saaaeeee beigām, un tur mums ir aizliegums pārtraukt un cieši cieši saistītas ar:

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 ir neparedzētu apstākļu gadījumā, piemēram, izejas no galvenās funkcijas. No tik cilpas kontrolieri var parādīt vai nu ar aparatūras atiestatīšanu, vai tas ir iespējams, izplūde no pulksteņu suņa - sargsuns. Nu, vai, kā jau iepriekš teicu, izlabojiet šīs vietas Hex redaktorā un maršrutēšanas, kur mums ir dvēsele. Pievērsiet uzmanību arī tam, ka ir divu veidu JMP un RJMP pārejas pirmais ir tieša pāreja uz adresi. Tas aizņem četrus baitus un var veikt tiešu pāreju visā atmiņas zonā. Otrs pārejas veids - RJMP - radinieks. Viņa komanda ņem divus baitus, bet pāreja tas notiek no pašreizējās pozīcijas (adreses) par 1024 soļiem uz priekšu vai atpakaļ. Un tās parametros ir norādīts atlikums no pašreizējā punkta. Biežāk izmanto, jo Tas aizņem divas reizes mazāk vietas flush, un garš faktori ir reti nepieciešams.

1 +000034: 940c0000 JMP 0x00000000 Jump

00000034: 940C0000 JMP 0x00000000 Jump

Un tas ir lēkt pašā koda sākumā. Restartējiet veidu. Jūs varat pārbaudīt, visi vektori pāriet šeit. No šīs izejas - ja jūs varat ļaut pārtraukt (tie ir aizliegti pēc noklusējuma), un jūs pārtraucat, bet nav apstrādātāja, tad būs programmas atiestatīšana - programma mest programmu pašā sākumā.

Galvenā funkcija. Viss ir līdzīgs, jūs pat nevarat aprakstīt. Meklējat tikai uz reģistriem, kas jau aprēķināti skaitu. Preprocessor Compiler Taxis !!! Tātad nav "burvju" numuru!

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

00000036: E383 LDI R24.0x33 Slodzes tūlītējais +000037: B989 OUT 0X09, R24 OUT līdz I / O Atrašanās vieta 15: Ubrrh \u003d Hi (Baudiver); +000038: BC10 OUT 0X20, R1 OUT līdz I / O atrašanās vieta 16: UCSRA \u003d 0; +000039: B81B OUT 0X0B, R1 OUT līdz I / O Atrašanās vieta 17: UCSRB \u003d 1<

Un šeit ir Jamb:

1 2 3 + 0000003e: E080 LDI R24.0x00 Load Tūlītēja + 0000003F: E090 LDI R25.0x00 Load Tūlītējais +00000040: 9508 RET subroutine Atgriezties

0000003e: E080 LDI R24.0x00 Load Tūlītēja + 0000003F: E090 LDI R25.0x00 Load Tūlītēja +00000040: 9508 RET subroutine Atgriezties

Tiek jautāts, kāpēc šis kompilators pievieno šādu topmaster? Un tas nav nekas cits kā atgriezties 0, tad mēs esam identificējuši kā int galveno (tukšumu). Tāpēc es uzvarēju vairāk nekā četri baiti nesaprot, ko :) un, ja jūs veicat tukšumu (tukšumu), tas būs tikai atkārtoti, bet Varning būs. Ko viņi saka, mēs neatgriežam neko uz galveno funkciju. Kopumā to darīt kā jūs :)

Sarežģīts? Šķiet, ka tas nav. Es izlaistu soli pa solim veiktspēju Disassembler režīmā un Pokery, jo procesors veic individuālus norādījumus, kas notiek ar reģistriem. Kā pāriet uz komandām un galīgo cilpu.

Turpinājums seko pāris dienām ...

Offtop:
Alexei78. Gang fiksēšanas spraudnis Firefox Veicināt navigāciju manā vietnē un forumā.
Diskusija un lejupielāde

Par AVR mikrokontrolleru programmēšanu, tomēr ir daudz attīstības rīku, tomēr populārākie, neapšaubāmi, pakete ir jāatzīst AVR studija. . Šādas popularitātes dēļ ir vairāki iemesli - tas ir uzņēmums, ko izstrādājusi uzņēmums Atmel , Tas apvieno teksta redaktoru, montētāju un simulatoru. AVR Studio pakotne tiek izmantota arī kopā ar fiksēšanas aparatūru. Ierosinātajā rakstā piemēri uzskata, ka metodes, lai strādātu ar paketi, kas palīdzēs iesācējiem programmētājiem saprast AVR studijas atsevišķu komponentu mijiedarbību.

Nākamajā raksta daļā tiks aprakstīts par atkļūdošanu AVR studijas vidē, kas rakstītas SI.

AVR studijas paketei ir stabila attīstības vēsture, kas atspoguļojas esošo versiju skaitā. Pēc 2003. gada beigām tika izlaista 4.08 versija, kurai ir vairāki noderīgi papildinājumi, un 2004. gada sākumā ir atbrīvots atjauninājums (servisa pakotne 1), pievienojot atbalstu AVR kontrolieriem no trešās paaudzes Atmega48 ģimene. Šīs ģimenes mikroshēmu ražošana ir paredzēta 2004. gada otrajā pusē.

Iepakojuma sadalījumu un servisa pakotni var lejupielādēt no www.atmel.com vai iegūt CD ar šo izplatību no Krievijas Atmel izplatītāja.

Avr Studio pakotnes darbs ir ērti pārskatīt jebkurā konkrētā programmā. Kā viedoklis, mēs apsvērsim veidot projektu vienkāršākajai programmai, kas būs savukārt gaismas diviem LED. Par noteikumu, ņem mikrošķiedras Atmega128. un savienojiet abus LED secinājumos 31 un 32 (tie ir biti 6 un 7 ostas d chip atmega128). AVR kontrolieri Ir spēcīgi izejas kaskādes, katras produkcijas tipiskā strāva ir 20 mA, maksimālais izejas strāva ir 40 mA, un tas attiecas uz gan plūstošu un plūstošo strāvu. Mūsu piemērā gaismas diodes ir savienotas ar anodiem uz secinājumiem kontroliera, un katodi caur dzesēšanas rezistoriem ir savienoti ar zemi. Tas nozīmē, ka LED aizdedzina barošanas "1" uz atbilstošo ostu produkciju. Shematiskā diagramma ir parādīta attēlā. Diagramma arī parāda divas pogas, kas jāizmanto vienā no programmām.

Šeit ir lietderīgi veikt nelielu digrāciju par izvēli mikroshēmu vienkāršākajam piemēram. Patiešām, pēc pirmā acu uzmetiena, tas var šķist dīvaini, kāpēc jums ir nepieciešams tik spēcīgs kristāls 64 kontaktu gadījumā, ja ir pietiekami 8-pin chip Attiny12. ? Tomēr šajā pieejā ir loģika. Ir zināms, ka gandrīz jebkura AVR kontroliera centrā atrodas tas pats kodols. Pēc un lieliem kontrolieriem atšķiras atmiņā, I / O ostu skaits un perifēro moduļu komplekts. Katras īpašās kontroliera iezīmes - saistošs loģisks nosaukums / izejas reģistri uz fiziskām adresēm, pārtraukumu adrešu adresēm, identificējot ostas bitus utt. Apraksta failus ar paplašinājumu.inc, kas ir iekļauti AVR studijas paketē. Līdz ar to, izmantojot konkrētu kristāla veidu, jūs varat atkļūdot programmu par sevi un jebkuram jaunākam kristālam. Turklāt, ja jūs izmantojat vecāko kristālu kā atkļūdošanu, šodien tas ir ATMEGA128, jūs varat atkļūdot programmu gandrīz jebkuram AVR kontrolierim, jums vienkārši ir jāizmanto aparatūras resursi, kas trūkst mērķa mikrokontrollera. Tādējādi, piemēram, jūs varat atkļūdot programmu, kas jāveic uz atmega128 Attiny13. . Šādā gadījumā avota kods paliks praktiski tāds pats, tikai pievienotā faila nosaukums ar 128Def.inc uz tn13def.inc mainīsies. Šai pieejai ir arī tās priekšrocības. Piemēram, "Extra" I / O ostas var izmantot, lai izveidotu savienojumu. LCD indikators kuru jūs varat atsaukt atkļūdošanas informāciju. Vai arī izmantojiet intrahēmuma emulatoru, kas savieno ar ATMEGA128 mikroshēmu JTAG ostu (attiny13 kontrolierim nav šīs ostas). Tādējādi ir iespējams izmantot vienu atkļūdošanas padomi, kurā ir uzstādīts "vecākais" AVR kontrolieris, atkļūdot jaunas jaunizveidotās sistēmas, kas dabiski balstās uz AVR mikrokontrolleriem. Vienu no šiem dēļiem sauc par megamu. Tas bija tas, kas tika izmantots, lai izveidotu piemērus, kas norādīti rakstā. Tas ir universāls viena borta kontrolieris, pamatojoties uz ATMega128 mikroshēmu, kas satur ārējo RAM, divas ostas RS-232. , LCD indikatora savienošanas osta, Intrahemnoe programmētājs un emulators JTAG ledus . Valdei ir arī vieta, kur sadalīt Flash-ROM sērijas mikroshēmu AT45 Korpusos TSOP32 / 40/48 un divu kanālu sērijas DAC AD5302 / AD5312 / AD5322 . Tagad, izskaidrojot AVR Monster lietošanas cēloņus, lai aizdedzinātu pāris Swatodiodes, jūs varat doties tālāk.

Programmēšana AVR studijas vidē, jums ir nepieciešams veikt standarta darbību secību:

  • apkopošana
  • Projekta izveide sākas ar projekta izvēlni izvēli. Atverot logu "Izveidot jaunu projektu", jums ir jānorāda projekta nosaukums (mūsu gadījumā - paraugs1) un inicializācijas faila nosaukumu. Nospiežot pogu "Next", atveras atlases atkļūdošanas platformas un ierīces logs, kur ir izvēlēts atkļūdošanas platforma (simulators vai emulators) un mikrokontrollera tips.

    Jūs varat izvēlēties vienu no piedāvātajiem intrahemny emulatoriem, mēs atzīmējam, ka katram emulatoram ir savs atbalstīto mikrocirkuitu saraksts. Attiecībā uz izskatāmo piemēru mēs izvēlamies kā atkļūdošanas platformu AVR simulators un atmega128 mikroshēma. Nospiežot pogu "Pabeigt", mūsu produkcija parādās AVR studijas paketes darba logi, kamēr tukši. Tas seko pareizajam logam, lai izvietotu programmas avota tekstu. To var izdarīt divos veidos vai izsaukt visu tekstu tieši redaktora logā vai lejupielādēt esošo failu. Zemāk ir pilnīga teksta vienkāršākā programma ar komentāriem.

    ; Piemērs "LED kontrole"; rakstīts kā Megam atkļūdošanas padome; Parametru ģeneratora biežums ir 7,37 MHz; LED ir savienotas ar PD6 un PD7 secinājumiem un ar rezistoriem - uz koplietošanas stieples. ; Savienojot Atmega128 Circuit I / O detalizētu failu "M128Def.inc"; Sākuma programmas sākumā:; pirmā operācija - steku inicializācija; Ja tas netiek darīts, zvaniet apakšprogrammai vai pārtraukt; neatgriežas kontroli atpakaļ; Noskaušanas rādītājs ir iestatīts uz iekšējā RAM pēdējā adresi - Ramend LDI R16, zems (Ramend) ārā SPL, R16 LDI R16, HIGH (RAMEND) OUT SPH, R16; Lai kontrolētu LED savienotas ar PD6 un PD7 secinājumiem; Ir jāpaziņo par šiem secinājumiem. ; Lai to izdarītu, rakstiet "1" uz DDRD reģistra attiecīgajiem bitiem (datadirection) 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 ; возврат в главную программу

    Projekts var sastāvēt no vairākiem failiem, bet viens fails ir piešķirts galvenais. Visas operācijas ir ērti ražot, izmantojot peles konteksta pogu. Pēc avota faila pievienošanas logiem ir šāda forma.

    Projekta apkopojums tiek veidots ar komandu projektu vai nospiežot taustiņu F7. Kompilācijas process tiek parādīts logā "Output". Šis logs var būt "vilkšana", kas ir komanda.

    Principā mēs jau esam saņēmuši izejas failu format.hex, kuru jau var ielādēt mikrocīncuks un ievērot LED pilnvarotus. Tomēr raksta mērķis ir parādīt pilnu darba ciklu AVR studijas vidē, tāpēc mēs ejam uz atkļūdošanas skatuvi. To veic ar atkļūdošanas sākt atkļūdošanas komandu.

    Tagad iestatiet frekvenci kvarca frekvences 7,3728 MHz logu "Simulator Options", lai precīzi izmērītu izpildes laiku programmas.

    Atlikušās iespējas ir jāatstāj nemainīgas. Tagad jūs varat veikt programmu soli pa solim, izmantojot peli vai pogu F11.

    AVR Studio pakete satur spēcīgus instrumentus, lai apskatītu un rediģētu valsts iekšējo reģistru un I / O ostas atkļūdotu mikrokontrollera, kā arī laiku, programmas izpildi. Piekļuve tiem tiek veikta caur logu "I / O".

    Faktiski informācijas apjoms, kas pieejams, izmantojot AVR Studio paketi skatīšanās logus, ir tik liels, ka ir nepieciešams izmantot datoru divu monitoru konfigurācijā, lai iegūtu maksimālu komfortu.

    Lai atkļūdotu mūsu piemēru, lai piekļūtu portiem d bitiem, jums ir jāatklāj I / O atmega128 virkne un pēc tam Portd Line. Tagad ir redzami visi trīs šīs ostas, Portd, DDRD un PIND reģistri. Lai redzētu vērtību, bitus un adresi, jums būs paplašināt pareizo loga robežu, svīšana logu ar programmas avota tekstu.

    Tagad, nokārtojot programmu soli pa solim režīmā, jūs varat redzēt izmaiņas pašreizējās valstīs šiem reģistriem bitu jomā. Tas ir iespējams ātri mainīt stāvokli jebkura bitu ostas reģistriem, un to var izdarīt, vai nu rakstot jaunu kodu vērtības laukā, vai tieši, noklikšķinot uz vēlamā bitu reģistra.

    Neatkarīgām vingrinājumiem tiek ierosināta šāda programma, kas atšķiras no iepriekšējā, ka gaismas diodes aizdegšanos kontrolē divas pogas.

    ; Piemērs "LED kontrole no pogām"; rakstīts kā Megam atkļūdošanas padome; LED ir savienotas ar PD6 un PD7 secinājumiem un ar rezistoriem - uz koplietošanas stieples. ; Pogas - uz PE4 un PE5 .include "M128Def.inc"; Sākt galveno programmu:; Stack inicializācija LDI R16, zems (Ramend) no SPL, R16 LDI R16, augsts (Ramend) Out SPH, R16; LED LED inicializācija R16 (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 ; цикл выполняется бесконечно

    Tādējādi uz vienkāršāko programmu piemēru tiek parādītas dažas AVR studijas paketes iezīmes. Ir nepieciešams saprast, ka tas ir tikai pirmais paziņa, kas ļauj ātri izmantot ar pamata paketes komandām. Tikmēr aplūkošanas paketes iespējas ir daudz plašākas. Piemēram, šeit jūs varat atkļūdot programmas, kas rakstītas augsta līmeņa valodās. Jo īpaši uzņēmuma ImageCraft c-kompilators izmanto AVR Studio atkļūdotāju kā dzimtā ". Lai to izdarītu, apkopojot avota kodu, jāizveido izejas faila ģenerēšanas opcija formātā, kas ir saderīgs ar AVR studiju. Tajā pašā laikā ir iespējams atkļūdot avota kodos.

    Vēl viens no daudzajām AVR studijas paketes īpašībām ir spēja savienot ārējās programmas. Piemēram, lai nodrošinātu, ka AS2 inspekcijas programmētājs ir nepieciešams, lai veiktu vairākas vienkāršas operācijas.

    Galvenā loga AVR Studio izvēlnē Rīki ir jāizvēlas Pielāgot;

    Logā Pielāgot izvēlieties rīku vienumu;

    Veicot dubultklikšķi uz peles pogas vai nospiežot ieliktni uz tastatūras, pievienojiet jaunu komandu sarakstam un zvaniet tam "AS2 programmētājs";

    Norādiet ceļu uz programmētāja izpildāmo failu, ievadot to tieši "Komandu" ievades laukā, vai noklikšķinot uz pogas "..." pogas pa labi no šī lauka;

    Tagad izvēlne Rīki parādās "programmētājs AS2".

    AVR Studio 4.08 pakete nozīmē, lai jūs savienotu palīgprogrammas - spraudņus. Pirmais AVR Studio spraudnis ir grafiskā redaktora programma, kas vienkāršo LCD indikatora inicializācijas procesu, kas var tieši pārvaldīt AVR kontrolieri ATMEGA169. LCD indikatora maksimālais loģiskais lielums ir 100 segmenti, katrs indikatora elements ir izgatavots saskaņā ar mazliet īpašā kontroliera reģistrā. Lai vienkāršotu ikdienas saistošo procedūru dažiem bitiem katrā segmentā, varat izmantot iepriekš minēto programmu.

    Apmeklējot "AVR dzimteni" - Norvēģijas Atmel biroju, kas ir viens no raksta autoriem, kas runāja ar Lars Quener, Programmera grupas vadītāju, kas izveidoja un atbalsta AVR studijas paketi. Šī persona, klasisks programmētājs, ar bārdu, džemperī un austi zeķes sandales, runāja par izredzes attīstības paketi. Nākamajā versijā (4.09) saskarne būs iespējota jaunai Intrahemne Emulator - JTagice MKII (to sauc arī JTagice2), kas gada otrajā pusē aizstās JTAGICE. Šis emulators ir divas būtiskas atšķirības. No vienas puses, atbalstīts atbalsts jaunam vienreizējus atkļūdošanas saskarnei jaunākiem AVR kontrolieriem, Debugwire. Šis interfeiss ir interesants, jo tas nav ieņem papildu secinājumus par mikrokontrollera par savu darbu, jo tas izmanto, lai apmainītos ar izejas reset mikrokontrollera! No otras puses (jūs varat saprast šo izteiksmi burtiski), pie Jtagice2 emulatora parādīsies, visbeidzot, USB interfeiss sazināties ar datoru.

    Literatūra

    1. AVR tehniskie apmācības tehniskie semināru materiāli. Atmel. Norvēģija. DECEPTER 2003.
    2. Nikolaja Korolev, Dmitrijs Korolev AVR mikrokontrolleri otrās paaudzes: Izstrādātāja vidē. // komponenti un tehnoloģijas, 2003 Nr. 7
    3. AVR mikrokontrolleri otrās paaudzes: jaunas aparatūras iespējas // sastāvdaļas un tehnoloģijas. 2003. 4.
    4. Nikolajs Korolevs, Dmitrijs Korolevs. AVR mikrokontrolleri: liels mazs. // shēmība ", 2001, №5
    5. Nikolajs Korolevs, Dmitrijs Korolevs. AVR mikrokontreri: programmatūra // sastāvdaļas un tehnoloģijas, 2000. Nr. 4.
    6. Nikolajs Korolevs. AVR: Developer Hardware // Komponenti un tehnoloģijas, 1999 № 1
    7. Nikolajs Korolevs. Atmel Risc-Microcontrollers // Chip-News 1998, №2
    8. Nikolajs Korolev, Dmitrijs Korolev AVR: Jauni 8 bitu Risc-mikrokontrolleri uzņēmuma Atmel // Mikroprocesoru apskats, 1998, №1

    Kaut kā nekavējoties izvilka, lai sniegtu padomus par programmēšanas vides izvēli AVR kontrolieriem. Vienkārši neizmetiet mani čības. Es esmu diezgan mazliet

    Valodas Programmēšana mikrokontrolleriem daudz. Programmēšanas mediji nav pietiekami un salīdzinājumā ar tiem, nepareizi. Nav labāku programmēšanas valodu. Tātad jums ir jāizvēlas vispiemērotākā valoda jums un programmēšanas videi.

    Ja jūs atrodaties brīdī, stāviet izvēles priekšā, par to, ko sākt strādāt, šeit ir daži ieteikumi.

    Bijušā programmēšanas pieredze. Neaizmirstiet iepriekšējo pieredzi programmēšanā. Pat ja tas bija baisik. Pat ja tas bija ilgs laiks skolā. Programmēšana kā velosipēds Ride - jums vienkārši ir jāsāk un ātri atcerēties viss aizmirsts. Sāciet ar BEYSIKA - Vēlāk tas būs vieglāk izvēlēties kaut ko vairāk piemērots jūsu vajadzībām.

    Palīdzēt videi.Vai jūsu draugi raksta uz Pascal? Jums ir atrisināts jautājums - rakstiet uz Pascal! Jūs vienmēr palīdzēsiet Padomei, bibliotēkas tiks izmestas bibliotēkās, sniegs gatavus projektus. Kopumā laimīgi tiks veikti viņu kopienai. Ja jūs darāt gluži pretēji, iegūstiet pretējo rezultātu. Draugi Sishers izklaidēs jūs, kas nolēmis mācīties montētāju. Negaidiet palīdzību.

    Laba AVR programmēšanas grāmata Tas palīdzēs ļoti labi. Diemžēl no tiem ir ļoti maz. Ja jūs rokās ieguva grāmatu, un jūs domājat, ka viss ir ļoti pieejams tajā. - Izmēģiniet. Es neinformēju mācīties ar e-grāmatām, kā pēdējo līdzekli, izdrukāt. Ļoti neērti, lai pārslēgtos starp faila faila vidi un tekstu. Daudz vairāk patīkamāku lasīšanas grāmatu nekavējoties mēģiniet bez traucējumiem, pārslēdzoties, turklāt jūs varat veikt zīmi uz laukiem, uzrakstiet radušās idejas.

    Programmēšana Vidēja vienkāršāka. Ja ir izvēle vairākas programmas jūsu valodas programmēšanas - nav šaubu, izvēlēties vienu, kas ir vieglāk. Ļaujiet tai būt mazāk funkcionālam. Ļaujiet tai apkopot biedējošu piepūstu kodu. Galvenais ir tikai sākt darbu. Pēc tam, kad esat noliecies vienkāršā vidē, jūs viegli dosiet uz moderāku un "pareizu" vidi. Un neklausieties tiem, kas saka, ka jūs zaudēsiet vairāk laika - tie ir nepareizi. Junioru klases skolēni nav lūguši lasīt "karu un mieru", viņi dod viņiem grāmatas vieglāk - ar attēliem.

    Bibliotēkas. Bibliotēku klātbūtne ir pretrunīga mācīties valodu. Protams, vēlāk viņi ievērojami veicinās dzīvi, bet pirmajās "melnajās kastēs" ir nesaprotamas un ne ļoti palīdz izpratne par valodu. No otras puses, tas atvieglo programmas izlasīšanu un ļaut jaunpienācējam, nevis īpaši sasaistīt, veidot sarežģītas programmas. Tātad, viņu klātbūtne nav īpaši garlaicīgi. Vismaz sākumā.

    Efektīvs kods. Programmēšanas vides izvēle, lai studētu programmēšanu tikai tad, cik efektīvi kompilācija ir slikta ideja. Jūs galvenokārt ērti sākat mācīties - ka desmitā lieta ir "pie izejas". Protams, jūs varat vēlāk strādāt pie tā.

    Viznis.Jebkura ierīce uz kuģa kristāla ir jākonfigurē, izmantojot ostas. Procedūra ir diezgan spēcīga un datu lapas ir nepieciešamas. Turklāt ir nianses, kurās jaunpienācējs nav tikai dot. Tāpēc vidējā līmenī ir ļoti vēlams, lai klātbūtni vizares. Izlaidumi ir automātiskie SPI, I2C, USART utt. Automātiskās korekcijas. Jo vairāk ierīces tiek atbalstītas, jo labāk. Atklājiet nepieciešamos perifēros parametrus, un pats ķeksi ģenerē kodu, kas sniegs norādītos parametrus. Ļoti vienkāršo dzīvi.


    Vispārīgi ieteikumi Šādai plānošanai sākotnējā posmā jābūt pēc iespējas vienkāršākiem (pat ja primitīvas). Programmēšanas videi jābūt viegli iemācīties (kā jums ir nepieciešams, lai sāktu, mācīties programmēšanu un netērētu laiku uz izvēles iestatījumiem). Ir ieteicams rūsēt. Arī neliedz krievu rokasgrāmatu un programmu piemēriem. Ir vēlams izmantot Crystal firmware iespēju. Tālāk, atstājot programmēšanas pamatus, varat pārvietoties uz sarežģītākiem čaulām.


    Vēl viens ieteikums, visbeidzot, strādā ar īstu kristālu. Nebaidieties to sadedzināt. Uzlabot praktisko pieredzi. Darbs ar emulatoriem (piemēram, proteus), lai gan tas atbrīvosies no lodēšanas dzelzs, bet nekad nevarēs sniegt apmierinātību, ka jūs saņemsiet no nopelnītās programmas, pirmās krūzes ar LED! Izpratne par to, ko jūs darījāt ar savām rokām Reālā darba ķēde ieplūst uzticību un stimulu pārvietoties!

    (Apmeklēja 7 377 reizes, 1 apmeklējumi šodien)

    Programmētājs koncepcija par LPT portu ir parādīts attēlā. Kā riepu, izmantojiet 74C 244 vai 74HC244 mikroshēmu (K1564AP5), 74LS244 (K5555AP5) vai 74als244 (K1533AP5).

    VD1 LED norāda mikrokontrollera ierakstīšanas režīmu, \\ t

    vD2 LED - lasījums,

    vD3 LED - diagrammas klātbūtne.

    Sistēmas darbināšanai nepieciešamais spriegums no ISP savienotāja, I.E. no programmējamas ierīces. Šī shēma ir pārstrādāta STK200 / 300 programmētājs (pievienoti LED vieglai darbībai), tāpēc tas ir saderīgs ar visām PC programmētāju programmām, kas darbojas ar STK200 / 300 shēmu. Strādāt ar šo programmētāju, izmantojiet programmu Cvavr.

    Programmētāju var veikt uz drukātās shēmas kuģa un ievietot to LPT savienotāja korpusā, kā parādīts attēlos:




    Lai strādātu ar programmētāju, tas ir ērti izmantot LPT paplašinātāju no ostas, kas ir viegli, lai sevi (piemēram, no CABLERONIX kabeļa printerim), galvenais ir "ne nožēlot" vadītāji par Zeme (18-25 kājas savienotāja) vai pirkt. Kabelis starp programmētāju un programmējamo mikroshēmu nedrīkst pārsniegt 20-30 cm.

    Sveiki, dārgie Habrarīti!

    Šajā rakstā es vēlos pastāstīt par to, kā kādu dienu es nolēmu sākt plānot mikrokontrollerus, kas bija vajadzīgi, un ka galu galā izrādījās.

    Mikrokontrolleru tēma ieinteresēja mani uz ilgu laiku, gadu 2001. gadā, bet pēc tam, lai saņemtu programmētāju dzīvesvietā bija problemātiska, un internetā un runā nebija iegādes. Man bija jāatliek šo gadījumu līdz labākajiem laikiem. Un tā, kādu dienu es atklāju, ka labākie laiki nāca, neatstājot māju, jūs varat iegādāties visu, kas man vajadzīgs. Es nolēmu mēģināt. Tātad, kas mums nepieciešams:

    1. programmētājs
    Ir daudz iespēju tirgū - no lētākajiem ISP (in-sistēmas programmēšanas) programmētājiem vairākiem dolāriem, lai spēcīgu atkļūdotāju programmētājiem pāris simti. Bez lielākas pieredzes šajā jautājumā, vispirms es nolēmu izmēģināt vienu no vienkāršākajiem un lētākajiem - USBASP. Es nopirku vienā reizē eBay par $ 12, tagad jūs varat atrast pat par $ 3-4. Faktiski, šī ir Ķīnas versija programmētājs no Thomas Fischl. Ko es varu teikt par viņu? Tikai viena lieta - tā darbojas. Turklāt ir diezgan daudz atmežas AVR kontrolieru AVR kontrolieri un nolaupīti. Saskaņā ar Linux neprasa vadītāju.

    Firmware, jums ir nepieciešams savienot VCC, GND, Atiestatīt, SCK, MOSI, MISO programmētāju izejas ar atbilstošiem mikrokontrollera izejām. Vienkāršībai es savācu papildu shēmu tieši vīriešiem:

    Pa kreisi uz kuģa - tas pats mikrokontrolleris, ko mēs gatavojamies mirgot.

    2. mikrokontrolleris
    Ar mikrokontrollera izvēli es ne īpaši apgrūtinājos un ņēma atmega8 no Atmel - 23 I / O priedes diviem 8 bitu taimeri, viena 16 bitu, frekvence - līdz 16 MHz, mazs patēriņš (1-3.6 mA) , lēti ($ 2). Kopumā, lai sāktu - vairāk nekā pietiekami.

    Saskaņā ar Linux, lai apkopotu un lejupielādētu programmaparatūru uz kontroliera, AVR-GCC + Avrdede komplekts darbojas perfekti. Uzstādīšana Trivial. Pēc instrukcijām jūs varat instalēt visu nepieciešamo dažu minūšu laikā. Vienīgie nans, kas būtu jāmaksā - Avrdude (programmatūra ierakstīšanai uz kontroliera) var pieprasīt super lietotāja tiesības piekļūt programmētājam. Iziet - palaist cauri sudo (nav ļoti laba ideja) vai reģistrēt īpašas UDEV tiesības. Sintakse var atšķirties dažādās OS versijās, bet manā gadījumā (Linux Mint 15) ir veikts, pievienojot šādu noteikumu uz /etc/udev/rules.d/41-atmega.rules failu:

    # USBASP programmētājs apakšsistēma \u003d\u003d "USB", ate (idvendor) \u003d\u003d "16C0", at (idproduct) \u003d\u003d "05DC", grupa \u003d "spraudnis", režīms \u003d "0666"

    Pēc tam, protams, ir nepieciešams restartēt pakalpojumu.
    Pakalpojums UDEV restartēšana
    Jūs varat apkopot un zibspuldzi bez problēmām tieši no komandrindas (kas apšauba), bet, ja ir daudz projektu, tas ir ērtāk ievietot spraudni un darīt visu tieši no aptumsuma vides.

    Saskaņā ar Windows būs jāsniedz vadītājs. Pārējā gadījumā nav problēmu. Zinātniskai interesei es mēģināju AVR Studio + Extreme Burner Bundle sistēmā Windows. Atkal, viss strādā ar sprādzienu.

    Mēs sākam programmēšanu

    AVR regulatoru programmēšana var būt gan montētājs (AVR montētājs) un C. Šeit es domāju, ka ikvienam ir jādara viņa izvēle atkarībā no konkrētā uzdevuma un tās vēlmēm. Personīgi es pirmo reizi sāku atlasīt montētāju. Programmēšana montētājs, ierīces arhitektūra kļūst skaidrāka, un sajūta šķiet, ka tās izrakt tieši kontroliera iekšpusē. Turklāt es uzskatu, ka īpaši kritiskās programmas, montāžas zināšanas var būt ļoti noderīgas. Pēc iepazīšanās ar AVR montētāju es esmu pāriet uz SI.

    Pēc iepazīšanās ar arhitektūru un pamatprincipiem es nolēmu savākt kaut ko noderīgu un interesantu. Mana meita man palīdzēja, viņa darīja šahu un viens skaists vakars paziņoja, ka viņš vēlas, lai taimeris skatīties partijas uz brīdi. Batz! Šeit tas ir - ideja par pirmo projektu! Bija iespējams pasūtīt tos tajā pašā eBay, bet es gribēju, lai padarītu savu pulksteni, ar melnu ... uh ... ar indikatoriem un pogām. Ne agrāk teica, nekā izdarīts!

    Kā displejs tika nolemts izmantot divu 7 segmentu diodes indikatoru. Lai kontrolētu, tas bija pietiekami 5 pogas - "Player 1", "spēlētājs 2", "reset", "iestatījums" un "pauze". Nu, neaizmirstiet par skaņas indikāciju. Izskatās, ka tas ir tas. Zemāk redzamajā attēlā ir redzams, ka mikrokontrollera pievienošanas vispārējā diagramma uz indikatoriem un pogām. Viņai būs nepieciešams, analizējot programmas pirmkodu:

    AULDING LIDY

    Sāksim, jo \u200b\u200btas būtu, no ieejas punkta programmas - galvenās funkcijas. Faktiski nekas nenozīmīgs tajā nav - ostu, datu inicializācijas un bezgalīgas pogas nospiešanas pogas iestatīšana. Nu, SEI () zvans ir izšķirtspēja pārstrādes pārtraukumiem, par tiem nedaudz vēlāk.

    Int galvenais (void) (init_io (); init_data (); Sound_off (); SEI (); bet (1) (rokturis_buttons ();) atgriešanās 0;)
    Apsveriet katru funkciju atsevišķi.

    Void init_io () (// izvade DDRB \u003d 0XFF; DDRD \u003d 0XFF; // SET INPUT DDRC \u003d 0B11100000; // Pull-up rezistori portsc | \u003d 0B00011111; // taimeris pārtrauc Timsk \u003d (1<

    I / O ostu iestatīšana ir ļoti vienkārša - uz DDRX reģistru (kur x ir burts, apzīmē portu) numuru, katrs no tiem nozīmē, vai atbilstošā PIN būs ievades ierīce (atbilst 0) vai produkcija (atbilst 0) uz 1). Tādējādi, seasushal DDRB un DDRD numuru 0xff, mēs veicām B un D izejas ostas. Attiecīgi, DDRC \u003d 0B11100000 komandu; Pagriež pirmās 5 portu C ports ievades tapās un atlikušo nedēļas nogalē. Komanda portsc | \u003d 0b00011111; Ietver iekšējās stingrākas rezistorus uz 5 kontroliera ievadiem. Saskaņā ar shēmu, pogas ir savienotas ar šiem izejvielām, kas, kad nospiests tiek slēgti tos uz zemi. Tādējādi kontrolieris saprot, ka poga ir nospiesta.

    Tālāk jūs ievērojat divu taimeru, taimera un taimera1 iestatījumu. Mēs izmantojam pirmo, lai atjauninātu rādītājus, un otrais - par laika atskaiti, pēc tam, kad to iestatījis katru sekundi. Detalizēts visu konstantu apraksts un taimera iestatīšanas metode noteiktam intervālam var atrast atmeža8 dokumentācijā.

    Pārstrādes pārtraukums

    ISR (displejs (); ja (_buzzer\u003e 0) (_buzzer--; ja (_buzzer \u003d\u003d 0) Sound_off ()) ISR (TIMER1_COMPA_VECT) (ja (Activetimer \u003d\u003d 1 && taimeris1\u003e 0) (taimeris1--- ; ja (taimeris1 \u003d\u003d 0) process_timeoff ();) Ja (Activetimer \u003d\u003d 2 && taimeris2\u003e 0) (taimeris2--; ja (taimeris2 \u003d\u003d 0) process_timeoff ();))

    Kad taimeris tiek aktivizēts, kontrole tiek nosūtīta uz atbilstošo pārtraukuma apstrādātāju. Mūsu gadījumā tas ir Timer0_ovf_vect procesors, kas izraisa laika produkcijas procedūru indikatoriem un taimeris1_compa_vect, kas apstrādā atpakaļskaitīšanu.

    Secinājums rādītājiem

    Void displejs () (display_number ((TIMER1 / 60) / 10, 0B00001000); _Delay_ms (0,25); display_number ((taimeris1 / 60)% 10, 0B00000100); _delay_ms (0,25); display_number ((taimeris1% 60) / 10, 0B0000000010); _delay_ms (0,25); display_number ((taimeris1% 60)% 10, 0B00000001); _delay_ms (0,25); display_number ((taimeris2 / 60) / 10, 0B10000000); _delay_ms (0,25); display_number ((taimeris2); / 60)% 10, 0B01000000); _delay_ms (0,25); display_number ((taimeris2% 60) / 10, 0B00100000); _delay_ms (0,25); display_number ((taimeris2% 60)% 10, 0B00010000); _delay_ms (0,25); _delay_ms (0,25); ; portd \u003d 0;) void display_number (int numurs, int maska) (Portb \u003d numurs_mask (numurs); Portdd \u003d maska;)

    Displeja funkcija izmanto dinamisku indikācijas metodi. Fakts ir tāds, ka katram individuālajam indikatoram ir 9 kontakti (7 segmentu kontrolei, 1 punktu un 1. punktu). Lai kontrolētu 4 ciparus, tas aizņems 36 kontaktus. Pārāk izšķērdīgs. Tāpēc izplūdes produkcija uz vairāku ciparu indikatoru tiek organizēts saskaņā ar šādu principu:

    Spriegums ir pārmaiņus baroti katrā no kopīgajiem kontaktiem, kas ļauj izcelt vēlamo skaitli attiecīgajā indikatorā, izmantojot tos pašus 8 kontroles kontaktus. Ar pietiekami augstu izejas frekvenci tas izskatās kā statisks attēls. Tas ir iemesls, kāpēc visi 8 piegādes kontakti abiem rādītājiem diagrammā ir savienoti ar 8 ostām ostas D, un 16 kontaktu kontroles segmenti ir savienoti pa pāriem un savienots ar 8 ostām Ostas B. Tādējādi displeja funkcija ar kavēšanos 0,25 MS pārmaiņus parāda vēlamo numuru katram no rādītājiem. Galu galā visi izejas, kas baro spriegumu uz rādītājiem, ir izslēgti (komanda Portdd \u003d 0;). Ja tas nav izdarīts, tad pēdējais displeja cipars turpinās sadedzināt, līdz nākamais zvans tiek saukts par displeja funkciju, kas novedīs pie tā spilgtākas luminiscences salīdzinājumā ar pārējo.

    Preses ārstēšana

    Void rokturis_buttons () (rokturis_button (key_Setup); rokturis_button (key_reset); rokturis_button (key_Pause); rokturis_button (key_player1); rokturis_button (key_player2);) void_player2); \u003d Setup_bit; pārtraukums; CASE taustiņš_reset: bit \u003d reset_bit; pārtraukums; case key_pause: bit \u003d pause_bit; pārtraukums; case key_player1: bit \u003d atskaņotājs11_bit; pārtraukums; bit \u003d atskaņotājs;), ja (bit_is_clear ( Poga_pin, bits)) (ja (_Pressed \u003d\u003d 0) (_delay_ms (debunēt_time); ja (bit_is_clear (poga poga, bit))) (_Pressed | \u003d taustiņš; // atslēga darbības slēdzis (taustiņš): process_setup (); pārtraukums; CASE taustiņš : Process_reset (); pārtraukums; lieta key_pause: Process_Pause (); pārtraukums; CASE taustiņš_player1: process_player1 (); pārtraukums; lieta key_player2: process_player2 (15); pārtraukums;), cits (_pressed & \u003d ~ atslēga) ;))

    Šī funkcija savukārt aptaujas visas 5 pogas un procesus, ja tāds ir noticis. Presēšana tiek reģistrēta, pārbaudot bit_is_clear (poga_pin, bit), i.e. Poga tiek nospiesta, ja ievade atbilst tam ir savienots ar zemi, kas notiks saskaņā ar shēmu, nospiežot pogu. Lai izvairītos no vairākām nevajadzīgām atbildēm, ir nepieciešama aizkavēta kavēšanās ilgums, lai izvairītos no vairākām nevajadzīgām atbildēm sakarā ar kontaktu rakteļiem. Saglabājot preses statusu atbilstošos mainīgos bitos _Pressed tiek izmantots, lai novērstu atkārtotu aktivizēšanu ar ilgu nospiešanas pogu.
    Nospiežot funkcijas ir diezgan trivial un uzskata, ka papildu komentāros nav nepieciešams.

    Pilna teksta programma

    #Define f_cpu 4000000L #include #Include. #Include. #define debunēt_time 20 #define poga_bit pc0 #define setup_bit pc0 #define reset_bit pc1 #define pupere1_bit pc2 #define player1_bit pc3 #define atskaņotājs2_bit pc4 #define key_Setup 0b0000000010 #define key_pause 0B00000100 #define key_player1 0B00001000 #define key_player2 0b00010000 key_player2 0b00010000 gaistošs int Activetimer \u003d 0; Gaistošs int taimeris1 \u003d 0; Gaistošs int timer2 \u003d 0; gaistošs int _buzzer \u003d 0; Gaistošs int _pressed \u003d 0; // funkciju deklarācijas void_io (); void init_data (); Int numurs_mask (int numurs); void rokturis_buttons (); void handl_button (INT atslēga); Void process_setup (); Tukša process_reset (); void process_pause (); void process_timeoff (); Void process_player1 (); Void process_player2 (); void displejs (); void display_number (int maska, int numurs); Void sound_on (int intervāls); void sound_off (); // pārtrauc ISR (displejs (); ja (_buzzer\u003e 0) (_buzzer--; ja (_buzzer \u003d\u003d 0) Sound_off ();) ISR (TIMER1_COMPA_VECT) (ja (Activetimer \u003d\u003d 1 && taimeris1\u003e 0) ( Timer1--; ja (taimeris1 \u003d\u003d 0) process_timeoff (), ja (Activetimer \u003d\u003d 2 && taimeris2\u003e 0) (taimeris2--; ja (taimeris2 \u003d\u003d 0) process_timeoff ();)) int galvenais (tukšums);) (init_io (); init_data (); Sound_off (); SEI (); kamēr (1) (rokturis_buttons ();) atgriešanās 0;) void_io () (// izvades izejas DDRB \u003d 0xff; DDRD \u003d 0xff; // komplekts INPUT DDRC \u003d 0B11100000; // pull-up rezistori portsc | \u003d 0b00011111; // taimeris pārtrauc Timsk \u003d (1< 5940 || Taimeris2\u003e 5940) (taimeris1 \u003d 0; taimeris2 \u003d 0;)) void process_reset () (init_data ();) void process_timeoff () (init_data (); sound_on (30);) void process_pause () (activetimer \u003d 0;) void process_player1 () (activetimer \u003d 2;) void process_player2 () (aktīvs) _player2 () (activetimer \u003d 1;) void hands_button (int taustiņš) (Key_Setup: bit \u003d setup_bit; pārtraukums; case key_reset: bit \u003d reset_bit; pārtraukums; CASE taustiņš_Pause: bit \u003d pause_bit; pārtraukums; case key_player1: bit \u003d atskaņotājs1_bit; pārtraukums; case key_player2: bit \u003d atskaņotājs2_bit; pārtraukums; noklusējums: atgriešanās;), ja (ja (_pressed \u003d\u003d 0) (ja (_pressed \u003d\u003d 0) (ja (_pressed \u003d\u003d 0) (ja (_pressed \u003d\u003d 0) _Delay_ms (debunēt_imtive); ja (bit_is_clear (poga_pin, bit)) (_Pressed | \u003d atslēga; // key_Setup: process_Setup (); pārtraukums; case key_reset: process_reset (); pārtraukums; lieta key_pause: Process_Pause (); pārtraukums; lieta key_player1 : Process_player1 (); pārtraukums; case key_player2: process_player2 (); pārtraukums;) Sound_on (15);))) cits (_pre Ssed & \u003d ~ atslēga; )) Void rokturis_buttons () (Handl_button (key_Setup); rokturis_button (Key_reset); rokturis_button (key_Pause); rokturis_button (key_player1); rokturis_button (key_player2);) void displejs () (display_numer ((timer1 / 60) / 10, 0B00001000) ; _Delay_ms (0,25); display_number ((taimeris1 / 60)% 10, 0B00000100); _delay_ms (0,25); display_number ((taimeris1% 60) / 10, 0B00000010); _delay_ms (0,25); displejs_number ((taimeris1% 60) % 10, 0B0000000001); _delay_ms (0,25); display_number ((taimeris2 / 60) / 10, 0B10000000); _delay_ms (0,25); display_number ((taimeris2 / 60)% 10, 0B01000000); _delay_ms (0,25); display_number ((0,25); Timer2% 60) / 10, 0B00100000); _delay_ms (0,25); display_number (((taimeris2% 60)% 10, 0B00010000); _delay_ms (0,25); portdd \u003d 0;) void displejs_numer (int numurs_mask) (Portb \u003d numurs_mask ( Numurs); PORTD \u003d maska;) VOID SOUND_ON (INT intervāls) (_buzzer \u003d intervāls; // Put Buzzer Pin High Peldc | \u003d 0B00100000;) Void Sound_off () (// Put Sound_off () (// Put Sound_off () (// Put Sound_off () (// Put Sound_off () (// Put Sound_off () (// Putum_0000);)

    Prototips tika samontēts dempinga padomē.