AVR-ийн кодыг хэрхэн бичих, Atmel AVR микроконтроллеруудыг C хэл дээр програмчлах. AVR програмчлал

LPT порт програмистын бүдүүвч диаграммыг зурагт үзүүлэв. Автобусны жолоочийн хувьд 74AC 244 эсвэл 74HC244 (K1564AP5), 74LS244 (K555AP5) эсвэл 74ALS244 (K1533AP5) микро схемийг ашиглана уу.

LED VD1 нь микроконтроллерын бичлэг хийх горимыг заана.

LED VD2 - унших,

LED VD3 - хэлхээнд цахилгаан хангамж байгаа эсэх.

Хэлхээ нь ISP холбогчоос цахилгаан тэжээлд шаардлагатай хүчдэлийг авдаг, өөрөөр хэлбэл. програмчлагдсан төхөөрөмжөөс. Энэ хэлхээ нь шинэчлэгдсэн STK200/300 программист хэлхээ (ажиллахад хялбар болгох үүднээс LED-үүдийг нэмсэн) тул STK200/300 хэлхээтэй ажилладаг бүх компьютерийн программист программтай нийцдэг. Энэ програмисттай ажиллахын тулд програмыг ашиглана уу CVAVR

Программистыг хэвлэмэл хэлхээний самбар дээр хийж, зурагт үзүүлсэн шиг LPT холбогчийн орон сууцанд байрлуулж болно.




Программисттай ажиллахын тулд LPT портын өргөтгөлийг ашиглах нь тохиромжтой бөгөөд үүнийг өөрөө хийхэд хялбар байдаг (жишээлбэл, принтерийн Centronix кабелиас), гол зүйл бол газрын дамжуулагчийг нөөцлөхгүй байх явдал юм (18- 25 холбогч хөл) эсвэл худалдаж аваарай. Программист болон програмчлагдсан чип хоорондын кабель нь 20-30 см-ээс хэтрэхгүй байх ёстой.

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

Харамсалтай нь хүн бүр шууд үр дүнг хүсдэг. Тиймээс би өөр замаар явахаар шийдсэн - C-ийн талаар зааварчилгаа хийх, гэхдээ түүний дотуур хувцасыг харуулсан. Сайн embedder программист төхөөрөмжөө үргэлж чанга барьж, зөвшөөрөлгүйгээр нэг алхам хийхийг зөвшөөрдөггүй. Тэгэхээр эхлээд 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 boudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO(bauddivider) UBRRH = HI(bauddivider);<

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

Тэд шаардлагатай коэффициентийг тооцоолох ердийн үйл ажиллагааг хөнгөвчлөх болно. Эхний мөрөнд бид үүнийг оронд нь хэлдэг 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 0x04000000000 0x00000034 Үсрэх +00000008: 940C0034 JMP 0x00000034 Үсрэх +0000000A: 940C0034 JMP 0x00000034 Үсрэх +0000000C: 9400000C: 940000003JMP4000 0000000E: 940C0034 JMP 0x000034 Үсрэх +00000010: 940c0034 JMP 0x00000034 Үсрэх +000012: 940c0034 JMP 0x0000003040c. Jump +0000340c 0000034 Үсрэх +00000016: 940C003 4 JMP 0x00000034 Үсрэх +00000018: 940c0034 JMP 0x00000034 Үсрэх +0000001a: 940JMP00003 Jump +0030 0000001c : 940C0034 JMP 0x00000034 Үсрэх +0000001E: 940C0034 JMP 0x00000034 Үсрэх +00000020: 940C0034 JMP 0x0090002 MP 0x00000 034 Үсрэх +00000024: 940C0034 JMP 0x00000034 Үсрэх +00000026: 940C0034 JMP 0x00000034 Үсрэх +00000028: 90000028: 9000000C

00000000: 940C002A JMP 0x00002A Үсрэх +00000002: 940C0034 JMP 0x00000034 Үсрэх +00000004: 940C0034 JMP 0x00003004000 000034 Үсрэх +000008: 940C0034 JMP 0x00000034 Үсрэх +0000000a: 940c0034 JMP 0x00000034 Үсрэх +0000000C: 940c0034 Jump00000 : 940C0034 JMP 0x00000034 Үсрэх +00000010: 940C0034 JMP 0x00000034 Үсрэх +00000012: 940C0034 JMP 0x00000034 Үсрэх +0400000 034 Үсрэх +00000016: 940C0034 JMP 0x00000034 Үсрэх +00000018: 940C0034 JMP 0x00000034 Үсрэх +0000001A: 940C0034 Jump000C JMP0003 : 940C0034 JMP 0x00000034 Үсрэх +0000001E: 940C0034 JMP 0x00000034 Үсрэх +00000020: 940C0034 JMP 0x00000034 Үсрэх +0000000 03 4 Үсрэх +00000024: 940C0034 JMP 0x00000034 Үсрэх +00000026: 940C0034 JMP 0x00000034 Үсрэх +00000028: 940C0034 JMP04 Jump00

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

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

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

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

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-д зориулсан залгаасыг үүсгэсэн бөгөөд энэ нь миний сайт болон форумыг удирдахад хялбар болгодог.
Хэлэлцүүлэг, татаж авах,

