AVR: AVR Studio орчинд програмчлал хийх. Atmel Avr студийн AVR Studio дибаг хийх нэгдсэн орчин

AVR Studio 4-тэй ажиллахын тулд та өөрөө суулгах хэрэгтэй. Хэрэв аль хэдийн суулгасан бол та энэ алхамыг алгасаж болно.

Суурилуулалт:
c:/avr/ лавлах үүсгэх - энд ажлын программууд байрлана.
лавлах үүсгэх, жишээ нь c:/works/ – энд таны бүтээлүүд хадгалагдах болно.
Тэдэнтэй холбоотой ямар ч асуудал гарахгүйн тулд товчлолууд байх шаардлагатай.

Ерөнхийдөө AVRStudio5 байдаг, гэхдээ AVRStudio4 хангалттай хэвээр байна.

Бүх ажил AVRStudio4 дээр явагдах болно, WinAVR нь зөвхөн AVR-GCC номын сангийн учир хэрэгтэй (Ингэснээр та C хэл дээр бичих боломжтой)
ГЭХДЭЭ! Та эхлээд WinAVR-г суулгах хэрэгтэй, эс тэгвээс AVR-GCC номын санг авахгүй.

Та үүнийг эндээс ойлгоно гэж бодож байна.
C хэлээр бичихэд зориулсан AVR-GCC
Ассемблерийн хувьд Atmel Avr Ассемблер.

MK-г эхнээс нь ойлгож эхлэх нь дээр. Энэ нь Assembler гэсэн үг бөгөөд энэ нь та Atmel AVR Assembler-ийг бүтээнэ гэсэн үг юм.

Дараа нь Atmega8 микроконтроллерыг сонгоно уу.

төслийг бүтээхэд том, цагаан, хоосон хуудас байх болно. энд код байх болно.

Энэ хуудасны агуулгын талаар бага зэрэг

