Atmega8 програмчлал. AVR микроконтроллеруудыг програмчлах. Програмчлалын горим дахь MK интерфейс

Компьютерээс микроконтроллер руу шилжүүлэхийн тулд бидэнд USBasp болон AVRDUDE програм хэрэгтэй.Өнөөдөр програмчлалд зориулагдсан програмистуудын өргөн сонголт байдаг AVR микроконтроллерууд. Тэдгээрийн дотроос та хэдхэн резистор ашиглан COM порттой шууд холбогддог тул програмист гэж нэрлэх аргагүй олон гар хийцийн бүтээлийг олж болно. Гэсэн хэдий ч орчин үеийн компьютеруудзөөврийн компьютерууд нь COM портоор бараг тоноглогдоогүй тул програмист сонгох гол шалгууруудын нэг бол түүнийг холбох чадвар юм. USB порт. Хамгийн хямд, энгийн бөгөөд хамгийн түгээмэл нь USBasp программист юм. Үүнийг бараг бүх радио дэлгүүрээс худалдаж авч болно боломжийн үнэ. Үүний өртөг нь Хятад интернетДэлгүүр нь 1.5 доллараас 3 долларын хооронд хэлбэлздэг.

Програмист USBasp

Компьютер нь USB портоор дамжуулан USBasp программист ашиглан микроконтроллертой холбогдож, өгөгдөл нь интерфэйсээр дамждаг. SPI С цуврал П захын I интерфейс(цуваа захын интерфейс). MK-г програмисттай холбохын тулд тусгай зүү ашигладаг: MOSI, MISO, SCK, RESET, VCC, GND. Хэдийгээр SPI Зөвхөн MOSI, MISO, SCK гэсэн гурван тээглүүрийг ашиглах ёстой гэж үздэг боловч бид бүх зургаан зүүг ашиглах болно.

Интерфэйсээр өгөгдөл солилцох үед SPI Микроконтроллер нь нэгэн зэрэг хүлээн авах (MISO зүү) эсвэл өгөгдөл дамжуулах (MOSI зүү) боломжтой. Мэдээлэл хүлээн авах эсвэл дамжуулах горимыг тохируулах нь SCK зүү дээр тодорхой импульс өгөх замаар хийгддэг.

Программист холбогч нь дүрмээр бол 10 тээглүүртэй бөгөөд 10 утастай кабель ашиглан микроконтроллерт холбогдсон байна. Гэсэн хэдий ч 6 зүү адаптертай кабелийг ашиглах нь илүү тохиромжтой, учир нь энэ тохиолдолд бүх зүү эзэлдэг. Арван зүү холбогчийн хувьд нэг зүү хоосон хэвээр байх бөгөөд дөрвөн зүү нь нийтлэг утсанд (GND) холбогдсон байна.

Компьютер программистыг илрүүлэхийн тулд та USBasp драйверийг суулгах ёстой.

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

Энэ программистын цорын ганц сул тал, эсвэл илүү зөв, бага зэргийн таагүй тал нь үүнийг Atmel Studio дэмждэггүй (янз бүрийн заль мэхгүйгээр) байгаа тул та үүнийг ашиглах хэрэгтэй. гуравдагч талын програм. Хамгийн батлагдсан нь AVRDUDE юм.

Тохиргоо

Одоо бид эцсийн шатыг дуусгах л үлдлээ. AVRDUDE програмыг ажиллуулна уу. Анхдагч байдлаар, Програмын таб нээгдэнэ. Цонхны доод хэсэгт Тохиргоо цэснээс програмистын төрлийг сонгоно уу usbasp. Дараагийн ангилалд МикроконтроллерМанай ATmega8 микроконтроллерыг сонго. Доорх ангилалд ФлэшЗууван дүрс дээр товшоод нээгдэх цэсэнд өргөтгөлтэй эмхэтгэсэн файл руу очих замыг зааж өгнө үү. зургаан өнцөгт. Файлд хүрэх зам болон файл өөрөө бидний өмнө нь заасантай ижил байх болно.

Программистыг үйлдлийн систем илрүүлсэн (программист драйвер зөв суулгасан) болон микроконтроллерт зөв холбогдсон эсэхийг шалгахын тулд товчлуур дээр дарна уу. Уншиж байна. Хэрэв алдаа байхгүй бол " гэсэн оруулгатай цонх гарч ирнэ. Генераторын тохируулгын нүдийг уншсан!"Мөн дээд цонхонд арван зургаатын тоо гарч ирнэ. MK бүр өөрийн гэсэн дугаартай.

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