Ямар нэгэн байдлаар би AVR хянагчдад зориулсан програмчлалын орчинг сонгох талаар зөвлөгөө өгөхийг хүссэн юм. Зүгээр л над руу шаахай битгий хая. би жоохон :)

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

Хэрэв та яг одоо юун дээр ажиллаж эхлэхээ сонгох асуудалтай тулгараад байгаа бол танд өгөх хэдэн зөвлөмжийг эндээс авна уу.

Өмнөх програмчлалын туршлага.Өмнөх програмчлалын туршлагаа үл тоомсорлож болохгүй. ҮНДСЭН байсан ч гэсэн. Сургуульд байсан ч гэсэн. Програмчлал нь унадаг дугуй унахтай адил юм - нэгэнт та мартсан бүхнээ хурдан санаж байна. BASIC-ээс эхэл - үүнийг эзэмш - дараа нь зорилгодоо илүү тохирох зүйлийг сонгоход хялбар байх болно.

Хүрээлэн буй орчны тусламж.Найзууд чинь Паскаль хэлээр бичдэг үү? Асуудал таны хувьд шийдэгдсэн - Паскаль дээр бичээрэй! Тэд танд үргэлж зөвлөгөө өгөх, номын сан өгөх, суралцахад тань бэлэн төслүүд өгөх болно. Ерөнхийдөө тэд таныг нийгэмдээ угтан авахдаа баяртай байх болно. Хэрэв та эсрэгээр нь хийвэл эсрэг үр дүнд хүрэх болно. Хэрэв та Ассемблерийн чиглэлээр суралцахаар шийдсэн бол ТУХН-ийн салбарын найзууд таныг хүлээж авах болно. Тусламж хүлээх хэрэггүй.

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

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

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

Үр дүнтэй код.Зөвхөн кодыг хэр үр дүнтэй эмхэтгэсэн дээр үндэслэн програмчлалд суралцах програмчлалын орчинг сонгох нь муу санаа юм. Хамгийн гол нь та сурч эхлэхэд тухтай байх болно - үүнээс гарах зүйл бол арав дахь зүйл юм. Мэдээжийн хэрэг, та үүнийг дараа нь хийж болно.

Шидтэнгүүд.Чип дээрх аливаа төхөөрөмжийг порт ашиглан тохируулах шаардлагатай. Уг процедур нь нэлээд уйтгартай бөгөөд мэдээллийн хуудас шаардлагатай. Үүнээс гадна эхлэгчдэд ойлгоход амаргүй нюансууд байдаг. Тиймээс хүрээлэн буй орчинд шидтэнгүүд байх нь маш их хүсч байна. Vyzard бол SPI, I2C, USART гэх мэт автомат тааруулагч юм. Илүү олон төхөөрөмж дэмжигдэх тусам сайн. Та шаардлагатай захын параметрүүдийг тохируулсан бөгөөд шидтэн өөрөө заасан параметрүүдийг өгөх кодыг үүсгэдэг. Амьдралыг маш хялбар болгодог.


Ерөнхий зөвлөмжүүдИйм - эхний үе шатанд програмчлал нь аль болох энгийн (бүр анхдагч) байх ёстой. Програмчлалын орчин нь сурахад хялбар байх ёстой (учир нь та эхлээд програмчлалыг эзэмшиж, тохиргоонд цаг үрэхгүй байх хэрэгтэй). Орос болсон нь дээр. Оросын гарын авлага, жишээ програмууд бас тустай байх болно. Хүрээлэн буй орчноос болорыг гялсхийх чадвартай байх нь зүйтэй. Дараа нь та програмчлалын үндсийг эзэмшсэнээр илүү төвөгтэй бүрхүүлүүд рүү шилжиж болно.


Эцсийн нэг зөвлөмж: жинхэнэ болортой ажиллах. Үүнийг шатаахаас бүү ай. Практик туршлага хуримтлуулах. Эмулятор (жишээ нь Proteus) -тай ажиллах нь таныг гагнуурын төмрөөр эргэлзэхээс чөлөөлөх боловч ажлын хөтөлбөр, LED анхны анивчсанаас авах сэтгэл ханамжийг хэзээ ч өгч чадахгүй! Бодит ажлын диаграммыг өөрийн гараар хийсэн гэдгээ ойлгох нь танд итгэл найдвар, цааш явах урам зоригийг өгдөг!

(7,377 удаа зочилсон, өнөөдөр 1 удаа зочилсон)

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

