AVR: AVR Studio muhitida dasturlash. Atmel Avr studiodan AVR Studio integratsiyalashgan disk raskadrovka muhiti

AVR Studio 4 bilan ishlash uchun uni o'zingiz o'rnatishingiz kerak. Agar u allaqachon o'rnatilgan bo'lsa, bu bosqichni o'tkazib yuborishingiz mumkin.

O'rnatish:
c:/avr/ katalogini yarating - bu yerda ishchi dasturlar joylashadi.
katalog yarating, masalan c:/works/ – bu yerda sizning ishlaringiz saqlanadi.
Ular bilan hech qanday muammo bo'lmasligi uchun yorliqlar bo'lishi kerak.

Odatda AVRStudio5 mavjud, ammo AVRStudio4 hali ham etarli.

Barcha ishlar AVRStudio4 da bo'lib o'tadi, WinAVR faqat AVR-GCC kutubxonasi tufayli kerak bo'ladi (Shuning uchun siz C da yozishingiz mumkin)
LEKIN! Avval WinAVR-ni o'rnatishingiz kerak, aks holda AVR-GCC kutubxonasi olinmaydi.

O'ylaymanki, siz buni shu erda tushunasiz.
C tilida yozish uchun AVR-GCC
Assembler uchun mos ravishda Atmel Avr Assembler.

MKni noldan tushunishni boshlash yaxshiroqdir. Va bu Assembler-dan anglatadi, ya'ni siz Atmel AVR Assembler-ni yaratasiz.

Keyin Atmega8 mikrokontrollerini tanlang.

loyiha yaratilganda, katta, oq, bo'sh varaq bo'ladi. bu erda kod bo'ladi.

ushbu varaqning mazmuni haqida bir oz

"Izohlar" - kompilyator kompilyatsiya qilishda o'tkazib yuboradigan matn.
sharh boshlanishidan oldin maxsus belgi bo'lishi kerak, men belgidan foydalanaman; "Nuqtali vergul", shuningdek, "ikki chiziq" (//) mavjud
bu erda sharhlar misollari

/* * Ushbu turdagi sharh (ko'p qatorli), * odatda * manba kodi haqidagi * qo'shimcha ma'lumot uchun ishlatiladi, ya'ni. * ism, ishlab chiquvchi va boshqalar. */ NOP // Bu izoh asosan buyruq maqsadini yoki SLEEP kodini tushuntirish uchun ishlatiladi; Ushbu sharh, xuddi oldingi kabi, koddagi tushuntirish uchun (eslatmalar uchun) ishlatilishi mumkin

buyruqlar har bir satrda yoziladi. bular. bitta buyruq - bitta qator.
Aytaylik, ikkita "parametrli" buyruqlar mavjud, bittasi bilan yoki hech narsasiz

MOV R16, R17; ikkita parametr INC R16; bitta SEI parametri; parametrlarsiz

MOV R16, R17; uch bayt INC R16; ikki bayt SEI; bir bayt

Jamoa hajmi va parametrlari o'rtasidagi bog'liqlikni ko'ryapsizmi?

Har bir mikrokontroller o'z assembleriga ega, garchi ularning mnemonikasi o'xshash bo'lsa-da, ya'ni. Bitta seriyali MK uchun MOV buyrug'i mashina kodida ko'rinadi, masalan, 0x12 va boshqasi uchun 0x55.
Shunday qilib, kompilyatsiya paytida u bizga kerak bo'lgan kodda kompilyatsiya qilinadi, biz kompilyatorga qaysi mikrokontroller uchun dastur yozayotganimizni aytishimiz kerak.
Bu odatda loyiha yaratishda tanlanadi.
Shuning uchun biz Atmega8 mikrokontrollerini tanladik.

Lekin bu hammasi emas. Hayotimizni osonlashtirish uchun AVRStudio4-da "Makroassembler" deb ataladigan doimiylar to'plami mavjud.

Ularni yuklash uchun siz kodning boshiga qatorni kiritishingiz kerak

"m8def.inc" ni qo'shing // .include buyrug'i yordamida biz m8def.inc faylini yukladik; endi bu biz uchun osonroq bo'ladi;)

Kodning eng boshida uzilishlar jadvali joylashtirilgan. Bu nima ekanligini va qanday ishlashini boshqa maqolada tushuntiraman. Ammo hozircha buni shunday yozamiz:

RJMP RESET; RETI ishlov beruvchisini qayta o'rnatish; RJMP EXT_INT0; IRQ0 ishlov beruvchisi RETI; RJMP EXT_INT1; IRQ1 ishlov beruvchisi RETI; RJMP TIM2_COMP; Timer2 solishtiruvchi ishlov beruvchi RETI; RJMP TIM2_OVF; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT; Timer1 Capture Handler RETI; RJMP TIM1_COMPA; Timer1 CompareA Handler RETI; RJMP TIM1_COMPB; Timer1 CompareB Handler RETI; RJMP TIM1_OVF ; Timer1 Overflow Handler RETI; RJMP TIM0_OVF ; Timer0 Overflow Handler RETI; RJMP SPI_STC; SPI Transfer Complete Handler RETI; RJMP USART_RXC; USART RX Complete Handler RETI; RJMP USART_UDRE; UDR Empty Handler RETI; RJMP USART_TXC; USART TX Complete Handler RETI; RJMP ADC; ADC Conversion Complete Handler RETI; RJMP EE_RDY; EEPROM Ready Handler RETI; RJMP ANA_COMP; Analog taqqoslash moslamasi RETI; RJMP TWSI; Ikki simli ketma-ket interfeys ishlovchi RETI; RJMP SPM_RDY; Dastur xotirasiga tayyor ishlov beruvchini saqlang

Shundan so'ng kodning o'zi keladi

QAYTA ISHGA TUSHIRISH: ; ishga tushirish tokeni MAIN: NOP ; asosiy halqa belgisi RJMP MAIN

Ammo bitta (aniqrog'i bitta emas, balki ko'p) xususiyatlar mavjud.

Kodni yozish qulayligi, ravshanligi va nisbiy o'tishlarni osonlashtirish uchun bizga markerlar berildi, ular qanday ko'rinishga ega? “RESET:” va “MAIN:” markerlar bo‘lib, ularning nomlarida deyarli barcha lotin harflari va raqamlari bo‘lishi mumkin. Markerlarda funksiyalar va buyruqlar nomlari bo'lishi mumkin emas, masalan, "NOP".
Ularga qanday qilib erishish mumkin? Keling, RJMP buyrug'ini aytaylik.

Shuningdek, Markerlardan biz pastki dastur (protsedura) yaratishimiz mumkin, uni tugatgandan so'ng biz chaqirilgan joyga qaytamiz. Unga qo'ng'iroq qilish uchun "RCALL (pastki dastur)" buyrug'idan foydalaning va pastki dasturdan (protsedura) qaytish uchun uni "RET" buyrug'i bilan tugatishingiz kerak. Biz shunday kod bilan yakunlashimiz kerak:

Qayta boshlash: ASOSIY: NOP RCALL PPP1 ; RJMP MAIN PPP1 kichik dasturini chaqiring: NOP RET ; pastki dasturdan chiqing

“RCALL” buyrug'i qanday ishlaydi, u chaqirilganda u chaqirilgan manzil STACKga joylashtiriladi, “RET” buyrug'i chaqirilganda esa “stek” registridan olib tashlanadi. STACK ishga tushirilishi kerak.

MK bilan ishlashimiz uchun uni ishga tushirishimiz kerak. chunki mk, bu qurilma universal bo'lib, unda ko'plab kirish/chiqish portlari va periferik qurilmalar mavjud. USART, PWM, DAC, ADC va boshqalar kabi. Mikrokontrollerni ishga tushirishning birinchi bosqichi "stack" ning boshlanishini ko'rsatishdir. Biz "RESET:" belgisidan keyin ishga tushirishni amalga oshiramiz.

LDI R16, HIGH (RAMEND) OUT SPH, R16 LDI R16, LOW (RAMEND) OUT SPL, R16

Agar biz kod boshida .include “m8def.inc” buyrug‘ini kiritmaganimizda, uni quyidagicha yozishimiz kerak edi:

LDI R16,0x04 OUT SPH,R16 LDI R16,0x5f OUT SPL,R16

Menimcha, farq sezilarli.

STACK - bu do'kon tipidagi xotira: (oxirgi kirish, birinchi chiqish).
Do'kon turi supermarket emas, balki avtomatdan olingan shox. Umid qilamanki, har bir kishi unga patronlar qanday yuklanganligini va keyin u erdan qanday olib tashlanishini tasavvur qila oladi.
STACK xotirasiga katta e'tibor berish kerak, chunki... u bilan ishlashda har qanday kichik xatolik stekning ishdan chiqishiga olib kelishi mumkin. Bu shunday muhim mavzuki, men unga butun bir mavzuni bag'ishlashga qaror qildim va uni alohida eslatmada yozaman.

Shunday qilib, biz quyidagi kodni oldik:

"m8def.inc" RJMP RESET ni qo'shing; RETI ishlov beruvchisini qayta o'rnatish; RJMP EXT_INT0; IRQ0 ishlov beruvchisi RETI; RJMP EXT_INT1; IRQ1 ishlov beruvchisi RETI; RJMP TIM2_COMP; Timer2 solishtiruvchi ishlov beruvchi RETI; RJMP TIM2_OVF; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT; Timer1 Capture Handler RETI; RJMP TIM1_COMPA; Timer1 CompareA Handler RETI; RJMP TIM1_COMPB; Timer1 CompareB Handler RETI; RJMP TIM1_OVF ; Timer1 Overflow Handler RETI; RJMP TIM0_OVF ; Timer0 Overflow Handler RETI; RJMP SPI_STC; SPI Transfer Complete Handler RETI; RJMP USART_RXC; USART RX Complete Handler RETI; RJMP USART_UDRE; UDR Empty Handler RETI; RJMP USART_TXC; USART TX Complete Handler RETI; RJMP ADC; ADC Conversion Complete Handler RETI; RJMP EE_RDY; EEPROM Ready Handler RETI; RJMP ANA_COMP; Analog taqqoslash moslamasi RETI; RJMP TWSI; Ikki simli ketma-ket interfeys ishlovchi RETI; RJMP SPM_RDY; Dastur xotirasini saqlashga tayyor ishlov beruvchini RESET: LDI R16, HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 RGMP RESET ASOSIY: YO‘Q ; asosiy halqa belgisi RJMP MAIN

