Учимся создавать проекты с помощью avr микроконтроллера

Интегрированная среда разработки

Мы установим мощную IDE Eclipse, которую сможем использовать не только для программирования микроконтроллеров, но и при желании, для написания программ практически на любом языке для host-платформы. Eclipse — это кросс-платформенный инструмент для построения интегрированных сред разработки, реализуемых в виде плагинов, написанный на Java. Вы можете использовать Eclipse не только на Linux, но и в других операционных системах. Единственный минус этого решения — требовательность к объему оперативной памяти в некоторых случаях. Если на вашей машине меньше 2 Gb оперативной памяти, то мы рекомендовали бы добавить планочку, на всякий случай. Не будем бегать по сети в поисках Eclipse, посмотрим, что доступно в репозитории:     apt-cache search eclipse   Нам понадобится базовый пакет eclipse и инструменты разработчика на C/C++ eclipse-cdt. Устанавливаем, особо не рефлексируя:     sudo apt-get install eclipse eclipse-cdt Запустим Eclipse и добавим плагин для удобной работы с AVR, который, помимо всего прочего, обеспечит нам возможность работать с различными моделями программаторов. При запуске Eclipse попросит указать директорию, где будут храниться исходники проектов, выбирайте любое имя на свое усмотрение (директория не должна существовать, Eclipse создаст ее самостоятельно). После того, как Eclipse запустился, пройдем по меню     Help -> Install new software… -> Add… Нам предлагают ввести URL репозиторя, содержащего нужный нам плагин. Узнать URL можно, посетив сайт marketplace.eclipse.org. Забьем в строку поиска «AVR» и найдем AVR Eclipse Plugin, распространяемый под свободной лицензией. На странице плагина нужно догадаться кликнуть по зеленой стрелочке, чтобы получить URL репозитория: http://avr-eclipse.sourceforge.net/updatesite/.

Копируем этот URL в поле «Location» в оконе «Add repository» Eclipse, жмем «Ok». Eclipse подгрузит список доступного ПО из репозитория, отмечаем чекбокс напротив AVR Eclipse Plugin и жмем «Next». Последующие шаги мастера установки проходим, ни от чего не отказываясь. После установки плагина Eclipse захочет перезапуститься, в наших интересах ему это позволить. IDE готова к работе. Теперь разберемся с программатором.

Register Layout

Values that occupy more than one 8-bit register start in an even register.

Fixed Registers

Fixed Registers are registers that won’t be allocated by GCC’s register allocator. Registers R0 and R1 are fixed and used implicitly while printing out assembler instructions:

R0

is used as scratch register that need not to be restored after its usage. It must be saved and restored in interrupt service routine’s (ISR) prologue and epilogue. In inline assembler you can use __tmp_reg__ for the scratch register.

R1

always contains zero. During an insn the content might be destroyed, e.g. by a MUL instruction that uses R0/R1 as implicit output register. If an insn destroys R1, the insn must restore R1 to zero afterwards. This register must be saved in ISR prologues and must then be set to zero because R1 might contain values other than zero. The ISR epilogue restores the value. In inline assembler you can use __zero_reg__ for the zero register.

T
the T flag in the status register (SREG) is used in the same way like the temporary scratch register R0.

User-defined global registers by means of global register asm and / or -ffixed-n won’t be saved or restored in function pro- and epilogue.

Call-Used Registers

The call-used or call-clobbered general purpose registers (GPRs) are registers that might be destroyed (clobbered) by a function call.

R18–R27, R30, R31
These GPRs are call clobbered. An ordinary function may use them without restoring the contents. Interrupt service routines (ISRs) must save and restore each register they use.
R0, T-Flag
The temporary register and the T-flag in SREG are also call-clobbered, but this knowledge is not exposed explicitly to the compiler (R0 is a fixed register).

Call-Saved Registers

R2–R17, R28, R29
The remaining GPRs are call-saved, i.e. a function that uses such a registers must restore its original content. This applies even if the register is used to pass a function argument.
R1
The zero-register is implicity call-saved (implicit because R1 is a fixed register).

Как установить WINAVR

Хотя Atmel Studio 7 полезная штука для написания кода, она не самый лучший выбор, когда речь идет о программировании устройств AVR с использованием инструментов с открытым исходным кодом. Поэтому, чтобы сделать жизнь проще на этапе компиляции и/или программирования, мы будем использовать WINAVR, которая также поставляется с AVRDUDE для загрузки нашего кода на устройства Atmega. Чтобы скачать WINAVR для Windows, просто нажмите на эту ссылку и выберите исполняемый exe-файл.

