ПредишенСледващото

В тази статия, аз реших да записва всичко интересно, което успя да изрови по време на работа в среда IAR Embedded Workbench за AVR (и за програмиране с AVR GCC) програмиране.

невалидни основни (свободен)
докато (1)
//. тук тогава ще трябва да добавите кода на програмата
>
>

2. Добавете в началото на файла, Стартиране хедър, който описва своите процесорни регистри:

3. Добавете глава до началото на код модула:

#define фалшива 0
# определят вярно 1

#define uchar грозен Чар
#define uint неподписан вътр
#define ulong неподписан дълго

4. След добавяне iotiny24.h файл (името на файла глава се определя от вида на избраната процесор се приема като например ATTINY24 процесор) може удобно да се управляват пристанища. Тя се използва и ENABLE_BIT_DEFINITIONS кутия. включващ определяне бита. След iotiny24.h файл включително заглавката и флагове ENABLE_BIT_DEFINITIONS възможни операции като, например:

#define ENABLE_BIT_DEFINITIONS
#include
.
// така че включен нива 4, 5 и 6 на порт за изход режим.
DDRA_DDA6 = 1;
DDRA_DDA5 = 1;
DDRA_DDA4 = 1;

Много ефективни оператори тип Регистрирайте = (1 <<имя_бита), например:

