AVR mikrokontrolrator uchun bir xil C kodi boshqa turdagi ishlaydi?

Men mikrokontrolerlarni o'rganyapman va bu mavzu bo'yicha juda kam ma'lumotlarga egaman.

Bilingki, registrlardagi bitlarni belgilash va ularni asosan bitta ishni bajarish uchun manipulyatsiya qilish kerak. Registrlar mikroto'lqinlarda elektronni sozlashadi va nazorat qiladi.

Atmel Studio dasturida ma'lum bir 8-bit IT uchun C kodini yozdim. Masalan, uC ma'lumotlar bazasida TCNT0 kabi ro'yxatdan o'tgan nomlar mavjud. Agar bir xil kodni boshqa 8-bit AVR bilan ishlatmoqchi bo'lsam nima bo'ladi? Men hamma narsani noldan yozishim kerakmi yoki faqat kichik o'zgarishlar qilishim kerak? Ro'yxatdan o'tish nomlarining ko'pchiligi umumiymi?

Masalan, C bilan ATmega328Pni dasturlashtiradigan bo'lsak, xuddi shu kod boshqa AT 8-bitli turdagi ATMEga168 bilan ishlaydimi? Agar yo'q bo'lsa, odatda uni noldan yozib yuboradimi yoki avvalgi narsalarni o'zgartirasizmi?

Kodni uyg'unligi haqida men shubhalanaman. 32-bitli AVR32 kabi 8-bitli kodni ishlatish uchun qanday savol berasiz?

2
muammo kodning bir qismini tashkil etadi va/yoki kutubxonalar chipdagi maxsus atrof-muhit va adreslar bilan gaplashadigan yalang'och metalldir. Xuddi shu oilada bitta chipdan butunlay boshqa chipli oilalarga yoki kompaniyaga dizayndagi bir xil sonli atrof-muhit birliklariga ega bo'lishi va bir xil manzilga ega bo'lishi uchun hech qanday sabab yo'q. Portativligi (arduino, mbed) oshirishga harakat qilish uchun muhit yaratilishi mumkin, lekin siz hali ham sizda mavjud bo'lgan chiplardan foydalanishni xohlamaysiz yoki bu chip uchun kutubxona yo'q, keyin yo'q.
qo'shib qo'ydi muallif Bartosz Radaczyński, manba
muayyan registrlar chaqirilganda, u hatto butun oilani tark etmaydi. Ikki ma'lumot sahifasini tekshirishingiz kerak.
qo'shib qo'ydi muallif Bartosz Radaczyński, manba

6 javoblar

Masalan, C bilan ATmega328Pni dasturlashtiradigan bo'lsak, xuddi shu kod boshqa AT 8-bitli turdagi ATMEga168 bilan ishlaydimi?

Bunday holda, javob "ha" bo'ladi. ATmega168P va 328P o'rtasidagi farq faqat flesh-xotira miqdori hisoblanadi - dasturingiz 168P ga (ya'ni, 16 KB dan katta bo'lmagan) to'g'ri keladigan bo'lsa, u o'sha qismda ishlaydi.

Boshqa hollarda ... bu bog'liq. Tashqi qurilmalar bir xil nomga ega bo'lgan holatlarda ham, AVR liniyasi bo'ylab tashqi qurilmalar va funktsiyalarda ba'zi nozik farqlar mavjud. Tafsilotlar uchun ma'lumot jadvallarini diqqat bilan solishtiring.

AVR32 kabi 32-bitli UC uchun 8-bitli kodni ishlatish uchun qanday savolga egamiz?