После скачивания запустите установщик и просмотрите все предложенные опции, пока программа не спросит вас про место установки.

Лучшее место для установки WINAVR – это рекомендуемое расположение: C:WinAVR-20100110 . Следующая опция спросит про компоненты и вы должны убедиться, что установлены все галочки (показано ниже).

После того, как кнопка установки нажата, установщик выполнит остальную часть работы, после чего установщик закроется.

Необходимые компоненты

AT90S4433,8-битный RISC микроконтроллер ф.Atmel — 1 шт.

Панелька для микросхем 14 ножек — 2 шт.
или
панелька 28 ножек( ширина 7,5 мм) — 1 шт.

Купить необходимую панельку на 28 ножек будет гораздо сложнее,т.к. обычно такие панельки имеют ширину 14 мм вместо требуемой 7.5 мм.

Резистор 10 кОм (цветовая маркировка: коричневый, черный, оранжевый) — 1 шт.
Резистор 470 Ом (цветовая маркировка: желтый, пурпурный, коричневый) — 3 шт.
Резистор 1 кОм (цветовая маркировка: коричневый, черный, красный) — 1 шт.
Резистор 220 Ом (цветовая маркировка: красный, красный, коричневый) — 1 шт.
Кварцевый резонатор 4МГц — 1 шт.
Конденсатор керамический 27 пФ — 2 шт.
Любой разъем на 5 контактов, я обычно покупаю разъем в виде полоски на много контактов и отламываю необходимый мне кусок на 5 контактов.
Монтажная плата — 1 шт.
25-ти контактный разъем DB25 для подключения к параллельному порту — 1 шт.
Светодиод — 1 шт.
Макетная плата. Мы ей не пользовались, но я считаю, что она
будет весьма кстати, если Вы захотите продолжить эксперименты с AVR.
Рекомендую поместить микроконтроллер вместе с кварцем и конденсаторами
на монтажной плате и подключать его входы и выходы с помощью коротких проводов к макетной плате.

Комплектующие

Микроконтроллеры AVR имеют некоторые преимущества по сравнению с другими аналогичными микросхемами, включая более высокую MIPS и более дружественную архитектуру. В этой статье мы узнаем, как использовать AVR IDE, как создать исполняемый проект, построить базовую схему AVR, а затем запрограммировать ее. Для этого нам понадобится набор компонентов, а также некоторое программное обеспечение.

Оборудование:

  • ATMEGA168 DIP IC x 1
  • Кварцевые резонаторы, кристалл (4-20 МГц) x 1
  • 20 пФ конденсатор x 2
  • 680 резистор x 1
  • 5.6K резистор x 1
  • Светодиод LED x 1
  • Источник 5 В (цепь 7805, плавное регулирование и т.д.) x 1
  • Провода

Программное обеспечение:

  • USBASP
  • WINAVR (20100110)
  • Atmel Studio 7

3.6 Совет #6 – типы доступа: static

   Для глобальных данных использование ключевого слова static не всегда возможно. Если глобальные переменные объявлены с ключевым словом static, они могут быть доступны только в том файле, внутри которого они определены. Это предотвращает случайное использование переменной в других файлов.    С другой стороны, объявления локальных переменных внутри функции с ключевым словом static следует избегать. Значение статической переменной сохраняется между вызовами функции, и эта переменная сохраняется в течение всей программы. Таким образом, она требует постоянного места хранения в ОЗУ и дополнительного кода для доступа к ней. Это похоже на глобальную переменную, только область видимости статической переменной ограничена телом функции, в котором она объявлена.    Статическими можно объявлять также функции. В этом случае область видимости функции будет тоже ограничена файлом, в котором она объявлена, и вызвать ее можно будет только оттуда. По этим причинам компилятору проще оптимизировать такие функции.    Если статическая функция вызывается в файле всего один раз и оптимизация разрешена (-O1, -O2, -O3, -Os), компилятор сделает эту функцию встраиваемой. Таблица 3-7. Пример использования типов доступа – статическая функция.

   Заметьте, если функция вызывается несколько раз, она не будет встраиваться, потому что это увеличит код больше, чем прямой вызов функции.

Программное обеспечение для AVR в Linux

