Программирование Arduino без библиотек Arduino - Atmel Studio

Я думаю, что этот вопрос задавали тысячи раз, я просто не могу найти много ресурсов по этому вопросу.

Я хотел бы запрограммировать свой Arduino Uno (ATmega328P) с помощью Atmel Studio и языка C, за исключением библиотек Arduino. Я имею в виду, что я хотел бы написать код следующим образом:

int main(void) {
     /* set pin 5 of PORTB for output*/
     DDRB |= _BV(DDB5);

     while (1) {
       /* set pin 5 high to turn led on */
       PORTB |= _BV(PORTB5);
       _delay_ms(BLINK_DELAY_MS);

       /* set pin 5 low to turn led off */
       PORTB &= ~_BV(PORTB5);
       _delay_ms(BLINK_DELAY_MS);
     }
}

Вместо кода, который пронизан о, как удобно функциями Arduino. Я хочу залезть под капот и испачкаться в Arduinos!

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

Пока единственный несколько полезный источник, который мне удалось найти, — это эта страница: https://hekilledmywire.wordpress.com/2010/12/04/22/

Тем не менее, изображения отсутствуют, и в любом случае это выглядит минималистично.


person Joshua Granger    schedule 17.06.2015    source источник
comment
github.com/dwelch67/avr_samples Обычно Atmel хорошо относится к документации. начните с платы, выясните, какой вариант avr у вас есть (например, atmega328p), затем найдите его в atmel, и появится больше документов, чем вы хотите прочитать, ищите таблицы данных, справочное руководство, руководство пользователя, семейное руководство пользователя, и т. д. У некоторых поставщиков в таблице данных есть только контактные данные для аппаратных специалистов, у некоторых есть вся информация о программировании, у некоторых есть некоторые адреса, но семейный документ охватывает детали и т. д. Atmel может быть одним из этих поставщиков нескольких документов.   -  person old_timer    schedule 20.06.2015
comment
atmel.com/devices/atmega328p.aspx, затем получите ATmega48A/PA/88A/PA /168A/PA/328/P Завершите затем в главе «Порты ввода-вывода», в разделе «Описание регистра». набор инструкций 0x05, я думаю, это тот, который вы найдете, если вы просматриваете заголовки IDE или компиляторов для набора инструментов, который вы используете. и поймите, что эти адреса не обязательно должны быть универсальными для всех avrs, они могут меняться от одного к другому   -  person old_timer    schedule 20.06.2015


Ответы (2)


Если вы знакомы с C, я рекомендую

  • начните с справочника по AVR Libc
  • просмотрите iom328p.h для конкретных определений вашего процессора (находится в разделе ...\Atmel Toolchain\AVR8 GCC\Native\[#.#.####]\avr8-gnu-toolchain\avr\include\avr)
  • опционально, в Atmel Studio создайте новый проект платы ASF, выбрав устройство ATmega328p, и проверьте исходники, загруженные в папку вашего проекта из шаблона "user_board" (который в любом случае является общим почти пустым набором *.h, обеспечивающим пространство для вещи, которые могут вам понадобиться/не понадобиться)
  • иметь полное руководство по процессору рядом с вами всегда — найденные там регистры и битовые имена совпадают с определениями в библиотеках AVR

Имейте в виду, что библиотеки, поставляемые с Atmel Studio, и набор инструментов поддерживают m328P, но плата UNO сама по себе не поддерживается ASF. Тем не менее, для базового программирования вам будет хорошо.

добавление ... на PORTB

PORTB определяется в конкретном ...io.h вашего процессора (1-й пункт выше), который автоматически включается при включении <io.h> и выборе правильного процессора в AVR Studio. В библиотеке вашего процессора вы найдете

#define PORTB _SFR_IO8(0x05)

Просматривая руководство по процессору (4-й пункт выше) на странице 615, вы видите, что PORTB находится по адресу ввода-вывода 0x05 (q.e.d.). _SFR_IO8(..) сам по себе является макросом, определенным в <avr/sfr_defs.h> для преобразования из ввода-вывода в адрес памяти (да, нижние регистры дважды отображаются как ввод-вывод и память, в результате чего адрес памяти на 0x20 выше, потому что самые низкие адреса памяти заняты от R0 до R31).

Включив <io.h> вы получаете из библиотеки AVR

#include <avr/io.h>
// included by io.h
//    #include <avr/sfr_defs.h>
//    #include <avr/portpins.h>
//    #include <avr/common.h>
//    #include <avr/version.h>
//    #include <avr/io(your_processor).h> via processor declaration ... fuses
//        #include <avr/(maybe some more).h>

Все эти ...h (и некоторые другие), наконец, позволяют вам программировать на C, используя имена регистров/портов/выводов, которые вы найдете в руководстве по процессору.

Есть еще несколько полезных библиотек, таких как

#include <stdint.h>                     // Type definitions, e.g. uint8_t
//    #include "stdint-gcc.h"
#include <avr/power.h>                  // clock prescaler macro
#include <avr/interrupt.h>              // interrupt macros

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

person MikeD    schedule 18.06.2015
comment
Я выбрал это в качестве ответа, хотя, возможно, это то, что я уже проверил. Впрочем, вряд ли это твоя вина — мне следовало задать свой вопрос более тщательно. Я знаю программирование на C (я пишу настольные приложения на C#, и у меня был класс Microprocessors, использующий плату Nexys4 FPGA). Мой инструктор порекомендовал мне научиться программировать Arduino на чистом C с помощью Atmel Studio, а не на Arduino C с помощью Arduino IDE. Таким образом, я искал хорошие источники для объяснения битовых регистров (и адресов, по которым они расположены, а также того, как получить доступ к этим адресам). - person Joshua Granger; 19.06.2015
comment
Я думаю, что мой пробел в понимании (до сих пор) заключается в том, почему/как/где компилятор определяет, что такое PORTB и т.д. средства (тем более, что это нигде четко не определено). В целом, не так много полезных статей о том, как начать работу с микропроцессорами в Atmel Studio (с Pure C). - person Joshua Granger; 19.06.2015
comment
о битовых регистрах руководство по процессору должно быть вашим руководством (мой ответ 4-й маркер --> ссылка), для быстрого ознакомления см. страницы 611ff, 65ff, 17ff, re PORTB ... см. редактирование - person MikeD; 20.06.2015

Вы можете делать все, что хотите, но вам понадобится программист, такой как Atmel-ICE, AVR Dragon, STK 500 или AVRISP mkII. Есть еще несколько. У Atmel есть несколько программаторов в зависимости от ваших потребностей. Есть также некоторые сторонние программисты, которые намного дешевле. У меня есть STK500 и Дракон. Любите их обоих, и они прекрасно работают с Atmel Studio 6.X.

Хорошим учебным ресурсом является эта книга:

Make: AVR Programming by Elliot Williams.

person PhillyNJ    schedule 17.06.2015
comment
Я думаю, вы неправильно поняли вопрос. У меня уже есть оборудование (Arduino Uno/ATmega328P) и программное обеспечение (Atmel Studio), необходимые для программирования чипа на Arduino Uno. Мой вопрос, с другой стороны, направлен на поиск учебного материала, чтобы я мог лучше ознакомиться с фактическим кодированием чипа. - person Joshua Granger; 17.06.2015
comment
@JoshuaGranger Извините, я неправильно понял. Я обновил свой ответ отличной книгой, которая поможет вам изучить программирование AVR. - person PhillyNJ; 17.06.2015