"Сэтгэгдэл" гэдэг нь хөрвүүлэгчийн эмхэтгэх үед алгасдаг текст юм.
тайлбар эхлэхээс өмнө тусгай тэмдэг байх ёстой, би тэмдгийг ашигладаг; "Цэг таслал", мөн "давхар налуу зураас" (//) байдаг.
Энд сэтгэгдлийн жишээ байна

/* * Ийм төрлийн тайлбар (олон мөр), * ихэвчлэн эх кодын тухай * дагалдах мэдээлэлд * ашиглагддаг, i.e. * нэр, хөгжүүлэгч гэх мэт. */ NOP // Энэ тайлбарыг голчлон командын зорилгыг тайлбарлахад ашигладаг, эсвэл SLEEP кодын хэсэг; Энэ тайлбарыг өмнөхтэй адил кодын тайлбарт (тэмдэглэлд) ашиглаж болно

командуудыг мөр бүрт бичнэ. тэдгээр. нэг тушаал - нэг мөр.
Хоёр "параметртэй", нэгтэй эсвэл юу ч байхгүй командууд байна гэж бодъё

MOV R16, R17; хоёр параметр INC R16 ; нэг SEI параметр; параметргүй

MOV R16, R17; гурван байт INC R16; хоёр байт SEI; нэг байт

Багийн хэмжээ болон параметрүүдийн хоорондын уялдаа холбоог та харж байна уу?

Микроконтроллер бүр өөрийн ассемблертэй байдаг ч тэдгээрийн мнемоник нь ижил төстэй байдаг. Нэг цувралын MK-д зориулсан MOV команд нь 0x12, өөр 0x55 гэсэн машины кодыг харна.
Эмхэтгэх явцад үүнийг бидэнд хэрэгтэй кодоор хөрвүүлэхийн тулд бид ямар микроконтроллерт зориулж програм бичиж байгаагаа хөрвүүлэгчид хэлэх ёстой.
Энэ нь ерөнхийдөө төсөл үүсгэх үед сонгогддог.
Энэ шалтгааны улмаас бид Atmega8 микроконтроллерийг сонгосон.

Гэхдээ энэ нь бүгд биш. Бидний амьдралыг хөнгөвчлөхийн тулд AVRStudio4 нь "Macroassembler" гэх мэт тогтмол тоонуудтай.

Тэдгээрийг ачаалахын тулд та кодын эхэнд мөр оруулах хэрэгтэй

"m8def.inc"-г оруулна уу // .include командыг ашиглан бид m8def.inc файлыг ачааллаа; одоо энэ нь бидэнд илүү хялбар болно;)

Кодын хамгийн эхэнд тасалдлын хүснэгтийг байрлуулсан болно. Энэ нь юу болох, хэрхэн ажилладаг талаар би өөр нийтлэлд тайлбарлах болно. Харин одоохондоо ингэж бичье.

RJMP RESET; RETI зохицуулагчийг дахин тохируулах; RJMP EXT_INT0; IRQ0 Handler RETI; RJMP EXT_INT1; IRQ1 Handler RETI; RJMP TIM2_COMP; Timer2 Харьцуулах зохицуулагч 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; Аналог харьцуулагч зохицуулагч RETI; RJMP TWSI; Хоёр утастай цуврал интерфэйс зохицуулагч RETI; RJMP SPM_RDY; Програмын санах ойн бэлэн зохицуулагчийг хадгалах

Үүний дараа код өөрөө гарч ирнэ

ДАХИН АЧААЛЛАХ: ; эхлүүлэх токен MAIN: NOP ; гол давталтын тэмдэглэгээ RJMP MAIN

Гэхдээ нэг (эсвэл нэг биш, гэхдээ олон) онцлог байдаг.

Код бичихэд хялбар, ойлгомжтой байх, харьцангуй шилжилтийг хөнгөвчлөхийн тулд бидэнд маркер өгсөн, тэдгээр нь ямар харагддаг вэ? "RESET:" ба "MAIN:" нь тэмдэглэгээ бөгөөд тэдгээрийн нэр нь бараг ямар ч латин үсэг, тоо агуулж болно. Тэмдэглэгээнд функц, тушаалын нэр байж болохгүй, жишээ нь "NOP".
Хүн тэдэнд яаж хүрэх вэ? RJMP командыг хэлье.

Мөн Markers-аас бид дэд программ (процедур) хийж болно, үүнийг дуусгасны дараа бид дуудсан газар руугаа буцах болно. Үүнийг дуудахын тулд "RCALL (дэд програм)" командыг ашиглаж, дэд программаас (процедур) буцаж ирэхийн тулд "RET" командаар дуусгах хэрэгтэй. Бид ийм кодтой байх ёстой:

ДАХИН ЭХЛҮҮЛЭХ: ҮНДСЭН: ҮГҮЙ RCALL PPP1 ; дэд программыг дуудах RJMP MAIN PPP1: NOP RET ; дэд програмаас гарах

“RCALL” команд хэрхэн ажилладаг, түүнийг дуудах үед тухайн дуудсан хаягийг STACK дээр байрлуулж, “RET” командыг дуудах үед “стек” регистрээс хасдаг. STACK-г эхлүүлэх шаардлагатай.

Бид МК-тай ажиллахын тулд үүнийг эхлүүлэх хэрэгтэй. учир нь mk, энэ төхөөрөмж нь бүх нийтийнх бөгөөд олон оролт/гаралтын портууд болон захын төхөөрөмжүүдтэй. USART, PWM, DAC, ADC гэх мэт. Микроконтроллерыг эхлүүлэх эхний алхам бол "стек"-ийн эхлэлийг зааж өгөх явдал юм. Бид "RESET:" тэмдэглэгээний дараа эхлүүлэх ажлыг гүйцэтгэдэг.

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

Хэрэв бид кодын эхэнд .include “m8def.inc” командыг оруулаагүй бол дараах байдлаар бичих хэрэгтэй болно.

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

Миний бодлоор ялгаа нь мэдэгдэхүйц юм.

STACK нь дэлгүүрийн төрлийн санах ой юм: (хамгийн сүүлд орж, эхлээд гарах).
Дэлгүүрийн төрөл нь супермаркет биш, харин пулемётын эвэр юм. Хүн бүр хайрцагнууд руу хэрхэн ачигдсан, дараа нь тэндээс хэрхэн салгагддагийг төсөөлж чадна гэж найдаж байна.
Та STACK санах ойд маш их анхаарал хандуулах хэрэгтэй, учир нь... түүнтэй ажиллахад ямар нэгэн жижиг алдаа нь стекийн бүтэлгүйтэлд хүргэж болзошгүй юм. Энэ бол маш чухал сэдэв тул би түүнд бүхэл бүтэн сэдвийг зориулахаар шийдсэн бөгөөд үүнийг тусдаа тэмдэглэлд бичих болно.

Тиймээс бид дараах кодыг авсан.

"m8def.inc" RJMP RESET оруулах; RETI зохицуулагчийг дахин тохируулах; RJMP EXT_INT0; IRQ0 Handler RETI; RJMP EXT_INT1; IRQ1 Handler RETI; RJMP TIM2_COMP; Timer2 Харьцуулах зохицуулагч 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; Аналог харьцуулагч зохицуулагч RETI; RJMP TWSI; Хоёр утастай цуврал интерфэйс зохицуулагч RETI; RJMP SPM_RDY; Хөтөлбөрийн санах ойн бэлэн зохицуулагчийг хадгалах: LDI R16,HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 RGMP RESET ҮНДСЭН: ҮГҮЙ ; гол давталтын тэмдэглэгээ RJMP MAIN

Энэ үе шатанд бид төслийг эмхэтгэж, дибаг хийх зорилгоор ажиллуулж болох боловч бидний код юу ч хийхгүй тул бид зөвхөн кодын синтакс алдааг тодорхойлох боломжтой.

Дибаг хийх процессыг зөв хийхийн тулд та эмуляторыг MK-ийн ажиллах давтамжийг тохируулах хэрэгтэй бөгөөд үүнийг эмхэтгэж, дибаг хийж эхэлсний дараа л хийдэг.
Энэ нь бид цэсний мөрөнд "Бүтээх" гэснийг олоод нээгээд "Бүтээж ажиллуул" гэснийг харсны дараа кодын жагсаалтын эхний командын эсрэг талд шар сум харагдах болно гэсэн үг юм. Одоо бид цэсний мөрөнд "Дбаг хийх" хэсгийг хайж, "AVR Simulator Options" дээр дарвал дараах цонх нээгдэнэ.

Бид MK ба түүний давтамжийг өөрчлөх боломжтой, мөн баруун талд байгаа самбар дээр бид MK-ийн талаархи зарим мэдээллийг харж болно: түүний хамгийн их давтамж, санах ойн багтаамж (EEPROM, RAM, FLASH). Одоо Atmega8 дээрх өгөгдлийн хуудсыг 203 (бүртгэлийн ерөнхий жагсаалт) болон 205 (командын ерөнхий жагсаалт) дээр нээж, програмаа бичиж эхлээрэй.
Симуляторыг туршихаас бүү ай, энэ нь эвдэрэхгүй гэдгийг санаарай!


Сайн уу.

Энэхүү нийтлэл нь өөрсдийгөө Arduino-ээс "том болсон" гэж үздэг бөгөөд "ноцтой" микроконтроллерийн програмчлалын ертөнцөд хөл тавихад бэлэн байгаа хүмүүст таалагдах болно. Та "програмистынхаа ур чадварыг дээшлүүлэх" -ээс гадна төсөлдөө ямар ч микроконтроллер сонгох боломжтой бөгөөд мэдээжийн хэрэг та програмын хурд, тэдгээрийн эзэлдэг санах ойн хэмжээг үнэлэх болно.

Бүх зүйлийг тайлбарлах болно (   -д), эхнээс нь дуустал, - шаардлагатай програм хангамжийг суулгах, бэлтгэх, хамгийн энгийн "Gromov" програмистыг угсрах (Бүү ай, ердөө гурван диод, долоон резистор байдаг), MK программ хангамж болон AVR Studio дээр код бичих. Бүх үйл явц нь зураг, жишээнүүдийн хамт байх болно.

Би шууд захиалгаа өгье: компьютер нь COM портоор тоноглогдсон байх ёстой (USB-аас COM адаптер сайн ажиллахгүй байна). Хэрэв таны компьютер арын хэсэгт ийм холбогч байхгүй бол энэ нь эх хавтан дээр (зүү хэлбэртэй) байж магадгүй юм бол энэ "хөлөгдөх" тусламжтайгаар бүх зүйлийг шийдэж болно.

Харамсалтай нь, COM-гүй зөөврийн компьютер эзэмшигчдийн хувьд нийтлэл нь зөвхөн эрдэм шинжилгээний сонирхолтой юм.

За, эхэлцгээе ...

Танд юу хэрэгтэй вэ?

"Зөөлөн"


Юнипроф- янз бүрийн ATmega микроконтроллеруудыг анивчуулах бүх нийтийн програм, энгийн бөгөөд тохиромжтой, хамгийн чухал нь манай програмисттай төгс ажилладаг. Зохиогч нь Оросын хөгжүүлэгч Михаил Николаев юм.

Мэдээжийн хэрэг, та AVR Studio-аас MK-г гэрэлтүүлж болно, гэхдээ үүний тулд танд тусгай програмист хэрэгтэй. Тиймээс бид кодыг студид бичиж, гар хийцийн программист ашиглан UniProf-ийн тусламжтайгаар үүссэн hex файлуудыг флэш болгох болно. Нэмж дурдахад командын мөрөөс програм хангамжийг анивчуулах аргыг тайлбарлах болно.

Линукс хэрэглэгчид виртуал машин эсвэл Wine ашиглах шаардлагатай болно. Wine-ийн хувьд энэ нь надад тохирохгүй байсан, би портыг огт харж чадахгүй, виртуал машин дээр туршиж үзээгүй.

  Wine дээр өөгүй ажиллана (Debian 8.5, wine1.6).

Бүх програм хангамж үнэ төлбөргүй байдаг.

"Төмөр"

Бид туршилт хийх болно Arduino pro mini ATmega328 чиптэй. Кварцын давтамж (8/16 МГц), түүнчлэн хүчдэл (3.3/5v), хамаагүй. (доороос үзнэ үү)

Ирээдүйд та янз бүрийн Atmel микроконтроллеруудыг програмчлах болно, гэхдээ анх удаа энэ самбар нь зөв юм. Энэ нь хамгийн бага утас, гагнасан зүү бүхий нүцгэн хянагч учраас сайн хэрэг. Зөвхөн танд хэрэгтэй зүйл.

Микроконтроллер дээрх тэмдэглэгээний тухай

Нэрийн дараа санах ойн хэмжээг ихэвчлэн заадаг тоонууд байдаг.

Тоонуудын дараах үсэг нь тэжээлийн хүчдэлийн параметрүүдийг заана.

Захидал байхгүй- хянагчийн тэжээлийн хүчдэл 4.5-5.5 вольт дотор байна.
Л- багассан ажиллаж байгаа хянагчийн хувилбарууд (Бага)тэжээлийн хүчдэл (2.7 - 5.5 вольт).
В- бага тэжээлийн хүчдэл дээр ажилладаг хянагчийн хувилбарууд (1.8-5.5 вольт).
У- хэт бага тэжээлийн хүчдэл дээр ажилладаг хянагчийн хувилбарууд (0.7-5.5 вольт).
П- бага чадалтай хувилбарууд (унтраах горимд 100 нА хүртэл).
А- гүйдлийн хэрэглээг бууруулж, бүх хувилбаруудын цагийн давтамжийн хүрээг хамарсан, тэжээлийн хүчдэл 1.8-5.5 вольт (зарим загварт өмнөх хувилбаруудтай бүрэн нийцтэй байхын зэрэгцээ шинэ боломжууд болон шинэ бүртгэлүүд нэмэгдсэн).

Микроконтроллер " А"ба" үгүй ​​- А"Гал хамгаалагчийн битүүд өөр байдаг тул ихэвчлэн ижил гарын үсэгтэй байдаг бөгөөд энэ нь зарим хүндрэл учруулдаг.

Жишээ нь:

ATmega8- програмын санах ойн багтаамж 8 килобайт, тэжээлийн хүчдэл 4.5-5.5 вольт.
ATmega8L- програмын санах ойн багтаамж 8 килобайт, тэжээлийн хүчдэл 2.7-5.5 вольт.
ATtiny43U- санах ойн багтаамж 4 килобайт, өөрчлөлт - 3, тэжээлийн хүчдэл - 0.7-5.5 вольт.
ATtiny44A- санах ойн багтаамж 4 килобайт, өөрчлөлт - 4, гүйдлийн зарцуулалтыг бууруулсан, тэжээлийн хүчдэл 1.8-5.5 вольт.

Үсэггүй хянагч нь тэжээлийн хүчдэл буурсан (1.7 эсвэл 1.8 вольт) байж болно. Үүнийг мэдээллийн хуудсанд тодруулах шаардлагатай.

ATtiny841- санах ойн багтаамж 8 килобайт, өөрчлөлт - 41, тэжээлийн хүчдэл - 1.7-5.5 вольт.

Зураасны дараа хянагчийн хамгийн их давтамжийг харуулсан тооноос бүрдэх микроконтроллерийн хувилбарыг зааж өгсөн болно. (тохиромжтой тэжээлийн хүчдэл дээр), мөн орон сууцны сонголт, үйл ажиллагааны температурын хүрээ, үйлдвэрлэлийн онцлогийг харуулсан үсэгнээс.

Давтамжийн дараах нэг эсвэл хоёр үсэг нь орон сууцны төрлийг заана.

Юнипроф
Хөтөлбөр бичих нь тулааны хагас нь тул та үүнийг хянагч руу оруулах хэрэгтэй хэвээр байна. Тиймээс энэ тал дээр илүү анхааръя.

Хэрэв таны Arduino стандарт Blink суулгасан бол сайн байх болно (энэ нь үйлдвэрээс ирдэг).

UniProf-ийг ажиллуулцгаая... Магадгүй дараах цонх гарч ирэх болно:

Энэ нь LPT порттой холбогдсон тул товшино уу БОЛЖ БАЙНА УУ.

Дараа нь програмын цонх нээгдэнэ:

Хэрэв портыг зөв сонгоогүй бол дараах цонх гарч ирнэ...

OK дарж, хүссэн портоо сонгоно уу.

Хэрэв MK автоматаар илрээгүй бол гараар сонгох цонх гарч ирнэ.

Харамсалтай нь жагсаалтад ороогүй байна atmega328, тиймээс бид сонгодог мега32 (тэд ижил хэмжээний флаш санах ойтой) ба дарна уу БОЛЖ БАЙНА УУ.

Үүний дараа үл мэдэгдэх үгийн оронд холбогдсон хянагч гарч ирнэ...

32Кнь Flash санах ойн хэмжээ, мөн 1024 - EEPROM дууны хэмжээ.

Одоо, хэрэв бүх зүйл зураг дээрх шиг байвал   тусламжийг нээж, тэнд бичсэн зүйлийг анхааралтай уншина уу. Зохиогч нь маш товч бөгөөд тиймээс их цаг хугацаа шаардахгүй. Одоогоор ямар ч товчлуурыг дарж болохгүй.

Та уулзсан уу? Гайхалтай, одоо бид цаашаа явж болно. EEPROM-ийн хажууд байгаа хайрцгийн чагтыг арилгаснаар та өөрчлөгдсөн интерфейсийг харах болно:

EEPROM-ийн чагтыг арилгасны дараа энэ санах ойн хэсгийг уншиж, бичихгүй.

Бид hex файлуудтай ажиллах тул "шалгах тэмдэг" -ийг арилгах болно. ГенералТэгээд BIN, мөн хайрцгийг чагтална уу Тоормослох!, энэ нь унших/бичих хугацааг нэмэгдүүлэх боловч тогтвортой байдлыг нэмэгдүүлэх болно.

Процесс хурдан биш тул та хүлээх хэрэгтэй болно. Цэнхэр квадратууд доор мөлхөж, баруун доод буланд тоог тоолно. Эхний дамжуулалт нь PROGRAM талбарыг, хоёр дахь нь EEPROM-ийг унших болно.

Надад стандарт Blink суурилуулсан шинэ Arduino байгаа (программист холбогдсон үед диод анивчхаа болино). Хэрэв танд ижил зүйл байгаа бол дараах зураг гарч ирнэ.

Баруун талд бид EEPROM-д юу ч байхгүй, зүүн талд PROGRAM-д бичигдсэн програм байгааг харж байна. (Миний хэлсэнчлэн энэ бол Blink). Одоо доош сумыг ашиглан өгөгдөл дуусах хүртэл гулсагчийг гүйлгэнэ үү...

... одоо төгсгөл хүртэл гүйлгэ. Та илүү их өгөгдлийг харах болно - энэ бол Arduino ачаалагч юм.

Одоо би нийтлэлээсээ завсарлага аваад MK-ийн бүтцийн талаар уншихыг санал болгож байна, энэ нь таны материалын талаархи ойлголтыг нэмэгдүүлэх болно. Бүх зүйлийг маш сайн, ойлгомжтой бичсэн. За, уншсаны дараа буцаж ирээд үргэлжлүүлье...

Сонголтыг арилгана уу EEPROM. Бидэнд үнэхээр хэрэггүй, гэхдээ "хачиг" байгаа нь тодорхой болно Тоормослох!

Одоо бүх программ хангамжийг хянагчдаа хадгалъя, ингэснээр туршилт хийсний дараа бид үүнийг анхны байдалд нь буцааж өгөх болно.

  товчийг дараад программыг хадгалаад дараах байдлаар нэрлэнэ. origProMini328.hex. Ингээд л боллоо, одоо танд нөөц байна.

... дараа нь аль хэдийн танил болсон Унших товчийг дарна уу. Үүний дараа та PROGRAM дахь бүх нүд хоосон байгааг харах болно. Зөвхөн програмыг устгаад зогсохгүй Arduino ачаалагчийг бас устгасан.
Өөрөөр хэлбэл, одоо та уламжлалт аргыг ашиглан ноорог байршуулах боломжгүй болно. Дараа нь, хэрэв та хүсвэл гараараа бага зэрэг даллаж, нөөцөөс бүх зүйлийг сэргээ.

Одоо бид хянагчийг зөвхөн AVR Studio дээр бичсэн ижил "Blink"-ээр гэрэлтүүлэх болно.

Энэ код нь иймэрхүү харагдаж байна:

#тодорхойлох F_CPU 16000000UL #include #оруулна #PIN_PB5 5-г тодорхойлох // PB5 (Arduino - D13) #PIN_PB5_PORT PORTB-г тодорхойлох #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; }
Хэрэв та 8 МГц кварцтай Arduino ашигладаг бол энэ нь буруу зүйл биш бөгөөд диод нь хагас удаа анивчих болно.

Хэр их зай эзэлдэгийг энд харуулав:

AVRDude

Uniprof нь бусад ижил төстэй програмуудын нэгэн адил зөвхөн AVRDude програмын график нэмэлт юм (AVR Татаж авах-Байршуулах), дараа нь микроконтроллер дээр дээр дурдсан бүх үйлдлийг гүйцэтгэдэг.
Учир нь AVRDudeөөрийн график интерфэйсгүй тул та тушаалын мөрөөс түүнтэй ажиллах хэрэгтэй. Энэ нь зарим хүнд тохиромжгүй мэт санагдаж болох ч энэ нь эсрэгээрээ, консолоос ажиллах нь үнэхээр гайхалтай. Тохиромжтой, энгийн бөгөөд ямар ч үйлдлийн системд холбогдоогүй, учир нь avrdude бүх зүйлд байдаг. Одоо та үүнийг харах болно.

Хэрэглэгчдэд зориулсан

Аврдүдэ AVR toolchain-д багтсан тул суулгаарай (AVR Studio суулгасны дараа)нийтлэлийн эхэнд бичсэнчлэн.

CD\
...дискний үндэс рүү оч ХАМТ.

Командыг оруулснаар:

Хэрэв тийм бол тэгвэл авурдуудявж, үргэлжлүүлэхэд бэлэн байна.

Одоо бид программистаа тохиргооны файлд нэмэх хэрэгтэй авурдууд (C:\Program Files (x86)\Atmel\AVR Tools\AVR Toolchain\bin\ avrdude.conf) . Програм дээр нээнэ үү Notepad++"ПРОГРАМЧИЙН ТОДОРХОЙЛОЛТ" гэсэн бичээсийн дараа дараах мөрүүдийг нэмнэ:

Програмист ID = "gromov"; desc = "цуваа порт цохих, дахин тохируулах = dtr sck = rts mosi = txd miso = cts"; төрөл = serbb; дахин тохируулах = 4; scck = 7; моси = 3; мисо = 8; ;
Бит цохих.

Файлыг хадгалж, хааж, шаардлагагүй болсон.

Терминал руу буцаж очоод MK болон программист хоорондын харилцаа холбоог шалгах командыг өг.

Avrdude -n -c gromov -P com1 -p m328p
Та өөр com порттой байж болно.

Суулгах авурдууд

Sudo apt install avrdude

Командыг оруулснаар:

Та тусламжийн мэдээллийг харах ёстой.

Хэрэв тийм бол тэгвэл авурдуудажилд бэлэн.

Портыг тохируулах:

Sudo stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflshҮүнийг компьютер дахин ачаалах болгоны дараа хийх эсвэл rc.local руу нэмэх шаардлагатай.

/dev/ttyS0 хаана байна com1, /dev/ttyS1 - com2гэх мэт.
Ирээдүйд би багаар бичих болно /dev/ttyS0, танд байж магадгүй /dev/ttyS1гэх мэт.

Программистыг тохиргооны файлд нэмнэ үү /etc/avrdude.conf

Sudo nano /etc/avrdude.conf

“ПРОГРАМЧИЙН ТОДОРХОЙЛОЛТ” гэсний дараа дараах мөрүүдийг нэмнэ.

Програмист ID = "gromov"; desc = "цуваа порт цохих, дахин тохируулах = dtr sck = rts mosi = txd miso = cts"; төрөл = "serbb"; дахин тохируулах = 4; scck = 7; моси = 3; мисо = 8; ;
Програмист нь Bit-baging технологийг ашигладаг.

Хуулбарлахдаа ишлэлүүд нь зүгээр л ишлэл хэвээр үлдэх эсэхийг шалгаарай, эс тэгвээс тэдгээр нь өөрчлөгдөж магадгүй (кодчлолын зөрүүгээс шалтгаалж), аврдуд тангараглах болно.

Файлыг хадгалаад хаа.

MK болон программист хоорондын холболтыг шалгах командыг өгнө үү.

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

Хэрэв холболт байгаа бол хариулт нь дараах байдалтай байна.

Энд л үйлдлийн системүүдийн ялгаа дуусч, тушаалууд нь давхарддаг.

Командад аргумент нэмнэ үү -vэсвэл -v -v (ямар ч тушаалд нэмж болно)бүрэн мэдээллийг харуулахын тулд:

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


Avrdude-ийн дүгнэлт бол Windows болон Линукс дээр хоёулаа адилхан, тиймээс би одооноос зөвхөн Win дээр дэлгэцийн зураг авах болно.

Энд илүү их мэдээлэл байна, жишээлбэл, ямар гал хамгаалагч суурилуулсныг харж болно. Энд тэдгээрийг арван зургаатын тоогоор гаргана (HEX)тоо. Жишээлбэл, hfuse 0xDA, хоёртын хувилбарт энэ нь иймэрхүү харагдаж байна - . Өөрөөр хэлбэл, эдгээр нь график интерфэйс дээр шалгагдсан ижил битүүд юм.

Гал хамгаалагчтай ажиллахдаа ATmega микроконтроллеруудад гал хамгаалагч нь урвуу байрлалтай байдаг гэдгийг санаарай. Тэр бол 0 - Энэ дээрЮчено, ба 1 - унтраахЮчено. Энэ нь онлайн тооны машинд төөрөгдөл үүсгэдэг (доороос үзнэ үү).

Бүс нутгийн программыг уншъя флэш (uniprof дээрх PROGRAM-тай ижил)тушаал:

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 дээр кодыг программ дээр харуулсан боловч энд файлд бичих болно.

Програм хангамжийг уншиж, файл руу бичнэ readfl.txt. Захидал h (hex)төгсгөлд нь өгөгдлийг арван зургаатын форматаар бичих ёстойг заана. Хэрэв та захидал бичвэл б (хоёртын систем), хоёртын системд бичигдэх бөгөөд хэрэв r (түүхий), дараа нь өгөгдөл "түүхий" хэлбэрээр байх болно (крякозябра).

Эндээс win хэрэглэгчид дискний үндсэн хэсэгт байрладаг гэж үздэг ХАМТ (C:\), болон Линукс хэрэглэгчид үндсэн фолдероосоо ажилладаг тул файлууд тэнд хадгалагдах болно (өөрөөр заагаагүй бол). MK-д байршуулах програм хангамж нь тэнд байрлах ёстой.

Ялахын тулд файл C:\readfl.txt, linux-ийн хувьд /home/user/readfl.txt дотор байрлана. Та энэ файлыг нээж үзэх боломжтой.

EEPROM уншиж байна:

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 болон eeprom-г хамт унших:

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###

Хянагчийг устгах:

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

"Дахин тохируулах" зүүг салга - диод анивчихгүй, програм устах болно.

Өмнө нь татаж авсан файлтай MK-г анивчъя 328test.hex. Дискний үндэс дээр байрладаг C(c:\328test.hex) windows эсвэл linux дээрх нүүр хавтсанд (/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###

Хэрэв та "дахин тохируулах" -ыг унтраавал хянагч амьдарна.

Анхаарна уу. MK-г анивчуулах үед авурдууд, хянагчийг устгах шаардлагагүй, програм өөрөө үүнийг хийдэг. Гэсэн хэдий ч, хэрэв та параметрийг зааж өгвөл , дараа нь MK автоматаар цэвэрлэхгүй.

EEPROM програм хангамж:

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###

Бүх гал хамгаалагчийг уншиж байна:

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###

Зарим хянагч нь гал хамгаалагчгүй байж болно.

Зөвхөн уншигдах Гал хамгаалагч:

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###

Бага гал хамгаалагч нь цагны дохионы эх үүсвэр (дотоод, гадаад), давтамжийг сонгох, түүнд тэжээл өгсний дараа хянагч эхлэхээс өмнөх түр зогсолтыг сонгох үүрэгтэй. Одоо та тэнд бичсэн утга байна - 0xff, энэ нь 8 МГц ба түүнээс дээш давтамжтай гадаад кварцтай тохирч байна.

Одоо бид өөр нэг гал хамгаалагчийг асаах бөгөөд энэ нь таны ATmeg-ийг дотоод 8 МГц генератороос ажилд шилжүүлэх болно.

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###

Хэрэв танд 16 МГц-ийн Arduino байгаа бол диод хоёр дахин удаан анивчих болно.
Ирээдүйд, AVR Studio дээр кодлохдоо та 8 МГц давтамжийг зааж өгч, кварцыг задлах боломжтой бөгөөд ингэснээр та хоёр үнэгүй дижитал зүү авах боломжтой.

Гэхдээ энэ нь хожим бөгөөд одоо өмнөх гал хамгаалагчийг асаах замаар бүгдийг буцацгаая.

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###

Диод зөв анивчих болно.

Гал хамгаалагчийг дангаар нь эсвэл хамтад нь асааж болно.

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###
Эдгээр тушаалуудыг өгөх шаардлагагүй. Тодорхой болгох үүднээс би тэдгээрийг танилцуулж байна.

Цаашид бусад хянагч ашиглах шаардлагатай үед та онлайн тооны машин дээрх нүдийг шалгаад утгыг авах болно. (холбоос зүүн дээд буланд байгаа) hex форматад оруулаад флэш болго.

Одоо зөвхөн параметрүүдийг тодорхойлоход л үлдлээ авурдуудтэгээд та эцсийн хэсэг рүү шилжиж болно.

-с Громов- програмистын төрөл, эс тэгвээс тохиргоонд бичсэн нэр (avrdude.conf).
-P com1- За энд бүх зүйл тодорхой байна.
-p m328p- тэмдэглэгээний төрөл MK.
- энэ сонголтын дараа санах ойн хэсгийг зааж өгнө (флэш, eeprom, xfuse), үүн дээр ямар нэгэн үйлдэл хийх болно (r - унших, w - бичих).
Хоёр цэг нь тусгаарлах үүрэг гүйцэтгэдэг.

Энд микроконтроллеруудын нэр, тэдгээрийн нэр, программистууд болон бусад сонголтуудын хамт.

MK хоч

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
м128- ATmega128
m1280- ATmega1280
m1281- ATmega1281
m1284p- ATmega1284P
m1284rfr2- ATmega1284RFR2
m128rfa1- ATmega128RFA1
m128rfr2- ATmega128RFR2
м16- ATmega16
m161- ATmega161
m162- ATmega162
m163- ATmega163
m164p- ATmega164P
m168- ATmega168
m168p- ATmega168P
m169- ATmega169
m16u2- ATmega16U2
м2560- ATmega2560 (**)
m2561- ATmega2561 (**)
m2564rfr2- ATmega2564RFR2
m256rfr2- ATmega256RFR2
м32- ATmega32
m324p- ATmega324P
m324pa- ATmega324PA
м325- ATmega325
м3250- ATmega3250
м328- ATmega328
m328p- ATmega328P
м329- ATmega329
м3290- ATmega3290
m3290p- ATmega3290P
m329p- ATmega329P
m32u2- ATmega32U2
m32u4- ATmega32U4
m406- ATMEGA406
м48- ATmega48
m48p- ATmega48P
м64- ATmega64
m640- ATmega640
m644- ATmega644
m644p- ATmega644P
m644rfr2- ATmega644RFR2
m645- ATmega645
m6450- ATmega6450
m649- ATmega649
m6490- ATmega6490
m64rfr2- ATmega64RFR2
м8- ATmega8
m8515- ATmega8515
m8535- ATmega8535
м88- ATmega88
m88p- ATmega88P
м8у2- 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

Линукс хэрэглэгчид дарс хэрэглэж болно.

Та бүх зүйлийг суулгасан гэж найдаж байна, тиймээс AVR Studio-г ажиллуулцгаая...


Энд бид шинэ төсөл үүсгэх эсвэл хуучин төслийг нээхийг хүсч байна. дарна уу Шинэ төсөл


Сонго AVR GCC, учир нь бид ассемблер дээр биш SI дээр бичих болно.
Бид төсөлд нэр өгч, нүдийг шалгана уу.
Сонго Байршил (Би C:\ диск дээр AVR хавтас үүсгэсэн)Төсөл бүхий хавтаснууд тэнд автоматаар үүсгэгдэх болно.
дарна уу Дараачийн


Сонго AVR симулятор, учир нь бид дибаг хийхийг зөвшөөрдөг тусгай программист байхгүй бөгөөд бидний микроконтроллер байдаг ATmega328p.
дарна уу Дуусга.

Эдгээр заль мэх хийсний дараа студи ажиллахад бэлэн байна.

Зүүн талд төсөлд хүрэх замууд байна. Төв хэсэгт код бичсэн текст засварлагч байдаг. Баруун талд хянагчийн бүртгэлүүд байна. Зүүн доод талд дибаг хийх мэдээлэл байна.

Одоогоор бидний сонирхож байгаа товчлууруудаас -

Төслийг бий болгох.
Төслийг бүтээж, дибаг хийж эхлээрэй.
Файлыг эмхэтгэж байна.
Цэвэрлэгээ.
Төслийн тохиргоо. Тиймээс үүн дээр дарна уу ...

Энд та MK төрлийг өөрчилж, цагийн давтамжийг тохируулж болно (бид үүнийг кодонд шууд бичих болно), оновчлолын түвшин, түүнчлэн ямар файл үүсгэхийг тодорхойлох.
Сонирхуулахын тулд зүүн талд байгаа дүрс дээр товшоод товшино уу Цуцлах.
Би эдгээр болон бусад сонголтыг тайлбарлахгүй, гэхдээ дараа нь би чадварлаг тайлбар бүхий холбоосыг өгөх болно.

Одоо нийтлэлийн эхэнд бичсэн кодыг хуулж, редактор руу оруулна уу.

Номын сан үүнийг шаарддаг тул бид кодын цагийн давтамжийг зааж өгсөн саатал.х.

Барилга амжилттай болсон, ямар ч алдаа, анхааруулга байхгүй.

Одоо замдаа явцгаая C:\AVR\my328\өгөгдмөл\, бид тэндээс бидний үүсгэсэн hex файлыг олдог - my328.hexба үүнийг хянагч руу анивчина уу. Юу гялсхийх вэ (avrdude эсвэл uniprof)өөрөө сонго.

avrdude-д энэ нь дараах байдлаар харагдах болно.

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###

"Дахин тохируулах"-ыг идэвхгүй болгоод диод секундэд нэг удаа анивчихыг харна уу. Би танд командын мөрийн энгийн, хялбар байдлын талаар итгүүлсэн гэж найдаж байна.

Arduino-г буцааж Arduino болгон хувиргахын тулд танд нөөц бий.

Дээр дурдсанчлан би AVR Studio-тэй ажиллах талаар тайлбар хийхгүй, мөн SI хэлний хичээл заахгүй. Юуны өмнө энэ бол миний төлөвлөгөө биш байсан. (Би зүгээр л Arduino-оос AVR Studio руу шилжихэд туслахыг хүссэн)

IDE нь төрөл бүрийн загвар, номын сан, дибаг хийх функцуудыг агуулсан хөгжүүлэлтийн нэгдсэн орчин юм. Хэрэв бид ярих юм бол 2004 оноос хойш хүчирхэг програм хангамжийн багц болох AVR студио тэдэнд зориулж боловсруулсан.

Эхний хувилбарууд

Студийн анхны хувилбарууд нь ассемблер агуулсан байсан бөгөөд та үүнийг эхний чуулгануудаас гаргаж авах боломжтой байсан ч хожим энэ төслийг орхиж, үндсэн хэлээр C AVR-ийг сонгосон. Хөрвүүлэгч нь төлбөртэй, маш ноцтой IAR бүтээгдэхүүн байсан. Та WINAVR-ийг үнэгүй татаж авах боломжтой бөгөөд үүнийг хийхийн тулд студийг суулгасны дараа үүнийг суулгах хэрэгтэй.

Анхаар! Үүнийг зөвхөн AVR studio 4 болон бусад хувилбаруудыг суулгасны дараа хийх нь дээр.

AVR studio 4 (дээрх зураг) удаан хугацааны турш онцолсон. Олон микроконтроллер хөгжүүлэгчид энэ асуудалтай тулгарсан. Хожим нь IDE-г AVR studio 5 болгон сайжруулсан.Интерфэйсээс гадна ямар нэгэн онцгой өөрчлөлт гараагүй бөгөөд зөвхөн дараа нь хөгжүүлэгч компани бүтээгдэхүүнээ шинэчилж, нэрийг нь Atmel studio 6 болгон өөрчилсөн.

AVR studio 5 орчин нь дараах микроконтроллеруудыг дэмждэг:

  • AVR32;
  • XMEGA.

Atmel studio 6 нь AVR studio 5-аас эрс ялгаатай байсан бөгөөд хувилбарын хамгийн мэдэгдэхүйц шинэлэг зүйлүүд нь:

  1. Microsoft Visual Studio 2010 нь AVR гэр бүлтэй хамтран ажиллаж эхэлсэн.
  2. AVR studio 5-тай харьцуулахад синтаксийн тодотгол сайжирсан.
  3. Санамжууд болон командын багцыг автоматаар бөглөх боломж нэмэгдсэн нь хөгжүүлэлтийн процессыг хурдасгадаг.
  4. Ерөнхийдөө хүрээлэн буй орчны бүх үйл ажиллагаа илүү найдвартай болсон.
  5. ARM Cortex-M-ийн дэмжлэгийг нэмсэн.
  6. WinAVR-г тусад нь суулгах шаардлагагүй; GCC-г одоо суулгацын явцад суулгасан нь залуу хувилбаруудаас ялгаатай.

Atmel studio 6-д програмын хэрэглэгчдэд илүү сайн үсрэлт гарсан нь Атмелийн гэр бүлийн алдар нэрд нөлөөлсөн. Гэсэн хэдий ч файлын зам дахь орос тэмдэгтүүдэд хангалттай дэмжлэг үзүүлэх боломжгүй байв.

Одоогийн хувилбар - Atmel studio 7

Миний ашигласан хөгжүүлэлтийн орчин бол Visual Studio Isolated Shell 2015; нэг талаас, энэ шийдэл нь Windows XP дээр дэмжигдээгүй, нөгөө талаас, эдгээр арга хэмжээг програмын гадаад байдал болон түүний ажиллагааг сайжруулах зорилгоор авсан.

Магадгүй хамгийн чухал нь Atmel studio 7-д Arduino-ийн дэмжлэг нэмсэн явдал юм. Энэ нь та энгийн схемүүдээс бүх C функц, дибаг хийх, MCU симулятор болон бусад функцуудыг ашиглах боломжтой гэсэн үг юм. Arduino болон Atmel studio 7-ийн хослол нь энэхүү энгийн сургалтын платформыг хөгжүүлэхэд шинэ шатанд гарсан.

Arduino-тэй Atmel студид суралцах нь Arduino-ийн зүрх сэтгэл болох Atmega микроконтроллерыг бүрэн, үр бүтээлтэй эзэмших, гүнзгий танилцах боломжийг олгоно.

Нэмж дурдахад, Atmel вэбсайтаас LCD дэлгэцийг ажиллуулах, холбох багцыг татаж авах боломжтой. Мэргэшсэн жишээ болгон та LCD 1602 ашиглаж болно; Интернет дээр үүн дээр олон хичээл байдаг бөгөөд хөгжүүлэгч дэлгэц дээр 16 тэмдэгт, 2 мөр байдаг.

Хаанаас сурч эхлэх вэ?

Мэдээжийн хэрэг та програмист худалдаж авахаас эхлэх хэрэгтэй; Хамгийн төсөвт ээлтэй нь USBASP юм. USBASP программистыг Atmel Studio 7-д дэмждэггүй.


Программист болон AVRdude програмын драйверуудыг татаж аваад бүгдийг нь хамтад нь ажиллуулахын тулд та тушаалын мөрөөр дараах тушаалыг ашиглаж болно.

"avrdude -c usbasp -p atmega32 -U flash:w: програм хангамжийн файлын нэр. зургаан өнцөгт -U гал хамгаалагч:w:0x6a:m -U hfuse:w:0xff:m"

atmel studio 7 (гарчиг - гадаад хэрэгсэл) дээр профайл үүсгэх замаар түүний дэмжлэгийг идэвхжүүлж, "Аргументууд" зүйлд "-c usbasp -p atmega32 -U flash:w:$(TargetName).hex" гэх мэтийг оруулна уу. Та микроконтроллер ашигладаг төрөл.

Энэ бол студи болон USBASP программистыг холбох цорын ганц арга зам юм. Анивчихдаа болгоомжтой байгаарай - та микроконтроллерийн гарын үсгийг гэмтээж болох бөгөөд үүнийг зөвхөн 12 В (өндөр хүчдэл) програмистаар сэргээх боломжтой.

Сургалтанд ямар уран зохиол ашиглах ёстой вэ?

Юуны өмнө микроконтроллер бүрийн гарын авлагыг албан ёсны вэбсайтаас татаж аваарай. Тодорхой сурах бичгийг санал болгоход хэцүү байдаг ч “DI Halt - AVR. Сургалтын курс" та үүнийг ашиглаж болно - энэ материалыг бүтээгч нь дадлагажигч, янз бүрийн интернетийн эх сурвалжуудын талаархи олон нийтлэлийн зохиогч, мэргэжлийн хүрээлэлд нэр хүндтэй хүн юм.

Би МК-д суралцах нь ассемблерээс эхлэх ёстой гэж нэгээс олон удаа хэлсэн. Вэбсайт дээрх бүхэл бүтэн курс үүнд зориулагдсан (хэдийгээр энэ нь тийм ч тогтвортой биш боловч аажмаар би үүнийг зохих дүр төрхтэй болгож байна). Тийм ээ, энэ нь хэцүү, үр дүн нь эхний өдөр гарахгүй, гэхдээ та хянагчдаа юу болж байгааг ойлгож сурах болно. Та энэ нь хэрхэн ажилладагийг мэдэх болно, мөн сармагчин шиг бусдын эх сурвалжийг хуулахгүй, яагаад гэнэт ажиллахаа больсныг ойлгохыг хичээх болно. Нэмж дурдахад, С-д хамгийн тохиромжгүй мөчид сэрээтэй гарч ирдэг улаавтар код үүсгэх нь илүү хялбар байдаг.

Харамсалтай нь хүн бүр шууд үр дүнг хүсдэг. Тиймээс би өөр замаар явахаар шийдсэн - C-ийн талаар зааварчилгаа хийх, гэхдээ түүний дотуур хувцасыг харуулсан. Сайн суулгагч програмист төхөөрөмжөө үргэлж боолтноос нь чанга барьж, зөвшөөрөлгүйгээр нэг алхам хийхийг зөвшөөрдөггүй. Тэгэхээр эхлээд C код байх болно, дараа нь хөрвүүлэгч юу үйлдвэрлэсэн, энэ бүхэн хэрхэн ажилладаг вэ :)

Нөгөөтэйгүүр, С-ийн хүчтэй тал бол кодыг зөөвөрлөх чадвар юм. Хэрэв та мэдээж бүх зүйлийг зөв бичсэн бол. Ажлын алгоритмууд болон тэдгээрийн техник хангамжийн хэрэгжилтийг төслийн өөр өөр хэсэгт хуваах. Дараа нь алгоритмыг өөр микроконтроллер руу шилжүүлэхийн тулд зөвхөн техник хангамжийн бүх дуудлага бичигдсэн интерфейсийн давхаргыг дахин бичиж, бүх ажлын кодыг хэвээр үлдээхэд хангалттай. Мэдээжийн хэрэг, унших чадвар. С хэлний эх кодыг анх харахад ойлгоход илүү хялбар байдаг (хэдийгээр ... жишээ нь, би юуг зааж өгөх нь хамаагүй - C эсвэл ASM байна :)), гэхдээ бүх зүйл зөв бичигдсэн бол дахин. Би бас эдгээр цэгүүдэд анхаарлаа хандуулах болно.