Одоо категори дахь Програмын товчлуур дээр дарна уу Флэш. Хөтөлбөрийг MK-д амжилттай бүртгэх үед доорх оруулгатай цонх гарч ирнэ.

Бүртгэгдсэн, эсвэл тэдний хэлснээр програмын програмын үр дүн нь манай микроконтроллерийн PC0 зүүтэй холбогдсон асдаг LED юм.

Сайхан өдөр. Үргэлжлүүлье. Бид "atmel studio" дээр бичсэн програмын дибаг хийх үйл явцтай танилцаж, "proteus" -д нэг LED бүхий хэлхээг бараг угсарсны дараа хэлхээг техник хангамжид угсарч, микроконтроллерийг асаах цаг болжээ.

Прототипийг програмчлахын тулд ( атмега 8) бид USBASP программистыг ашиглах болно. Энэ нь дараах байдалтай харагдаж байна.

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

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


Бид программистыг олж мэдсэний дараа. Техник хангамжид хэлхээг угсрах ажлыг үргэлжлүүлье. Бид микроконтроллерыг талхны самбар дээр суурилуулдаг. Эхний хөлийг MK дээр жижиг дугуйгаар тэмдэглэсэн гэдгийг сануулъя.

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

Бид холбогчийг 10 зүү холбогчтой холбодог. Бид дараах MOSI, RST, SCK, MISO, VTG (VCC), GND зүүг ашигладаг.

Та atmega8 дээрх мэдээллийн хуудсыг аль хэдийн татаж авсан гэж найдаж байна. Үгүй бол та татаж авч болно. Бид микроконтроллерийн тээглүүрүүдийн зүүг хардаг.

Бид холбогчийг дараах зүү рүү холбодог.

  • VCC нь MK-ийн 7-р зүү;
  • MK-ийн 19-р зүү хүртэл SCK;
  • MISO нь MK-ийн 18-р зүү;
  • MOSI нь MK-ийн 17-р зүү;
  • GND (программист зүү 10) MK-ийн 8-р зүү;
  • MK-ийн 1 зүү хүртэл RST;

Цаашид амжилттай ажиллахын тулд үйлдлийн систем нь Шайтан машиныг (программист) анх удаа эхлүүлэхдээ төхөөрөмжийг ажиллуулахад шаардлагатай драйверуудыг суулгахыг санал болгоно.

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

Хэрэв та Windows 7 ба түүнээс дээш хувилбарыг ажиллуулж байгаа бол танд бага зэргийн хүндрэл гарч болзошгүй. Програмистад зориулсан драйверууд нэлээд хуучирсан тул тэдэнд байхгүй цахим гарын үсэг. Ийм драйвер суулгахыг оролдох үед үйлдлийн систем нь иймэрхүү зүйлийг харуулах болно *

Жолооч нарын тоон гарын үсэг шаардлагатай энэ төхөөрөмжийн. At сүүлчийн өөрчлөлттоног төхөөрөмж эсвэл програм хангамжбуруу гарын үсэг зурсан эсвэл гэмтсэн файлэсвэл хортой програмгарал үүсэл нь тодорхойгүй. (Код 52).

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

Гарын үсгийн баталгаажуулалтыг идэвхгүй болгосны дараа "Тоног төхөөрөмжийн суулгах шидтэн"-д задалсан драйвер бүхий хавтсанд хүрэх замыг зааж өгнө үү.

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

LED бүхий хэлхээг угсрах ажлыг үргэлжлүүлье.

Микроконтроллерийн програмыг гэрэлтүүлэхийн тулд бид "avrdudeprog" програмыг ашиглана. Ерөнхий архивт байгаа.

Микроконтроллеруудын жагсаалтаас atmega8-ийг сонгоно уу. MK-г сонгосны дараа гал хамгаалагч болон Түгжих битүүдийг анхдагчаар тохируулсан тухай мэдээлэх цонх гарч ирнэ.

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