В пакетах программного обеспечения для Linux содержатся десятки тысяч программ и утилит.

Давайте же посмотрим что у нас есть в пакетах для нашего дистрибутива Linux по ключевому слову «avr», выполним поиск командой:

В результате получим список из нескольких десятков программ и библиотек.

Для начала нам будет интересно вот что:

  • avr-libc — Стандартная библиотека C предназначенная для совместного использования с GCC специально под Atmel AVR;
  • avra — Ассемблер для AVR микроконтроллеров (AVRAssevmler);
  • avrdude — Программное обеспечение для программирования (прошивки) Atmel AVR микроконтроллеров;
  • avrdude-doc — Документация к программе avrdude для чтения в оффлайн режиме, формат HTML;
  • binutils-avr — Набор утилит для работы с данными для AVR микроконтрллеров (avr-objcopy, avr-size и другие);
  • gcc-avr — Компилятор языка GNU C, кросс-компилятор для AVR;
  • gdb-avr — Отладчик (GNU Debugger) для AVR микроконтроллеров;
  • simulavr — Консольный симулятор для Atmel AVR микроконтроллеров.

Установим весь этот набор ПО одной командой:

С этим набором программного обеспечения и каким-то редактором текста уже можно писать программы и прошивать микроконтроллеры AVR.

При помощи avra мы сможем скомпилировать исходный код на Ассемблере (sample_program.asm) и сразу же получить на выходе готовый HEX-файл (sample_program.hex) для записи в флешь-память микроконтроллера.

С помощью gcc-avr можно произвести компиляцию исходного кода на языке Си и получить на выходе объектный файл с машинными кодами (sample_program.obj), который потом при помощи программы avr-objcopy, что входит в комплект утилит binutils-avr,  переконвертируем в HEX-формат (sample_program.hex) для записи в флешь-память AVR чипа.

При помощи программы avr-size из комплекса утилит binutils-avr мы сможем узнать размер секций, а также общий размер данных в получившемся HEX-файле чтобы убедиться что программа поместится в памяти микроконтроллера.

Мощная программа avrdude даст нам возможность считать и записать прошивку в микроконтроллер. Мы сможем записать в микроконтроллер прошивку в HEX-формате (sample_program.hex) которая была получена после компиляции программы на Ассемблере, Си или другом компиляторе для AVR.

В программном симуляторе simulavr мы сможем произвести симуляцию работы программы, посмотреть содержимое регистров микроконтроллера в процессе выполнения программы.

Какие редакторы исходного кода и среды разработки подойдут для программирования AVR микроконтроллеров в Linux? — в принципе любые редакторы с удобной вам подсветкой синтаксиса для языков программирования Си и Ассемблера.

Ниже рассмотрим некоторые из редакторов и сред программирования, которые можно оптимизировать под свои нужды для удобного программирования AVR микроконтроллеров в Linux и не только.

Особенности семейства

Прежде всего, микроконтроллеры этой серии являются быстрыми. Большинство инструкций процессор микроконтроллера выполняет за один цикл. Микроконтроллеры AVR примерно в 4 раза быстрее, чем PIC. Кроме того, они потребляют немного энергии и могут работать в 4 режимах экономии энергии.

Большинство контроллеров AVR являются 8-разрядными, хотя сейчас существует и 32-разрядная разновидность  контроллеров AVR32. Кроме того, как уже упоминалось выше, AVR принадлежат к типу RISC-микроконтроллеров. Архитектура RISC (Complex Instruction Set Computers) означает, что набор инструкций, которые может выполнять процессор устройства, является ограниченным, но, в то же время, подобная архитектура дает преимущество в скорости.  Противоположностью архитектуры RISC является архитектура CISC (Complex Instruction Set Computers).

32-разрядная разновидность контроллеров AVR32

8-битность контроллера означает, что он способен передавать и принимать 8-битные данные. Доступные регистры ввода/вывода также являются 8-битными.

Архитектура контроллера основана на регистрах. Это означает, что для хранения исходных данных операции и ее результата в контроллере используются регистры.

Процессор контроллера берет данные из двух входных регистров, выполняет логическую операцию и сохраняет результат в выходном регистре. Все это занимает 1  исполняемый цикл.

Upgrading Arduino IDE 1.0

Note: This is an advanced option that may have side effects that have not yet been discovered. The official status is “works for me”. You may find issues that I have not come across yet.