Илүү дэлгэрэнгүй мэдээллийг CodeVision хэрэглэгчийн гарын авлагаас англи хэл дээр авах боломжтой бөгөөд би мөн http://somecode.ru сайтыг микроконтроллеруудад зориулсан C-ийн видео хичээлүүд болон Дейтелийн "С хэл дээр хэрхэн програмчлах вэ" номыг санал болгож байна. Миний хэрэглэж байсан цорын ганц сайн ном эхэлсэн.

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

Програм хангамж нь өөрөө .hex өргөтгөлтэй бөгөөд нэг ба тэг хэлбэртэй заавруудын багц бөгөөд энэ нь микроконтроллерт ойлгомжтой. Би програм хангамжийг хаанаас авч болох вэ? Та үүнийг электроникийн вэбсайтаас татаж авах эсвэл өөрөө бичиж болно. Та үүнийг хөгжлийн орчин гэж нэрлэгддэг тусгай програмуудад бичиж болно. Миний хамгийн сайн мэддэг нь AVR Studio, IAR, CodeVision, WinAVR... Эдгээр орчны аль нь илүү сайн эсвэл муу болохыг хэлэх боломжгүй. Эдгээр програмууд нь үндсэндээ тав тухтай байдал, програмчлалын хэл, үнийн хувьд ялгаатай гэж бид хэлж чадна. Энэ сайт дотор зөвхөн CodeVision-г авч үздэг.

Бид орчныг цэгцэлсэн, одоо програм хангамж бичих үйл явцыг харцгаая. CodeVision дээр та эхлээд төсөл үүсгэх хэрэгтэй. Үүнийг кодын шидтэн эсвэл хоосон ашиглан үүсгэж болно. Ямар ч тохиолдолд та ашигласан микроконтроллерийн төрлийг сонгож, давтамжийг нь зааж өгөх хэрэгтэй. Шидтэнг ашиглах үед танаас анхны тохиргоог сонгож, тохиргооны тусламжтайгаар эх кодыг үүсгэхийг хүсэх болно. Дараа нь та энэ кодыг засах боломжтой цонх гарч ирнэ. Хэдийгээр та өөрийн эх кодыг Notepad дээр бичиж, тохиргооноос төсөлд хавсаргаж болно.

Эх кодын файл нь програмчлалын хэл дээрх командуудын багц бөгөөд CodeVision-ийн даалгавар бол эдгээр командыг хоёртын код руу хөрвүүлэх, таны даалгавар бол энэ эх кодыг бичих явдал юм. CodeVision нь Си хэлийг ойлгодог, эх кодын файлууд нь “.c” өргөтгөлтэй. Гэхдээ CodeVision нь C хэл дээр ашиглагддаггүй зарим бүтэцтэй байдаг тул олон програмистууд үүнд дургүй байдаг бөгөөд ашигласан хэлийг C-тэй төстэй гэж нэрлэдэг. Гэсэн хэдий ч энэ нь таныг ноцтой төсөл бичихэд саад болохгүй. Маш олон жишээ, код үүсгэгч, олон тооны номын сангууд CodeVision-д том давуу талыг өгдөг. Цорын ганц сөрөг зүйл бол төлбөртэй боловч кодын хязгаарлалттай үнэгүй хувилбарууд байдаг.

Эх код нь ашигласан микроконтроллерын төрөл болон үндсэн функц бүхий толгой хэсгийг агуулсан байх ёстой. Жишээлбэл, ATtiny13 ашигладаг

#оруулна хүчингүй гол(void) ( );

#оруулна хүчингүй гол(void) ( );

Үндсэн функцийн өмнө та шаардлагатай сангуудыг холбож, глобал хувьсагч, тогтмол, тохиргоог зарлаж болно. Номын сан нь тусдаа файл бөгөөд ихэвчлэн ".h" өргөтгөлтэй, өмнө нь бичсэн кодыг агуулдаг. Зарим төслүүдэд энэ код хэрэгтэй байж болох ч заримд нь хэрэггүй. Жишээлбэл, бид нэг төсөлд LCD дэлгэц ашигладаг бол өөр нэг төсөлд ашигладаггүй. Та "alcd.h" LCD дэлгэцтэй ажиллах номын санг дараах байдлаар холбож болно.

#оруулна #оруулна хүчингүй гол(void) ( );

#оруулна #оруулна хүчингүй гол(void) ( );

Хувьсагч гэдэг нь тодорхой утгыг байршуулж болох санах ойн хэсэг юм. Жишээлбэл, хэрэв та хоёр тоог нэмбэл үр дүнг цаашид ашиглахын тулд хаа нэгтээ хадгалах хэрэгтэй. Эхлээд та хувьсагчийг зарлах хэрэгтэй, өөрөөр хэлбэл. түүнд зориулж санах ойг хуваарилах, жишээлбэл:
int i=0;
тэдгээр. бид i хувьсагчийг зарлаж, түүнд 0 утгыг байрлуулсан, int нь хувьсагчийн төрөл, эсвэл энгийнээр хэлбэл, хуваарилагдсан санах ойн хэмжээг илэрхийлдэг. Хувьсагчийн төрөл бүр нь зөвхөн тодорхой утгыг хадгалах боломжтой. Жишээлбэл, int-ийг -32768-аас 32767 хүртэлх тоогоор бичиж болно. Хэрэв та бутархай хэсэгтэй тоог ашиглах шаардлагатай бол тэмдэгтүүдийн хувьд хувьсагчийг хөвөгч гэж зарлах ёстой.