Ushbu bosqichda biz loyihani kompilyatsiya qilishimiz va disk raskadrovka uchun ishga tushirishimiz mumkin, ammo bizning kodimiz hech narsa qilmagani uchun biz koddagi sintaktik xatolarni aniqlashimiz mumkin.

To'g'ri disk raskadrovka jarayoni uchun siz emulyatorni MK ishlaydigan chastotani o'rnatishingiz kerak, bu faqat kompilyatsiya va disk raskadrovka boshlangandan keyin amalga oshiriladi,
Bu shuni anglatadiki, biz menyu satrida "Yaratish" ni topamiz, uni ochamiz va "Yaratish va ishga tushirish" ni ko'ramiz, shundan so'ng biz kodlar ro'yxatidagi birinchi buyruq qarshisida sariq o'qni ko'ramiz. Endi biz menyu satrida "Debug" ni qidiramiz va "AVR Simulator Options" ni bosing, quyidagi oyna ochiladi:

Unda biz MK va uning chastotasini o'zgartirishimiz mumkin, shuningdek, o'ngdagi panelda biz MK haqida ba'zi ma'lumotlarni ko'ramiz: uning maksimal chastotasi, xotira hajmi (EEPROM, RAM, FLASH). Endi Atmega8-da 203 (registrlarning umumiy ro'yxati) va 205 (buyruqlarning umumiy ro'yxati) sahifalarida ma'lumotlar jadvalini oching va dasturingizni yozishni boshlang.
Va unutmang, simulyator bilan tajriba qilishdan qo'rqmang, u buzilmaydi!


Salom.

Ushbu maqola Arduinodan "katta bo'lgan" va "jiddiy" mikrokontroller dasturlash dunyosiga qadam qo'yishga tayyor bo'lganlarga ishonadiganlarga yoqadi. Siz "dasturchining mahoratini oshirasiz" dan tashqari, siz o'zingizning loyihalaringiz uchun istalgan mikrokontrollerni tanlash imkoniyatiga ega bo'lasiz va, albatta, siz dasturlarning tezligi va ular egallagan xotira hajmini qadrlaysiz.

Hammasi tasvirlangan bo'ladi (    uchun), boshidan oxirigacha, - kerakli dasturiy ta'minotni o'rnatish va tayyorlash, eng oddiy "Gromov" dasturchisini yig'ish (qo'rqmang, faqat uchta diod va etti rezistor mavjud), MK proshivka va AVR Studio-da kod yozish. Butun jarayon rasmlar va misollar bilan birga bo'ladi.

Darhol band qilishimga ruxsat bering: kompyuter MAQOMOTI porti bilan jihozlangan bo'lishi kerak (USB dan COM adapteri yaxshi ishlamaydi). Agar sizning kompyuteringizning orqa tomonida bunday ulagich bo'lmasa, u ehtimol anakartda (pin shaklida), keyin hamma narsani ushbu "chiqarish" bilan hal qilish mumkin.

Afsuski, MAQOMOTI bo'lmagan noutbuklar egalari uchun maqola faqat ilmiy qiziqish uyg'otadi.

Demak, boshlaylik…

Sizga nima kerak bo'ladi?

"Yumshoq"


UniProf- turli xil ATmega mikrokontrollerlarini miltillash uchun universal dastur, oddiy va qulay, eng muhimi, dasturchimiz bilan mukammal ishlaydi. Muallif rossiyalik dasturchi Mixail Nikolaev.

Albatta, siz MK-ni AVR Studio-dan o'chirib qo'yishingiz mumkin, ammo buning uchun sizga maxsus dasturchi kerak. Shunday qilib, biz kodni studiyada yozamiz va olingan olti burchakli fayllarni uy qurilishi dasturchimiz yordamida UniProf yordamida miltillaymiz. Bundan tashqari, buyruq satridan proshivkani miltillash usuli tasvirlanadi.

Linux foydalanuvchilari virtual mashina yoki Wine-dan foydalanishlari kerak. Men uchun Wine bilan ishlamadi, men portni umuman ko'rmayapman va virtual mashinada sinab ko'rmadim.

  Wine-da benuqson ishlaydi (Debian 8.5, wine1.6).

Barcha dasturiy ta'minot bepul.

"Temir"

Biz tajribalar o'tkazamiz Arduino pro mini ATmega328 chipi bilan. Kvarts chastotasi (8/16 MGts), shuningdek kuchlanish (3,3/5v), farqi yo'q. (pastga qarang)

Kelajakda siz turli xil Atmel mikrokontrollerlarini dasturlaysiz, lekin birinchi marta bu plata to'g'ri. Bu yaxshi, chunki u minimal simlar va lehimli pinlar bilan deyarli yalang'och boshqaruvchi. Faqat sizga kerak bo'lgan narsa.

Mikrokontrollerlardagi belgilar haqida

Ismdan keyin ko'pincha xotira hajmini ko'rsatadigan raqamlar mavjud.

Raqamlardan keyingi harf besleme kuchlanish parametrlarini bildiradi.

Xat yo'q- tekshirgichning besleme zo'riqishida 4,5-5,5 volt oralig'ida.
L- qisqartirilgan tezlikda ishlaydigan kontrollerlarning versiyalari (past) besleme zo'riqishida (2,7 - 5,5 volt).
V- past kuchlanish kuchlanishida ishlaydigan kontrollerlarning versiyalari (1,8-5,5 volt).
U- ultra past kuchlanish kuchlanishida ishlaydigan kontrollerlarning versiyalari (0,7-5,5 volt).
P- kam quvvatli versiyalar (Oʻchirish rejimida 100 nA gacha).
A- barcha versiyalarning butun taktli chastota diapazonini qamrab oluvchi kamaytirilgan oqim iste'moli, besleme zo'riqishida 1,8-5,5 volt (ba'zi modellarda oldingi versiyalar bilan to'liq moslikni saqlab qolgan holda yangi xususiyatlar va yangi registrlar qo'shilgan).

Mikrokontrollerlar « A"va" emas - A"odatda bir xil imzoga ega, bu ba'zi qiyinchiliklarni keltirib chiqaradi, chunki Fuse-bitlari boshqacha.

Misollar:

ATmega8- dastur xotirasi hajmi 8 kilobayt, ta'minot kuchlanishi 4,5-5,5 volt.
ATmega8L- dastur xotirasi hajmi 8 kilobayt, ta'minot kuchlanishi 2,7-5,5 volt.
ATtiny43U- xotira hajmi 4 kilobayt, modifikatsiya - 3, besleme zo'riqishida - 0,7-5,5 volt.
ATtiny44A- xotira hajmi 4 kilobayt, modifikatsiya - 4, oqim sarfini kamaytirish, besleme zo'riqishida 1,8-5,5 volt.

Harfsiz boshqaruvchining kuchlanishi pasaygan bo'lishi mumkin (1,7 yoki 1,8 volt). Bu ma'lumotlar jadvalida aniqlanishi kerak.

ATtiny841- xotira hajmi 8 kilobayt, modifikatsiya - 41, besleme zo'riqishida - 1,7-5,5 volt.

Defisdan keyin mikrokontroller versiyasi ko'rsatilgan bo'lib, u tekshirgichning maksimal chastotasini ko'rsatadigan raqamlardan iborat. (tegishli ta'minot kuchlanishida), va uy-joy variantini, ish harorati oralig'ini va ishlab chiqarish xususiyatlarini ko'rsatadigan harflardan.

Chastotadan keyingi bir yoki ikkita harf uy turini ko'rsatadi:

UniProf
Dastur yozish - bu urushning yarmi; siz hali ham uni boshqaruvchiga qandaydir tarzda kiritishingiz kerak. Shunday ekan, keling, bunga ko'proq e'tibor qarataylik.

Agar Arduino standart Blink bilan yuklangan bo'lsa yaxshi bo'lardi (u bilan birga zavoddan keladi).

UniProf-ni ishga tushiramiz... Ehtimol, quyidagi oyna ochiladi:

Bu LPT portiga ulangan, shuning uchun shunchaki bosing KELISHDIKMI.

Shundan so'ng dastur oynasi ochiladi:

Agar port to'g'ri tanlanmagan bo'lsa, oyna paydo bo'ladi...

OK tugmasini bosing va kerakli portni tanlang.

Agar MK avtomatik ravishda aniqlanmasa, qo'lda tanlash oynasi paydo bo'ladi:

Afsuski, ro'yxatda yo'q atmega328, shuning uchun biz tanlaymiz mega32 (ular bir xil miqdordagi flesh xotiraga ega) va bosing KELISHDIKMI.

Shundan so'ng noma'lum so'z o'rniga ulangan kontroller paydo bo'ladi...

32 ming- Flash xotira hajmi, va 1024 - EEPROM hajmi.

Endi, agar hamma narsa rasmdagidek bo'lsa, unda   yordamini oching va u erda yozilgan narsalarni diqqat bilan o'qing. Muallif juda qisqa edi, shuning uchun ko'p vaqt talab qilmaydi. Hali hech qanday tugmani bosmang.

Siz uchrashdingizmi? Ajoyib, endi davom etishimiz mumkin. EEPROM yonidagi katakchani olib tashlang va siz o'zgartirilgan interfeysni ko'rasiz:

EEPROM katagiga belgini olib tashlangandan so'ng, ushbu xotira maydonini o'qish va yozish amalga oshirilmaydi.

Biz olti burchakli fayllar bilan ishlaganimiz sababli, biz "tasdiqlash belgilarini" olib tashlaymiz. General Va BIN, shuningdek, katakchani belgilang Tormoz!, bu o'qish/yozish vaqtini oshiradi, lekin barqarorlikni oshiradi.

Jarayon tez emas, shuning uchun siz kutishingiz kerak. Moviy kvadratlar quyida emaklab o'tadi va pastki o'ng burchakda raqamlar hisoblanadi. Birinchi o'tish PROGRAM maydonini, ikkinchisi esa EEPROMni o'qiydi.

Menda standart Blink o'rnatilgan yangi Arduino bor (dasturchi ulanganda, diod miltillashni to'xtatadi). Agar sizda ham xuddi shunday bo'lsa, quyidagi rasm paydo bo'ladi:

O'ng tomonda biz EEPROM-da hech narsa yo'qligini ko'ramiz, chapda esa PROGRAM-da yozilgan dastur mavjud. (Aytganimdek, bu Blink). Endi maʼlumotlar tugaguncha slayderni aylantirish uchun pastga oʻqdan foydalaning...

... endi oxirigacha aylantiring. Siz ko'proq ma'lumotlarni ko'rasiz - bu Arduino bootloader.

Endi men maqolamdan tanaffus qilishni va MK tuzilishi haqida o'qishni taklif qilaman, bu sizning materialni tushunishingizni sezilarli darajada oshiradi. Hammasi juda yaxshi va aniq yozilgan. Xo'sh, uni o'qib bo'lgach, qaytib keling va davom etaylik ...

belgisini olib tashlang EEPROM. Bizga bu haqiqatan ham kerak emas, lekin "belgi" borligi aniq bo'ladi Tormoz!

Keling, proshivka bo'lgan hamma narsani tekshirgichda saqlaymiz, shunda tajribalardan so'ng uni asl holatiga qaytarishimiz mumkin.

  tugmasini bosing va proshivkani saqlang, uni quyidagi kabi chaqiring: origProMini328.hex. Mana, endi sizda zaxira bor.

... va keyin allaqachon tanish bo'lgan O'qish tugmasini bosing. Shundan so'ng siz PROGRAMdagi barcha katakchalar bo'sh ekanligini ko'rasiz. Nafaqat dastur, balki Arduino bootloader ham olib tashlandi.
Ya'ni, endi siz an'anaviy usuldan foydalangan holda eskizlarni yuklay olmaysiz. Keyin, agar xohlasangiz, qo'lingizning engil to'lqini bilan hamma narsani zaxiradan tiklang.

Endi biz kontrollerni faqat AVR Studio-da yozilgan bir xil "Blink" bilan yondiramiz.

Kod shunday ko'rinadi:

#define F_CPU 16000000UL #include #o'z ichiga oladi #define PIN_PB5 5 // PB5 (Arduino - D13) #define PIN_PB5_PORT PORTB #define PIN_PB5_DDR DDRB int main(void) ( PIN_PB5_DDR = 1<< PIN_PB5; // устанавливаем PIN_PB5 (PB5 (ардуина - D13)) как ВЫХОД while(1) { PIN_PB5_PORT = 1 << PIN_PB5; _delay_ms(300); PIN_PB5_PORT = 0 << PIN_PB5; _delay_ms(300); } return 0; }
Agar siz 8 MGts kvartsli Arduino dan foydalansangiz, unda buning hech qanday yomon joyi yo'q, diod faqat yarim marta miltillaydi.

Mana qancha joy egallaydi:

AVRDude

Uniprof, boshqa shunga o'xshash dasturlar kabi, AVRDude dasturining faqat grafik qo'shimchasidir (AVR Downloader-Yuklash vositasi), keyin mikrokontrollerda yuqorida tavsiflangan barcha amallarni bajaradi.
Chunki AVRDude o'zining grafik interfeysiga ega emas, siz u bilan buyruq satridan ishlashingiz kerak. Bu ba'zilar uchun noqulay bo'lib tuyulishi mumkin, ammo buning aksi; konsoldan ishlash juda yaxshi. Qulay, sodda va hech qanday OS bilan bog'lanmagan, chunki avrdude, ehtimol, hamma narsa uchun mavjud. Endi buni ko'rasiz.

Foydalanuvchilar uchun

Avrdude AVR asboblar zanjiriga kiritilgan, shuning uchun uni o'rnating (AVR Studio o'rnatilgandan keyin) maqolaning boshida yozilganidek.