Тохируулсан тохиргоонууд нь Atmega8A-д дотоод осциллятороос (цагийн давтамж 8 МГц) ажиллахын тулд ажлаа гүйцэтгэхийг "тушаал" өгдөг. Тохиргоог хүчин төгөлдөр болгохын тулд та "Програмчлал" товчийг дарах хэрэгтэй. Гэхдээ дарахаас өмнө бүх зүйл зөв тохируулагдсан эсэхийг дахин шалгаарай.

"Хөтөлбөр" хуудас руу буцах.

Бид аль микроконтроллерыг анивчуулахаа программд хэлсний дараа бид сүүлчийн хичээл дээр бичсэн програмын файлыг сонгоно. Энэ нь HEX өргөтгөлтэй. "Дбаг хийх" хавтсанд байрладаг

"Хайргыг" анивчуулахын өмнө "Бүх зүйлийг арилгах" товчийг дарна уу. Энэ нь таныг үл ойлгогдох алдаанаас хамгаалах болно (чулууг аль хэдийн оёсон бол яах вэ):

Бид ажлынхаа үр дүнд сэтгэл хангалуун байна :) Үргэлжлүүлэн...

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

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

Даалгавар: Нэг LED-ийг удирдах программыг боловсруулцгаая. Товчлуур дээр дарахад LED асч, суллахад унтардаг.

Эхлээд төхөөрөмжийн бүдүүвч диаграммыг боловсруулъя. Оролт гаралтын портууд нь аливаа гадаад төхөөрөмжийг микроконтроллерт холбоход ашиглагддаг. Порт бүр нь оролт, гаралтын аль алинд нь ажиллах чадвартай. LED-ийг нэг порт руу, товчлуурыг нөгөө рүү холбоно. Энэ туршилтын хувьд бид хянагч ашиглах болно Атмега8. Энэ чип нь 3 оролт гаралтын порттой, 2 найман бит, 1 арван зургаан бит таймер/тоолууртай. Мөн самбар дээр 3 сувгийн PWM, 6 сувгийн 10 битийн аналог-тоон хувиргагч болон бусад олон зүйл байдаг. Миний бодлоор микроконтроллер нь програмчлалын үндсийг сурахад тохиромжтой.

LED-ийг холбохын тулд бид PB0 мөрийг, товчлуураас мэдээллийг уншихын тулд PD0 мөрийг ашиглана. Диаграммыг 1-р зурагт үзүүлэв.

Цагаан будаа. 1

R2 резистороор дамжуулан тэжээлийн хүчдэлийг PD0 оролтод нийлүүлдэг бөгөөд энэ нь логик нэг дохиотой тохирч байна. Товчлуур хаагдах үед хүчдэл тэг болж буурдаг бөгөөд энэ нь логик тэгтэй тохирч байна. Ирээдүйд R2-ийг хэлхээнээс хасч, дотоод ачааллын резистороор сольж, програмд ​​шаардлагатай тохиргоог оруулж болно. LED нь гүйдэл хязгаарлагч R3 резистороор дамжуулан PB0 портын гаралттай холбогддог. LED-ийг асаахын тулд PB0 шугамд логик нэг дохио өгөх шаардлагатай. Төхөөрөмж нь давтамжийн тогтвортой байдалд өндөр шаардлага тавьдаггүй тул бид 4 МГц давтамжтай дотоод мастер цагийн генераторыг ашиглах болно.

Одоо бид програмаа бичнэ. Би программ бичихдээ програмчлалын орчинг ашигладаг AVR StudioТэгээд WinAvr. AVR Studio-г нээвэл угтан авах цонх гарч ирэх бөгөөд "Шинэ төсөл үүсгэх" товчийг товшоод, төслийн төрлийг сонгоно уу - AVR GCC, төслийн нэрийг бичнэ үү, жишээ нь "cod1", "Төслийн хавтас үүсгэх" болон "Create" хоёрыг шалгана уу. эхлүүлэх файл" гэсэн хайрцгийг сонгоод, "Дараах" товчийг дарж, зүүн цонхноос "AVR Simulator" -ыг сонгоод, баруун цонхноос "Atmega8" микроконтроллерийн төрлийг сонгоод "Дуусгах" товчийг дарахад редактор болон төслийн ангиллын мод нээгдэнэ. Эхний тохиргоонууд дууссан.

Эхлээд гадаад файлуудыг хавсаргах операторыг ашиглан Atmega8-ийн стандарт тайлбар текстийг нэмье. #оруулна

