Category Archives: AVR

Работа с 8-битными микроконтроллерами от Atmel

Как я делал Digispark

Узнал о существовании этой платформы – и загорелся.
Из плюсов – программируется из среды Arduino , до 6 ног для подключения периферии.
Заказывать готовый модуль совершенно не хотелось, решил сделать сам.

Куплено:
Attiny85 – 2 штуки,
стабилитроны на 3,6 вольта – 10 штук,резисторы на 68 ом – 10 штук.

Найдено в загашнике:
резистор на 1,2 килоома (по хорошему бы надо 1,5)
макетная плата,
соединительные провода,
сборка светодиод+резистор,
хвост с USB-разъёмом.

Схема была сдёрнута отсюда

Получилось так:
digispark

Bootloader взял у micronucleus
Сами Digispark-овцы пишут, что их поделка работает на версии 1.02, в других местах встречал упоминание о стабильной 1.06, на micronucleus на момент написания лежит версия 2.03, которая показала себя вполне работоспособной.

Заливал bootloader в attiny85 программатором USBAsp, с программой eXtreme burner.
Burner’у пришлось чуть вправить мозг – о существовании attiny85 он не знал.
А теперь коварный вопрос – с какими фьюзами заливать прошивку?
Штатные (Low – 62, High – DF, Ext – FF) не прокатывают.
Нашелся добрый человек, подсказал: Low – E1, High – DD, Ext – FE. В этом случае нога контроллера RESET (1 нога чипа, или pin5 с точки зрения Arduino) так и остаётся сбросом, сохраняется возможность перешить контроллер обычным программатором, но pin5 программировать в скетчах бесполезно.

Для рисковых и подготовленных парней
Если сильно хочется задействовать тот самый pin5
Low – E1, High – 5D, Ext – FE.
!!! Внимание !!! После прошивки этих фьюзов контроллер для обычного программатора станет недоступен. Посему предлагаю сначала прошиться безопасными фьюзами, убедиться, что девайс завёлся, и только потом шаманить.
У меня на это случай собран FuseBit Doctor , так что мне не страшно 🙂

Далее ставим драйвера и добавляем поддержку Digispark’a в среде Arduino.

Bootloader работает хитрО – первые 5 секунд после подачи питания ждёт сигнала по USB на обновление прошивки, после чего передаёт управление залитой программе.

Соответствие физических ног контроллера и логических пинов в среде разработки:

  • 5 – Pin 0 → I2C SDA, PWM
  • 6 – Pin 1 → PWM
  • 7 – Pin 2 → I2C SCK, Analog In
  • 2 – Pin 3 → Analog In (also used for USB+ when USB is in use)
  • 3 – Pin 4 → PWM, Analog (also used for USB- when USB is in use)
  • 1 – Pin 5 → Analog In

Про особенности создания bootloader-ов для таких малых чипов можно почитать тут

 

Ошибка при программировании ATtiny13 в eXtreme Burner (решено)

Нарвался на неприятность – программа eXtreme Burner (v 1.4.2) отказывается корректно шить ATtiny13.
При верификации начинается ругань “Mismatch at location 0x00000000”
При этом и Khazama и AVRDUDEPROG шьют её без проблем на том же компе и программаторе.

Исправляется так:
Находим, куда заинсталлирован eXtreme Burner.
У меня располагается штатно c:\Program Files\eXtreme Burner – AVR\.
Заходим в папку Data, в ней открываем файл chips.xml да хоть Notepad’ом.
Находим кусок:

<CHIPLIST>
<CHIP>
<NAME>ATtiny13A</NAME>
<FLASH>1024</FLASH>
<EEPROM>64</EEPROM>
<SIG>0x0007901E</SIG>
<PAGE>64</PAGE>

…и меняем значение PAGE с 64 на 32.

Сохраняем, перезапускаем, наслаждаемся.

Сложение регистровой пары с регистром или константой

Иногда в памяти программ удобно хранить некий блок констант для последующего использования. Определяется такой блок директивой .db (для однобайтовых значений) и помечается меткой, предположим const_label.
Как пример – набор битовых масок цифр и символов для 7-сегментного индикатора.
Или последовательность задержек для формирования сложного сигнала.
В чем разница?
В первом случае из памяти программ извлекается единственное значение –  нужная в данный момент битовая маска.
Во втором происходит последовательное чтение всей цепочки до некоего определённого стоп-байта (как вариант – $FF).
Для задания адреса, по которому находится нужный блок и элемент в нём, используется регистровая пара Z (она же ZH:ZL, она же r31:r30), разрядностью в 16 бит.
В первом случае эта регистровая пара складывается либо с 8-битной константой,
либо с 8-битным же регистром.

Этот случай и рассмотрим.
Continue reading