CD\
...diskning ildiziga o'ting BILAN.

Buyruqni kiritish orqali:

Agar shunday bo'lsa, unda avrdude borishga va davom etishga tayyor.

Endi biz dasturchimizni konfiguratsiya fayliga qo'shishimiz kerak avrdude (C:\Program Files (x86)\Atmel\AVR Tools\AVR Toolchain\bin\ avrdude.conf) . Uni dasturda oching Notepad++ va “DASTUR TA’RIFLARI” yozuvidan keyin quyidagi qatorlar qo‘shilsin:

Dasturchi identifikatori = "gromov"; desc = "seriyali port portlashi, reset=dtr sck=rts mosi=txd miso=cts"; turi = serbb; qayta o'rnatish = 4; scck = 7; mosi = 3; miso = 8; ;
Bitta urish.

Faylni saqlang va yoping; u endi kerak emas.

Terminalga qayting va MK va dasturchi o'rtasidagi aloqani tekshirish buyrug'ini bering:

Avrdude -n -c gromov -P com1 -p m328p
Sizda boshqa com port bo'lishi mumkin.

O'rnatish avrdude

Sudo apt o'rnatish avrdude

Buyruqni kiritish orqali:

Yordam ma'lumotlarini ko'rishingiz kerak.

Agar shunday bo'lsa, unda avrdude ishga tayyor.

Portni sozlang:

Sudo stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflshBuni har bir kompyuter qayta ishga tushirilgandan so'ng qilish kerak yoki uni rc.local-ga qo'shish kerak.

Bu erda /dev/ttyS0 com1, /dev/ttyS1 - com2 va hokazo.
Kelajakda jamoalarda yozaman /dev/ttyS0, bo'lishi mumkin /dev/ttyS1 va hokazo.

Dasturchini konfiguratsiya fayliga qo'shing /etc/avrdude.conf

Sudo nano /etc/avrdude.conf

"DASTUR TA'RIFLARI" dan keyin quyidagi qatorlarni qo'shing:

Dasturchi identifikatori = "gromov"; desc = "seriyali port portlashi, reset=dtr sck=rts mosi=txd miso=cts"; turi = "serbb"; qayta o'rnatish = 4; scck = 7; mosi = 3; miso = 8; ;
Dasturchi Bit-banging texnologiyasidan foydalanadi.

Nusxalashda tirnoqlar shunchaki tirnoq bo'lib qolishiga ishonch hosil qiling, aks holda ular o'zgarishi mumkin (kodlashlardagi farq tufayli) va avrdude qasam ichadi.

Faylni saqlang va yoping.

MK va dasturchi o'rtasidagi aloqani tekshirish uchun buyruq bering:

Sudo avrdude -n -c gromov -P /dev/ttyS0 -p m328p

Agar aloqa mavjud bo'lsa, javob quyidagicha bo'ladi:

Bu erda operatsion tizimlar orasidagi farqlar tugaydi va buyruqlar takrorlanadi.

Buyruqga argument qo'shing -v yoki -v -v (har qanday buyruqlarga qo'shilishi mumkin) to'liq ma'lumotni ko'rsatish uchun:

Avrdude -n -v -c gromov -P com1 -p m328p ###WIN###
sudo avrdude -n -v -c gromov -P /dev/ttyS0 -p m328p ###Linux###


Avrdudening xulosasi shuki, Windowsda ham, Linuxda ham bir xil, shuning uchun bundan buyon men skrinshotlarni faqat Win-da olaman.

Bu erda ko'proq ma'lumot mavjud, masalan, qanday sigortalar o'rnatilganligini ko'rishingiz mumkin. Bu erda ular o'n oltilik tizimda chiqariladi (HEX) raqamlar. Masalan, hfuse 0xDA, ikkilik formatda bu shunday ko'rinadi - . Ya'ni, bu grafik interfeyslarda o'chirilgan bir xil bitlar.

Sigortalar bilan ishlaganda, ATmega mikrokontrolörlarida sigortalar teskari ekanligini unutmang. Ya'ni 0 - Bu yoqilgan Yucheno va 1 - o'chirilgan Yucheno. Bu onlayn kalkulyatorlarda chalkashliklarni keltirib chiqaradi (pastga qarang).

Keling, proshivkani hududdan o'qib chiqamiz miltillovchi (uniprofdagi PROGRAM bilan bir xil) buyruq:

Avrdude -c gromov -P com1 -p m328p -U flash:r:readfl.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h ###Linux###

Uniprof-da kod dasturda ko'rsatilgan, ammo bu erda u faylga yoziladi.

Mikrodastur faylga o'qiladi va yoziladi readfl.txt. Xat h (olti burchakli) oxirida, ma'lumotlar o'n oltilik formatda yozilishi kerakligini ko'rsatadi. Agar siz xat yozsangiz b (ikkilik), ikkilik sistemada yoziladi va agar r (xom), keyin ma'lumotlar "xom" shaklida bo'ladi (kryakozyabra).

Shundan so'ng, win foydalanuvchilari diskning ildizida joylashgan deb taxmin qilinadi BILAN (C:\), va Linux foydalanuvchilari uy papkasidan ishlaydilar, shuning uchun fayllar u yerda saqlanadi (boshqacha belgilanmagan bo'lsa). MKga yuklanadigan proshivka u erda joylashgan bo'lishi kerak.

G'alaba qozonish uchun fayl bu yerda C:\readfl.txt, Linux uchun esa /home/user/readfl.txt da joylashgan bo'ladi. Siz ushbu faylni ochib, ko'rib chiqishingiz mumkin.

EEPROM o'qish:

Avrdude -c gromov -P com1 -p m328p -U eeprom:r:reader.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:r:reader.txt:h ###Linux###

Flash va eepromni birgalikda o'qish:

Avrdude -c gromov -P com1 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###Linux###

Tekshirish moslamasini o'chirish:

Avrdude -e -c gromov -P com1 -p m328p ###WIN###
sudo avrdude -e -c gromov -P /dev/ttyS0 -p m328p ###Linux###

"Qayta tiklash" pinini ajratib oling - diod miltillamaydi, dastur o'chiriladi.

Keling, MKni avval yuklab olingan fayl bilan o'ynaymiz 328test.hex. Diskning ildizida yotadi C(c:\328test.hex) Windows-da yoki linux-dagi uy papkasida (/home/user/328test.hex).

Avrdude -c gromov -P com1 -p m328p -U flash:w:328test.hex ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:328test.hex ###Linux###

Endi "qayta o'rnatish" ni o'chirsangiz, boshqaruvchi hayotga kiradi.

Eslatma. MK orqali miltillaganda avrdude, kontrollerni o'chirish shart emas, dastur buni o'zi qiladi. Biroq, agar siz parametrni aniqlasangiz -D, keyin MK avtomatik ravishda tozalanmaydi.

EEPROM dasturiy ta'minoti:

Avrdude -c gromov -P com1 -p m328p -U eeprom:w:eeprom.hex ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:w:eeprom.hex ###Linux###

Barcha sigortalarni o'qish:

Avrdude -c gromov -P com1 -p m328p -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h -U lock:r:lock.txt:h -U efuse:r:efuse .txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h -U lock:r:lock.txt:h -U efuse :r:efuse.txt:h ###Linux###