бит, _Бит 0 эсвэл 1 тэмдэгт -128-аас 127 хүртэл тэмдэггүй тэмдэгт 0-ээс 255 int хүртэл -32768-аас 32767 хүртэл unsigned int 0-ээс 65535 хүртэл урт int -2147483648-аас 2147483647-аас ± 9195 хүртэл 75e- 38-аас ±3.402e38 хүртэл

Үндсэн функц дотор үндсэн програм аль хэдийн ажиллаж байна. Функцийг гүйцэтгэсний дараа програм зогсох тул тэд ижил програмыг байнга давтдаг хязгааргүй while давталт хийдэг.

void main(void) ( while (1) ( ) ; );

void main(void) ( while (1) ( ); );

Та эх кодын аль ч хэсэгт тайлбар бичиж болно, энэ нь програмын үйл ажиллагаанд ямар ч байдлаар нөлөөлөхгүй, харин бичсэн код дээр тэмдэглэл хийхэд тусална. Та хоёр налуу зураастай мөрийг тайлбар хийж болно // үүний дараа хөрвүүлэгч бүх мөрийг эсвэл хэд хэдэн мөрийг /**/ үл тоомсорлодог, жишээ нь:

/*Математикийн үндсэн үйлдлүүд:*/ int i= 0 ; //i хувьсагчийг зарлаж 0 утгыг өгнө//Нэмэлт: i = 2 + 2 ; //Хасах: i = 2 - 2 ; //энэ илэрхийллийг гүйцэтгэсний дараа i хувьсагч 0-тэй тэнцүү болно//Үржүүлэх: i = 2 * 2 ; //энэ илэрхийллийг гүйцэтгэсний дараа i хувьсагч 4-тэй тэнцүү болно//Хуваалт: i = 2 / 2 ; //энэ илэрхийллийг гүйцэтгэсний дараа i хувьсагч 1-тэй тэнцүү болно

/*Математикийн үндсэн үйлдлүүд:*/ int i=0; //i хувьсагчийг зарлаж, түүнд 0 утгыг өгнө //Нэмэлт: i = 2+2; //энэ илэрхийллийг гүйцэтгэсний дараа i хувьсагч 4-тэй тэнцүү болно //Хасах: i = 2-2; //энэ илэрхийллийг гүйцэтгэсний дараа i хувьсагч 0-тэй тэнцүү болно //Үржүүлэх: i = 2*2; //энэ илэрхийллийг гүйцэтгэсний дараа i хувьсагч нь 4-тэй тэнцүү болно //Division: i = 2/2; //энэ илэрхийллийг гүйцэтгэсний дараа i хувьсагч 1-тэй тэнцүү болно

Ихэнх тохиолдолд програм нь нэг кодоос нөгөөд шилжих шаардлагатай байдаг бөгөөд үүний тулд нөхцөлт if() үйлдлүүд байдаг, жишээлбэл:

if(i>3) //хэрэв i нь 3-аас их бол i утгыг 0 ( i=0; ) оноож өгнө /*хэрэв i нь 3-аас бага бол нөхцөлийн үндсэн хэсгийн дараах код руу орно, i.e. хаалтны дараа ()*/

Мөн if -ийг else -тэй хамт хэрэглэж болно - өөрөөр

Хэрвээ би<3) //если i меньше 3, то присвоить i значение 0 { i=0; } else { i=5; //иначе, т.е. если i больше 3, присвоить значение 5 }

Мөн “==” гэсэн харьцуулах оператор байдаг бөгөөд үүнийг “=” оноолттой андуурч болохгүй. Урвуу үйлдэл нь "!="-тэй тэнцүү биш гэж үзье

if(i==3)//хэрэв i нь 3 бол i утгыг 0 ( i=0; ) if(i!=5) //хэрэв i нь 5 биш бол i-д 0 ( i=0) утгыг онооно; )

Илүү нарийн төвөгтэй зүйлүүд - функцууд руу шилжье. Танд хэд хэдэн удаа давтагддаг тодорхой код байна гэж бодъё. Түүнээс гадна, энэ код нь нэлээд том хэмжээтэй. Тэр болгонд бичих нь эвгүй. Жишээлбэл, i хувьсагчийг ямар нэг байдлаар өөрчилдөг программ дээр D портын 0 ба 3 товчлуурыг дарахад i хувьсагчийн утгаас хамааран B портын хөлийг эргүүлэх кодыг ажиллуулдаг.