The procedure is quite straightforward, surprisingly so given that the compiler and library shipped with the IDE is ancient (gcc 4.3.3). Nevertheless upgrading the IDE should be considered an advanced option that you probably don’t want to do unless you are having issues with it that you believe the upgrade will solve.

Step 1: Backup the old tools

Navigate to hardware/tools subdirectory of the Arduino installation and make a copy of the avr subdirectory like this.

Make a backup

Step 2: Drag and drop the new tools

  1. Navigate into the c:\avrgcc directory and select everything in it.
  2. Navigate a new window to the arduino-1.0\hardware\tools\avr subdirectory.
  3. Drag and drop the entire contents of the avrgcc directory as a copy (not a move!) into the arduino directory. Say yes to all prompts from Windows about merges and overwrites.

Step 3: Backup the Arduino library

Navigate to the hardware\arduino\cores subdirectory of your arduino installation and make a copy of the arduino subdirectory.

Step 4: Fix problems in the Arduino library

The final step is to fix up some problems with the Arduino library. Some are due to the library being written for the old avr-libc and others are just sloppy coding that we need to clean up.

Navigate into the hardware\arduino\cores\arduino directory that we just backed up and download and overwrite the files therein with those in the following table.

File Reason for fix
HardwareSerial.cpp The USART macros have changed and old macros deprecated. Rather than rewrite HardwareSerial.cpp we enable support for the old macros with the __AVR_LIBC_DEPRECATED_ENABLE__ preprocessor symbol.
IPAddress.cpp
and IPAddress.h
Poor code quality here. The 4-octet class member is forcibly type-punned to an incompatible type in several places. This hack forces gcc to disable an entire class of optimisations. The new compiler automatically enables strict-aliasing when size optimisations are selected so we get told about this. The fix is to declare the 4-octet member as a union so it can be used in a type-safe manner.
Print.cpp The old prog_char et al. typedefs are no longer supported. The correct way to declare something to be in flash is with __attribute__((progmem)) on the variable name, not the type. There is one place in Print.cpp where I had to do this.
WString.h The F(string_literal) macro is incorrectly declared. reinterpret_cast can never cast away cv-qualifiers as it is being asked to do in this file. The fix is to keep the const qualifier in the cast target.

Real-Time Operating Systems

  • AvrX — AvrX is a Real-Time Multitasking Kernel.
  • EtherNut — Nut/OS — Ethernut is an Open Source Hardware and Software Project for building Embedded Ethernet Devices. It contains Nut/OS which is an intentionally simple RTOS for the ATmega128, which provides a minimum of services to run Nut/Net, the TCP/IP stack.
  • FreeRTOS — FreeRTOS is a portable, open source, mini Real Time Scheduler (or mini RTOS kernel).
  • TinyOS — TinyOS is a component-based runtime environment designed to provide support for deeply embedded systems which require concurrency intensive operations while constrained by minimal hardware resources.
  • Contiki — Contiki is an Internet-enabled operating system and desktop environment for a number of smallish systems.
  • XMK — eXtreme Minimal Kernel — XMK is a preemptive multitasking scheduler/kernel for 8bit microcontrollers. Its goal is to provide a bare bones RTOS with a small enough footprint (RAM+ROM) to run on 8bit microcontrollers.

Calling Convention

  • An argument is passed either completely in registers or completely in memory.
  • To find the register where a function argument is passed, initialize the register number Rn with R26 and follow this procedure:

    1. If the argument size is an odd number of bytes, round up the size to the next even number.
    2. Subtract the rounded size from the register number Rn.

    3. If the new Rn is at least R8 and the size of the object is non-zero, then the low-byte of the argument is passed in Rn. Subsequent bytes of the argument are passed in the subsequent registers, i.e. in increasing register numbers.

    4. If the new register number Rn is smaller than R8 or the size of the argument is zero, the argument will be passed in memory.

    5. If the current argument is passed in memory, stop the procedure: All subsequent arguments will also be passed in memory.
    6. If there are arguments left, goto 1. and proceed with the next argument.
  • Return values with a size of 1 byte up to and including a size of 8 bytes will be returned in registers. Return values whose size is outside that range will be returned in memory.
  • If a return value cannot be returned in registers, the caller will allocate stack space and pass the address as implicit first pointer argument to the callee. The callee will put the return value into the space provided by the caller.
  • If the return value of a function is returned in registers, the same registers are used as if the value was the first parameter of a non-varargs function. For example, an 8-bit value is returned in R24 and an 32-bit value is returned R22…R25.
  • Arguments of varargs functions are passed on the stack. This applies even to the named arguments.