Ba'zi kontrollerlarda hech qanday sug'urta bo'lmasligi mumkin.

Faqat o'qish uchun past sug'urta:

Avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###WIN###
sudo avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###Linux###

Kam sug'urta soat signali manbasini (ichki, tashqi), uning chastotasini va quvvat yoqilgandan so'ng boshqaruvchi ishga tushishidan oldin pauzani tanlash uchun javobgardir. Endi siz u erda yozilgan qiymatga egasiz - 0xff, bu 8 MGts va undan yuqori chastotali tashqi kvartsga mos keladi.

Endi biz ATmeg-ni 8 MGts chastotali ichki generatordan ishlashga o'tkazadigan yana bir sug'urta o'chiramiz.

Avrdude -c gromov -P com1 -p m328p -U lfuse:w:0xe2:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U lfuse:w:0xe2:m ###Linux###

Agar sizda 16 MGts chastotali Arduino bo'lsa, diod ikki barobar sekin miltillaydi.
Kelajakda, AVR Studio-da kodlashda siz 8 MGts chastotasini belgilashingiz va kvartsni echishingiz mumkin, shu bilan yana ikkita bepul raqamli pinni olasiz.

Ammo bu keyinroq va endi oldingi sug'urtani o'chirish orqali hamma narsani avvalgidek qaytaramiz:

Avrdude -c gromov -P com1 -p m328p -U lfuse:w:0xff:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U lfuse:w:0xff:m ###Linux###

Diyot to'g'ri miltillaydi.

Sigortalar alohida yoki birgalikda yonishi mumkin:

Avrdude -c gromov -P com1 -p m328p -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m ###Linux###
Bu buyruqlarni berish shart emas. Men ularni aniqlik uchun taqdim etaman.

Kelajakda, boshqa kontrollerlardan foydalanish kerak bo'lganda, siz onlayn kalkulyatordagi katakchalarni belgilaysiz va qiymatlarni olasiz. (havola yuqori chap burchakda joylashgan) hex formatida va uni miltillashtiring.

Endi faqat parametrlarni aniqlash qoladi avrdude va siz yakuniy qismga o'tishingiz mumkin.

-c Gromov- dasturchi turi, to'g'rirog'i u konfiguratsiyada yozilgan nomi (avrdude.conf).
-P com1- Xo'sh, bu erda hamma narsa aniq.
-p m328p- belgilash turi MK.
-U- ushbu parametrdan keyin xotira maydoni ko'rsatiladi (flesh, eeprom, xfuse), unda har qanday harakatlar amalga oshiriladi (r - o'qish, w - yozish).
Ikki nuqta ajratuvchi vazifasini bajaradi.

Bu erda mikrokontrollerlar va ularning taxalluslari, dasturchilar va boshqa variantlar nomlari bilan.

MK taxalluslari

uc3a0512- AT32UC3A0512
c128- AT90CAN128
c32- AT90CAN32
c64- AT90CAN64
pwm2- AT90PWM2
pwm2b- AT90PWM2B
pwm3- AT90PWM3
pwm316- AT90PWM316
pwm3b- AT90PWM3B
1200 - AT90S1200 (****)
2313 - AT90S2313
2333 - AT90S2333
2343 - AT90S2343 (*)
4414 - AT90S4414
4433 - AT90S4433
4434 - AT90S4434
8515 - AT90S8515
8535 - AT90S8535
usb1286- AT90USB1286
usb1287- AT90USB1287
usb162- AT90USB162
usb646- AT90USB646
usb647- AT90USB647
usb82- AT90USB82
m103- ATmega103
m128- ATmega128
m1280- ATmega1280
m1281- ATmega1281
m1284p- ATmega1284P
m1284rfr2- ATmega1284RFR2
m128rfa1- ATmega128RFA1
m128rfr2- ATmega128RFR2
m16- ATmega16
m161- ATmega161
m162- ATmega162
m163- ATmega163
m164p- ATmega164P
m168- ATmega168
m168p- ATmega168P
m169- ATmega169
m16u2- ATmega16U2
m2560- ATmega2560 (**)
m2561- ATmega2561 (**)
m2564rfr2- ATmega2564RFR2
m256rfr2- ATmega256RFR2
m32- ATmega32
m324p- ATmega324P
m324pa- ATmega324PA
m325- ATmega325
m3250- ATmega3250
m328- ATmega328
m328p- ATmega328P
m329- ATmega329
m3290- ATmega3290
m3290p- ATmega3290P
m329p- ATmega329P
m32u2- ATmega32U2
m32u4- ATmega32U4
m406- ATMEGA406
m48- ATmega48
m48p- ATmega48P
m64- ATmega64
m640- ATmega640
m644- ATmega644
m644p- ATmega644P
m644rfr2- ATmega644RFR2
m645- ATmega645
m6450- ATmega6450
m649- ATmega649
m6490- ATmega6490
m64rfr2- ATmega64RFR2
m8- ATmega8
m8515- ATmega8515
m8535- ATmega8535
m88- ATmega88
m88p- ATmega88P
m8u2- ATmega8U2
t10-ATtiny10
t11- ATtiny11
t12- ATtiny12
t13- ATtiny13
t15-ATtiny15
t1634- ATtiny1634
t20- ATtiny20
t2313- ATtiny2313
t24- ATtiny24
t25- ATtiny25
t26- ATtiny26
t261- ATtiny261
t4- ATtiny4
t40- ATtiny40
t4313-ATtiny4313
t43u- ATtiny43u
t44- ATtiny44
t45- ATtiny45
t461- ATtiny461
t5- ATtiny5
t84- ATtiny84
t85- ATtiny85
t861- ATtiny861
t88- ATtiny88
t9- ATtiny9
x128a1- ATxmega128A1
x128a1d- ATxmega128A1revD
x128a1u- ATxmega128A1U
x128a3- ATxmega128A3
x128a3u- ATxmega128A3U
x128a4- ATxmega128A4
x128a4u- ATxmega128A4U
x128b1- ATxmega128B1
x128b3- ATxmega128B3
x128c3- ATxmega128C3
x128d3- ATxmega128D3
x128d4- ATxmega128D4
x16a4- ATxmega16A4
x16a4u- ATxmega16A4U
x16c4- ATxmega16C4
x16d4- ATxmega16D4
x16e5- ATxmega16E5
x192a1- ATxmega192A1
x192a3- ATxmega192A3
x192a3u- ATxmega192A3U
x192c3- ATxmega192C3
x192d3- ATxmega192D3
x256a1- ATxmega256A1
x256a3- ATxmega256A3
x256a3b- ATxmega256A3B
x256a3bu- ATxmega256A3BU
x256a3u- ATxmega256A3U
x256c3- ATxmega256C3
x256d3- ATxmega256D3
x32a4- ATxmega32A4
x32a4u- ATxmega32A4U
x32c4- ATxmega32C4
x32d4- ATxmega32D4
x32e5- ATxmega32E5
x384c3- ATxmega384C3
x384d3- ATxmega384D3
x64a1- ATxmega64A1
x64a1u- ATxmega64A1U
x64a3- ATxmega64A3
x64a3u- ATxmega64A3U
x64a4- ATxmega64A4
x64a4u- ATxmega64A4U
x64b1- ATxmega64B1
x64b3- ATxmega64B3
x64c3- ATxmega64C3
x64d3- ATxmega64D3
x64d4- ATxmega64D4
x8e5- ATxmega8E5

Linux foydalanuvchilari sharobdan foydalanishlari mumkin.

Umid qilamanki, sizda hamma narsa allaqachon o'rnatilgan, shuning uchun AVR Studio-ni ishga tushiramiz...


Bu erda bizdan yangi loyiha yaratish yoki eskisini ochish so'raladi. bosing Yangi loyiha


Tanlang AVR GCC, chunki biz assemblerda emas, SIda yozamiz.
Biz loyihaga nom beramiz va katakchalarni belgilaymiz.
Tanlang Manzil (Men C:\ diskida AVR papkasini yaratdim) U erda avtomatik ravishda loyihalar bilan papkalar yaratiladi.
bosing Keyingisi


Tanlang AVR simulyatori, chunki bizda disk raskadrovka qilishga ruxsat beruvchi maxsus dasturchi yo'q va bizning mikrokontrollerimiz mavjud ATmega328p.
bosing Tugatish.

Ushbu manipulyatsiyalardan so'ng studiya ishlashga tayyor.

Chap tomonda loyihaga boradigan yo'llar mavjud. Markazda kod yozilgan matn muharriri joylashgan. O'ng tomonda kontroller registrlari joylashgan. Pastki chap tomonda disk raskadrovka ma'lumotlari mavjud.

Hozirda bizni qiziqtirgan tugmalar -

Loyihani qurish.
Loyihani yarating va nosozliklarni tuzatishni boshlang.
Faylni kompilyatsiya qilish.
Tozalash.
Loyihani sozlash. Shunday qilib, ustiga bosing ...

Bu erda siz MK turini o'zgartirishingiz, soat chastotasini o'rnatishingiz mumkin (biz uni to'g'ridan-to'g'ri kodga yozamiz), optimallashtirish darajasi, shuningdek, qanday fayllar yaratilishini aniqlang.
Qiziqish uchun chapdagi piktogrammalarni bosing va bosing Bekor qilish.
Men bu va boshqa variantlarni tushuntirmayman, lekin keyinroq men vakolatli tavsifga ega havolani taqdim etaman.

Endi maqola boshida yozilgan koddan nusxa oling va uni muharrirga joylashtiring:

Biz kodda soat chastotasini ko'rsatdik, chunki kutubxona buni talab qiladi kechikish.h.

Qurilish muvaffaqiyatli bo'ldi, hech qanday xato yoki ogohlantirish yo'q.

Endi yo'limizga boraylik C:\AVR\my328\standart\, biz u erda biz yaratgan hex faylni topamiz - my328.hex va uni kontrollerga o'rnating. Nima porlashi kerak (avrdude yoki uniprof) o'zingiz uchun tanlang.

Avrdude-da u quyidagicha ko'rinadi:

Avrdude -c gromov -P com1 -p m328p -U flash:w:\AVR\my328\default\my328.hex ###WIN###
avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:my328.hex ###Linux###

"Qayta o'rnatish" ni o'chiring va diodaning soniyada bir marta miltillashiga qarang. Umid qilamanki, men sizni buyruq satrining soddaligi va qulayligiga ishontirdim.