Миний дибаг хийх самбар нь бүх жишээнүүдийн арслангийн хувийг суурилуулах туршилтын тоног төхөөрөмж болж ажиллах болно.

AVR-д зориулсан анхны C програм

Хөрвүүлэгчийг сонгох, орчныг тохируулах
AVR-д зориулсан олон төрлийн C хөрвүүлэгч байдаг:
Юуны өмнө энэ IAR AVR C- бараг гарцаагүй AVR-ийн шилдэг хөрвүүлэгч гэж хүлээн зөвшөөрөгдсөн, учир нь хянагч өөрөө Атмел болон IAR-ын мэргэжилтнүүдийн хооронд нягт хамтран бүтээгдсэн. Гэхдээ та бүх зүйлийг төлөх ёстой. Мөн энэ хөрвүүлэгч нь зөвхөн үнэтэй арилжааны програм хангамж төдийгүй маш олон тохиргоотой тул үүнийг зүгээр л эмхэтгэхийн тулд маш их хүчин чармайлт шаарддаг. Би түүнтэй үнэхээр нөхөрлөсөнгүй, уг төсөл нь холбох үе шатанд хачирхалтай алдаанаас болж ялзарч байсан (хожим нь би энэ нь муруй хагарал байсныг мэдсэн).

Хоёр дахь нь ирдэг WinAVR GCC- хүчирхэг оновчтой хөрвүүлэгч. Бүрэн нээлттэй эх сурвалж, хөндлөн платформ, ерөнхийдөө амьдралын бүх баяр баясгалан. Энэ нь мөн AVR Studio-д төгс нийцдэг бөгөөд танд дибаг хийх боломжийг олгодог бөгөөд энэ нь үнэхээр тохиромжтой юм. Ерөнхийдөө би үүнийг сонгосон.