удирдамжийн синтакс #оруулна

#оруулна<имя_файла.h>
#"файлын нэр.h"-г оруулах

Өнцгийн хаалт< и >хавсаргасан файлуудыг эхлээд оруулах нэртэй WinAvr стандарт хавтсаас хайх ёстойг хөрвүүлэгчид зааж өгнө. " ба " давхар хашилт нь хөрвүүлэгчийг төсөл хадгалагдаж буй лавлахаас хайж эхлэхийг хэлнэ.

Микроконтроллерийн төрөл бүр өөрийн гэсэн толгой файлтай байдаг. ATMega8-ийн хувьд энэ файлыг iom8.h, ATtiny2313 - iotn2313.h гэж нэрлэдэг. Програм бүрийн эхэнд бид ашиглаж буй микроконтроллерийн толгой файлыг оруулах ёстой. Гэхдээ io.h гэсэн нийтлэг толгой файл бас байдаг. Урьдчилан процессор нь энэ файлыг боловсруулж, төслийн тохиргооноос хамааран шаардлагатай толгой файлыг манай программд оруулдаг.

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

#оруулна

Аливаа Си программ нь нэг үндсэн функц агуулсан байх ёстой. Үүнийг үндсэн гэж нэрлэдэг. Програмын гүйцэтгэл нь үргэлж үндсэн функцийг гүйцэтгэхээс эхэлдэг. Функц нь толгой - int main(void) ба их биетэй - буржгар хаалтаар () зааглагдсан байна.

int үндсэн(хүчингүй)
{
функциональ бие
}

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

int- энэ бол 2 байт бүхэл тоо, утгын хүрээ - 32768-аас 32767 хүртэл

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

Дараа нь бид портыг тохируулна Дүүдэнд. Портын ажиллах горимыг регистрийн агуулгаар тодорхойлно DDRD(мэдээлэл дамжуулах чиглэлийн бүртгэл). Бид энэ регистрт "0x00" (0b0000000 - хоёртын хэлбэрээр) тоог бичдэг бөгөөд товчлуураас өөр юу ч энэ порттой холбогдоогүй тул D портыг бүхэлд нь оролт болгон тохируулдаг. Та регистрийн бит бүрт (0-оролт, 1-гаралт) 0 эсвэл 1 тоог бичиж портыг битээр тохируулах боломжтой, жишээлбэл DDRD = 0x81 (0b10000001) - D портын эхний ба сүүлчийн мөрүүд дараах байдлаар ажилладаг. гаралт, бусад нь оролт болно. Дотоод ачааллын эсэргүүцэл нь мөн холбогдсон байх ёстой. PORTx бүртгэл нь порт оролтын горимд байх үед дотоод резисторууд асаалттай эсвэл унтарсан эсэхийг хянадаг. Тэнд нэгжийг бичье.

Портыг тохируулж байна Бгарц руу. Портын ажиллах горимыг регистрийн агуулгаар тодорхойлно DDRB. Порт руу LED-ээс өөр юу ч биш Бхолбогдоогүй тул портыг бүхэлд нь гаралт болгон тохируулах боломжтой. Үүнийг бүртгэлд бичих замаар хийдэг DDRB"0xFF" тоонууд. LED-ийг анх асаахад асахаас сэргийлэхийн тулд порт руу бичнэ үү Блогик тэг. Үүнийг бичлэг хийх замаар хийдэг PORTB= 0x00;

Утга оноохын тулд "=" тэмдгийг ашигладаг бөгөөд үүнийг "тэнцүү" тэмдэгтэй андуурч болохгүй, оноох оператор гэж нэрлэдэг.

Портын тохиргоо дараах байдлаар харагдах болно.

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

Бид програмын гол гогцоог бичдэг. байхад(Англи хэлнээс "while") - энэ тушаал нь давталтыг зохион байгуулж, нөхцөл биелэх хүртэл давталтын биеийг олон удаа давтаж, өөрөөр хэлбэл хаалтанд байгаа илэрхийлэл үнэн байх болно. С хэлэнд илэрхийлэл нь тэгтэй тэнцүү биш бол үнэн, харин худал гэж үздэг.

Тушаал дараах байдалтай байна.

байхад (нөхцөл)
{
гогцоо бие
}

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