Arduino-ni Arduino-ga aylantirish uchun sizda zaxira nusxasi mavjud.

Yuqorida yozilganidek, men AVR Studio bilan ishlash bo'yicha tushuntirishlarga kirmayman va SI tili bo'yicha dars bermayman. Birinchidan, bu mening rejam emas edi. (Men shunchaki Arduino-dan AVR Studio-ga o'tishga yordam bermoqchi edim)

IDE - bu turli xil andozalar, kutubxonalar va tuzatuvchi funktsiyalarni o'z ichiga olgan integratsiyalashgan ishlab chiqish muhiti. Agar gapiradigan bo'lsak, 2004 yildan beri ular uchun kuchli dasturiy ta'minot to'plami, AVR studio ishlab chiqilgan.

Birinchi versiyalar

Studiyaning birinchi versiyalari uchun assemblerni o'z ichiga olgan, siz uni birinchi yig'ilishlardan chiqarib olishingiz mumkin, ammo keyinchalik bu loyihadan voz kechildi va C AVR asosiy til sifatida tanlandi. Kompilyator pullik va juda jiddiy mahsulot IAR edi. Siz WINAVR-ni bepul yuklab olishingiz mumkin, buning uchun studiyani o'rnatganingizdan so'ng uni o'rnatishingiz kerak.

Eslatma! Buni faqat AVR studio 4 va boshqa versiyalarni o'rnatgandan so'ng qilish yaxshiroqdir.

AVR studio 4 (yuqoridagi rasm) uzoq vaqt davomida namoyish etildi. Ko'pgina mikrokontroller ishlab chiquvchilari bu muammoga duch kelishdi. Keyinchalik IDE AVR studio 5 ga ko'tarildi.Interfeysdan tashqari hech qanday maxsus o'zgarishlar bo'lmadi va shundan keyingina ishlab chiquvchi kompaniya mahsulotga rebrending kiritdi va nomini Atmel studio 6 ga o'zgartirdi.

AVR studio 5 muhiti quyidagi mikrokontrollerlarni qo'llab-quvvatladi:

  • AVR32;
  • XMEGA.

Atmel studio 6 AVR studio 5 dan sezilarli darajada farq qildi; versiyadagi eng sezilarli yangiliklar:

  1. Microsoft Visual Studio 2010 AVR oilasi bilan ishlay boshladi.
  2. AVR studio 5 bilan solishtirganda yaxshilangan sintaksik ta'kidlash.
  3. Qo'shilgan maslahatlar va buyruqlar to'plamini avtomatik to'ldirish, bu ishlab chiqish jarayonini tezlashtiradi.
  4. Umuman olganda, atrof-muhitning butun faoliyati yanada ishonchli bo'ldi.
  5. ARM Cortex-M uchun qo'shimcha qo'llab-quvvatlash.
  6. WinAVR endi alohida o'rnatilishi shart emas; GCC endi yosh versiyalardan farqli o'laroq o'rnatish jarayonida o'rnatiladi.

Atmel studio 6-da dastur foydalanuvchisi uchun yaxshiroq sakrash yuz berdi, bu Atmel oilalarining mashhurligiga ta'sir qildi. Biroq, fayl yo'llarida ruscha belgilarni etarli darajada qo'llab-quvvatlashga erishish mumkin emas edi.

Joriy versiya - Atmel studio 7

Men foydalanadigan ishlab chiqish muhiti Visual Studio Isolated Shell 2015 edi; bir tomondan, bu yechim Windows XP da qo'llab-quvvatlanmaydi, boshqa tomondan, bu choralar dasturning tashqi ko'rinishini ham, uning funksionalligini ham yaxshilash uchun qabul qilindi.

Ehtimol, eng muhimi Atmel studio 7-da Arduino-ni qo'llab-quvvatlashning qo'shilishidir. Bu oddiy eskizlar to'plamidan barcha C funktsiyalari, disk raskadrovka, MCU simulyatori va boshqa funktsiyalardan foydalanishga o'tishingiz mumkinligini anglatadi. Arduino va Atmel studio 7 kombinatsiyasi ushbu oddiy o'quv platformasini ishlab chiqishda yangi bosqichni berdi.

Arduino bilan Atmel studiosini o'rganish to'liq va samarali o'zlashtirishga o'tish va Arduino yuragi - Atmega mikrokontrolleri bilan chuqurroq tanishish imkoniyatini beradi.

Bundan tashqari, Atmel veb-saytidan LCD displeyni ishlatish va ulash uchun paketni yuklab olishingiz mumkin. O'zlashtirish uchun misol sifatida siz LCD 1602 dan foydalanishingiz mumkin, Internetda u haqida ko'plab darslar mavjud va ishlab chiquvchi displeyda 16 ta belgi va 2 qatorga ega.

O'rganishni qaerdan boshlash kerak?

Siz, albatta, dasturchi sotib olishdan boshlashingiz kerak; Eng byudjetli USBASP. USBASP dasturchisi Atmel Studio 7 da qo'llab-quvvatlanmaydi.


Dasturchi va AVRdude dasturi uchun drayverlarni yuklab oling va ularning barchasi birgalikda ishlashi uchun buyruq satri orqali buyruqdan foydalanishingiz mumkin:

"avrdude -c usbasp -p atmega32 -U flash:w: proshivka faylining nomi. olti burchakli -U sug'urta:w:0x6a:m -U hfuse:w:0xff:m"

va atmel studio 7 da profil yaratish orqali uni qo'llab-quvvatlashni yoqing (sarlavha - tashqi vositalar) va Argumentlar bandiga "-c usbasp -p atmega32 -U flash:w:$(TargetName).hex" va hokazolarni kiriting. mikrokontrollerlardan foydalanadigan turi.

Bu studiya va USBASP dasturchisini ulashning yagona yo'li. Miltillashda ehtiyot bo'ling - siz mikrokontroller imzosiga zarar etkazishingiz mumkin va uni faqat 12 V (yuqori kuchlanish) dasturchi bilan tiklash mumkin.

Trening uchun qanday adabiyotlardan foydalanishim kerak?

Avvalo, har bir mikrokontroller uchun rasmiy veb-saytdan qo'llanmalarni yuklab oling. Muayyan darslikni tavsiya qilish qiyin, ammo “DI Halt - AVR. O'quv kursi" siz undan foydalanishingiz mumkin - ushbu materialning yaratuvchisi amaliyotchi, turli xil Internet-resurslarda ko'plab maqolalar muallifi va oddiygina ixtisoslashgan doiralarda hurmatli shaxs.

Men MKni o'rganishni assemblerdan boshlash kerakligini bir yoki ikki marta aytganman. Veb-saytdagi butun kurs bunga bag'ishlangan edi (garchi bu juda izchil bo'lmasa-da, lekin asta-sekin men uni mos keladigan ko'rinishga aylantiraman). Ha, bu qiyin, natija birinchi kunida bo'lmaydi, lekin siz boshqaruvchida nima sodir bo'layotganini tushunishni o'rganasiz. Siz uning qanday ishlashini bilib olasiz va boshqa odamlarning manbalarini maymun kabi ko'chirmaysiz va nima uchun u to'satdan ishlamay qolganini tushunishga harakat qilasiz. Bunga qo'shimcha ravishda, C uchun eng mos bo'lmagan paytda pitchfork bilan chiqadigan redneck kodini yaratish ancha oson.

Afsuski, hamma darhol natijalarni xohlaydi. Shuning uchun men boshqa yo'l bilan borishga qaror qildim - C bo'yicha darslik qilish, lekin uning ichki kiyimini ko'rsatish bilan. Yaxshi o'rnatuvchi dasturchi har doim o'z apparat qismini murvatdan mahkam ushlab, ruxsatisiz bir qadam ham tashlashiga yo'l qo'ymaydi. Shunday qilib, avval C kodi bo'ladi, keyin kompilyator nima ishlab chiqargan va barchasi qanday ishlaydi :)

Boshqa tomondan, C ning kuchli tomoni bu kodni ko'chirishdir. Agar, albatta, siz hamma narsani to'g'ri yozsangiz. Loyihaning turli qismlariga ish algoritmlari va ularning apparat tadbiqlarini ajratish. Keyin, algoritmni boshqa mikrokontrollerga o'tkazish uchun faqat apparatga barcha qo'ng'iroqlar yoziladigan interfeys qatlamini qayta yozish va barcha ishchi kodni avvalgidek qoldirish kifoya qiladi. Va, albatta, o'qish qobiliyati. C manba kodini bir qarashda tushunish osonroq (garchi... masalan, men nimaga ishora qilishim muhim emas - u C yoki ASM :)), lekin yana, agar hamma narsa to'g'ri yozilgan bo'lsa. Men ham ushbu fikrlarga e'tibor qarataman.

Mening disk raskadrovka taxtasi eksperimental uskuna bo'lib xizmat qiladi, unda barcha misollarning asosiy qismi o'rnatiladi.

AVR uchun birinchi C dasturi

Kompilyatorni tanlash va muhitni sozlash
AVR uchun turli xil C kompilyatorlari mavjud:
Avvalo bu IAR AVR C- deyarli aniq AVR uchun eng yaxshi kompilyator sifatida tan olingan, chunki nazoratchining o'zi Atmel va IAR mutaxassislari o'rtasida yaqin hamkorlikda yaratilgan. Lekin siz hamma narsa uchun to'lashingiz kerak. Va bu kompilyator nafaqat qimmat tijoriy dasturiy ta'minot, balki juda ko'p sozlamalarga egaki, uni oddiygina kompilyatsiya qilish uchun juda ko'p kuch talab etiladi. Men u bilan haqiqatan ham do'stlikni rivojlantirmadim; loyiha ulanish bosqichidagi g'alati xatolar tufayli chirigan edi (keyinchalik bu egri yoriq ekanligini bildim).

Ikkinchi keladi WinAVR GCC- kuchli optimallashtiruvchi kompilyator. To'liq ochiq manba, kross-platforma, umuman olganda, hayotning barcha quvonchlari. Shuningdek, u AVR Studio bilan mukammal birlashadi, bu sizga o'sha erda disk raskadrovka qilish imkonini beradi, bu juda qulay. Umuman olganda, men uni tanladim.