Бас байдаг CodeVision AVR Cнь маш алдартай хөрвүүлэгч юм. Энэ нь энгийн байдлаасаа болж алдартай болсон. Та хэдхэн минутын дотор ажлын програмыг авах боломжтой - эхлүүлэх кодын шидтэн нь бүх төрлийн зүйлийг эхлүүлэх стандартыг баталгаажуулснаар үүнийг ихээхэн хөнгөвчилдөг. Үнэнийг хэлэхэд, би үүнд сэжиглэж байна - нэг удаа би энэ хөрвүүлэгчийн бичсэн програмыг задлах шаардлагатай бол энэ нь код биш харин ямар нэгэн эмх замбараагүй байдал болж хувирсан. Аймшигтай хэмжээний шаардлагагүй хөдөлгөөн, үйлдлүүд нь ихээхэн хэмжээний код, удаан гүйцэтгэлд хүргэсэн. Гэсэн хэдий ч магадгүй анхны програмыг бичсэн хүний ​​ДНХ-д алдаа гарсан байж магадгүй юм. Дээрээс нь тэр мөнгө хүсч байна. IAR шиг их биш, гэхдээ мэдэгдэхүйц. Демо горимд энэ нь танд 2кб-аас ихгүй код бичих боломжийг олгоно.
Мэдээжийн хэрэг хагарал бий, гэхдээ хэрэв та хулгай хийх гэж байгаа бол энэ нь IAR утгаараа сая юм :)