PORTB = ~PIND; // D портоос утгыг авч, эргүүлээд PORTB-д онооно (PORTB руу бичих)

// C илэрхийллийг баруунаас зүүн тийш уншина

PINDмэдээлэл оруулах бүртгэл. Хянагчийн гадаад гаралтын мэдээллийг уншихын тулд эхлээд портын хүссэн битийг оролтын горимд шилжүүлэх шаардлагатай. Өөрөөр хэлбэл регистрийн харгалзах бит дээр бичнэ DDRxтэг. Зөвхөн үүний дараа гадны төхөөрөмжөөс дижитал дохиог энэ зүү рүү нийлүүлж болно. Дараа нь микроконтроллер нь бүртгэлээс байтыг унших болно PINx. Харгалзах битийн агуулга нь портын гадаад зүү дээрх дохиотой тохирч байна. Манай програм бэлэн болсон бөгөөд дараах байдалтай байна.

#оруулна int main (void) ( DDRD = 0x00; //port D - оролт PORTD = 0xFF; // ачааллын резисторыг холбоно DDRB = 0xFF; // порт B - гаралт PORTB = 0x00; //гаралтыг 0 байхад (1) тохируулна уу. ) ( PORTB = ~PIND; //~ битийн урвуу тэмдэг ) )

С хэлэнд сэтгэгдэл өргөн хэрэглэгддэг. Бичих хоёр арга бий.

/*Сэтгэгдэл*/
// Сэтгэгдэл

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

Хэрэв та ижил програмыг ашиглаж, Зураг 2-т үзүүлсэн шиг 8 товчлуур, 8 LED-ийг микроконтроллерт холбовол портын бит бүр нь тодорхой болно. Дтүүний порт биттэй таарч байна Б. SB1 товчийг дарснаар HL1 асна, SB2 товчийг дарснаар HL2 асна гэх мэт.

Зураг 2

Нийтлэлд А.В.Беловын номын материалыг ашигласан. "AVR төхөөрөмж хөгжүүлэгчдэд зориулсан заавар"

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

ерөнхий мэдээлэл

Микроконтроллерууд хаа сайгүй байдаг. Тэдгээрийг хөргөгч, угаалгын машин, утас, үйлдвэрийн машин болон бусад олон тооны техникийн төхөөрөмжөөс олж болно. Микроконтроллер нь энгийнээс маш нарийн төвөгтэй хүртэл байдаг. Сүүлийнх нь илүү их функц, функцийг санал болгодог. Гэхдээ та нарийн төвөгтэй технологийг шууд ойлгох боломжгүй болно. Эхлээд та энгийн зүйлийг эзэмших хэрэгтэй. Мөн Atmega8-ийг дээж болгон авах болно. Чадварлаг архитектур, ээлтэй интерфэйсийн ачаар үүн дээр програмчлах нь тийм ч хэцүү биш юм. Нэмж дурдахад, энэ нь ихэнхэд ашиглахад хангалттай гүйцэтгэлтэй бөгөөд тэдгээрийг үйлдвэрт ч ашигладаг. Atmega8-ийн хувьд програмчлалын хувьд AVR (C/Assembler) гэх мэт хэлний мэдлэг шаардлагатай. Хаанаас эхлэх вэ? Энэ технологийг эзэмших нь гурван аргаар боломжтой. Atmega8-тай хаана ажиллахаа хүн бүр өөрөө сонгодог.

  1. Arduino ашиглан програмчлал.
  2. Бэлэн төхөөрөмж худалдан авах.
  3. Микроконтроллерыг өөрөө угсрах.

Бид эхний болон гурав дахь цэгүүдийг авч үзэх болно.

Arduino

Энэ бол янз бүрийн төхөөрөмжийг хурдан бүтээхэд тохиромжтой хэлбэрээр хийгдсэн тохиромжтой платформ юм. Уг самбарт микроконтроллер өөрөө, түүний бэхэлгээ, программист хэлбэрээр хэрэгтэй бүх зүйл аль хэдийн бий. Энэ замаар явснаар хүн дараахь үр өгөөжийг хүртэх болно.

  1. Бага босго шаардлага. Техникийн төхөөрөмжийг хөгжүүлэхийн тулд та тусгай ур чадвартай байх шаардлагагүй.
  2. Нэмэлт бэлтгэлгүйгээр холбоход өргөн хүрээний элементүүд бэлэн болно.
  3. Хөгжлийн хурдан эхлэл. Arduino-ийн тусламжтайгаар та шууд төхөөрөмж үүсгэх боломжтой.
  4. Олон тооны сургалтын материал, янз бүрийн загварыг хэрэгжүүлэх жишээнүүдийн бэлэн байдал.