Shuningdek bor CodeVision AVR C juda mashhur kompilyator hisoblanadi. U oddiyligi tufayli mashhur bo'ldi. Unda bir necha daqiqada ishchi dasturni olishingiz mumkin - boshlang'ich kodi ustasi har xil narsalarni ishga tushirish uchun standartlarni belgilash orqali buni sezilarli darajada osonlashtiradi. Rostini aytsam, men bunga shubha bilan qarayman - bir marta men ushbu kompilyator tomonidan yozilgan dasturni demontaj qilishim kerak edi, bu kod emas, balki qandaydir tartibsizlik bo'lib chiqdi. Keraksiz harakatlar va operatsiyalarning dahshatli miqdori katta miqdordagi kod va sekin ishlashga olib keldi. Biroq, ehtimol, asl mikrodasturni yozgan odamning DNKsida xatolik yuz bergan. Bundan tashqari, u pulni xohlaydi. IAR kabi ko'p emas, lekin sezilarli. Demo rejimida esa 2kb dan ortiq bo'lmagan kod yozish imkonini beradi.
Albatta, yoriq bor, lekin agar siz o'g'irlamoqchi bo'lsangiz, bu IAR ma'nosida million :)

Hali bor Image Craft AVR C Va MicroC mikroelektronikadan. Men ikkalasini ham ishlatishim shart emas edi, lekin S.W.G. juda maqtovli MicroPascal, deydi ular, juda qulay dasturlash muhiti va kutubxonalar. Menimcha, MicroC bundan ham yomoni bo'lmaydi, lekin u ham to'lanadi.

Aytganimdek, men tanladim WinAVR uchta sababga ko'ra: bu bepul, u AVR Studio bilan birlashadi va barcha holatlar uchun bir tonna tayyor kod yozilgan.

Shunday qilib, WinAVR o'rnatishni AVR Studio bilan yuklab oling. Keyinchalik, avval studiya o'rnatiladi, keyin WinAVR tepaga o'raladi va plagin shaklida studiyaga biriktiriladi. Men WinAVR-ni C:\WinAVR kabi qisqa yo'lda o'rnatishni qat'iy tavsiya qilaman, bu bilan siz yo'llar bilan bog'liq ko'plab muammolardan qochasiz.

Loyiha yaratish
Shunday qilib, studiya o'rnatildi, C vidalandi, biror narsani dasturlashga harakat qilish vaqti keldi. Keling, oddiy, eng oddiyidan boshlaylik. Studiyani ishga tushiring, u erda AVR GCC kompilyatori sifatida yangi loyihani tanlang va loyiha nomini kiriting.

Ish maydoni bo'sh *.c fayli bilan ochiladi.

Endi studiya xatcho'plarida yo'llarni ko'rsatishni sozlash zarar qilmaydi. Buning uchun quyidagi manzilga o'ting:
Menyu asboblari - Variantlar - Umumiy - FileTabs va ochiladigan ro'yxatdan "Faqat fayl nomi" ni tanlang. Aks holda, ishlash imkonsiz bo'ladi - yorliq faylning to'liq yo'lini o'z ichiga oladi va ekranda ikki yoki uchta yorliqdan ko'p bo'lmaydi.

Loyihani sozlash
Umuman olganda, barcha bog'liqliklar tasvirlangan make faylini yaratish klassik hisoblanadi. Va bu, ehtimol, to'g'ri. Lekin men uchun to'liq integratsiyalangan IDElar bilan o'sgan uVision yoki AVR Studio bu yondashuv juda begona. Shuning uchun men buni o'z yo'limda qilaman, hamma narsa studiya vositalaridan foydalangan holda.

Tugmani tishli quti bilan tiqing.


Bu sizning loyihangiz uchun sozlamalar, aniqrog'i make faylini avtomatik yaratish sozlamalari. Birinchi sahifada siz faqat MK ishlaydigan chastotani kiritishingiz kerak. Bu sug'urta bitlariga bog'liq, shuning uchun bizning chastotamiz 8000000Hz deb taxmin qilamiz.
Shuningdek, optimallashtirish liniyasiga e'tibor bering. Endi -Os bor - bu o'lchamni optimallashtirish. Hozircha shunday qoldiring, keyin siz ushbu parametr bilan o'ynashga harakat qilishingiz mumkin. -O0 umuman optimallashtirish emas.

Keyingi qadam yo'llarni sozlashdir. Avvalo, u erda loyiha katalogingizni qo'shing - u erda siz uchinchi tomon kutubxonalarini qo'shasiz. Ro'yxatda ".\" yo'li paydo bo'ladi.

Make fayli yaratildi, siz uni loyihangizdagi standart papkada ko'rishingiz mumkin, shunchaki ko'rib chiqing va u erda nima borligini ko'ring.


Hozircha hammasi shu. Hamma joyda OK tugmasini bosing va manbaga o'ting.

Muammoni shakllantirish
Bo'sh qog'oz qandaydir ayyor g'oyani amalga oshirishni vasvasaga soladi, chunki diodning oddiy miltillashi endi ishlamaydi. Keling, zudlik bilan buqani shoxlaridan olib, kompyuter bilan aloqani amalga oshiramiz - bu men qiladigan birinchi narsa.

Bu shunday ishlaydi:
MAQOMOTI portiga bitta (kod 0x31) kelganda, biz diodni yoqamiz va nol kelganda (kod 0x30) o'chadi. Bundan tashqari, hamma narsa uzilishlarda amalga oshiriladi va fon vazifasi boshqa diyotning miltillashi bo'ladi. Oddiy va mazmunli.

Sxemani yig'ish
Biz USB-USART konvertor modulini mikrokontrollerning USART pinlariga ulashimiz kerak. Buni amalga oshirish uchun ikkita simdan o'tish moslamasini oling va uni ko'ndalang pinlarga qo'ying. Ya'ni, boshqaruvchining Rx ni konvertorning Tx ga, Tx ni esa boshqaruvchining Rx ga ulaymiz.

Oxir-oqibat, bu diagramma:


Qolgan pinlarni, quvvatni yoki qayta o'rnatishni ulashni o'ylamayman, bu standart.

Kod yozish

Men C tilining o'zi tavsifiga alohida e'tibor bermasligim uchun darhol rezervlashimga ijozat bering. Buning uchun klassik "C dasturlash tili" dan K&R dan turli xil qo'llanmalargacha bo'lgan juda katta miqdordagi materiallar mavjud.

Men o'z qo'limda shunday usullardan birini topdim; Men bir marta bu tilni o'rganish uchun foydalanganman. U erda hamma narsa qisqa, aniq va aniq. Men uni asta-sekin birlashtiraman va veb-saytimga tortaman.

To'g'ri, hali hamma bo'limlar o'tkazilmagan, lekin menimcha, bu uzoq davom etmaydi.

Men buni yaxshiroq tasvirlay olishim dargumon, shuning uchun o'quv kursidan nozikliklarni batafsil tushuntirish o'rniga men ushbu qo'llanmaning alohida sahifalariga to'g'ridan-to'g'ri havolalarni taqdim etaman.

Kutubxonalarni qo'shish.
Avvalo, biz kerakli kutubxonalar va ta'riflar bilan sarlavhalarni qo'shamiz. Axir, C universal tildir va biz unga AVR bilan maxsus ishlayotganimizni tushuntirishimiz kerak, shuning uchun manba kodidagi qatorni yozing:

1 #o'z ichiga oladi

#o'z ichiga oladi

Ushbu fayl papkada joylashgan WinAVR va unda boshqaruvchining barcha registrlari va portlarining tavsifi mavjud. Bundan tashqari, u erda hamma narsa ayyor, kompilyator orqali uzatiladigan ma'lum bir kontrollerga bog'langan. qilish parametrdagi fayl MCU va ushbu o'zgaruvchiga asoslanib, loyihangizga ushbu kontroller uchun barcha portlar va registrlar manzillari tavsifi bilan sarlavha fayli ulanadi. Voy-buy! Busiz, bu ham mumkin, lekin keyin siz SREG yoki UDR kabi ramziy registr nomlaridan foydalana olmaysiz va har birining manzilini eslab qolishingiz kerak bo'ladi "0xC1" kabi, bu bosh og'rig'i bo'ladi.