Бас байдаг Image Craft AVR CТэгээд MicroCмикроэлектроникоос. Би аль нэгийг нь ашиглах шаардлагагүй байсан, гэхдээ S.W.G.их магтаж байна MicroPascal, тэд хэлэхдээ, маш тохиромжтой програмчлалын орчин, номын сан. MicroC илүү муу байх болно гэж би бодож байна, гэхдээ энэ нь бас төлбөртэй.

Миний хэлсэнчлэн би сонгосон WinAVRГурван шалтгааны улмаас: энэ нь үнэ төлбөргүй, AVR Studio-д нэгтгэгддэг бөгөөд бүх тохиолдолд зориулж бичсэн тонн бэлэн код байдаг.

Тиймээс WinAVR суулгацыг AVR Studio ашиглан татаж аваарай. Дараа нь эхлээд студийг суулгаж, дараа нь WinAVR-ийг дээрээс нь өнхрүүлэн студид залгаас хэлбэрээр хавсаргана. Би WinAVR-ийг C:\WinAVR гэх мэт богино зам дээр суулгахыг зөвлөж байна, ингэснээр та замтай холбоотой олон асуудлаас зайлсхийх болно.

Төсөл үүсгэх
Тиймээс, студи суулгасан, C нь шурган, ямар нэг зүйл програмчлах цаг болжээ. Энгийн, хамгийн энгийнээс эхэлье. Студио ажиллуулж, тэнд AVR GCC хөрвүүлэгчийн хувьд шинэ төслийг сонгоод төслийн нэрийг оруулна уу.

Ажлын талбар хоосон *.c файлаар нээгдэнэ.