Гэхдээ тодорхой сул талууд бас бий. Тиймээс Arduino Atmega8 програмчлал нь микроконтроллерийн ертөнцөд илүү гүнзгий нэвтэрч, олон ашигтай талыг ойлгох боломжийг олгодоггүй. Нэмж дурдахад та AVR (C/Assembler)-ийн ашигладаг хэлнээс ялгаатай програмчлалын хэл сурах хэрэгтэй болно. Бас нэг зүйл: Arduino нь нэлээд нарийн хүрээтэй загваруудтай. Тиймээс эрт орой хэзээ нэгэн цагт самбарт ашигладаггүй микроконтроллер ашиглах шаардлагатай болно. Гэхдээ ерөнхийдөө энэ нь Atmega8-тай ажиллахад тохиромжтой сонголт юм. Arduino-ээр програмчлах нь электроникийн ертөнцөд итгэлтэй эхлэх боломжийг танд олгоно. Хүн бүтэлгүйтэл, асуудлаас болж бууж өгөх магадлал багатай.

Өөрөө угсрах

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

Угсрахад юу хэрэгтэй вэ?

Эхлээд та Atmega8-г өөрөө авах хэрэгтэй. Үүнгүйгээр микроконтроллерийг програмчлах нь боломжгүй юм. Зохистой функцийг хангахын зэрэгцээ энэ нь хэдэн зуун рубль болно. Atmega8-ийг хэрхэн програмчлах вэ гэсэн асуулт бас бий. USBAsp бол маш сайн гэдгээ баталсан маш сайн төхөөрөмж юм. Гэхдээ та өөр програмист ашиглаж болно. Эсвэл өөрөө угсарна уу. Гэхдээ энэ тохиолдолд муу бүтээгдсэн бол микроконтроллерыг хуванцар, төмрийн ажиллагаагүй хэсэг болгон хувиргах эрсдэлтэй. Мөн талхны самбар, холбогчтой байвал гэмтээхгүй. Тэд шаардлагагүй, гэхдээ мэдрэл, цаг хугацаа хэмнэх болно. Эцэст нь танд 5V цахилгаан хангамж хэрэгтэй.

Эхлэгчдэд зориулсан Atmega8 програмчлалын жишээг ашиглан

Төхөөрөмжийг ерөнхийд нь хэрхэн бүтээдэгийг харцгаая. Тэгэхээр бидэнд микроконтроллер, LED, резистор, программист, холбох утас, тэжээлийн хангамж байна гэж бодъё. Эхний алхам бол програм хангамжийг бичих явдал юм. Энэ нь микроконтроллерийн командуудын багц гэж ойлгогддог бөгөөд үүнийг тусгай форматаар эцсийн файл болгон танилцуулдаг. Бүх элементүүдийн холболт, түүнчлэн тэдэнтэй харилцах харилцааг зааж өгөх шаардлагатай. Үүний дараа та хэлхээг угсарч эхлэх боломжтой. VCC зүү нь тэжээлтэй байх ёстой. Төхөөрөмж, элементүүдтэй ажиллахад зориулагдсан бусад аль нэгэнд эхлээд резистор, дараа нь LED холбогдсон байна. Энэ тохиолдолд эхнийх нь хүч нь хоёр дахь эрчим хүчний шаардлагаас хамаарна. Та дараах томьёог ашиглаж болно: R=(Up-Ups)/Is. Энд p нь хүч, s нь LED юм. Бидэнд 2V зарцуулдаг, 10 мА тэжээлийн гүйдэл шаарддаг LED байгаа гэж төсөөлөөд үз дээ, үүнийг математикийн үйлдлүүдэд илүү тохиромжтой хэлбэрт шилжүүлж, 0.01А авна. Дараа нь томъёо дараах байдлаар харагдах болно: R=(5V-2V)/0.01A=3V/0.01A=300 Ом. Гэхдээ практик дээр хамгийн тохиромжтой элементийг сонгох боломжгүй байдаг. Тиймээс хамгийн тохиромжтойг нь авдаг. Гэхдээ та математикийн аргаар олж авсан утгаас өндөр эсэргүүцэлтэй резистор ашиглах хэрэгтэй. Энэ аргын ачаар бид түүний үйлчилгээний хугацааг уртасгах болно.