For example, suppose a function with the following prototype:

int func (char a, long b);

then

  • a will be passed in R24.
  • b will be passed in R20, R21, R22 and R23 with the LSB in R20 and the MSB in R23.
  • The result is returned in R24 (LSB) and R25 (MSB).

Exceptions to the Calling Convention

GCC comes with libgcc, a runtime support library. This library implements functions that are too complicated to be emit inline by GCC. What functions are used when depends on the target architecture, what instructions are available, how expensive they are and on the optimization level.

Functions in libgcc are implemented in C or hand-written assembly. In the latter case, some functions use a special ABI that allows better code generation by the compiler.

For example, the function that computes unsigned 8-bit quotient and remainder, __udivmodqi4, just returns the quotient and the remainder and clobbers R22 and R23. The compiler knows that the function does not destroy R30, for example, and may hold a value in R30 across the function call. This reduces the register pressure in functions that call __udivmodqi4.

Function

Availability

Operation

Clobbers

Description

__umulhisi3

4.7+ && MUL

SI:22 = HI:26 * HI:18

Rtmp

Multiply 2 unsigned 16-bit integers to a 32-bit result

__mulhisi3

4.7+ && MUL

SI:22 = HI:26 * HI:18

Rtmp

Multiply 2 signed 16-bit integers to a 32-bit result

__usmulhisi3

4.7+ && MUL

SI:22 = HI:26 * HI:18

Rtmp

Multiply the signed 16-bit integer in R26 with the unsigned 16-bit integer in R18 to a 32-bit result

__muluhisi3

4.7+ && MUL

SI:22 = HI:26 * SI:18

Rtmp

Multiply an unsigned 16-bit integer with a 32-bit integer to a 32-bit result

__mulshisi3

4.7+ && MUL

SI:22 = HI:26 * SI:18

Rtmp

Multiply a signed 16-bit integer with a 32-bit integer to a 32-bit result

__udivmodqi4

QI:24 = QI:24 / QI:22 QI:25 = QI:24 % QI:22

R23

Unsigned 8-bit integer quotient and remainder

__divmodqi4

QI:24 = QI:24 / QI:22 QI:25 = QI:24 % QI:22

R23, Rtmp, T

Signed 8-bit integer quotient and remainder

__udivmodhi4

HI:22 = HI:24 / HI:22 HI:24 = HI:24 % HI:22

R21, R26…27

Unsigned 16-bit integer quotient and remainder

__divmodhi4

HI:22 = HI:24 / HI:22 HI:24 = HI:24 % HI:22

R21, R26…27, Rtmp, T

Signed 16-bit integer quotient and remainder

The Operation column uses GCC’s machine modes to describe how values in registers are interpreted.

Machine Modes

Qarter, 8 bit

Half, 16 bit

Single, 32 bit

Double, 64 bit

Partial Single, 24 bit

Integer

QI

HI

SI

DI

PSI

Float

SF

DF

Signed _Accum

HA

SA

DA

Signed _Fract (Q-Format)

QQ

HQ

SQ

DQ

Unsigned _Accum

UHA

USA

UDA

Unsigned _Fract (Q-Format)

UQQ

UHQ

USQ

UDQ

Tipps & Tricks

Eine Liste mit einigen Hinweisen:

07.10.11 → es kann Probleme mit der aktuellen Eclipse-Version (Indigo) und WinAVR geben. Falls ihr Indigo installiert habt und Eclipse die Definitionen wie z.B. DDRA nicht kennt, jedoch kompillieren kann, dann müsst ihr auf die Version Helios SR2 wechseln. Danach läuft alles wie gehabt!

Keine «antiken» Versionen verwenden. Für MS-Windows-Nutzer: aktuelles WinAVR installieren. Für Linux/Unix-Nutzer: letzte stabile Version selbst kompilieren oder aus «Distribution-Packages» installieren (z. B. cdk4avr).

Bei Problemen zuerst in die Anleitung der avr-libc schauen. Insbesondere die FAQ lesen.

Sicherstellen, dass der MCU-Parameter (zum Compiler/Linker, meist im Makefile defniert) mit dem Zielprozessor übereinstimmt.

AVR-GCC-Tutorial in diesem Wiki lesen.