Одоо студийн хавчуурга дахь замын дэлгэцийг тохируулах нь гэмтээхгүй. Үүнийг хийхийн тулд дараах руу очно уу:
Цэсийн хэрэгслүүд - Сонголтууд - Ерөнхий - FileTabs-ыг сонгоод доош унах жагсаалтаас "Зөвхөн файлын нэр"-ийг сонгоно уу. Үгүй бол ажиллах боломжгүй болно - таб нь файлын бүрэн замыг агуулж, дэлгэцэн дээр хоёр, гурваас илүүгүй таб байх болно.

Төслийн тохиргоо
Ерөнхийдөө бүх хамаарлыг дүрсэлсэн make файл үүсгэхийг сонгодог гэж үздэг. Энэ нь магадгүй зөв байх. Гэхдээ миний хувьд бүрэн нэгдсэн IDE-тэй өссөн uVisionэсвэл AVR StudioЭнэ хандлага нь үнэхээр харь юм. Тиймээс би үүнийг өөрийнхөөрөө хийх болно, студи ашиглан бүх зүйлийг хийх болно.

Товчлуурыг араагаар цохино.


Эдгээр нь таны төслийн тохиргоо, эс тэгвээс make файлыг автоматаар үүсгэх тохиргоо юм. Эхний хуудсан дээр та өөрийн MK ажиллах давтамжийг оруулах хэрэгтэй. Энэ нь гал хамгаалагчийн битүүдээс хамаардаг тул бидний давтамжийг 8000000Hz гэж үздэг.
Мөн оновчлолын шугамд анхаарлаа хандуулаарай. Одоо -Os байна - энэ бол хэмжээг оновчтой болгох явдал юм. Одоо байгаагаар нь үлдээгээрэй, тэгвэл та энэ параметрээр тоглохыг оролдож болно. -O0 бол оновчлол огт биш.

Дараагийн алхам бол замуудыг тохируулах явдал юм. Юуны өмнө, төслийн лавлахаа тэнд нэмнэ үү - та тэнд гуравдагч этгээдийн номын санг нэмэх болно. Жагсаалтад ".\" зам гарч ирнэ.

Make файлыг үүсгэсэн тул та үүнийг төслийнхөө анхдагч хавтаснаас харж, тэнд юу байгааг хараарай.


Одоохондоо ийм л байна. Хаа сайгүй OK дарж, эх сурвалж руу очно уу.

Асуудлын томъёолол
Диодын анивчих нь ажиллахаа больсон тул хоосон хуудас нь ямар нэгэн зальтай санааг хэрэгжүүлэхийг хүсч байна. Бухыг нэн даруй эврээр нь авч, компьютертэй холбох ажлыг хэрэгжүүлье - энэ бол миний хийх хамгийн эхний зүйл юм.

Энэ нь дараах байдлаар ажиллах болно.
COM порт дээр нэг (код 0x31) ирэхэд бид диодыг асаах бөгөөд тэг ирэхэд (код 0x30) унтарна. Түүнээс гадна бүх зүйл тасалдал дээр хийгдэх бөгөөд арын даалгавар нь өөр диод анивчих болно. Энгийн бөгөөд утга учиртай.

Хэлхээ угсрах
Бид USB-USART хөрвүүлэгч модулийг микроконтроллерийн USART зүү рүү холбох хэрэгтэй. Үүнийг хийхийн тулд хоёр утаснаас холбогчийг авч, тээглүүр дээр хөндлөн байрлуулна. Өөрөөр хэлбэл бид хянагчийн Rx-ийг хөрвүүлэгчийн Tx-тэй, хувиргагчийн Tx-ийг контроллерийн Rx-тэй холбодог.

Эцсийн эцэст энэ бол диаграм юм.


Үлдсэн тээглүүр, тэжээл, дахин тохируулахыг би бодохгүй байна, энэ нь стандарт юм.

Код бичих

Би Си хэлний өөрийн тайлбарыг нарийвчлан судлахгүй гэдгээ шууд захиалгаа өгье. Сонгодог "С програмчлалын хэл"-ээс эхлээд K&R-ээс эхлээд янз бүрийн гарын авлага хүртэл асар их хэмжээний материал байдаг.

Би ийм аргыг олсон юм; би үүнийг нэг удаа энэ хэлийг судлахдаа ашигласан. Тэнд бүх зүйл товч, ойлгомжтой, ойлгомжтой байдаг. Би үүнийг аажмаар нэгтгэж, вэбсайт дээрээ чирж байна.

Бүх бүлгийг хараахан шилжүүлээгүй байгаа нь үнэн, гэхдээ энэ нь тийм ч удаан үргэлжлэхгүй байх гэж бодож байна.

Би үүнийг илүү сайн тайлбарлах магадлал багатай тул сургалтын курсээс нарийн ширийн зүйлийг дэлгэрэнгүй тайлбарлахын оронд энэ гарын авлагын бие даасан хуудсуудын шууд холбоосыг өгөх болно.

Номын санг нэмж байна.
Юуны өмнө бид шаардлагатай номын сан, тайлбар бүхий толгойг нэмж оруулав. Эцсийн эцэст, C бол бүх нийтийн хэл бөгөөд бид түүнд AVR-тэй тусгайлан ажиллаж байгаагаа тайлбарлах хэрэгтэй тул эх кодонд мөрийг бичнэ үү.

1 #оруулна

#оруулна

Энэ файл нь хавтсанд байрладаг WinAVRбөгөөд энэ нь хянагчийн бүх регистр, портуудын тайлбарыг агуулдаг. Түүгээр ч барахгүй, хөрвүүлэгч дамжуулан дамжуулдаг тодорхой хянагчтай холбоотой бүх зүйл зальтай байдаг. хийхпараметр дэх файл MCUмөн энэ хувьсагч дээр тулгуурлан толгой файл нь таны төсөлд холбогдсон бөгөөд энэ тодорхой хянагчийн бүх порт, регистрүүдийн хаягийн тайлбартай. Хөөх! Үүнгүйгээр энэ нь бас боломжтой, гэхдээ дараа нь та SREG эсвэл UDR гэх мэт бэлгэдлийн бүртгэлийн нэрийг ашиглах боломжгүй бөгөөд "0xC1" шиг тус бүрийн хаягийг санах хэрэгтэй бөгөөд энэ нь толгой өвдөх болно.

Баг нь өөрөө #оруулна<имя файла> нь таны төсөлд ямар нэгэн текст файлын агуулгыг нэмэх боломжийг олгодог, жишээлбэл, функцүүдийн тайлбар бүхий файл эсвэл өөр кодын хэсэг. Заавар нь энэ файлыг олохын тулд бид төслийнхөө замыг зааж өгсөн (WinAVR лавлах нь анхдагчаар тэнд бүртгэгдсэн байдаг).

Үндсэн функц.
Си програм нь бүхэлдээ функцуудаас бүрддэг. Тэдгээрийг ямар ч дарааллаар, өөр өөр аргаар үүрлэж, бие биенээсээ дуудаж болно. Функц бүр гурван шаардлагатай параметртэй:

  • Буцах утга нь жишээлбэл. нүгэл(х) x-ийн синусын утгыг буцаана. Товчхондоо математикийн адил.
  • Дамжуулсан параметрүүд нь ижил X байна.
  • Үйл ажиллагааны бие.

Дамжуулж, буцааж өгсөн бүх утгууд нь өгөгдлөөс хамааран ямар нэгэн төрлийн байх ёстой.

Аливаа Си программ нь функц агуулсан байх ёстой голҮндсэн програм руу нэвтрэх цэг болгон, эс тэгвээс энэ нь С биш юм :). Өөр хэн нэгний эх кодонд нэг сая файлаас main байгаа тул энэ нь бүх зүйл эхэлдэг програмын гол хэсэг гэдгийг ойлгож болно. Ингээд асууя:

1 2 3 4 5 int main(void) (0 буцаана; )

int main(void) (0 буцаана; )

Энэ бол анхны хамгийн энгийн программ бичигдсэн, энэ нь юу ч хийхгүй байх нь хамаагүй, бид дөнгөж эхэлж байна.

Бид юу хийснийг олж мэдье.
intЭнэ нь үндсэн функцийн буцаадаг өгөгдлийн төрөл юм.

Мэдээжийн хэрэг, микроконтроллер дээр голЗарчмын хувьд юуг ч буцааж болохгүй, онолын хувьд байх ёстой хүчингүй гол (хүчингүй), гэхдээ GCC нь анх PC-д зориулагдсан бөгөөд тэнд программ дууссаны дараа үйлдлийн системд утгыг буцааж өгөх боломжтой. Тиймээс GCC ажиллаж байна хүчингүй гол (хүчингүй)Анхааруулга гэж тангараглаж байна.

Энэ бол алдаа биш, энэ нь ажиллах болно, гэхдээ би анхааруулгад дургүй.

хүчингүйЭнэ тохиолдолд бид функц руу дамжуулдаг өгөгдлийн төрөл юм голгаднаас юуг ч хүлээж авах боломжгүй, тиймээс хүчингүй- дамми. Ямар нэгэн зүйл дамжуулах, буцаах шаардлагагүй үед stub ашигладаг.

Тэд энд байна { } буржгар хаалт нь програмын блок бөгөөд энэ тохиолдолд функцийн бие юм гол, код тэнд байрлана.

буцах- энэ нь үндсэн функц дууссаны дараа буцаах буцах утга, учир нь бидэнд int, өөрөөр хэлбэл тоо байгаа тул бид тоог буцаах ёстой. Хэдийгээр энэ нь утгагүй хэвээр байна, учир нь ... микроконтроллер дээр бид зөвхөн голоос хаашаа ч явж чадахгүй. Би null буцаана. Учир нь хамаагүй. Гэхдээ хөрвүүлэгч нь ихэвчлэн ухаалаг байдаг бөгөөд энэ тохиолдолд код үүсгэдэггүй.
Хэдийгээр, хэрэв гажуудсан бол, дараа нь голТа MK руу очиж болно - жишээлбэл, ачаалагчийн хэсэгт орж ажиллуулж болно, гэхдээ энэ нь шилжилтийн хаягийг засахын тулд програм хангамжтай бага түвшний ажил хийх шаардлагатай болно. Доор та өөрөө харж, яаж хийхийг ойлгох болно. Юуны төлөө? Энэ бол өөр асуулт, 99.999% тохиолдолд энэ шаардлагагүй :)