Jamoaning o'zi #o'z ichiga oladi<имя файла> loyihangizga har qanday matn faylining mazmunini, masalan, funksiyalar tavsifi yoki boshqa kod qismiga ega faylni qo'shish imkonini beradi. Va direktiv ushbu faylni topishi uchun biz loyihamizga yo'lni belgilab oldik (WinAVR katalogi sukut bo'yicha u erda allaqachon ro'yxatdan o'tgan).

Asosiy funktsiya.
C dasturi butunlay funksiyalardan iborat. Ularni har qanday tartibda va turli yo'llar bilan joylashtirish va bir-biridan chaqirish mumkin. Har bir funktsiya uchta talab qilinadigan parametrga ega:

  • Qaytish qiymati, masalan. gunoh(x) x ning sinus qiymatini qaytaradi. Qisqasi, matematikada bo'lgani kabi.
  • O'tkazilgan parametrlar bir xil X.
  • Funktsiya tanasi.

O'tkazilgan va qaytarilgan barcha qiymatlar ma'lumotlarga qarab qandaydir turdagi bo'lishi kerak.

Har qanday C dasturi funksiyani o'z ichiga olishi kerak asosiy asosiy dasturga kirish nuqtasi sifatida, aks holda u umuman C emas :). Birovning manba kodida millionlab fayllardan main mavjudligi bilan siz bu dasturning asosiy qismi ekanligini tushunishingiz mumkin, bu erda hamma narsa boshlanadi. Shunday qilib, so'raylik:

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

int main(void) (qaytish 0; )

Hammasi shunday, birinchi eng oddiy dastur yozildi, u hech narsa qilmasligi muhim emas, biz endi boshladik.

Keling, nima qilganimizni aniqlaymiz.
int Bu asosiy funktsiya qaytaradigan ma'lumotlar turi.

Albatta, mikrokontrollerda asosiy printsipial jihatdan hech narsani qaytarib bo'lmaydi va nazariy jihatdan bo'lishi kerak asosiy bekor (bo'sh), lekin GCC dastlab shaxsiy kompyuter uchun mo'ljallangan va u erda dastur tugagandan so'ng qiymatni operatsion tizimga qaytarishi mumkin. Shuning uchun GCC yoqilgan asosiy bekor (bo'sh) Ogohlantirish bilan qasam ichadi.

Bu xato emas, u ishlaydi, lekin men ogohlantirishlarni yoqtirmayman.

bekor bu biz funksiyaga uzatadigan ma'lumotlar turi, bu holda asosiy tashqaridan ham hech narsani qabul qila olmaydi, shuning uchun bekor- qo'g'irchoq. Hech narsa uzatish yoki qaytarish kerak bo'lmaganda stub ishlatiladi.

Mana ular { } jingalak qavslar dastur bloki, bu holda funksiya tanasi asosiy, kod u erda joylashgan bo'ladi.

qaytish- bu asosiy funktsiya tugallangandan so'ng qaytariladigan qaytariladigan qiymat, chunki bizda int, ya'ni raqam bor, u holda biz raqamni qaytarishimiz kerak. Garchi bu hali ham mantiqiy bo'lmasa ham, chunki ... mikrokontrollerda biz faqat asosiydan hech qaerga keta olmaymiz. Men nullni qaytaraman. Chunki bu muhim emas. Ammo kompilyator odatda aqlli va bu holat uchun kod yaratmaydi.
Garchi, agar buzuq bo'lsa, keyin dan asosiy Siz MK-ga borishingiz mumkin - masalan, yuklash bo'limiga tushib, uni ishga tushiring, ammo bu o'tish manzillarini to'g'rilash uchun proshivka bilan past darajadagi ishlov berishni talab qiladi. Quyida siz o'zingiz ko'rasiz va buni qanday qilishni tushunasiz. Nima uchun? Bu boshqa savol, 99,999% hollarda bu kerak emas :)

Biz buni qildik va davom etdik. Keling, o'zgaruvchini qo'shamiz, bizga u haqiqatan ham kerak emas va usiz o'zgaruvchilarni kiritishning ma'nosi yo'q, lekin biz o'rganyapmiz. Agar o'zgaruvchilar funktsiya tanasiga qo'shilsa, ular mahalliy bo'lib, faqat shu funktsiyada mavjud. Funktsiyadan chiqqaningizda, bu o'zgaruvchilar o'chiriladi va RAM xotirasi muhimroq ehtiyojlar uchun ajratiladi. .

1 2 3 4 5 6 int main(void) (imzosiz char i; qaytish 0; )

int main(void) (imzosiz char i; qaytish 0; )

imzosiz imzosiz degan ma'noni anglatadi. Gap shundaki, ikkilik ko'rinishda eng muhim bit belgiga ajratilgan, ya'ni +127/-128 soni bir baytga (char) to'g'ri keladi, ammo agar belgi tashlansa, u 0 dan to'g'ri keladi. 255. Odatda belgi kerak emas. Shunday qilib imzosiz.
i faqat oʻzgaruvchan nomi. Boshqa emas; boshqa ... bo'lmaydi; Endi yo'q.

Endi biz portlarni ishga tushirishimiz kerak va UART. Albatta, siz kutubxonani olib, ulashingiz va qandaydir UartInit (9600) ga qo'ng'iroq qilishingiz mumkin; lekin keyin aslida nima bo'lganini bilmay qolasiz.

Biz buni qilamiz:

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 boudrate 9600L #boddividerni aniqlang (XTAL/(16*baudrate)-1)#define HI(x) ((x)>>8) #define LO(x) ((x)& 0xFF) UBRRL = LO(bauddivider) ; UBRRH = HI(bauddivider) ; 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 boudrate 9600L #define bouddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO(bo'luvchi); UBRRH = HI(bo'luvchi); UCSRA = 0; UCSRB = 1<

Qo'rqinchlimi? Aslida, haqiqiy kodning faqat beshta oxirgi satri mavjud. Hamma narsa, bu #aniqlash Bu protsessorli so'l tildir. Assambleyadagi kabi deyarli bir xil narsalar, ammo sintaksis biroz boshqacha.

Ular kerakli koeffitsientlarni hisoblash bo'yicha muntazam operatsiyalaringizni osonlashtiradi. Birinchi qatorda biz buni o'rniga aytamiz XTAL 8000000 ni xavfsiz almashtirishingiz mumkin va L- turni ko'rsatish, long deyish protsessorning taktli chastotasi. Xuddi shu baudrate— UART orqali ma'lumotlarni uzatish chastotasi.

bauddivider allaqachon murakkabroq, uning o'rniga oldingi ikkita formuladan foydalangan holda hisoblangan ifoda almashtiriladi.
Xo'sh va L.O. Va Salom past va yuqori baytlar bu natijadan olinadi, chunki Bu bir baytga sig'masligi aniq. IN Salom X (makros kiritish parametri) sakkiz marta o'ngga siljiydi, natijada faqat eng muhim bayt qoladi. Va ichida L.O. biz 00FF raqami bilan bitli VA qilamiz, natijada faqat past bayt qoladi.

Shunday qilib, qilingan hamma narsa xuddi shunday #aniqlash siz uni xavfsiz tashlab yuborishingiz va kalkulyatorda kerakli raqamlarni hisoblashingiz va ularni darhol UBBRL = ... qatorlariga kiritishingiz mumkin. va UBBRH = …..

mumkin. Lekin! Buni qiling MUTLAK MUMKIN EMAS!

Bu shunday yoki boshqa tarzda ishlaydi, lekin sizda shunday bo'ladi sehrli raqamlar- hech qayerdan va noma'lum sabablarga ko'ra olingan qadriyatlar va agar siz bir necha yil ichida bunday loyihani ochsangiz, bu qadriyatlar nima ekanligini tushunish juda qiyin bo'ladi. Hozir ham, agar siz tezlikni o'zgartirmoqchi bo'lsangiz yoki kvarts chastotasini o'zgartirmoqchi bo'lsangiz, hamma narsani qayta hisoblashingiz kerak bo'ladi, lekin siz koddagi bir nechta raqamni o'zgartirdingiz va tamom. Umuman olganda, agar siz kodlovchi sifatida brend bo'lishni xohlamasangiz, kodingizni o'qish, tushunarli va o'zgartirish oson bo'lishi uchun yarating.

Keyin hamma narsa oddiy:
Bularning barchasi "UBRRL va Co" UART uzatgichining konfiguratsiya registrlari bo'lib, ular yordamida biz dunyo bilan bog'lanamiz. Va endi biz ularga kerakli qiymatlarni tayinladik, ularni kerakli tezlik va rejimga o'rnatdik.

Yozib olish turi 1< Quyidagi ma'noni anglatadi: 1-ni oling va uni joyiga qo'ying RXEN baytda. RXEN bu registrning 4-biti UCSRB, shunday qilib 1< 00010000 ikkilik sonini hosil qiladi, TXEN- bu 3-bit va 1< 00001000 beradi. Yagona "|" bu bitli YOKI, shuning uchun 00010000 | 00001000 = 00011000. Xuddi shu tarzda, qolgan kerakli konfiguratsiya bitlari o'rnatiladi va umumiy yig'inga qo'shiladi. Natijada, yig'ilgan raqam UCSRBda qayd etiladi. Batafsil ma'lumotlar USART bo'limidagi MK ma'lumotlar jadvalida tasvirlangan. Shunday ekan, keling, texnik tafsilotlar bilan chalg'ib qolmaylik.

Bajarildi, nima bo'lganini ko'rish vaqti keldi. Kompilyatsiyani bosing va emulyatsiyani boshlang (Ctrl + F7).

Nosozliklarni tuzatish
Har qanday progress barlari o'tib ketdi, studiya o'zgardi va asosiy funktsiyaga kirish yonida sariq o'q paydo bo'ldi. Bu protsessor hozirda ishlayotgan va simulyatsiya to'xtatilgan joy.

Gap shundaki, dastlab, aslida u UBRRL = LO(boddivider) liniyasida edi; Axir, bizda aniqlangan narsa kod emas, balki oddiygina dastlabki hisob-kitoblardir, shuning uchun simulyator biroz zerikarli. Ammo endi u tushundi, birinchi ko'rsatma bajarildi va agar siz daraxtga chiqsangiz I/U ko'rinishi, USART bo'limiga o'ting va u erda UBBRL baytiga qarang, qiymat allaqachon mavjud ekanligini ko'rasiz! 0x33.

Uni bir qadam oldinga olib boring. Boshqa registrning mazmuni qanday o'zgarishini ko'ring. Shunday qilib, ularning barchasini ko'rib chiqing, barcha ko'rsatilgan bitlar men aytganimdek o'rnatilganligiga e'tibor bering va ular bir vaqtning o'zida butun bayt uchun o'rnatiladi. Bu Return-dan boshqa uzoqqa bormaydi - dastur tugadi.

Ochilish
Endi simulyatsiyani nolga qaytaring. U yerga bosing Qayta tiklash (Shift+F5). Demontaj qilingan ro'yxatni oching, endi siz boshqaruvchida nima sodir bo'layotganini ko'rasiz. Ko'rish -> Disassembler. Va YYAAAAAAA emas!!! Assembler!!! DAXSHAT!!! KERAK. Shunday qilib, keyinchalik, biror narsa noto'g'ri bo'lganda, siz kodda ahmoq bo'lmaysiz va forumlarda oqsoqlangan savollarni bermaysiz, balki darhol ichakka kiring va qayerda qolib ketganingizni ko'ring. U erda qo'rqinchli narsa yo'q.

Avvaliga seriyadan toplar bo'ladi:

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 O'tish +00000002: 940C0034 JMP 0x00000034 O'tish +00000004: 940C0034 JMP 0x040000 J030000000 0x00000034 O'tish +00000008: 940C0034 JMP 0x00000034 O'tish +0000000A: 940C0034 JMP 0x00000034 O'tish +0000000C: 9400000C: 9400000C: 940MP0000 O'tish 0x00000034 O'tish +00000016: 940C0034 JMP 0x00000034 O'tish +00000018: 940C0034 JMP 0x00000034 O'tish +0000001A: 9400001A: 9400000003400000C : 940C0034 JMP 0x00000034 O'tish +0000001E: 940C0034 JMP 0x00000034 O'tish +00000020: 940C0034 JMP 0x00000034 O'tish +0000000 J04000 34 O'tish +00000024: 940C0034 JMP 0x00000034 O'tish +00000026: 940C0034 JMP 0x00000034 O'tish +00000028: 940C0034 JMP004

O‘tish 0x00000034 O'tish +00000008: 940C0034 JMP 0x00000034 O'tish +0000000A: 940C0034 JMP 0x00000034 O'tish +0000000C: 9400000C: 94000000034JMP00000 : 940C0034 JMP 0x00000034 O'tish +00000010: 940C0034 JMP 0x00000034 O'tish +00000012: 940C0034 JMP 0x00000030 O'tish +00000030 J040000 J04000 O‘tish : 940C0034 JMP 0x00000034 O'tish +0000001E: 940C0034 JMP 0x00000034 O'tish +00000020: 940C0034 JMP 0x00000034 O'tish +0000000 J04000 34 O'tish +00000024: 940C0034 JMP 0x00000034 O'tish +00000026: 940C0034 JMP 0x00000034 O'tish +00000028: 940C0034 JMP004

Bu uzilish vektor jadvali. Biz unga keyinroq qaytamiz, ammo hozircha uning mavjudligini ko'rib chiqing va eslang. Birinchi ustunda buyruq joylashgan flesh katak manzili, ikkinchisi buyruq kodi, uchinchisi buyruq mnemonikasi, bir xil montaj ko'rsatmasi, uchinchisi buyruq operandlari. Xo'sh, avtomatik izoh.
Shunday qilib, agar qarasangiz, doimiy o'tishlar mavjud. Va JMP buyruq kodi to'rt baytdan iborat bo'lib, u orqaga yozilgan o'tish manzilini o'z ichiga oladi - past manzildagi past bayt va o'tish buyrug'i kodi 940C

0000002B: BE1F OUT 0x3F, R1 chiqish kirish/chiqarish joyiga

Ushbu nolni 0x3F manzilida yozib olish.I/U ko'rish ustuniga qarasangiz, 0x3F manzili SREG registrining manzili - kontrollerning bayroq registri ekanligini ko'rasiz. Bular. dasturni nol sharoitda ishga tushirish uchun SREG ni qayta o'rnatamiz.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Darhol yuklang +0000002D: E0D4 LDI R29,0x04 Darhol yuklang +0000002E: BFDE OUT 0x3E, R29 Kirish-chiqarish joyiga chiqish +0000000, I/U joyiga chiqish +0000000, O2FD uchun chiqish: B02D

0000002C: E5CF LDI R28,0x5F Darhol yuklang +0000002D: E0D4 LDI R29,0x04 Darhol yuklang +0000002E: BFDE OUT 0x3E, R29 Kirish/chiqish joyiga chiqish +0000000, I/U joyiga chiqish +0000000, O2FD uchun chiqish: B02F

Bu stek ko'rsatkichini yuklamoqda. Siz kiritish-chiqarish registrlariga bevosita yuklay olmaysiz, faqat oraliq registr orqali. Shuning uchun, birinchi LDI oraliq, keyin esa u erdan OUT I/O ga. Men sizga keyinroq stack haqida ko'proq aytib beraman. Hozircha, bu RAM oxirida osilgan va manzillar va oraliq o'zgaruvchilarni saqlaydigan dinamik xotira maydoni ekanligini biling. Endi biz stekimiz qayerdan boshlanishini ko'rsatdik.

00000032: 940C0041 JMP 0x00000041 Oʻtish

Dasturning oxiriga o'ting va bizda uzilishlar va o'z-o'zidan mahkam bog'lanish taqiqlangan:

1 2 +00000041: 94F8 CLI Global uzilishni o'chirish +00000042: CFFF RJMP PC-0x0000 Nisbiy o'tish

00000041: 94F8 CLI Global uzilishni o'chirish +00000042: CFFF RJMP PC-0x0000 Nisbiy o'tish

Bu kutilmagan vaziyatlarda, masalan, asosiy funktsiyadan chiqishda. Tekshirgichni bunday halqadan apparatni qayta o'rnatish yoki, ehtimol, qo'riqchi tomonidan qayta o'rnatish orqali chiqarish mumkin. Xo'sh, yoki, yuqorida aytganimdek, buni olti burchakli muharrirda tuzating va yuragimiz xohlagan joyga yuguring. Shuni ham yodda tutingki, o'tishning ikki turi mavjud: JMP va RJMP; birinchisi, manzilga to'g'ridan-to'g'ri o'tish. U to'rt baytni egallaydi va to'g'ridan-to'g'ri butun xotira maydoni bo'ylab o'tishi mumkin. O'tishning ikkinchi turi RJMP - nisbiy. Uning buyrug'i ikki baytni oladi, lekin u joriy pozitsiyadan (manzil) 1024 qadam oldinga yoki orqaga siljiydi. Va uning parametrlari joriy nuqtadan ofsetni ko'rsatadi. U tez-tez ishlatiladi, chunki bir yuvishda bo'sh joyning yarmini egallaydi va uzoq o'tishlar kamdan-kam hollarda kerak bo'ladi.

1 +00000034: 940C0000 JMP 0x00000000 O'tish

00000034: 940C0000 JMP 0x00000000 Oʻtish

Va bu kodning eng boshiga sakrash. Qayta ishga tushirish. Bu erda barcha vektorlarning sakrashini tekshirishingiz mumkin. Bundan xulosa shuki, agar siz hozir uzilishlarni yoqsangiz (ular sukut bo'yicha o'chirilgan) va sizning uzilish sodir bo'lsa, lekin ishlov beruvchi yo'q bo'lsa, dasturiy ta'minot qayta o'rnatiladi - dastur eng boshidan qaytariladi.

Asosiy funktsiya. Hammasi o'xshash, hatto tasvirlashning hojati yo'q. Registrlarga kiritilgan allaqachon hisoblangan raqamga qarang. Kompilyatorning dastlabki protsessori qoyil qoldi!!! Shunday qilib, "sehrli" raqamlar yo'q!

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

00000036: E383 LDI R24,0x33 Darhol yuklang +00000037: B989 OUT 0x09,R24 Kirish/chiqarish joyiga chiqish 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 16-chi kirish/chiqarish joyiga chiqish: UCSRA = 0; +00000039: B81B OUT 0x0B, R1 I/U manziliga chiqish 17: UCSRB = 1<

Va bu xato:

1 2 3 +0000003E: E080 LDI R24.0x00 Darhol yuklash +0000003F: E090 LDI R25.0x00 Darhol yuklash +00000040: 9508 RET Pastki dasturni qaytarish

0000003E: E080 LDI R24.0x00 Darhol yuklash +0000003F: E090 LDI R25.0x00 Darhol yuklash +00000040: 9508 RET Pastki dasturni qaytarish

Savol shundaki, nega kompilyator bunday tepalarni qo'shadi? Va bu Return 0 dan boshqa narsa emas, biz funktsiyani int main(void) deb belgilab oldik va shuning uchun biz yana to'rt baytni bekorga sarfladik :) Va agar siz void main(void) qilsangiz, faqat RET qoladi, lekin ogohlantirish paydo bo'ladi. , bizning asosiy funksiyamiz hech narsani qaytarmaydi. Umuman olganda, xohlaganingizcha qiling :)