Дараа нь юу юм?

Тиймээс бидэнд жижиг диаграмм байна. Одоо зөвхөн програмистыг микроконтроллерт холбож, үүсгэсэн програмыг санах ойд нь бичих л үлдлээ. Энд нэг цэг байна! Хэлхээ барихдаа микроконтроллерийг гагнуургүй анивчуулж болохуйцаар үүсгэх шаардлагатай. Энэ нь цаг хугацаа, мэдрэлийг хэмнэж, элементүүдийн ашиглалтын хугацааг уртасгах болно. Atmega8 орно. Хэлхээ доторх програмчлал нь мэдлэг, ур чадвар шаарддаг гэдгийг тэмдэглэх нь зүйтэй. Гэхдээ энэ нь танд илүү дэвшилтэт загвар гаргах боломжийг олгодог. Эцсийн эцэст, гагнуурын явцад элементүүд гэмтэх нь ихэвчлэн тохиолддог. Үүний дараа диаграм бэлэн болно. Хүчдэл хэрэглэж болно.

Чухал цэгүүд

Би анхлан суралцагчдад Atmega8 програмчлалын талаар хэрэгтэй зөвлөгөө өгөхийг хүсч байна. Суурилуулсан хувьсагч болон функцийг бүү өөрчил! Төхөөрөмжийг үүсгэсэн програмын тусламжтайгаар бусад хөндлөнгийн оролцоог хаах "мөнхийн гогцоо" байхгүй эсэхийг шалгасны дараа сайн дамжуулагчийг ашиглахыг зөвлөж байна. Хэрэв та эдгээр зорилгоор гар хийцийн бүтээгдэхүүнийг ашигладаг бол микроконтроллер бүтэлгүйтэхэд сэтгэлзүйн бэлтгэлтэй байх ёстой. Программист ашиглан төхөөрөмжийг гэрэлтүүлэхдээ VCC, GND, SCK, MOSI, RESET, MISO гэсэн холбогдох гаралтыг холбох хэрэгтэй. Мөн аюулгүй байдлын урьдчилан сэргийлэх арга хэмжээг бүү зөрч! Хэрэв техникийн үзүүлэлтүүд нь цахилгаан тэжээл нь 5V байх ёстой гэж заасан бол та яг энэ хүчдэлийг дагаж мөрдөх хэрэгтэй. 6V элементүүдийг ашиглах нь микроконтроллерийн гүйцэтгэлд сөргөөр нөлөөлж, ашиглалтын хугацааг богиносгодог. Мэдээжийн хэрэг, 5V батерей нь тодорхой ялгаатай байдаг, гэхдээ дүрмээр бол бүх зүйл боломжийн хязгаарт байдаг. Жишээлбэл, хамгийн их хүчдэлийг 5.3V-д барих болно.

Сургалт, ур чадварыг дээшлүүлэх

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

Өөрөө ямар нэг зүйлийг бүтээж эхлэхэд хэцүү байдаг уу?

Энэ нь 500-2000 рубль, хэд хэдэн үнэ төлбөргүй үдэш байх нь хангалттай юм. Энэ удаад Atmega8 архитектуртай танилцахад хангалттай. Бага зэрэг дасгал хийсний дараа та тодорхой ажлуудыг гүйцэтгэдэг өөрийн төслүүдийг хялбархан үүсгэж болно. Жишээлбэл, робот гар. Зөвхөн Atmega8 нь хуруу, гарны үндсэн мотор функцийг дамжуулахад хангалттай байх ёстой. Мэдээжийн хэрэг, энэ нь нэлээд хэцүү ажил боловч энэ нь нэлээд боломжтой юм. Ирээдүйд олон арван микроконтроллер шаардагдах нарийн төвөгтэй зүйлсийг бүтээх боломжтой болно. Гэхдээ энэ бүхэн өмнө байна, үүнээс өмнө та энгийн зүйл дээр сайн дадлага хийх сургуульд суралцах хэрэгтэй.