Im Zweifel nicht INTERRUPT(…) sondern SIGNAL(…) nutzen. In neueren Versionen der avr-libc wurde «ISR» als Ersatz für SIGNAL eingeführt und sollte genutzt werden (SIGNAL und INTERRUPT werden langfristig entfallen). Darauf achten, dass die Vektor- bzw. Signal-Namen («Parameter») zu ISR bzw. SIGNAL (und INTERRUPT wenn denn unbedingt erforderlich) richtig geschrieben sind. Die Namen sind in der in der entsprechenden Header-Datei (ioxxx.h) für den Controller und der avr-libc-Dokumenation aufgelistet. Im Zweifel den erzeugten Interrupt-Vektor im Assembler-Listing prüfen, es darf kein SIG_xxx oder xxx_vect mehr zu sehen sein, sondern _vector_N (wobei N eine Zahl ist). Neuere Versionen der avr-gcc zeigen eine Warnung, falls etwas falsch geschrieben wurde, ältere Versionen nicht.

Zugriff auf Daten(-Tabellen) im Programmspeicher (Flash) erfolgt über Program-Space-Funktionen (pgm_read*). Lediglich die Definition einer Variablen/eines Feldes mit dem PROGMEM Attribut zu versehen, reicht (im Gegensatz zu Codevision, IAR, Imagecraft) nicht aus.

Nicht alle AVRs werden vollständig von der avr-libc bzw. dem Compiler unterstützt. Bei Problemen hilft oft ein Blick in den erzeugten Assembler-Code. Die Anzahl der unterstützen Controller steigt jedoch mit Version zu Version von binutils, avr-libc und avrdude. Evtl. reicht einfach ein Update auf neuere Software-Versionen (z. B. im jeweils aktuellen WinAVR-Packet).