AVR32 8-bitli AVR dan butunlay turli me`yoriy; nomi bilan bir qatorda deyarli hech narsa yo'q. Shunday qilib, siz dasturni qayta yozishingiz kerak.

3
qo'shib qo'ydi
C darajasida, siz buni amalga oshirganingizdan farq qilmaydi, ammo keyinchalik C darajasida, Unix dasturining to'liq kodi bu har xil emas. AVR arxitekturalari o'rtasida farqli bo'lgan narsa buyruqlar to'plamidir, xotira kartasi va atrof-muhit birliklari - asosan har bir narsa. Lekin C hali ham S qaramasdan.
qo'shib qo'ydi muallif jmknetspeed, manba

Kodni mikrokreditlar o'rtasida ko'chma bo'lishi uchun yozish mumkin. Buni amalga oshirish juda yaxshi, chunki sizning arizangiz juda sodda yoki siz shoshqaloq bo'lasiz :)

Ushbu g'oya, yuqori darajadagi protseduralarni (asosiy dastur oqimingiz) past darajadagi apparat manipulyasiyasidan ajratish (pinlarni ochish, registrlarni sozlash va hk).

Oddiy misol uchun LEDni boshqarishni istagan joyni tanlang. Sizning kodingizni LEDlar uchun alohida alohida modulga ega bo'lishingiz mumkin: (men AVR bilan ishlamayman, iltimos, har qanday xatoni kechiring)

led.c:

// For simplicity, this assumes all LEDs are on Port D.

void ledInit(uint8_t ledPin)
{

    DDRD |= (1 << ledPin);  //Configure the pin as an output
    PORTD &= ~(1 << ledPin);//Set the pin low
}

void ledOn(uint8_t ledPin)
{
    PORTD |= (1 << ledPin);
}

void ledOff(uint8_t ledPin)
{
    PORTD &= ~(1 << ledPin);
}

So'ngra, asosiy chiziq kodingizda ushbu buyruqlar orqali LEDga faqat faqat bo'ladi. Agar bir nechta buyruqni yoqish kerak bo'lsa, siz uni led.c fayliga qo'shasiz. Asosiy kod LED modulida nima sodir bo'lishidan xabardor emas.

Bu esa, ota-kodingizni mikrokontrolderlar o'rtasida ko'chirishni osonlashtiradi. Asosan, siz led.c faylini qayta yozishingiz kerak. Siz o'zingizning asosiy kodingizni ni hech o'zgartira olmaysiz .

Ushbu mantiqan taymerlar, aloqa portlari (SPI, I2C, USART ...) uchun ham foydalanish mumkin.


Katta hajmdagi loyihada uchta qatlam kodi mavjudligini topaman:

  • Har bir narsani o'rgatadigan asosiy kodi
  • Asosiy satrda funktsiyalar va nomlarni (#defines) beruvchi o'rta darajadagi. Bu narsa anahat kodi va narsalarni amalga oshirish uchun zarur bo'lgan past darajadagi funktsiyalar va
  • ni bildiradi
  • Past darajadagi (haydovchilar), bu aslida to'g'ri bitlarni aylantiradi.

Bunday holda past darajadagi funktsiyalar faqat o'rta darajadagi bloklar tomonidan kuzatiladi. O'rta darajadagi bloklar ota-kodga ta'sir ko'rsatadi.

Bu juda murakkab tuyulishi mumkin, ammo bu juda ham ko'p ish qilmaydi. Agar siz katta ilovalar tafsilotlarini o'zgartirsangiz, bu foyda bo'ladi.

Misol uchun, SPI atrof-muhitini ishlatish uchun dasturni yaratganingizni aytmoqchisiz, lekin sizning yangi dizayiniz haqiqiy I2C dan foydalanish kerak. Endi past darajadagi SPI buyruqlar o'rniga quyi darajadagi I2C buyruqlarini to'g'ri qo'ng'iroq qilish uchun o'rta darajadagi kod blokini o'zgartirishingiz mumkin. Yuqori darajali yoki past darajali kodni o'zgartirishingiz shart emas.

Aytish joizki, siz hali ham asoslarni o'rganayotib, buni tavsiya qilmayman :)

3
qo'shib qo'ydi

Qisqa javob, yo'q, bitta microcontroller uchun yozilgan C kodi boshqa mikrokontrolderlarda ishlashga kafolatlanmaydi.

Uzoq javob, sizning kompilyatoringiz bunday masalalarga katta e'tibor berishi mumkin, va kutubxonalar ham ko'plab tovush detallari haqida g'amxo'rlik bilan yozilgan bo'lishi mumkin.

Masalan, PIC C kompilyatorini CCS dan PIC oilasining mikrokontrollilari bilan ishlash uchun foydalanishga moyil bo'lmoqdaman. Oddiy mikrokontrolder uchun yozilgan kod odatda murakkab bir tekshirgichda ishlaydi, faqat boshqa h faylini qo'shish orqali. Agar men mavjud bo'lmagan periferikni ishlatishga harakat qilsam, derleyici menga xatolik beradi (bu murakkab bir tekshiruvchidan oddiygina osonlikcha o'tishiga to'sqinlik qiladi).

Bu haqda hech qanday sehr yo'q. Biri barcha tegishli xotira joylari uchun defs yozish uchun vaqtni oldi va bu deflarni chaqirish va tegishli harakatlar qilish uchun funktsiyalarni yozing.

STM32 yadro nazoratchilari uchun CMSIS kutubxonalari mavjud, ular nazariyasida degan ma'noni anglatadi, agar chip muharriringiz CMSIS kutubxonasini taqdim etsa, sizning kodingiz STM32 yadro oilasining boshqa a'zolariga, hatto turli xil ishlab chiqaruvchilar.

2
qo'shib qo'ydi

Kod ishlay olishi mumkin, bu sizning kompilyatoringizga bog'liq va sizning kodingizda ishlatiladigan tashqi qurilmalar, ya'ni taymerlar va hisoblagichlar bir xil registrga ega.

1
qo'shib qo'ydi

Agar bir xil kodni boshqa 8-bitli AVR bilan ishlatmoqchi bo'lsam nima bo'ladi?

kodning tabiatiga bog'liq.

apparatga qaram bo'lgan kod, aniq har xil apparat bilan mco'da ishlamaydi. Ikki mo'min bir xil jihozlarga (masalan, TIMER0) ega bo'lsa, kod o'zgartirilmadi.

apparat-mustaqil kod shubhasiz, har qanday mco'da, kompilyatorlar tomonidan qo'llab-quvvatlanadigan darajada ishlaydi.

1
qo'shib qo'ydi

Bir xil AVR oilasi bilan ishlayotgan bo'lsangiz, ro'yxatdan o'tishning nomi bir xil bo'lishi kerak. Ba'zi retseptlar paydo bo'lishi mumkin, agar bu xususiyat bir xil bo'lmasa yo'qoladi. Biroq, agar siz boshqa ishlab chiqaruvchiga boradigan bo'lsangiz, ro'yxatdan o'tishning nomi butunlay boshqacha bo'ladi. (Mikrochipdan TI ga va boshqalarga borganingizda ...)

Siz eski kodingizdan boshlashingiz mumkin, chunki ko'pincha u C dasturiy ta'minotidan foydalanadi. Algoritm qismi o'zgarmagan bo'lishi mumkin. O'zingiz xohlagancha harakat qilish uchun registrni o'zgartirishingiz kerak bo'ladi.

0
qo'shib qo'ydi