хүчингүй гол(void) ( хэрэв (PIND.0== 0 ) //PD0 дээрх товчлуур дарагдсан эсэхийг шалгана уу(хэрэв (i== 0) //хэрэв i==0 байвал PB0-г идэвхжүүлнэ( PORTB.0= 1 ; ) хэрэв (i== 5) // хэрэв i==5 бол PB1-ийг идэвхжүүлнэ( PORTB.1= 1 ; ) ) … хэрэв (PIND.3== 0 ) // PD3 товчлуурыг шалгахдаа ижил зүйлийг хийнэ үү( if (i== 0 ) ( PORTB.0= 1 ; ) if (i== 5 ) ( PORTB.1= 1 ; ) ) )

void main(void) ( if(PIND.0==0) //PD0 дээрх товчлуур дарагдсан эсэхийг шалгах ( if(i==0) //хэрэв i==0 бол PB0-ийг асаана ( PORTB.0=1); ) if( i==5) // хэрэв i==5 бол PB1-г асаана ( PORTB.1=1; ) ) ) ... if(PIND.3==0) // PD3 товчлуурыг шалгахдаа мөн адил үйлдлийг хийнэ. ( if(i==0 ) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) )

Ерөнхийдөө код нь тийм ч том биш боловч хэд дахин том байж болох тул өөрийн функцийг үүсгэх нь илүү тохиромжтой байх болно.
Жишээлбэл:

хүчингүй болгох i_check() ( хэрэв (i== 0 ) ( PORTB.0= 1 ; ) хэрэв (i== 5 ) ( PORTB.1= 1 ; ) )

хүчингүй болгох i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) )

void гэдэг нь функц нь юу ч буцаадаггүй гэсэн үг, энэ талаар доор дэлгэрэнгүй i_check() - энэ бол манай функцийн нэр, та үүнийг хүссэнээрээ дуудаж болно, би үүнийг яг ингэж нэрлэсэн - check i. Одоо бид кодоо дахин бичиж болно:

хүчингүй болгох i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) хүчингүй болгох main(void) ( if(PIND.0==0) ) //PD0 дээрх товчлуур дарагдсан эсэхийг шалгана ( i_check(); ) ... if(PIND.3==0) ( i_check(); ) )

Код i_check() мөрөнд хүрэхэд; дараа нь функц дотор үсэрч, доторх кодыг гүйцэтгэх болно. Зөвшөөрч байна, код нь илүү нягт, ойлгомжтой, i.e. функцууд нь ижил кодыг солиход тусалдаг, зөвхөн нэг мөр. Функцийг үндсэн кодоос гадуур зарласан болохыг анхаарна уу, i.e. үндсэн функцийн өмнө. Энэ нь надад яагаад хэрэгтэй байна гэж та хэлж болно, гэхдээ хичээлүүдийг судлах явцад та ихэвчлэн функцуудтай таарах болно, жишээлбэл, LCD дэлгэцийг цэвэрлэх lcd_clear() - функц нь ямар ч параметрийг хүлээн авдаггүй бөгөөд юу ч буцаадаггүй, гэхдээ энэ нь дэлгэц. Заримдаа энэ функцийг бараг бүх мөрөнд ашигладаг тул кодын хэмнэлт нь тодорхой байдаг.

Утга авах үед функцийг ашиглах нь илүү сонирхолтой харагдаж байна, жишээлбэл, c хувьсагч байдаг ба int төрлийн хоёр утгыг авдаг функцийн нийлбэр байдаг. Үндсэн программ энэ функцийг гүйцэтгэх үед аргументууд аль хэдийн хаалтанд байх тул "a" нь хоёр, "b" нь 1-тэй тэнцүү болно. Функц биелэгдэж, "c" нь 3-тай тэнцүү болно. .

int c= 0 ; хүчингүй нийлбэр(int a, int b) ( c= a+ b; ) хүчингүй гол(void ) ( нийлбэр(2 , 1 ) ; )

int c=0; хүчингүй нийлбэр(int a, int b) ( c=a+b; ) хүчингүй гол(void) ( нийлбэр(2,1); )

Хамгийн түгээмэл ижил төстэй функцуудын нэг нь LCD дэлгэц дээр курсорыг хөдөлгөх явдал юм lcd_gotoxy(0,0); Энэ нь мөн аргументуудыг авдаг - x ба y координатууд.

Функцийг ашиглах өөр нэг сонголт, утга буцаах үед энэ нь хүчингүй болохоо болино, хоёр тоо нэмэх функцийн өмнөх жишээг сайжруулъя:

int c= 0 ; int нийлбэр(int a, int b) ( буцаах a+ b; ) хүчингүй гол(void) ( с= нийлбэр(2, 1) ; )

int c=0; int нийлбэр(int a, int b) ( a+b буцаана; ) хүчингүй гол(void) ( с=нийлбэр(2,1); )