// деактивиране цифров буфер крака 0, 4 и 5 на порт
DIDR0 = (1<

Пример 5. програма мига червен светодиод (LED _RED, _GRN _YEL и свързан към + 5V захранване чрез ограничаване на текущата резистори):

#include
// низ #include Трябва да се работи
// функция __delay_cycles.
#include
#define _RED PORTA_PORTA6
#define _GRN PORTA_PORTA5
#define _YEL PORTA_PORTA4

невалидни основни (свободен)
#define забавяне 1000000

// превключване на LED пристанища в изходния режим
DDRA_DDA6 = 1;
DDRA_DDA5 = 1;
DDRA_DDA4 = 1;

// изключване светодиодите
_RED = 1;
_YEL = 1;
_GRN = 1;
докато (вярно)
_RED = 0; // изход 0, червеният LED светва
__delay_cycles (забавяне / 10);
_RED = 1; // изход 1 червен светодиод погасява
__delay_cycles (забавяне - (а / 10));
>
>


#define _key PINA_PINA6
.
ако (_key == невярно)
// бутон е натиснат!
>

#include
#define _key PINB_PINB2
#define YEL PB2
#define _YEL PORTB_PORTB2
.
ако (_key == невярно)
// бутон е натиснат!
.
>

HKEY_CURRENT_USER \ Software \ IAR Systems \ IAR Embedded Workbench IDE \ Последните работни плотове \
C - Program Files-IAR AVR Embedded Workbench 4.0-здравия бин IarIdePm.exe.

Почиствайте само с помощта на регентство.

Препоръчително е да се добави следния клавишна комбинация (в менюто Debug):
Reset Ctrl + R
Стоп грешки Alt + D
Счупете Esc

8. Най-лесният начин да влезете в режим на спиране на захранването на ATtiny45:

След това излезе от режим на заспиване, може да бъде прекъснат само Watchdog, прекъсне или да прекъсне INT0 Смяна на ПИН, USI Старт състояние и нулиране.

9. Същото, но от силата на Даун резолюция изход прекъсване PCI - Смяна на ПИН прекъсне. Примерът използва ATtiny45 крак 7, която е окачена върху бутона (виж схема breadboard.):

// SE = 1 - заспиване Активиране
// SM1 = 1, SM0 = 0 и - след __sleep () команда да започне режим
// Захранване на Даун
MCUCR = (1< // PCIE = 1 - Pin Промени Прекъсване Активиране
GIMSK = 1< // PCINT2 = 1 - позволи прекъсване от 7 фута
// (KEY == PCINT2 == РВ2)
PCMSK = 1< // резолюция на всички прекъсва
SREG_I = 1;
__sleep ();
// след това идва код, който ще се изпълнява само след
// натискане на един бутон.
.

10. Как мога да напишете прекъсне треньор. например, за PCINT0 вектор:

// #pragma вектор = директива трябва да се посочи номерът на вектор
// списък прекъсват вектори е посочено в iotiny45.h на файла
#pragma вектор = PCINT0_vect
// име PCINT0_routine избран произволно
__interrupt невалидни PCINT0_routine (свободен)
__no_operation ();
>

Сега, ако ние се прекъсне Смяна на ПИН прекъсне, както е споменато в предишния връх, ще се нарече вместо RETI включете този код (__no_operation ();).

#define WDT128ms 0x03
WDTCR = (1< // резолюция на всички прекъсва
SREG_I = 1;

#pragma вектор = WDT_vect
__interrupt невалидни WDT_routine (свободен)
__no_operation ();
WDTCR_WDTIE = 1;
>

Сега нулирането ще не само на процесора ще се събуди всеки 128 милисекунди (ако __sleep команда () е наречен).

12. SLEEP Екипът е много бързо, така че понякога не е нужно време за прилагането на резултатите от предходната команда:

Ако не беше за четирите отбора NOP, пристанищния B не разполага с време, за да преминете към входа. Аз, например, продължава да гори LED свързва с пин PB2 (след SLEEP той продължава да работи като пазар). Брой на свободните операции преди инструкцията SLEEP е необходимо, за да изберете експерименталната (понякога е по-добре да се използва цикъла).

13. Променлива поплавък е 4 байта.

14. За да се променливата съхраняват в EEPROM и да бъде на разположение, когато се рестартира и отново включете захранването, трябва да се уточни __eeprom атрибут памет и дума __no_init (без __no_init променливи в началото ще се нулира), например:

__no_init __eeprom поплавък fVar;

uchar АРС;
Adr = (uchar)&fVar;

15. Рано да се насладите и да се отпуснете, да се възползват от удоволствията на програмиране в C - памет лети в тръбата много лесно, особено ако използвате типове плувка, ред (това включва правилните функции код библиотека) - удобството да плащат. Може би най-големият недостатък на AVR на архитектура - консумация най-малко веднъж на 2 байта на инструкции за монтаж.

17. За да се генерира случайно число в границите 0..32767 (или 0 до RAND_MAX константи) съществува или е наличен в CLIB DLIB функция библиотека ранд (). Така че може да се използва за увеличаване на файла Стартиране да бъдат включени stdlib.h. За да се генерира случайно число във всяка желана диапазон на работа необходимо да се използва модул (%). Например, така генерира случайна двоично число (истина или лъжа, че е случайно число между 0 и 1 ...):

И той генерира число от 0 до 9:

18. За да отпечатате знак за процент% на използване ФОРМАТ (и sprintf), ще трябва да го повтори два пъти:

ФОРМАТ ( "Това е знак за процент: %%");

19. Някои глобални или статични променливи могат да бъдат поставени директно в регистър R4-R15, което значително ще подобри скоростта на променливата. За да направите това, трябва да се използва при обявяване на променлива разширява __regvar ключова дума. и да използвате опцията компилатор --lock_regs на. Пример регистър декларация променлива (да се използва регистър двойка R15: R14):

__regvar __no_init Int брояч @ 14;

Ограничения: Максималният размер на един обект, който може да бъде идентифициран в регистрите чрез директива __regvar е 4 байта. Не можете да използвате указател към променлива разпределят с помощта __regvar директива. Освен това, не е възможно да се уточни на обекта, когато се обявява от първоначалната стойност. В допълнение, ако използвате __regvar, ключалката по този начин регистрира променлива, и да се използват библиотеки също трябва да бъдат прекомпилирани с един и същ набор от заключени регистри. Поради това тези нарушения са най-използвани в крайни случаи - може би най-добрата алтернатива е да се напише отделен модул на асемблер.

Всичко казано в този съвет може да бъде намерена в директорията на компилатора IAR, файл C: \ Program Files \ IAR AVR Embedded Workbench 4.0 \ AVR \ док \ EWAVR_CompilerReference.pdf. Вижте. __regvar, --lock_regs, --memory_model.

20. Проблемът с дейностите по строителство -> след натрупването на командния ред: не можете да стартирате след съставянето на необходимите инструменти.

проблемът обикновено е свързано с изпълнението на програмите начини. В този случай, на View прозореца -> Messages -> Изграждане след компилация запис се появява "Общ брой на грешки: 1" (въпреки че грешката при синтаксис не е бил по време на компилация) и необходимите стъпки в командния ред при стартиране на Post-изграждане на командния ред не се случи. Трудността на установяване и поправяне на тези грешки е, че няма информация за причината за проблема.

Първото нещо, за да се провери - на пътя към мястото на изпълнимия полезността. Тя трябва да се управлява от пълни права посочената пътека, или до изчерпване на пътя трябва да бъдат посочени в променлива среда% Path% на. Ако изпълним програмата се намира в папката на проекта, използвайте вградените макроси IAR $ PROJ_DIR $, което показва местонахождението на конфигурационните файлове на проекта * .ewp и * .eww. използване Печалба $ PROJ_DIR $ е, че тя позволява да се отървете от абсолютния път, и лесно можете да копирате или преместите на проекта в папка на диска, без да губи своята ефективност.

Второто нещо, за да се провери - виж пускам тези файлове, които трябва да бъдат обработени. Ако програмата очаква да види входни файлове в текущата директория, използвайте една партида файл, за да стартирате програмата, както и в рамките на една партида файл, използвайте командата CD да се промени към директорията на полезност. В сегашния курс на проекта преминава през опцията за партида файл. Пример за правилно конфигурирани линии след натрупването на командния ред:

post_build_pu.bat файл Пример:

21. Как да се изчисли броя на елементите в масива от структури или масиви от елементи от определен тип? Подходящ макро преброяващите:

Как да се реши проблема без да се налага да изключите отстраняване на грешки (-O0 опции и така нататък. Н.)? Понякога изключите отстраняване на грешки не е възможно. IMHO най-лесният начин - да зададете променлива летлив атрибут, компилаторът няма да го оптимизирате, и ще разпредели за тази променлива отделно място в паметта.

Сега променливи сс, мм и чч ще бъдат лесно достъпни, когато пристъпи. Този съвет е добре за повечето компилатори като IAR и ССЗ.

Също така за AVR GCC (от версия 4.4), можете да изключите оптимизация на блок от код чрез директива Pragma:

Функцията може да бъде прекратен, като добавите атрибут оптимизация __attribute __ на ((оптимизиране ( "O0"))). по следния начин:

Свързани статии

Подкрепете проекта - споделете линка, благодаря!