Бид үүнийг хийж, цааш явлаа. Хувьсагчийг нэмье, энэ нь бидэнд үнэхээр хэрэггүй бөгөөд үүнгүйгээр хувьсагчийг оруулах нь утгагүй боловч бид суралцаж байна. Хэрэв хувьсагчийг функцийн биед нэмсэн бол тэдгээр нь орон нутгийнх бөгөөд зөвхөн энэ функцэд л байдаг. Функцээс гарахад эдгээр хувьсагч устаж, RAM санах ойг илүү чухал хэрэгцээнд зориулж хуваарилдаг. .

1 2 3 4 5 6 int main(void) ( тэмдэггүй тэмдэгт i; буцаах 0 ; )

int main(void) ( тэмдэггүй тэмдэгт i; буцаах 0; )

гарын үсэг зураагүйгарын үсэг зураагүй гэсэн үг. Баримт нь хоёртын дүрслэлд хамгийн чухал битийг тэмдэгтэнд хуваарилдаг бөгөөд энэ нь +127/-128 тоо нь нэг байт (тэмдэгт) багтдаг гэсэн үг боловч хэрэв тэмдгийг хаявал энэ нь 0-ээс таарах болно. 255. Ихэвчлэн тэмдэг хэрэггүй. Тэгэхээр гарын үсэг зураагүй.
бизүгээр л хувьсагчийн нэр юм. Дахиж үгүй.

Одоо бид портуудыг эхлүүлэх хэрэгтэй UART. Мэдээжийн хэрэг, та номын санг авч, холбож, ямар нэгэн төрлийн UartInit(9600) руу залгаж болно; гэхдээ дараа нь чи үнэхээр юу болсныг мэдэхгүй.

Бид үүнийг хийдэг:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void ) ( unsigned char i; #define XTAL 8000000L #define baudrate 9600L #bauddivider-г тодорхойлох (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 baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO(бауд хуваагч); UBRRH = HI(бауд хуваагч); UCSRA = 0; UCSRB = 1<

Аймшигтай юу? Үнэн хэрэгтээ бодит кодын сүүлийн таван мөр л байдаг. Бүх зүйл, тэр #тодорхойлохЭнэ бол урьдчилсан процессорын макро хэл юм. Ассемблейтэй бараг ижил зүйл боловч синтакс нь арай өөр юм.

Тэд шаардлагатай коэффициентийг тооцоолох ердийн үйл ажиллагааг хөнгөвчлөх болно. Эхний мөрөнд бид үүнийг оронд нь хэлдэг XTALта 8000000-г аюулгүйгээр орлуулж болно, мөн Л- төрлийг зааж өгөх, урт гэж хэлэх нь процессорын цагийн давтамж юм. Үүнтэй адил дохионы түвшин— UART-ээр өгөгдөл дамжуулах давтамж.

дамжуулагчаль хэдийн илүү төвөгтэй тул түүний оронд өмнөх хоёр томъёоны томъёог ашиглан тооцоолсон илэрхийлэлийг орлуулах болно.
За тэгээд L.O.Тэгээд Сайн ууэнэ үр дүнгээс бага ба өндөр байтыг авах болно, учир нь Энэ нь нэг байтад багтахгүй нь ойлгомжтой. IN Сайн уу X (макро оролтын параметр) баруун тийш найман удаа шилжсэнээр зөвхөн хамгийн чухал байт л үлдэнэ. Тэгээд дотор L.O.бид 00FF тоогоор битийн дагуу хийнэ, үр дүнд нь зөвхөн бага байт үлдэнэ.

Тэгэхээр хийсэн бүх зүйл ийм байна #тодорхойлохТа үүнийг аюулгүй хаяж, шаардлагатай тоог тооцоолуур дээр тооцоолж, UBBRL = ... гэсэн мөрөнд нэн даруй оруулна уу. ба UBBRH = …..

Чадах. Гэхдээ! Үүнийг хийх БҮСГҮЙ БОЛОМЖГҮЙ!

Энэ нь ийм эсвэл тэр замаар ажиллах болно, гэхдээ та ийм нэртэй байх болно ид шидийн тоо- хаанаас ч юм, үл мэдэгдэх шалтгаанаар авсан үнэт зүйлс, хэрэв та хоёр жилийн дараа ийм төсөл нээх юм бол эдгээр үнэт зүйлс юу болохыг ойлгоход хэцүү байх болно. Одоо ч гэсэн, хэрэв та хурдаа өөрчлөх эсвэл кварцын давтамжийг өөрчлөхийг хүсч байвал бүх зүйлийг дахин тооцоолох шаардлагатай болно, гэхдээ та код дээрх хэд хэдэн тоог өөрчилсөн бөгөөд ингээд л болоо. Ер нь, хэрэв та кодлогч гэж нэрлэгдэхийг хүсэхгүй байгаа бол уншихад хялбар, ойлгомжтой, өөрчлөхөд хялбар байхаар кодоо хий.

Дараа нь бүх зүйл энгийн:
Эдгээр бүх "UBRRL and Co" нь UART дамжуулагчийн тохиргооны бүртгэл бөгөөд үүний тусламжтайгаар бид дэлхийтэй харилцах болно. Одоо бид тэдэнд шаардлагатай утгыг өгч, хүссэн хурд, горимд тохируулсан.

Бичлэгийн төрөл 1<Дараахыг илэрхийлнэ: 1-ийг аваад байранд нь тавь RXENбайтаар. RXENЭнэ бол бүртгэлийн 4 дэх бит юм UCSRB, Тэгэхээр 1< 00010000 хоёртын тоог үүсгэдэг, TXEN- энэ бол 3 дахь бит, мөн 1< 00001000 өгөх болно. Ганц "|" энэ нь жаахан юм ЭСВЭЛ, тэгэхээр 00010000 | 00001000 = 00011000. Үүнтэй адилаар үлдсэн шаардлагатай тохиргооны битүүдийг тохируулж, ерөнхий овоолгод нэмнэ. Үүний үр дүнд цуглуулсан тоог UCSRB-д бүртгэдэг. Дэлгэрэнгүй мэдээллийг USART хэсэг дэх MK-ийн мэдээллийн хуудсанд тайлбарласан болно. Тиймээс техникийн нарийн ширийн зүйлд сатааралгүй байцгаая.

Дууслаа, юу болсныг харах цаг боллоо. Эмхэтгэл дээр дарж эмуляцийг эхлүүлнэ үү (Ctrl+F7).

Дибаг хийх
Бүх төрлийн ахиц дэвшлийн баарууд урсан өнгөрч, студи өөрчлөгдөж, үндсэн функцын үүдний ойролцоо шар сум гарч ирэв. Энд процессор ажиллаж байгаа бөгөөд симуляцийг түр зогсоосон байна.

Баримт нь эхэндээ энэ нь UBRRL = LO(bauddivider) шугам дээр байсан юм; Эцсийн эцэст, бидний тодорхойлсон зүйл бол код биш, зүгээр л урьдчилсан тооцоолол бөгөөд иймээс симулятор бага зэрэг уйтгартай байдаг. Харин одоо тэр ойлгов, хэрэв та модонд авирах юм бол эхний заавар дууссан I/O харах, USART хэсэгт очоод UBBRL байтыг харвал утга нь аль хэдийн байгаа гэдгийг харах болно! 0х33.

Үүнийг нэг алхам урагшлуулаарай. Нөгөө бүртгэлийн агуулга хэрхэн өөрчлөгдөж байгааг хараарай. Тиймээс бүгдийг нь шалгаад, заасан бүх битүүд нь миний хэлсэнчлэн тохируулагдсан бөгөөд тэдгээрийг бүхэлд нь байтад нэгэн зэрэг тохируулсан болохыг анхаарна уу. Энэ нь "Буцах"-аас цааш явахгүй - хөтөлбөр дууссан.

Нээлт
Одоо симуляцийг тэг болгож дахин тохируулна уу. Тэнд дарна уу Дахин тохируулах (Shift+F5). Задаргаатай жагсаалтыг нээ, одоо та хянагч дээр юу болж байгааг харах болно. Харах -> Дизассемблер. Бас YYAAAAAAA биш!!! Ассемблер!!! АЙМШИГ!!! ТЭГЭЭД ХЭРЭГТЭЙ. Тиймээс, дараа нь ямар нэг зүйл буруу болвол та кодонд тэнэг байж, форум дээр доголон асуулт асуухгүй, харин нэн даруй зүрх сэтгэлдээ орж, хаана гацсанаа хараарай. Тэнд аймшигтай зүйл байхгүй.

Эхлээд цувралын шилдэгүүд байх болно:

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 Үсрэх +00000002: 940C0034 JMP 0x00000034 Үсрэх +00000004: 940C0034 JMP 0x040000003 JMP 0x04000000000000 0x00000034 Үсрэх +00000008: 940C0034 JMP 0x00000034 Үсрэх +0000000A: 940C0034 JMP 0x00000034 Үсрэх +0000000C: 9400000C: 940000003JMP4000 0000000E: 940C0034 JMP 0x00000034 Үсрэх +00000010: 940C0034 JMP 0x00000034 Үсрэх +00000012: 940C0034 JMP 0x0400000303000000 0x00000034 Үсрэх +00000016: 940C0034 JMP 0x00000034 Үсрэх +00000018: 940C0034 JMP 0x00000034 Үсрэх +0000001A: 94000001A: 9400000003JMP40000 : 940C0034 JMP 0x00000034 Үсрэх +0000001E: 940C0034 JMP 0x00000034 Үсрэх +00000020: 940C0034 JMP 0x00000034 Үсрэх +00000000 JMP JMP 0x00000000 34 Үсрэх +00000024: 940C0034 JMP 0x00000034 Үсрэх +00000026: 940C0034 JMP 0x00000034 Үсрэх +00000028: 940C0034 JMP000003 Үсрэх

Үсрэх 0x00000034 Үсрэх +00000008: 940C0034 JMP 0x00000034 Үсрэх +0000000A: 940C0034 JMP 0x00000034 Үсрэх +0000000C: 9400000C: 9400000003JJMP00003 : 940C0034 JMP 0x00000034 Үсрэх +00000010: 940C0034 JMP 0x00000034 Үсрэх +00000012: 940C0034 JMP 0x00000034 Үсрэх +0000000 JMP +000000 34 Үсрэх +00000016: 940C0034 JMP 0x00000034 Үсрэх +00000018: 940C0034 JMP 0x00000034 Үсрэх +0000001A: 940C0034 JMP0000 Jump 00000 : 940C0034 JMP 0x00000034 Үсрэх +0000001E: 940C0034 JMP 0x00000034 Үсрэх +00000020: 940C0034 JMP 0x00000034 Үсрэх +00000000 JMP JMP 0x00000000 34 Үсрэх +00000024: 940C0034 JMP 0x00000034 Үсрэх +00000026: 940C0034 JMP 0x00000034 Үсрэх +00000028: 940C0034 JMP000003 Үсрэх

Энэ бол тасалдлын вектор хүснэгт юм. Бид дараа нь түүн рүү буцах болно, гэхдээ одоохондоо энэ нь байгаа гэдгийг санаарай. Эхний багана нь команд байрлах флаш нүдний хаяг, хоёр дахь нь тушаалын код, гурав дахь нь командын мнемоник, ижил угсралтын заавар, гурав дахь нь командын операндууд юм. За автомат сэтгэгдэл.
Тэгэхээр, хэрэв та харвал тасралтгүй шилжилтүүд байдаг. JMP командын код нь дөрвөн байт бөгөөд энэ нь арагшаа бичсэн үсрэх хаягийг агуулдаг - доод хаяг дахь бага байт, үсрэх тушаалын код 940C

0000002B: BE1F OUT 0x3F, R1 Оролт/Гаралтын байршилд гарна

Энэ тэгийг 0x3F хаягаар бүртгэж байна. Хэрэв та I/O харах баганыг харвал 0x3F хаяг нь SREG регистрийн хаяг буюу хянагчийн туг бүртгэлийн хаяг болохыг харах болно. Тэдгээр. Бид програмыг тэг нөхцөлд ажиллуулахын тулд SREG-г дахин тохирууллаа.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Шууд ачаална

0000002C: E5CF LDI R28,0x5F Шууд ачаална +0000002D: E0D4 LDI R29,0x04 Шууд ачаална

Энэ нь стек заагчийг ачаалж байна. Та оролт гаралтын бүртгэлд шууд ачаалах боломжгүй, зөвхөн завсрын бүртгэлээр дамжуулан. Тиймээс эхлээд LDI-ийг завсрын түвшинд, дараа нь тэндээс OUT-д I/O руу шилжүүлнэ. Би дараа нь стекийн талаар илүү ихийг хэлэх болно. Одоогоор энэ нь RAM-ийн төгсгөлд өлгөөтэй, хаяг болон завсрын хувьсагчдыг хадгалдаг динамик санах ойн хэсэг гэдгийг мэдэж аваарай. Одоо бид стек хаанаас эхлэхийг зааж өгсөн.

00000032: 940C0041 JMP 0x00000041 Үсрэх

Хөтөлбөрийн төгсгөлд оч, тэнд бид тасалдал, өөрөө өөртөө чанга давталт хийхийг хориглоно.

1 2 +00000041: 94F8 CLI Глобал тасалдлыг идэвхгүй болгох +00000042: CFFF RJMP PC-0x0000 Харьцангуй үсрэлт

00000041: 94F8 CLI Глобал тасалдлыг идэвхгүй болгох +00000042: CFFF RJMP PC-0x0000 Харьцангуй үсрэлт

Энэ нь үндсэн функцээс гарах гэх мэт урьдчилан тооцоолоогүй нөхцөл байдлын үед юм. Хянагчийг ийм гогцооноос техник хангамжийг дахин тохируулах, эсвэл харуулын нохойноос дахин тохируулах замаар гаргаж авч болно. За, эсвэл дээр хэлсэнчлэн үүнийг зургаан өнцөгт засварлагч дээр засаад бидний зүрх хүссэн газар руу давхи. Мөн JMP болон RJMP гэсэн хоёр төрлийн шилжилт байдгийг анхаарна уу; эхнийх нь хаяг руу шууд шилжих явдал юм. Энэ нь дөрвөн байт эзэлдэг бөгөөд санах ойг бүхэлд нь дамжих боломжтой. Хоёрдахь төрлийн шилжилт нь RJMP - харьцангуй юм. Түүний тушаал нь хоёр байт авдаг боловч одоогийн байрлалаас (хаяг) 1024 алхам урагш эсвэл хойш хөдөлдөг. Мөн түүний параметрүүд нь одоогийн цэгээс офсетийг заана. Учир нь энэ нь илүү их ашиглагддаг зай талбайн талыг эзэлдэг бөгөөд урт шилжилт хийх нь ховор байдаг.

1 +00000034: 940C0000 JMP 0x00000000 Үсрэх

00000034: 940C0000 JMP 0x00000000 Үсрэх

Энэ бол кодын хамгийн эхэнд үсрэлт юм. Нэг төрлийн дахин ачаалах. Та бүх векторууд энд үсэрч байгааг шалгаж болно. Эндээс гарсан дүгнэлт бол хэрэв та одоо тасалдлыг идэвхжүүлсэн бол (тэдгээрийг анхдагчаар идэвхгүй болгосон) таны тасалдал үүссэн боловч зохицуулагч байхгүй бол програм хангамжийг дахин тохируулах болно - програмыг эхнээс нь буцаах болно.

Үндсэн функц. Бүх зүйл адилхан, та үүнийг дүрслэх шаардлагагүй. Бүртгэлд оруулсан аль хэдийн тооцоолсон тоог хараарай. Хөрвүүлэгчийн урьдчилсан процессор рок!!! Тиймээс "шидэт" тоо байхгүй!

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

00000036: E383 LDI R24,0x33 Шууд ачаална +00000037: B989 OUT 0x09,R24 Гарах I/O байршил 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 Гарах I/O байршил 16: UCSRA = 0; +00000039: B81B OUT 0x0B,R1 Гарах I/O байршил 17: UCSRB = 1<

Мөн энд алдаа байна:

1 2 3 +0000003E: E080 LDI R24.0x00 Шууд ачаална

0000003E: E080 LDI R24.0x00 Шууд ачаална

Асуулт нь хөрвүүлэгч яагаад ийм топуудыг нэмдэг вэ? Мөн энэ нь Return 0-ээс өөр зүйл биш, бид функцийг int main(void) гэж тодорхойлсон тул бид дахин дөрвөн байтыг дэмий үрсэн :) Тэгээд хэрэв та void main(void) хийвэл зөвхөн RET үлдэнэ, гэхдээ анхааруулга гарч ирнэ. , бидний үндсэн функц юу ч буцаадаггүй. Ер нь өөрийнхөө хүссэнээр хий :)