Үр дүн нь сүүлчийн удаа c=3-тай ижил байх боловч бид “c” хувьсагчийг функцийн утга нь хүчингүй болсон боловч int төрлийн хоёр тооны нийлбэрийг буцаадаг гэдгийг анхаарна уу. Ингэснээр бид "c" тодорхой хувьсагчтай холбогддоггүй бөгөөд энэ нь функцийг ашиглахад уян хатан байдлыг нэмэгдүүлдэг. Ийм функцийн энгийн жишээ бол ADC өгөгдлийг унших явдал бөгөөд функц нь хэмжсэн утгыг буцаана үр дүн=read_adc();. Функцуудыг дуусгая.

Одоо массив руу шилжье. Массив нь хамааралтай хувьсагч юм. Жишээлбэл, танд хэд хэдэн цэг бүхий синус хүснэгт байгаа тул та хувьсагч үүсгэхгүй int sinus1=0; int sinus2=1; гэх мэт. Үүний тулд массивыг ашигладаг. Жишээлбэл, та дараах гурван элементийн массив үүсгэж болно.
int sinus=(0,1,5);
Массивын элементийн нийт тоог дөрвөлжин хаалтанд тэмдэглэв. Та гурав дахь элементийн утгыг "c" хувьсагчид дараах байдлаар оноож болно.
с=синус;
Массивын элементүүдийн дугаарлалт нь тэгээс эхэлдэг болохыг анхаарна уу, өөрөөр хэлбэл. "c" нь тавтай тэнцүү болно. Энэ массив нь синусын элементгүй байна!!!
Та дараах байдлаар бие даасан элементэд утгыг оноож болно:
синус=10;

CodeVision-д мөр хувьсагч байхгүй гэдгийг та аль хэдийн анзаарсан байх. Тэдгээр. та хувьсагчийн мөр үүсгэх боломжгүй hello=”hello”; Үүнийг хийхийн тулд та бие даасан тэмдэгтүүдийн массив үүсгэх хэрэгтэй болно.

lcd_putchar(сайн уу); lcd_putchar(сайн уу); lcd_putchar(сайн уу);

гэх мэт.
Энэ нь нэлээд төвөгтэй болж хувирав, энд мөчлөгүүд аврах ажилд ирдэг.
Жишээлбэл, while давталт

while(PINB.0!=0) ( )

Товчлуурыг дарах хүртэл юу ч хийхгүй - хоосон гогцоо ажиллуул.

Өөр нэг сонголт бол for давталт юм

int i; хувьд (i= 0; i< 6 ; i++ ) { lcd_putchar(hello[ i] ) ; }

int i; for(i=0;i<6;i++) { lcd_putchar(hello[i]); }

Утга нь while гэсэнтэй яг адилхан бөгөөд зөвхөн эхний нөхцөл i=0 болон i++ мөчлөг бүрд биелэгдэх нөхцөл нэмэгдэнэ. Гогцооны доторх кодыг аль болох хялбаршуулсан.

Програмаа бичсэний дараа эх кодыг эмхэтгэсэн бөгөөд хэрэв алдаа байхгүй бол та хүссэн програм хангамжийг төслийн хавтсанд хүлээн авах болно. Одоо та микроконтроллерыг асааж, төхөөрөмжийн ажиллагааг эдлэх боломжтой.

Та програм хангамж дээрээ гогцоо, массив, функцийг ашиглахыг нэн даруй оролдох ёсгүй. Таны гол ажил бол програм хангамжийг ажиллуулах явдал тул үүнийг хийх нь танд илүү хялбар бөгөөд кодын хэмжээг анхаарч үзэх хэрэггүй. Зөвхөн ажлын код бичээд зогсохгүй сайхан, авсаархан бичихийг хүсэх цаг ирнэ. Дараа нь Си хэлний зэрлэг шинж чанарыг судлах боломжтой болно. Бүх зүйлийг эзэмшихийг хүсч буй хүмүүст би "С хэл дээр хэрхэн програмчлах вэ" номыг дахин санал болгож байна, олон жишээ, даалгавар байдаг. Visual Studio-г суулгаж, win32 консол програмыг үүсгээд, тэндээ өөрийн хүссэнээр дасгал хий.


Энэхүү avr сургалтын курст би микроконтроллер програмчлалын эхлэгчдэд зориулсан бүх үндсийг тайлбарлахыг хичээсэн авр. Бүх жишээнүүд нь микроконтроллер дээр бүтээгдсэн atmega8. Энэ нь бүх хичээлийг давтахын тулд танд зөвхөн нэг MK хэрэгтэй болно гэсэн үг юм. Proteus-ийг электрон хэлхээний эмулятор болгон ашигладаг - миний бодлоор эхлэгчдэд хамгийн сайн сонголт. Бүх жишээн дээрх программуудыг avr CodeVision AVR-д зориулсан C хөрвүүлэгчид бичсэн болно. Яагаад зарим ассемблер дээр байж болохгүй гэж? Учир нь анхлан суралцагч аль хэдийн мэдээллээр дүүрэн байдаг бөгөөд хоёр тоог үржүүлдэг програм ассемблер дээр зуу орчим мөр авдаг бөгөөд нарийн төвөгтэй, тод төслүүдэд C ашигладаг. CodeVision AVR хөрвүүлэгч нь atmel микроконтроллеруудад тохирсон, тохиромжтой код үүсгэгчтэй, сайн интерфэйстэй бөгөөд шууд та микроконтроллерийг түүгээр анивчуулж болно.