inp(), outp(), sbi() und cbi() werden in der aktuellen Bibliotheksversion nicht offiziell unterstützt (man muss eine spezielle Header-Datei einbinden(deprecated.h). Es wird schon seit längerem empfohlen, diese Makros nicht mehr zu nutzen. Einige Anleitungen sind in diesem Punkt veraltet. Mit halbwegs aktuellen avr-gcc/avr-libc-Versionen kann einfach z. B. DDRB=0xfe bzw. foo=PINB geschrieben werden. Mit PORTB |= _BV(1) setzt man PORTB.1, mit PORTB &= ~_BV(1) löscht man es wieder, mit PORTB ^= _BV(1) kann man es umschalten (_BV(x) entspricht dabei (1

Mit dem Tool avr-nm erhält man eine Übersicht über die Platzausnutzung in der erzeugten ELF-Datei bzw. dem damit gefüllten AVR. Das Tool wird per Kommandozeile mit

avr-nm --size-sort --print-size -r -td <your_ELF_file>
aufgerufen und gibt eine vierspaltige Liste aus: Die erste Spalte ist die Adresse, die zweite die benötigte Größe, die dritte der Typ und die vierte der Name des Symbols. Alle Symbole vom Typ «T» (globale Funktionen), «t» (lokale Funktionen) und letztlich auch die mit einem «D» oder «d» (globale bzw. lokale Daten mit Initialisierungswerten im ROM) betreffen das FLASH-ROM. Typen «B» und «b» brauchen ausschließlich RAM (werden beim Start mit 0 initialisiert). (vgl. von Jörg Wunsch)

Mit dem Tool avr-size erhält man eine Übersicht über den Platzbedarf in den text, data und bss Sektionen innerhalb der ELF Binärdatei. Die Sektionen text und data benötigen Platz im FLASH-ROM und die Sektionen data und bss benötigen zur Laufzeit Platz im SRAM.

Создание первого проекта

Следующая задача состоит в том, чтобы создать проект на основе AVR микроконтроллера и протестировать схему, компилятор и программатор.

Сначала перейдите в: Файл -> Создать -> Проект (англ. File -> New -> Project) и в открывшемся окне выберите: Исполняемый проект GCC C (англ. GCC C Executable Project), а в текстовом поле Имя (англ. Name) дайте любое название вашему проекту.

Следующее окно, которое должно появиться, — это окно выбора устройства. Из списка выберите Atmega168. Насколько мне известно, это окно не имеет никакого смысла, так как мы все равно передаем имя устройства в AVRDUDE вручную (пока я не могу найти способ заставить Atmel Studio 7 автоматически отправлять имя устройства в AVRDUDE через аргументы).

Результатом должен стать файл main.c, содержащий код нашей программы, который будет запускать AVR. Однако сгенерированный код ничего не делает, поэтому замените все содержимое файла main.c с помощью приведенной ниже программы (обязательно сохраните файл после ввода нового кода).

#define F_CPU 800000UL // Я использую кристалл 8 МГц

#include <avr/io.h>
#include <avr/delay.h>

int main(void){
	DDRD = 0xFF; // Сделать порт D портом выхода

	while(1){
		PORTD = 0xFF;
		_delay_ms(1000);
		PORTD = 0x00;
		_delay_ms(1000);
	}
}

Теперь пришло время скомпилировать код и загрузить его на устройство AVR. Первый шаг — убедиться, что наш проект использует компилятор WINAVR. Щелкните правой кнопкой мыши проект и выберите «Дополнительно» (англ. — Advanced) в окне свойств.

В окне «Дополнительно» убедитесь, что в поле «Набор инструментов» (англ. — Toolchain Flavour) выбран WINAVR.

Сохраните проект и скомпилируйте его, нажав: Build -> Build Solution (или нажав F7). Если все идет по плану, в окне вывода должно появиться следующее сообщение:

Build succeeded.

========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

Это означает, что наш проект успешно скомпилирован и готов к передаче на наш чип. Чтобы запрограммировать устройство, убедитесь, что USBASP подключен как к ПК, так и к цепи Atmega, к цепи подано питание и что к микросхеме подключен кристалл (в случае, если микросхема была настроена для использования внешнего кристалла).

Затем, после всего этого, нажмите: Инструменты -> USBASP (англ. Tools -> USBASP), и все будет работать автоматически.

Если все хорошо, светодиод в вашей цепи должен начать мигать. Ниже приведен вывод AVRDUDE в Atmel Studio 7, показывающий, как выглядит успешная программа.

avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude.exe: Device signature = 0x1e9406
avrdude.exe: NOTE: FLASH memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
avrdude.exe: erasing chip
avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
avrdude.exe: reading input file "0x26"
avrdude.exe: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude.exe: 1 bytes of lfuse written
avrdude.exe: verifying lfuse memory against 0x26:
avrdude.exe: load data lfuse data from input file 0x26:
avrdude.exe: input file 0x26 contains 1 bytes
avrdude.exe: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.00s

avrdude.exe: verifying ...
avrdude.exe: 1 bytes of lfuse verified
avrdude.exe: reading input file "c:\users\robinlaptop\Documents\Atmel Studio\7.0\OurFirstAVR\OurFirstAVR\Debug\OurFirstAVR.hex"
avrdude.exe: writing flash (184 bytes):

Writing | ################################################## | 100% 0.11s

avrdude.exe: 184 bytes of flash written
avrdude.exe: verifying flash memory against c:\users\robinlaptop\Documents\Atmel Studio\7.0\OurFirstAVR\OurFirstAVR\Debug\OurFirstAVR.hex:
avrdude.exe: load data flash data from input file c:\users\robinlaptop\Documents\Atmel Studio\7.0\OurFirstAVR\OurFirstAVR\Debug\OurFirstAVR.hex:
avrdude.exe: input file c:\users\robinlaptop\Documents\Atmel Studio\7.0\OurFirstAVR\OurFirstAVR\Debug\OurFirstAVR.hex contains 184 bytes
avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 0.10s

avrdude.exe: verifying ...
avrdude.exe: 184 bytes of flash verified

avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.

Bestandteile

Die Toolchain (Werkzeugsammlung) besteht aus mehreren Kommandozeilen-Programmen, die sich auf einfache Weise in einen Editor oder eine Entwicklungsumgebung einbinden lassen. Weit verbreitet ist die Verwendung von make zur Steuerung, siehe AVR-GCC-Tutorial: Exkurs Makefiles.

Die Bestandteile im einzelnen:

  • Binutils: Assembler, Linker und weitere Hilfsprogramme.
  • GCC: Der eigentliche C(++)-Compiler.
  • AVR-Libc: Die C-Standardbibliothek mit AVR-spezifischen Headerdateien und Funktionen.
  • AVRDUDE: universelle AVR-Programmiersoftware, kein eigentlicher Teil der Toolchain, aber oft verwendet
Оцените статью:
Оставить комментарий