Хэцүү үү? Үгүй бололтой. Дизассемблер горимд алхам алхмаар гүйцэтгэх дээр товшоод процессор бие даасан зааварчилгааг хэрхэн гүйцэтгэдэг, бүртгэлд юу тохиолдохыг харна уу. Тушаалууд болон эцсийн давталтаар дамжих хөдөлгөөн хэрхэн явагддаг вэ?

Хэдэн өдрийн дараа үргэлжлүүлнэ...

Оффтоп:
Алексей78Би Firefox-д зориулсан залгаас үүсгэсэн бөгөөд энэ нь миний сайт болон форумыг удирдахад хялбар болгодог.
Хэлэлцэх, татаж авах,

Atmel Studio нь ARM Cortex-M цуврал процессорын архитектур дээр суурилсан Atmel микроконтроллеруудад зориулсан программуудыг зохион бүтээх, дибаг хийх боломжийг олгодог нэгдсэн хөгжүүлэлтийн платформ юм. Atmel Studio нь C/C++ эсвэл ассемблер хэл дээр бүтээгдсэн програмуудыг дибаг хийх, бүтээх боломжийг олгодог, ашиглахад хялбар орчин юм. Энэ нь ARM болон AVR архитектурт зориулсан 1600 гаруй төслийг багтаасан үнэ төлбөргүй Atmel Software Framework эх кодын багтаасан том номын сантай. Ийм номын сантай байх нь ямар ч програмистын хувьд маш том урамшуулал юм. Энэхүү IDE нь AVR-д суурилсан олон төрлийн микроконтроллер, түүнчлэн Cortex-M3, Cortex-M4 цөмүүдийг ашигладаг Atmel SAM3-д суурилсан флаш микроконтроллеруудыг програмчлахад ашиглаж болно.

Atmel Studio нь ямар ч програмистын амьдралыг илүү хялбар болгох хэрэгслүүдийг агуулдаг. Энэхүү платформ нь Atmel Spaces, Atmel Gallery зэрэг шийдлүүдийг агуулдаг. Atmel Gallery нь хөгжүүлэлтийн хэрэгсэл, нэгдсэн програм хангамжийн онлайн дэлгүүр юм. Atmel Spaces нь Atmel микроконтроллеруудад зориулсан техник хангамж, програм хангамжийн төслийн файлуудыг хамтран хөгжүүлэх, хадгалах зориулалттай үүлэнд суурилсан орон зай юм.

Гол онцлог, функцууд

  • нь бүрэн үнэ төлбөргүй нэгдсэн хөгжлийн орчин юм;
  • C/C++ болон Ассемблер хэлийг дэмждэг;
  • нарийвчилсан баримт бичгийн хамт;
  • төрөл бүрийн програмуудад зориулсан эх кодын жишээ бүхий өргөн хүрээний номын сан багтана;
  • Atmel микроконтроллеруудыг програмчлахад зориулагдсан.

Тусгай шаардлага

  • процессорын давтамж 1.6 GHz ба түүнээс дээш;
  • 1 ГБ RAM-аас 32 битийн системд зориулсан;
  • 2 ГБ RAM-аас 64 битийн системд зориулсан;
  • виртуал машин дээр ажиллах үед нэмэлт 512 MB RAM ашиглахыг зөвлөж байна;
  • 6 ГБ үнэгүй хатуу дискний зай.

Энэ хувилбарт шинэ зүйл юу вэ?

7.0.790 (25.02.2016)

  • өргөтгөсөн дибаг хийх (EDBG) нэмэлт дэмжлэг;
  • интерфэйсийн тохиргооны профайлыг дэмжих нэмэлт. Та тохиргооны самбар дээрх товчлууруудыг ашиглан профайлуудын хооронд шилжих боломжтой;
  • Өмнө нь импортолсон төслүүдэд номын санг импортлох боломжийг нэмсэн. Arduino Zero болон Zero Pro-д зориулсан дэмжлэг нэмэгдсэн;
  • зэрэгцээ бүтээх нь одоо анхдагчаар идэвхжсэн;
  • Xplained Mini-д зориулсан шинэчилсэн програм хангамж;
  • Solution Explorer дээрх "Бүх файлыг харуулах" функцийг зассан.