Энэхүү сургалтын курс нь дараахь зүйлийг энгийн жишээн дээр тайлбарлаж харуулах болно.

  • Микроконтроллеруудыг програмчилж эхлэх, хаанаас эхлэх, үүнд юу хэрэгтэй вэ.
  • avr программ хангамж бичих, компьютер дээр кодыг дуурайх, дибаг хийхэд ямар програм ашиглах вэ?
  • MK дотор ямар захын төхөөрөмжүүд байдаг, тэдгээрийг программаараа хэрхэн хянах вэ
  • Дууссан програм хангамжийг микроконтроллерт хэрхэн бичих, хэрхэн дибаг хийх талаар
  • Төхөөрөмждөө PCB хэрхэн хийх вэ
MK програмчлах эхний алхмуудыг хийхийн тулд танд зөвхөн хоёр програм хэрэгтэй болно.
  • Proteus бол эмулятор програм юм (үүнд та жинхэнэ гагнуур хийхгүйгээр хэлхээг боловсруулж, дараа нь манай програмыг энэ хэлхээнд туршиж үзэх боломжтой). Бид эхлээд Proteus дахь бүх төслийг эхлүүлж, дараа нь жинхэнэ төхөөрөмжийг гагнах болно.
  • CodeVisionAVR нь AVR-д зориулсан Си програмчлалын хэлний хөрвүүлэгч юм. Үүн дээр бид микроконтроллерийн програмуудыг боловсруулах бөгөөд үүнээс шууд жинхэнэ MK-г асаах боломжтой болно.
Proteus-ийг суулгасны дараа түүнийг ажиллуулна уу
Тэр биднийг өөртэй нь хамт ирдэг төслүүдийг үзэхийг урьж байна, бид эелдэгээр татгалздаг. Одоо түүний доторх хамгийн энгийн хэлхээг бүтээцгээе. Үүнийг хийхийн тулд дүрс дээр товшоод юу ч болохгүй. Одоо та жижиг үсэг дээр дарах хэрэгтэй P (номын сангаас сонгох)бүрэлдэхүүн хэсгийн жагсаалтын самбарт бүрэлдэхүүн хэсэг сонгох цонх нээгдэнэ
маск талбарт номын сангаас олохыг хүссэн бүрэлдэхүүн хэсгийн нэрийг оруулна уу. Жишээлбэл, бид mega8 микроконтроллер нэмэх хэрэгтэй
үр дүнгийн жагсаалтад mega8 руу зааж, товчийг дарна уу БОЛЖ БАЙНА УУ. Mega8 микроконтроллер нь бидний бүрэлдэхүүн хэсгүүдийн жагсаалтад гарч ирнэ
Тиймээс бид талбарт маск гэсэн үгийг оруулснаар бүрэлдэхүүн хэсгүүдийн жагсаалтад өөр резистор нэмнэ resболон LED удирдсан

Диаграм дээр хэсгүүдийг байрлуулахын тулд хэсэг дээр товшоод диаграмын талбар дээр товшоод бүрэлдэхүүн хэсгийн байршлыг сонгоод дахин дарна уу. Зүүн талд байгаа диаграммд газар эсвэл ерөнхий сөрөг нэмэхийн тулд "Терминал" дээр товшоод Ground-г сонгоно уу. Тиймээс бүх бүрэлдэхүүн хэсгүүдийг нэмж, тэдгээрийг холбосноор бид энэ энгийн хэлхээг олж авдаг
Ингээд л бидний анхны схем бэлэн боллоо! Гэхдээ та тэр юу хийж чадах вэ гэж асууж магадгүй юм. Юу ч биш. Юу ч биш, учир нь микроконтроллер ажиллахын тулд та түүнд зориулж програм бичих хэрэгтэй. Программ гэдэг нь микроконтроллерийн гүйцэтгэх командуудын жагсаалт юм. Бидэнд микроконтроллерыг хөл дээр суурилуулах хэрэгтэй PC0логик 0 (0 вольт) ба логик 1 (5 вольт).

Микроконтроллерт зориулсан програм бичих

