Программирование микроконтроллеров avr

5Скетч для управления сдвиговым регистром по интерфейсу SPI

Напишем скетч, реализующий «бегущую волну», последовательно зажигая светодиоды, подключённые к выходам сдвигового регистра.

#include <SPI.h>

const int pinSelect = 8; // пин выбора регистра

void setup() {
  SPI.begin(); // инициализация интерфейса SPI
  pinMode(pinSelect, OUTPUT); // 
  digitalWrite(pinSelect, LOW); // выбор ведомого устройств (регистра)
  SPI.transfer(0); // очищаем содержимое регистра
  digitalWrite(pinSelect, HIGH); // конец передачи
  Serial.begin(9600);
}

void loop() {
  for (int i=0; i}

Сначала подключим библиотеку SPI и инициализируем интерфейс SPI. Определим пин 8 как пин выбора ведомого устройства SS. Очистим сдвиговый регистр, послав в него значение «0». Инициализируем последовательный порт.

Чтобы зажечь определённый светодиод с помощью сдвигового регистра, нужно подать на его вход 8-разрядное число. Например, чтобы загорелся первый светодиод – подаём двоичное число 00000001, чтобы второй – 00000010, чтобы третий – 00000100, и т.д. Эти двоичные числа при переводе в десятичную систему счисления образуют такую последовательность: 1, 2, 4, 8, 16, 32, 64, 128 и являются степенями двойки от 0 до 7.

Соответственно, в цикле loop() по количеству светодиодов делаем пересчёт от 0 до 7. Функция pow(основание, степень) возводит 2 в степень счётчика цикла. Микроконтроллеры не очень точно работают с числами типа «double», поэтому для преобразования результата в целое число используем функцию округления round(). И передаём получившееся число в сдвиговый регистр. Для наглядности в монитор последовательного порта выводятся значения, которые получаются при этой операции: единичка «бежит» по разрядам – светодиоды загораются волной.

Числа, посылаемые в сдвиговый регистр 74HC595

4Скетч для считывания информации, записанной на RFID-метке

Теперь давайте откроем скетч из примеров: Файл Образцы MFRC522 DumpInfo и загрузим его в память Arduino.

Открываем скетч DumpInfo

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

#include <SPI.h>
#include <MFRC522.h>

const int RST_PIN = 9; // пин RST
const int SS_PIN = 10; // пин SDA (SS)

MFRC522 mfrc522(SS_PIN, RST_PIN); // создаём объект MFRC522

void setup() {
	Serial.begin(9600); // инициализация послед. порта
	SPI.begin(); // инициализация шины SPI
	mfrc522.PCD_Init(); // инициализация считывателя RC522
}

void loop() {
	// Ожидание прикладывания новой RFID-метки:
	if ( ! mfrc522.PICC_IsNewCardPresent()) {
		return; // выход, если не приложена новая карта
	}

	// Считываем серийный номер:
	if ( ! mfrc522.PICC_ReadCardSerial()) {
		return; // выход, если невозможно считать сер. номер
	}

	// Вывод дампа в послед. порт:
	mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

Текст скетча достаточно хорошо прокомментирован.

Для более полного знакомства с библиотекой изучите файлы MFRC522.h и MFRC522.cpp из директории rfid-master.

1Описание последовательного интерфейса SPI

SPI – Serial Peripheral Interface или «Последовательный периферийный интерфейс» – это синхронный протокол передачи данных для сопряжения ведущего устройства (Master) с периферийными устройствами (Slave). Ведущим устройством часто является микроконтроллер. Связь между устройствами осуществляется по четырём проводам, поэтому SPI иногда называют «четырёхпроводной интерфейс». Вот эти шины:

Название Назначение шины SPI
MOSI (Master Out Slave In) линия передачи данных от ведущего к ведомым устройствам;
MISO (Master In Slave Out) линия передачи от ведомого к ведущему устройству;
SCLK (Serial Clock) тактовые импульсы синхронизации, генерируемые ведущим устройством;
SS (Slave Select) линия выбора ведомого устройства; когда на линии логический «0», ведомое устройство «понимает», что сейчас обращаются к нему.

Существует четыре режима передачи данных (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), обусловленные сочетанием полярности тактовых импульсов (работаем по уровню HIGH или LOW), Clock Polarity, CPOL, и фазой тактовых импульсов (синхронизация по переднему или заднему фронту тактового импульса), Clock Phase, CPHA. В последнем столбце таблицы приведены поясняющие иллюстрации. На них Sample обозначены моменты, когда данные на линии должны быть готовы и считываются устройствами

Буквой Z отмечено, что состояние данных на линии неизвестно или не важно

Режим Полярность тактовых импульсов (CPOL) Фаза тактовых импульсов (CPHA) Диаграмма режима
SPI_MODE0
SPI_MODE1 1
SPI_MODE2 1
SPI_MODE3 1 1

Интерфейс SPI предусматривает несколько вариантов подключения ведомых устройств: независимое и каскадное. При независимом подключении к шине SPI ведущее устройство обращается к каждому ведомому устройству индивидуально. При каскадном подключении ведомые устройства срабатывают поочерёдно, как бы каскадом.

Виды подключения устройств для работы по интерфейсу SPI: независимое и каскадное

From Arduino to a Microcontroller on a Breadboard

This tutorial explains how to migrate from an Arduino board to a standalone microcontroller on a breadboard. It’s similar to this tutorial, but uses an Arduino board to program the ATmega on the breadboard.

Unless you choose to use the minimal configuration described at the end of this tutorial, you’ll need four components (besides the Arduino, ATmega328, and breadboard):

  • a 16 MHz crystal,
  • a 10k resistor, and
  • two 18 to 22 picofarad (ceramic) capacitors.

Burning the Bootloader

If you have a new ATmega328 (or ATmega168), you’ll need to burn the bootloader onto it. You can do this using an Arduino board as an in-system program (ISP). If the microcontroller already has the bootloader on it (e.g. because you took it out of an Arduino board or ordered an already-bootloaded ATmega), you can skip this section.

To burn the bootloader, follow these steps:

  1. Upload the ArduinoISP sketch onto your Arduino board. (You’ll need to select the board and serial port from the Tools menu that correspond to your board.)
  2. Wire up the Arduino board and microcontroller as shown in the diagram to the right.
  3. Select «Arduino Duemilanove or Nano w/ ATmega328» from the Tools > Board menu. (Or «ATmega328 on a breadboard (8 MHz internal clock)» if using the minimal configuration described below.)
  4. Select «Arduino as ISP» from Tools > Programmer
  5. Run Tools > Burn Bootloader

You should only need to burn the bootloader once. After you’ve done so, you can remove the jumper wires connected to pins 10, 11, 12, and 13 of the Arduino board.

Using an Arduino board to burn the bootloader onto an ATmega on a breadboard.

Uploading Using an Arduino Board

Once your ATmega328p has the Arduino bootloader on it, you can upload programs to it using the USB-to-serial convertor (FTDI chip) on an Arduino board. To do, you remove the microcontroller from the Arduino board so the FTDI chip can talk to the microcontroller on the breadboard instead. The diagram at right shows how to connect the RX and TX lines from the Arduino board to the ATmega on the breadboard. To program the microcontroller, select «Arduino Duemilanove or Nano w/ ATmega328» from the the Tools > Board menu (or «ATmega328 on a breadboard (8 MHz internal clock)» if you’re using the minimal configuration described below). Then upload as usual.

Uploading sketches to an ATmega on a breadboard. Remember to remove the microcontroller from the Arduino board!

Minimal Circuit (Eliminating the External Clock)

If you don’t have the extra 16 MHz crystal and 18-22 picofarad capacitors used in the above examples, you can configure the ATmega328 to use its internal 8 MHz RC oscillator as a clock source instead. (You don’t really need the 10K pullup resistor on the reset pin either, so we remove it to get a truly minimal configuration.)

You’ll need to install support for an additional hardware configuration:

  1. Create a «hardware» sub-folder in your Arduino sketchbook folder (whose location you can find in the Arduino preferences dialog). If you’ve previously installed support for additional hardware configuration, you may already have a «hardware» folder in your sketchbook.
  2. Move the breadboard folder from the zip archive to the «hardware» folder of your Arduino sketchbook.
  3. Restart the Arduino software.
  4. You should see «ATmega328 on a breadboard (8 MHz internal clock)» in the Tools > Board menu.

Once you’ve done this, you can burn the bootloader and upload programs onto your ATmega328 as described above. Be sure to select «ATmega328 on a breadboard (8 MHz internal clock)» when burning the bootloader. (If you select the wrong item and configure the microcontroller to use an external clock, it won’t work unless you connect one.)

Attention

This procedure works on Arduino 1.0.x software.

Using an Arduino board to burn the bootloader onto an ATmega on a breadboard (w/o an external clock).

Uploading sketches to an ATmega on a breadboard.

Once you’ve programmed the ATmega on the breadboard, you can eliminate the Arduino. To do so, you’ll need to provide an alternative power supply for the microcontroller. See the standalone Arduino on a breadboard tutorial for details.

6«Бегущая волна» из светодиодов

Светодиоды загораются по очереди, и мы наблюдаем бегущую «волну» из огоньков. Управление светодиодами осуществляется с помощью сдвигового регистра, к которому мы подключились по интерфейсу SPI. В результате для управления 8-ю светодиодами задействованы всего 3 вывода Arduino. Если бы мы подключали светодиоды напрямую к цифровым портам Arduino, нам бы потребовалось для каждого светодиода использовать отдельный порт.

Мы изучили самый простой пример работы Arduino с шиной SPI. Более подробно рассмотрим работу нескольких сдвиговых регистров при независимом и каскадном подключениях в отдельной статье.

Особенности программы ICPROG:

При записи микроконтроллеров с
установленным (включенным) битом
защиты кода от считывания (CP = Code
Protect и/или CPD = Code Protect Data),
сразу, после записи кода, программа
ICPROG может выдавать сообщение об
ошибке чтения/проверки
по адресу 0000h. Это
связано с тем, что установки
Конфигурационного Слова (Configuration
Word) микроконтроллера, начинают
действовать сразу, после их
изменения, и
микроконтроллер осуществляет
защиту кода от считывания (если эта
защита включена). Данное сообщение
об ошибке следует воспринимать
скорее как подтверждение, что
включена защита кода от считывания.
При этом, код программы записан
корректно и микроконтроллер
работоспособен.

Для снятия защиты от считывания
(для микроконтроллеров «Flash»)
достаточно «стереть» память
микроконтроллера. При этом,
естественно, стирается и прошивка.
После этого, микроконтроллер можно
использовать вновь и вновь, для
записи новых программ.

Step 11: Solder the Pins

Use locking forceps to hold the pins steady, evenly spaced, and straight. The forceps also act as a heat sink that prevents the solder heat from traveling up the wire and melting the insulation or prematurely shrinking the heat shrink tubing. Solder each pin quickly, and don’t use an overabundance of solder. Use just enough to get the job done.

Add a capacitor between GND and RST on the programmer-side header, to disable reset from the FTDI adapter’s DTR pin. Several uF is fine, I used 33uF. 10uF would be fine, but my 33uF capacitors were smaller than the 10uF capacitors I had on hand. Solder the + side of the capacitor as close as possible to the header plastic so the heat shrink tubing covers as much as possible. I made a small slit near the end of the heat shrink tubing for the capacitor’s wire to go through.

Finally, slide the heat shrink tubing up the wire onto the connector until it meets the header plastic, and shrink the tubing with a heat gun.

Загрузка скетчей на Arduino Pro Mini через плату Arduino Uno

Еще один способ загрузки скетчей на Arduino Pro Mini – это использование платы Arduino Uno, в которой используется микроконтроллер ATmega328 в DIP-корпусе. ATmega328 необходимо аккуратно извлечь и на плате останется переходник USB-UART, который подсоединим 5 проводами к плате Arduino Pro Mini согласно таблице 2.

Теперь подключаем Arduino Uno к компьютеру. Выбираем в настройках необходимый порт, плату (Инструменты → Arduino Pro Or Pro Mini) и загружаем скетч.

1. Ошибка загрузки скетча на плату при подключении через конвертер USB-Serial.

  • Проверьте правильность подключения платы Arduino Pro Mini конвертеру USB-Serial.

  • Если у конвертера отсутствует контакт DTR, после компиляции скетча до загрузки, нажмите кнопку RESET на плате Arduino Pro Mini.

2. Ошибка загрузки скетча на плату при подключении интерфейсу SPI.

Проверьте правильность подключения платы Arduino Pro Mini согласно табл. 1.

3. Ошибка загрузки скетча на плату при подключении через Arduino Uno.

Проверьте правильность подключения платы Arduino Pro Mini согласно табл. 2.

Arduino

В жизни начинающего ардуинщика рано или поздно наступает момент, когда хочется сэкономить на размере своего изделия, не жертвуя при этом функциональностью. И тогда Arduino Pro Mini – отличное для этого решение! За счёт того, что у этой платы отсутствует встроенный USB-разъём, она в полтора раза меньше Arduino Nano. Но для того, чтобы её запрограммировать, придётся приобрести дополнительный – внешний – USB-программатор. О том, как «залить» написанную программу в память микроконтроллера и заставить Arduino Pro Mini работать, и пойдёт речь в этой статье.

Нам понадобится:

  • Arduino Pro Mini;
  • USBasp-программатор;
  • соединительные провода (рекомендую вот такой набор проводов);
  • макетная плата;
  • компьютер c Arduino IDE.

Step 2: Target End

Start with 6 female-to-female Dupont jumpers that are still in a ribbon, have not been zipped apart. And 1 male-to-male jumper. Work on the target end of the programmer cable. Arrange the connectors into 2 rows of 3 pins each pattern, that will plug into the ICSP header on an Arduino.

D12 MISO 1  .  .  2 VCC
D13  SCK 3  .  .  4 MOSI D11
     RST 5  .  .  6 GND

Put a small dob of glue between the connectors, and put a small piece of heat shrink tubing over the assembly and shrink it. There is not much glue needed for this, just enough to keep the connectors from slipping around after full assembly. After shrinking the tubing, press the connectors flat against the table so there aren’t any that are sticking out or uneven.

4Загрузка скетча в Arduinoс помощью программатора USBasp

Откроем скетч, который хотим загрузить в память микроконтроллера. Для примера пусть это будет мигание светодиодом: Файл Образцы 01. Basics Blink.

Подключаем программатор с подключённым к нему Arduino Pro Mini к компьютеру. Для того чтобы загрузить скетч в Ардуино с помощью программатора, можно поступить несколькими способами.

  1. Через меню Файл Загрузить через программатор.
  2. Используя сочетание клавиш Ctrl + Shift + U.
  3. Зажав клавишу Shift, нажать на кнопку со стрелкой вправо , которая обычно используется для загрузки скетча в память Ардуино стандартным способом.

Загрузка скетча в Arduino Pro Mini с помощью программатора USBasp

Это абсолютно эквивалентные способы, выбирайте самый удобный для себя. Это всё, программа «залита» в память микроконтроллера.

Обратите внимание

Если Arduino IDE выдаст предупреждение: warning: cannot set sck period. please check for usbasp firmware update. Не паникуйте, скетч всё равно записался в память микроконтроллера и будет работать.

Step 2: What Is ICSP?

Five connections are needed to program a PIC while attached to an application circuit. I add a 5 pin header to my circuit boards to make this connection quick and easy. The basics of PIC programming.Five connections are required to program a PIC. Power, ground, a programming voltage, clock, and data.+ (Vdd)/-(Vss) These are the power & ground connections (Vdd, Vss). Pretty standard. If you are using a programmer with ‘real’ voltage levels (NOT a JDM2!), your application can run from its own power supply when programmed, eliminating these connections.Vpp This is the programming voltage. PICs enter programming mode when ~13 volts are placed on the MCLR/Vpp pin (usually pin 1 on modern PICs, more on that below).Clock/Data or PGC/PGD The clock and data lines are used to write and read the PIC firmware. These are usually the same pins as PORTB6 & PORTB7.Exercise:Identify the ICSP connection points on the PICs in the pictures below.If the PIC fits, wear it.I get a lot of questions about my JDM2 design on instructables. The most frequent is «Will it program PIC X?'»‘ — here is how you can tell:1) Look at the data sheet. Find the ‘Pin Diagram’ that looks something like the picture below.2) Identify the location of the pins that must be connected for programming (Vpp, Vdd, Vss, Data, & Clock).3) Look at the socket connection on the programmer. Can you match the required pins with a socket on the programmer?

2Реализация интерфейса SPI на платах семейства Arduino

В Arduino шины интерфейса SPI находятся на определённых портах. У каждой платы своё соответствие выводов. Для удобства выводы продублированы и вынесены также на отдельный разъём ICSP (In Circuit Serial Programming, программирование устройства, включённого в цепь, по последовательному протоколу)

Обратите внимание, что на разъёме ICSP отсутствует пин выбора ведомого – SS, т.к. подразумевается, что Arduino будет использоваться как ведущее устройство в сети

Но при необходимости вы можете назначить любой цифровой вывод Ардуино в качестве SS.

На рисунке приведено стандартное соответствие выводов шинам SPI для Arduino UNO и Nano.

Реализация интерфейса SPI на платах Arduino UNO и Arduino Nano

1Программатор для Arduino

  • Разъём типа USB-A используется, понятно, для подключения программатора к компьютеру.
  • ISP-соединитель нужен для подключения к программируемой плате.
  • Джампер JP1 контролирует напряжение на выводе VCC ISP-коннектора. Оно может быть 3,3 В или 5 В. Если целевое программируемое устройство имеет собственный источник питания, нужно убрать перемычку.
  • Джампер JP2 используется для перепрошивки самого программатора; в данной статье этот вопрос не рассматривается.
  • Перемычка JP3 нужна, если тактовая частота целевого устройства ниже 1,5 МГц.
  • Светодиоды показывают: G – питание подаётся на программатор, R – программатор соединён с целевым устройством.

USBasp-программатор и назначение его частей

Step 8: Another Programming Cable for Pro Mini and Pro Micro

I also like Pro Mini and Pro Micro quite a lot. Those are boards invented by Sparkfun that are practically pin and footprint compatible. Pro Mini has ATmega328p MCU like the UNO and Pro Micro has ATmega32u4 like the Leonardo. I like to use them as programmers, and to program or bootload them via ICSP. So, here are the supplies for making an ICSP cable: female header, female Dupont jumpers, capacitor, and heat shrink tubing.

Cut the headers to the right length to fit on all of the pins on one side of the Pro Mini or Pro Micro. Cut in the middle of the first unused pin of a long header strip. All it takes is a little pressure with some diagonal cutters, and it will break apart. Then use the diagonal cutters to trim the excess plastic from the pin position destroyed when cutting the header. The result is a 12 position header with nice trimmed ends. To get fancy, sand the ends.

3Стандартная библиотека для работы по интерфейсу SPI

Для Arduino написана специальная библиотека, которая реализует протокол SPI. Она устанавливается вместе со средой разработки Arduino IDE. Подключается она так: в начале программы добавляем #include SPI.h.

Чтобы начать работу по протоколу SPI, нужно задать настройки и затем инициализировать протокол с помощью процедуры SPI.beginTransaction(). Можно выполнить это одной инструкцией: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

Это значит, что мы инициализируем протокол SPI на частоте 14 МГц, передача данных идёт, начиная с MSB (наиболее значимого бита), в режиме SPI_MODE0.

После инициализации выбираем ведомое устройство, переводя соответствующий пин SS в состояние LOW. Затем передаём ведомому устройству данные командой SPI.transfer(). После передачи возвращаем SS в состояние HIGH.

Временная диаграмма работы интерфейса SPI

Работа с протоколом завершается командой SPI.endTransaction().

Желательно минимизировать время выполнения передачи между инструкциями SPI.beginTransaction() и SPI.endTransaction(), чтобы не возникло накладок, если другое устройство попробует инициализировать передачу данных, используя другие настройки.

Если вы планируете в своём скетче использовать стандартные пины Arduino, можно не описывать их в начале программы, т.к. они уже определены в самой библиотеке и имеют следующие имена:

#define PIN_SPI_SS    (10)
#define PIN_SPI_MOSI  (11)
#define PIN_SPI_MISO  (12)
#define PIN_SPI_SCK   (13)

Данные пины определены в файле pins_arduino.h , который находится по пути %programfiles%\arduino-(версия)\hardware\arduino\avr\variants\ (если вы устанавливали программу в стандартное расположение). То есть, например, чтобы опустить пин выбора ведомого в состояние «0», можно написать:

digitalWrite(PIN_SPI_SS, LOW);

5Дамп данных с RFID-метки

Запустим монитор последовательного порта сочетанием клавиш Ctrl+Shift+M, через меню Инструменты или кнопкой с изображением лупы. Теперь приложим к считывателю билет метро или любую другую RFID-метку. Монитор последовательного порта покажет данные, записанные на RFID-метку или билет.

Считываем данные с билета на наземный транспорт и метро с помощью RFID

Например, в моём случае здесь зашифрованы уникальный номер билета, дата покупки, срок действия, количество оставшихся поездок, а также служебная информация. Мы разберём в одной из будущих статей, что же записано на карты метро и наземного транспорта.

Примечание

Да, с помощью модуля RFID-RC522 можно записать данные на билет метро. Но не обольщайтесь, каждая карта имеет неперезаписываемый счётчик циклов записи, так что «добавить» поездок себе на метро не получится – это сразу будет обнаружено и карта будет забракована турникетом :) А вот использовать билеты метро для записи на них небольших объёмов данных – от 1 до 4 кб – можно. И способы применения этому ограничены только вашей фантазией.

Чтение и запись фьюзов Ардуино

avrdude -C ../etc/avrdude.conf -c usbasp -p m328p -U lfuse:r:-:h

  • -c <programmer> — псевдоним используемого программатора, в данном случае usbasp.
  • -p <partno> — тип микроконтроллера. Я считываю фьюзы из Ардуино Уно, в которой установлен микроконтроллер ATmega328p, поэтому в качестве <partno> указано значение m328p.
  • -U <memtype>:r|w|v:<filename> — комплексная опция для указания производимой с памятью операции (чтение. запись, проверка). -U lfuse:r:-:h означает, что требуется прочитать содержимое младшего байта конфигурации и вывести считанное значение на экран в щестнадцатеричном виде.

А вот и результат выполнения приведенной команды:

Если у вас в результате присутствует строка avrdude: warning: cannot set sck period, please check for usbasp  firmware update, то не обращайте на нее внимание. Это всего лишь предупреждение, не ошибка, работе оно не мешает

Если вы всё же хотите от него избавиться, то нужно обновить прошивку USBasp, данная процедура подробно расписана в статье Прошивка USBasp. Как видно из скриншота, значение младшего конфигурационного байта равно 0xff, команда отработала успешно.

Теперь проверим запись фьюзов с использованием USBasp. Я изменю значение дополнительного конфигурационного байта с 0xFF на 0xFD, что приведет к установке порога срабатывания схемы BOD в 2.7В. Команда для Avrdude и результат ее выполнения приведены ниже:

avrdude -C ../etc/avrdude.conf -c usbasp -p m328p -U efuse:w:0xFD:m

Чтение и запись FLASH и EEPROM памяти Ардуино

В приведенных выше примерах команд для Avrdude в качестве параметра <memtype> использовались значения lfuse и efuse для доступа к конфигурационным байтам микроконтроллера. Данный параметр может принимать и другие значения, они приведены ниже:

  • calibration — байты калибровки RC-генератора;
  • eeprom — энергонезависимая память микроконтроллера;
  • efuse — дополнительный конфигурационный бит;
  • flash — FLASH память микроконтроллера;
  • fuse — фьюз-байт для микроконтроллеров с одним fuse-байтом;
  • hfuse — старший fuse-байт;
  • lfuse — младший fuse-байт;
  • lock — байт блокировки (ячейка защиты);
  • signature — три байта что обозначают сигнатуру чипа (device ID);
  • fuseN — байт с фьюзами для ATxmega чипов, N — целое число для каждого фьюза что поддерживается устройством;
  • application — область приложений во Flash памяти для МК ATxmega;
  • apptable — таблица приложений в области Flash памяти для устройств ATxmega;
  • boot — загрузочная область Flash памяти для устройств ATxmega;
  • prodsig — область с производственной сигнатурой (calibration) для устройств ATxmega;
  • usersig — область с пользовательской сигнатурой для устройств ATxmega.

Таким образом, для чтения FLASH Ардуино Уно (микроконтроллера ATmega328p) может быть использована следующая команда:avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U flash:r:flash_dump.hex:i
Файл с содержимым FLASH памяти микроконтроллера будет создан в каталоге Avrdude. Либо можно прописать в команде полный путь к файлу.
Для записи в FLASH память содержимого файла flash_dump.hex можно использовать команду:avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U flash:w:flash_dump.hex:i
Чтение EEPROM:avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U eeprom:r:eeprom_dump.hex:i
Запись EEPROM:avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U eeprom:w:eeprom_dump.hex:i

Запись загрузчика в Ардуино

Процедуру записи загрузчика я описывал ранее в публикации Arduino as ISP — программатор из Ардуино. Как и в прошлый раз для записи загрузчика мы будем использовать IDE Arduino. Последовательность шагов следующая:

5Скетч для управления сдвиговым регистром по интерфейсу SPI

Напишем скетч, реализующий «бегущую волну», последовательно зажигая светодиоды, подключённые к выходам сдвигового регистра.

#include <SPI.h>

const int pinSelect = 8; // пин выбора регистра

void setup() {
  SPI.begin(); // инициализация интерфейса SPI
  pinMode(pinSelect, OUTPUT); // 
  digitalWrite(pinSelect, LOW); // выбор ведомого устройств (регистра)
  SPI.transfer(0); // очищаем содержимое регистра
  digitalWrite(pinSelect, HIGH); // конец передачи
  Serial.begin(9600);
}

void loop() {
  for (int i=0; i}

Сначала подключим библиотеку SPI и инициализируем интерфейс SPI. Определим пин 8 как пин выбора ведомого устройства SS. Очистим сдвиговый регистр, послав в него значение «0». Инициализируем последовательный порт.

Чтобы зажечь определённый светодиод с помощью сдвигового регистра, нужно подать на его вход 8-разрядное число. Например, чтобы загорелся первый светодиод – подаём двоичное число 00000001, чтобы второй – 00000010, чтобы третий – 00000100, и т.д. Эти двоичные числа при переводе в десятичную систему счисления образуют такую последовательность: 1, 2, 4, 8, 16, 32, 64, 128 и являются степенями двойки от 0 до 7.

Соответственно, в цикле loop() по количеству светодиодов делаем пересчёт от 0 до 7. Функция pow(основание, степень) возводит 2 в степень счётчика цикла. Микроконтроллеры не очень точно работают с числами типа «double», поэтому для преобразования результата в целое число используем функцию округления round(). И передаём получившееся число в сдвиговый регистр. Для наглядности в монитор последовательного порта выводятся значения, которые получаются при этой операции: единичка «бежит» по разрядам – светодиоды загораются волной.

Числа, посылаемые в сдвиговый регистр 74HC595

Step 1: Why ICSP?

Programming a big DIP (through hole) chip is easy. Pop it into a socketed programmer, burn, and return to the application circuit. Test and repeat.
Things get more difficult with smaller (surface mount) chips. There are no standard sockets for QFN, SSOP, QFP, or even the large SOIC .300 packages. There are really expensive ($100s) clips that can attach to, and program, these chips. A different clip is needed for each chip type and pin count you use.
There is an alternative. Its called ICSP.
ICSP means ‘in circuit serial programmer(ing?)’. It is a way of programming a PIC while it is still attached to the application circuit. Thats right, no more chip swapping.
Why ICSP?
1. There are no programming sockets for small package chips. Clips are expensive.
2. Its a pain to move chips in & out of the programmer during development. Impossible for surface mount parts.

Что такое ISP?

  • С использованием программатора. В этом случае программатор работает напрямую с памятью микроконтроллера, самостоятельно размещая байты прошивки по нужным адресам. Микроконтроллер в этом процессе не участвует.
  • С использованием загрузчика. Загрузчик, он же бутлоадер (от английского bootloader) — это программа, записанная обычно в конце ПЗУ микроконтроллера, которая берет на себя функции программатора. При включении микроконтроллера управление сначала передается загрузчику. Он проверяет наличие определенных условий, сообщающих о необходимости перейти в режим программирования. Если условия не выполнены, то управление передается основной программе, в противном случае загрузчик принимает данные по заранее определенному интерфейсу и размещает их в ПЗУ. Таким образом микроконтроллер перепрограммирует сам себя.

Одной из важнейших особенностей Ардуино является возможность программирования непосредственно через USB порт, без дополнительного программатора. Сразу после включения Ардуино запускается загрузчик, который работает несколько секунд. Если за это время загрузчик получает команду программирования от IDE по последовательному интерфейсу UART, то он принимает и загружает новую программу в память микроконтроллера.

Оцените статью:
Оставить комментарий
Adblock
detector