Qiyinmi? Ko'rinishidan, yo'q. Disassembler rejimida bosqichma-bosqich bajarish tugmasini bosing va protsessor individual ko'rsatmalarni qanday bajarishini, registrlar bilan nima sodir bo'lishini ko'ring. Buyruqlar bo'ylab harakatlanish va yakuniy tsikl qanday sodir bo'ladi?

Bir necha kundan keyin davom etadi...

Offtop:
Aleksey78 Men Firefox uchun plaginni yaratdim, bu mening saytim va forumimga o'tishni osonlashtiradi.
Munozara va yuklab olish,

Atmel Studio - bu ARM Cortex-M seriyali protsessor arxitekturasi asosida Atmel mikrokontrollerlari uchun ishlab chiqilgan ilovalarni loyihalash va disk raskadrovka qilish imkoniyatini beruvchi integratsiyalashgan ishlab chiqish platformasi. Atmel Studio - bu muammosiz, ishlatish uchun qulay muhit bo'lib, u C/C++ yoki assembly tilida yaratilgan ilovalarni disk raskadrovka qilish va yaratish imkoniyatini beradi. U mutlaqo bepul Atmel Software Framework manba kodining o'rnatilgan hajmli kutubxonasiga ega bo'lib, u ARM va AVR arxitekturalari uchun 1600 dan ortiq loyihalarni o'z ichiga oladi. Bunday kutubxonaga ega bo'lish har qanday dasturchi uchun ajoyib bonusdir. Ushbu IDE turli xil AVR-ga asoslangan mikrokontrollerlarni, shuningdek, Cortex-M3, Cortex-M4 yadrolaridan foydalanadigan Atmel SAM3-ga asoslangan flesh mikrokontrollerlarni dasturlash uchun ishlatilishi mumkin.

Atmel Studio shuningdek, har qanday dasturchining hayotini ancha osonlashtiradigan vositalarni o'z ichiga oladi. Platformada Atmel Spaces va Atmel Gallery kabi yechimlar mavjud. Atmel Gallery - ishlab chiqish vositalari va o'rnatilgan dasturiy ta'minotning onlayn do'koni. Atmel Spaces - bu Atmel mikrokontrollerlari uchun apparat va dasturiy loyiha fayllarini hamkorlikda ishlab chiqish va saqlash uchun bulutga asoslangan makon.

Asosiy xususiyatlar va funktsiyalar

  • butunlay bepul integratsiyalashgan rivojlanish muhitidir;
  • C/C++ va Assembler tillarini qo'llab-quvvatlaydi;
  • batafsil hujjatlar bilan birga;
  • turli ilovalar uchun manba kodi misollari bilan keng kutubxonani o'z ichiga oladi;
  • Atmel mikrokontrolderlarini dasturlash uchun mo'ljallangan.

Maxsus talablar

  • protsessorning soat chastotasi 1,6 gigagertsli va undan yuqori;
  • 1 GB operativ xotiradan 32 bitli tizimlar uchun;
  • 2 GB operativ xotiradan 64 bitli tizimlar uchun;
  • virtual mashinada ishlayotganda qo'shimcha 512 MB RAM tavsiya etiladi;
  • Qattiq diskda 6 GB bo'sh joy.

Ushbu versiyada qanday yangiliklar bor?

7.0.790 (25.02.2016)

  • kengaytirilgan tuzatuvchi (EDBG) uchun qo'shimcha yordam;
  • interfeys sozlamalari profillari uchun qo'shimcha yordam. Sozlamalar panelidagi tugmalar yordamida profillar o'rtasida almashishingiz mumkin;
  • kutubxonalarni ilgari import qilingan loyihalarga import qilish imkoniyatini qo'shdi. Arduino Zero va Zero Pro uchun qo'shimcha qo'llab-quvvatlash;
  • parallel qurish endi sukut bo'yicha yoqilgan;
  • Xplained Mini uchun yangilangan proshivka;
  • Solution Explorer-da "Barcha fayllarni ko'rsatish" funksiyasi tuzatildi.