Бид CodeVisionAVR хөрвүүлэгчийг ашиглан програмыг Си хэл дээр бичнэ. CV-г ажиллуулсны дараа бид юу бүтээхийг хүсч байгаагаа асууна: Эх сурвалж эсвэл Төсөл Бид сүүлийнхийг сонгоод OK дарна уу. Дараа нь бид CVAVR CodeWizard шидтэнг ажиллуулахыг хүсэх болно (энэ нь эхлэгчдэд үнэлж баршгүй хэрэгсэл юм, учир нь энэ нь програмын үндсэн араг ясыг үүсгэж чаддаг) сонгох Тиймээ
Шидтэн нь Chip tab-ыг идэвхжүүлж эхэлдэг тул эндээс бид MK-ийнхаа загварыг сонгох боломжтой - энэ бол mega8 бөгөөд MK ажиллах давтамж (анхдагчаар mega8-ийг 1 мегагерц давтамжтайгаар тохируулсан) тул бид тохируулсан. Дээрх дэлгэцийн агшинд үзүүлсэн шиг бүх зүйл. Портууд таб руу очно уу
Atmega8 микроконтроллер нь 3 порттой: C, D, Port B. Порт бүр 8 пинтэй. Портын хөл нь хоёр төлөвт байж болно:
  • гарах
DDRx.y регистрийг ашиглан бид зүүг оролт эсвэл гаралтаар тохируулж болно. Хэрэв орвол
  • DDRx.y = 0 - гаралт нь иймэрхүү ажилладаг ОРЦ
  • DDRx.y = 1 зүү ажиллаж байна ГАРАХ
Зүүг гаралт болгон тохируулах үед бид үүнийг логик 1 (+5 вольт) ба логик 0 (0 вольт) болгож тохируулж болно. Үүнийг PORTx.y регистр рүү бичих замаар хийдэг. Дараа нь бид I/O портуудын талаар дэлгэрэнгүй ярих болно. Одоо бид бүх зүйлийг дэлгэцийн агшинд үзүүлсэн шиг тохируулаад File->Generate, Save and Exit дээр дарна уу. Дараа нь CodeWizard биднээс төслийг хадгалахыг хүсэх болно, бид үүнийг хадгалж, кодыг харна:

#оруулна //цаг хугацааны хоцрогдол үүсгэх номын сан void main(void) ( PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x01; // PC0-ийг гаралтын PORTD=0x00 болгох; DDRD=0x00; // Timer/Counter 0 эхлүүлэх TCCR0=0x00; // Timer/Counter TCCR1L=0x00 OCR1BL=0x00 // Timer/Counter 2-ыг эхлүүлэх // MCU= 0; Тасалдал(ууд)-ыг эхлүүлэх TIMSK=0x00 // Аналог Comparator эхлүүлэх ACSR=0x80 while (1) ( )


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

#оруулна //mega8 микроконтроллертой ажиллах номын сан #include //цаг хугацааны хоцрогдол үүсгэх номын сан void main(void) ( DDRC=0x01; /* PC0 pin-ийг гаралт болгох 0x01 оруулга танд танил биш мэт санагдаж магадгүй бөгөөд энэ нь 16-тын тооны 1-р тоо бөгөөд энэ мөр тэнцүү байх болно. Хоёртын системээр 0b00000001 хүртэл, тэгвэл би ингэж бичнэ.*/ байхад (1) ( )


Бүх зүйл сайхан байна. Гэхдээ LED анивчихын тулд бид PC0 зүү дээрх логик түвшинг өөрчлөх хэрэгтэй. Үүнийг хийхийн тулд та үндсэн гогцоонд хэд хэдэн мөр нэмэх хэрэгтэй.

#оруулна //mega8 микроконтроллертой ажиллах номын сан #include //цаг хугацааны хоцрогдол үүсгэх номын сан void main(void) ( DDRC=0x01; /* PC0 pin-ийг гаралт болгох 0x01 оруулга танд танил биш мэт санагдаж магадгүй бөгөөд энэ нь 16-тын тооны 1-р тоо бөгөөд энэ мөр тэнцүү байх болно. 0b00000001 хүртэл хоёртын системд, тэгвэл би яг ингэж бичнэ.*/ while (1) // програмын үндсэн давталт (// PORTC программын үндсэн давталтын операторын хаалтыг нээнэ.0=1; / / C 1-ийн pin-ийг delay_ms(500); // 500 миллисекундээр хойшлуул. ;//програмын үндсэн давталтын оператор хаалтыг хаадаг)


Ингээд л код бэлэн боллоо. Манай програмыг эмхэтгэхийн тулд (MK процессорын заавар руу орчуулах) "Бүх Төслийн файлуудыг бүтээх" дүрс дээр дарна уу. Манай төсөлд байрладаг Exe хавтсанд hex өргөтгөлтэй файл гарч ирэх ёстой, энэ бол MK-д зориулсан бидний програмын файл юм. Протеус дахь виртуал микроконтроллер руу манай програм хангамжийг оруулахын тулд та Proteus дахь микроконтроллерийн дүрс дээр давхар товших хэрэгтэй. Ийм цонх гарч ирнэ
Програмын файлын талбар дахь хавтасны дүрс дээр дарж, програмын маань hex файлыг сонгоод OK дарна уу. Одоо бид хэлхээнийхээ симуляцийг ажиллуулж болно. Үүнийг хийхийн тулд Proteus цонхны зүүн доод буланд байрлах "Тоглох" товчийг дарна уу.


Хуваалцах