Site Loader

Содержание

Бегущие огни на ATtiny2313, первая программа для микроконтроллера

Моим первым устройством на микроконтроллере была схема бегущих огней. Линейка из 15-ти светодиодов, которые попеременно загораются. Принципиальная схема такого устройства предельно проста. По сравнению с макетной платой здесь появились только 15 светодиодов, у которых анод общий, а катоды подсоединены к портам ввода/вывода микроконтроллера и столько же токоограничительных резисторов R3-R17 по 360 Ом.

Светодиоды управляются низким уровнем на выводе микроконтроллера (так как для низкого уровня микроконтроллер может выдать больший ток, около 20мА, чем для высокого, но не стоит забывать про суммарный ток, который может выдать порт).

Линейка светодиодов у меня организована на SMD компонентах, но это дело вкуса.

Теперь рассмотрим порты ввода/вывода. У ATtiny2313 есть 15 линий ввода/вывода, которые сгруппированы в 2 порта: PortB – 8 выводов и PortD – 7 выводов. Вся работа микроконтроллера состоит из правильного шевеления ножками, а искусство программирования – заставить его так делать.

Также ножки портов по совместительству могут выполнять другие функции: быть входом встроенного АЦП, внешнего прерывания, выходом USART’а и множество других функций, но их использование рассмотрим немного попозже. Для использования портов ввода вывода их нужно сперва сконфигурировать, за это отвечают регистры PORTX и DDRX, где X – имя порта. Приведем табличку их возможных состояний (n=0..7 – номер вывода в порту):

Как видно из таблицы при значении DDRXn =1 порт работает как выход, и логический уровень на его выходе равен биту PORTXn. При значении DDRXn =0 вывод PXn будет работать на вход, а бит PORTXn определяет, подключен ли к входу внутренний подтягивающий резистор или нет. Логический уровень на выводе PXn можно считать из бита PINXn. Перейдем к практике, предлагаю написать программу, которая будет по очереди зажигать каждый из 15 светодиодов, сперва напишем программу на С, а потом для разнообразия на ассемблере. Программа на С выглядит так:

  1. #include <avr/io.h>

  2.  

  3. #define SPEED 3000 //Скорость бегущих огней

  4.  

  5. void pause (unsigned int a) //Задержка

  6. { unsigned int i;

  7. for (i=a;i>0;i--);

  8. }

  9.  

  10. int main(void)

  11. {

  12. unsigned char i;

  13.  

  14. DDRB=0xff; //Инициализация портов ввода/вывода

  15. DDRD=0x7f;

  16. PORTB=0xff;

  17. PORTD=0x7f;

  18.  

  19. while (1) //Вечный цикл

  20. {

  21. for (i=0;i<8;i++) //По одному зажигаем светодиоды на PORTB

  22. {

  23. PORTB=~_BV(i);

  24. pause(SPEED);

  25. }

  26. PORTB=0xff;

  27.  

  28. for (i=0;i<7;i++) //По одному зажигаем светодиоды на PORTD

  29. {

  30. PORTD=~_BV(i);

  31. pause(SPEED);

  32. }

  33. PORTD=0x7f;

  34. }

  35. }

Теперь немного пояснений. Думаю, для тех, кто писал на С для ПК особых затруднений не возникнет. Строка #include подключает внешний модуль avr/io.h, который необходим для работы с портами ввода/вывода. Строка #define SPEED 3000 отвечает за скорость бегущей строки, означает, что в тексте программы все вхождения слова SPEED будут заменены на число 3000 (некий аналог задания констант в программе). Функция pause (unsigned int a) определяет задержку примерно (8*a)/f, где a – аргумент функции f – частота тактирования микроконтроллера. В вечном цикле while происходит попеременное включение светодиодов для каждого порта (так как управление осуществляется низким уровнем, то стоит символ НЕТ — «~»). Функция unsigned char _BV(b) возвращает байт, в котором бит под номером b устрановлен в единицу, а все остальные равны 0. Например, _BV(2)==0x04.

Попробует теперь написать аналогичную программу на ассемблере:
  1. ;********************Define chapter******************************************

  2. .def temp =r16

  3. .def temp2 =r17

  4.  

  5. .def coarse =r21

  6. .def medium =r22

  7. .def fine =r23

  8. ;**********************Const chapter*****************************************

  9. .equ c_del =1

  10. .equ m_del =100

  11. .equ f_del =255

  12.  

  13. .include "2313def.inc"

  14. ;*********************************Code segment*******************************

  15. .cseg

  16. .org 0

  17. rjmp reset

  18.  

  19. reset:

  20. ldi Temp,RamEnd ;Инициализация стека

  21. out SPL,Temp

  22.  

  23. ldi temp,0xff ;Инициализация портов ввода/вывода

  24. out DDRB, temp

  25. out PORTB, temp

  26. ldi temp,0x7f

  27. out DDRD, temp

  28. out PORTD, temp

  29. main:

  30. ldi temp,0xfe

  31. ldi temp2,0x08

  32. for1: ;По одному зажигаем светодиоды на PORTB

  33.  

  34. out PORTB,temp

  35. sec

  36. rol temp

  37. rcall delay

  38.  

  39. dec temp2

  40. cpi temp2, 0x00

  41. brne for1

  42.  

  43. ldi temp,0xff

  44. out PORTB, temp

  45.  

  46. ldi temp,0x7e

  47. ldi temp2,0x07

  48. for2: ;По одному зажигаем светодиоды на PORTD

  49.  

  50. out PORTD,temp

  51. sec

  52. rol temp

  53. rcall delay

  54.  

  55. dec temp2

  56. cpi temp2, 0x00

  57. brne for2

  58.  

  59. ldi temp,0x7f

  60. out PORTD, temp

  61.  

  62. rjmp main

  63. ;*********************Delay**************************************************

  64. delay:

  65.  

  66. ldi coarse, c_del

  67. cagain: ldi medium, m_del

  68. magain: ldi fine, f_del

  69. fagain: dec fine

  70. brne fagain

  71. dec medium

  72. brne magain

  73. dec coarse

  74. brne cagain

  75. ret

/io.h>

Секция Define chapter сопоставляет имена регистров с именами переменных. В секции Const chapter задаются константы, которые влияют на скорость бегущих огней. Далее идет сегмент кода Code segment в котором собственно и содержится код нашей программы. В коде программы сперва инициализируем стек, порты ввода/вывода конфигурируем как выхода, после чего в вечном цикле по одному светодиоды перебираем. Структура кода очень похожа на написанную выше программу С. Код на С более прост для понимания и компактен, но по размеру программы ассемблер обгоняет С (оптимизация не включена): 84 против 312 байт кода у С. Если же включить максимальную оптимизацию для С, то получим 184 байт кода, но придется совсем под другому переписать функцию задержки. Итого имеем, ассемблер более сложен, но код компактен и быстр, а С более прост, но код получившейся программы значительно больше. В заключение привожу видео готового устройства:

Советую не ограничиваться просто бегущим огоньком, а немного поэкспериментировать:

Скачать проект для AVR Studio

AVR-CDC: виртуальный COM-порт через Low-Speed USB (используется библиотека V-USB) | avr-working-with-usb

В статье описывается 2 проекта, основанные на библиотеке V-USBCDC-232 и CDC-IO. Автор — Osamu Tamura @ Recursion Co., Ltd.

Оба проекта представляют из себя простую схему на микроконтроллере AVR (ATtiny45/85, ATtiny461, ATtiny2313, ATmega8/48/88), которая при подключении к порту USB компьютера (далее просто PC) создает виртуальный

COM-порт. В обоих проектах используется бесплатная библиотека V-USB, которая позволяет средствами firmware, прошитого в микроконтроллер AVR, поддержать работу интерфейса USB. Первый проект (CDC-232) создает на компьютере виртуальный COM-порт, через который можно обмениваться данными с каким-нибудь другим устройством, имеющим низковольтный RS-232C (например, с микроконтроллером AT89C51 Atmel). Второй проект (CDC-IO) тоже создает виртуальный COM-порт, но он предназначен для управления ресурсами микроконтроллера (регистрами внутреннего назначения). То есть посылкой простых текстовых команд в консольной программе Вы можете менять состояние ножек микроконтроллера AVR, читать их состояние, управлять таймерами — счетчиками, PWM, читать ADC и т. д. 

[CDC-232

CDC-232 создает виртуальный COM-порт на PC, даже если он не имеет реального порта RS-232C. Это позволяет производить обмен данными RS-232C (без сигналов управления) после подсоединения устройства и установки драйвера.


Виртуальный COM-порт, работающий через программную реализацию USB

[Применение CDC-232]

Запрограммируйте AVR, спаяйте схему и подключите устройство в порт USB компьютера. Установите драйвер (если у Вас операционная система Windows). Получите доступ к устройству через сгенерированный виртуальный COM-порт из программы терминала или написанную Вами программу (которая работает с COM-портом). Сигналы управления (DTR, DTS, RTS, CTS) не используются, поэтому настройте программу терминала в режим «no flow-control» (без контроля потока).

Windows запросит установку драйвера заново всякий раз, когда Вы подключите устройство в другой порт USB. Ранее установленный драйвер детектируется автоматически. Будет назначен другой номер COM-порта. Если Вы установите серийный номер в AVR (пересоберите исходный код с новым usbconfig.h), Вы можете получить тот же самый номер COM-порта на любом порте USB. Но в этом случае Вы не можете подключить сразу несколько устройств CDC с одним и тем же серийным номером.

Перед тем, как отсоединить устройство, закройте COM-порт в терминальной программе или в Вашем самописном приложении. В противном случае Вы не сможете подключить устройство снова из-за неверного дескриптора файла (broken file handle). В этом случае перезапустите программу терминала или Ваше приложение. Переключиться в режим быстрой передачи можно использованием «lowcdc.vbs», при этом можно получить скорость выше 9600 bps.


Loop-back тест на версии ATtiny45

[Принципиальные схемы CDC-232]

Эти схемы рассчитаны на ATtiny45/85, ATtiny2313/AT90S2313 и ATmega8/48/88/168. У всех этих микроконтроллеров firmware программируется через ISP. Красный LED понижает напряжение USB от 5V до 3.3V, и предоставляет его для AVR. Ток потребления около 10mA, и его мало для питания других узлов. Когда подключаетесь к другому MCU (микроконтроллеру), соедините Gnd и соедините TxD и RxD крест-накрест. R4 ограничивает обратный ток, когда внешний MCU питается от Vcc 5V (Вы можете R4 не ставить, если напряжение питания внешнего MCU равно 3.3V). R5 защищает ножку TxD, когда она замкнута на Gnd. Вы можете опустить и R4 и R5, если Вы соединяетесь через RS-232C драйвер наподобие MAX232. Используйте кварцевый резонатор. Несмотря на то, что керамический резонатор в большинстве случаев работает хорошо, но для данного применения он не подходит, поскольку уход частоты слишком большой, и поэтому устройство может работать нестабильно.

ATtiny45/85 использует внутренний RC-генератор и PLL. Он откалиброван на частоту 16.5 МГц по частоте сигнала SOF (Start Of Frame) порта USB, когда устройство подключено к PC. UART в этом случае реализован программно. Он не может поддерживать высокую скорость передачи данных. Если TxD и RxD проинвертированы (пересоберите проект с опцией -DINVERT), Вы можете напрямую подключиться к сигналам RS-232C. Формат настройки порта 300-4800bps, 8N1.


CDC-232 для ATtiny45-20

Пример на ATtiny45 с использованием коннектора mini-B

У микроконтроллера ATtiny2313/AT90S2313 всего лишь 2 KB памяти программ. Механизм установки терминала опущен (т. е. автодетекта скорости нет). Установите переключатель DIP для смены скорости.

CDC-232 для ATtiny2313-20

У микроконтроллеров ATmega8/48/88’s внутренний UART конфигурируется от PC автоматически. Формат настройки 1200-57600bps, данные 7/8, четность N/E/O, количество стоп-бит 1/2

CDC-232 для ATmega8/48/88-20

Подключение к физическим линиям RS-232C требует инверсии полярности TxD и RxD, а также соответствие уровней сигнала. Используйте специальную IC наподобие MAX232. Вы можете её заменить простыми схемами (см. далее).

Когда целевой MCU имеет другое питание Vcc (отличное от 3.3V), образуются обратные токи утечки через сигнальные линии. Это искажает сигнал, либо подпитывает MCU без источника питания. Эта схема не очень хороша, но достаточна для большинства случаев.

[CDC-IO

CDC-IO управляет регистрами специального назначения (Special Function Registers, SFR) микроконтроллера AVR через виртуальный COM-порт на PC. Это позволяет свободно читать/записывать параллельные порты MCU (ножки микроконтроллера). Работают также операции с таймерами/счетчиками, PWM, ADC, EEPROM, что позволяет приложению на PC достичь очень глубокого управления микроконтроллером и разрабатываемым на нем устройством.


Внешний интерфейс с использованием программной реализации протокола USB

[Применение CDC-IO]

Инсталляция такая же, как и у CDC-232. Скорость COM-порта произвольна. Отправка текстовых команд происходит через программу терминала или из вашей программы на PC. Если Вы хотите получить более высокую скорость передачи, используйте «lowcdc.vbs» для переключения в bulk transfer mode.

Набор команд CDC-IO (Instruction Set)

Функция Команда Формат Ответ
Who @ @ «cdc-io», CR-LF
Get ? address ? data, CR-LF
Set = data address = CR-LF
AND & Set & data address & CR-LF
OR & Set | data address | CR-LF
EX-OR & Set ^ data address ^ CR-LF
Set Double $ data2 data1 address $ CR-LF

Версия с ATtiny2313 имеет только команды «Set», «Get», «Xor».

В таблице команд использованы следующие обозначения:

address: адрес регистра SFR, отображенный на память (memory mapped) в hex-формате
data: 8 бит данные в hex
разделитель:    Tab, Space, CR, LF
predefined addr (предопределенные символические адреса, case-insensitive, НЕ поддерживаются ATtiny2313): PINB, DDRB, PORTB PINC, DDRC, PORTC PIND, DDRD, PORTD

Примеры (‘_’ означает разделитель):

            DDRB_?_                  Возвращает значение DDRB вместе с CR-LF.
            12_34_=_                 Запись 0x12 по адресу 0x34, в ответ возвращает CR-LF.
            FB_PORTC_&_     Запись (PORTC & 0xFB) в PORTC, возвращает CR-LF.

(примеры для ATtiny2313)
            36_?_                        Возвращает величину PINB(0x36) вместе с CR-LF.
            12_37_=_                  Запись 0x12 по адресу DDRB(0x37), возвращает CR-LF.’ для модифицирования направления порта (вход или выход). Используйте PIN* для переключения бит в противоположное состояние (toggle), если порт назначен как выход (output).

Когда разрешены прерывания, сообщается номер вектора прерывания, когда оно вызывается.

Все регистры SFR доступны. См. даташит AVR для использования таймеров, ADC, EEPROM, и т. п.

[Принципиальные схемы CDC-IO]

Если напряжение питания Vcc целевой схемы равно 5V, и порты AVR сконфигурированы как входы, поставьте резисторы (3K3…10Kом) для предотвращения обратного тока. Используйте только кварцевый резонатор. Несмотря на то, что керамический резонатор в большинстве случаев работает хорошо, но для данного применения он не подходит, поскольку уход частоты слишком большой, и поэтому устройство может работать нестабильно.

ATtiny45/85 использует внутренний RC-генератор и PLL. Он откалиброван на частоту 16.5 МГц по частоте сигнала SOF (Start Of Frame) порта USB, когда устройство подключено к PC.


CDC-IO для ATtiny45-20

CDC-IO для ATtiny461-20

Для ATtiny2313 реализованы только команды «Set», «Get» и «Xor» из-за ограниченной памяти программ этого микроконтроллера. Эта версия также не имеет механизма interrupt-report.


CDC-IO для ATtiny2313-20

CDC-IO для ATmega8/48/88-20

[Пример программы]

Это экспериментальная схема и пример программы для ATmega8/48. Программа написана на C, VB, VC, VC++ и C#. Вы можете использовать другие языки (или макросы), если они могут работать с портом RS-232C.


На фото показан внешний вид экспериментальной схемы


Регулятор изменяет тон пищалки и маску мигания светодиодов.

[Пример управления без программы]

Операционные системы позволяют работать с COM-портами, как с обычными файлами. Вот так, например, под Windows Вы можете послать команду устройству, которое создает виртуальный COM-порт COM3 (в текстовом файле comands.txt записана последовательность команд):

c:\temp>copy comands.txt COM3
        1 file(s) copied.

Что интересно — под Windows XP можно использовать только имена COM1..COM9. Имена COM10, COM11, COM12, COM13 и далее Windows не воспринимает как системные, и думает, что это не порт, а файл (даже если такой порт реально имеется в Диспетчере Устройств).

[Ссылки]

1. Исходные тексты программ и firmware, описанные в статье, документация, драйвер для w2k, XP, Vista.
2. Проект CDC-232, портированный на AVR-USB-MEGA16 (ATmega16 с кварцем на 16 МГц).
3. AVR-CDC — Virtual COM Port over Low-Speed USB site:recursion.jp — сайт AVR-CDC Osamu Tamura @ Recursion Co.
4. USB консоль для управления радиолюбительскими приборами.

SPI для ATtiny2313 | Любительские конструкции на микроконтроллерах

Во всех микроконтроллерах семейства Mega имеется аппаратный модуль SPI. Он очень прост в своём использовании. После настройки и инициализации модуля нужно записать в регистр SPDR передаваемый байт данных — это запустит генератор тактового сигнала SPI,  данные начнут передаваться от Master к Slave и обратно. После установки флага окончания передачи в SPDR  будет находиться принятый байт. В общем всё  просто. Да и по моему мнению SPI самый лёгкий в освоении и использовании интерфейс, к тому же достаточно скоростной. Однако в некоторых контроллерах семейства Tiny аппаратного SPI нет — там установлен модуль USI, например в очень распространённой и применяемой ATtiny2313. На различных форумах я встречал неоднократные вопросы по поводу использования USI в качестве SPI, т.е. у народа возникают некоторые трудности. ?, хотя, USI, может быть, чуть сложнее SPI, но особых трудностей при разборе его работы возникнуть не должно. Основные части USI — это сдвиговый 8-ми разрядный регистр (для передачи/приёма данных)  и 4-х разрядный счётчик (для определения окончания передачи).  В тонкости построения USI я углубляться не буду — кто захочет разобраться подробнее тот раскурит даташит. Главное отличие работы USI в режиме SPI от аппаратного SPI семейства Mega — то, что синхроимпульсы для передачи/приёма формируются не аппаратно, а,  или программно, или от внешнего источника, или по прерыванию таймера 0. Кроме того, сдвиговый регистр и 4-х разрядный счётчик можно тактировать от разных источников, что позволяет построить на основе USI некоторые дополнительные модули.
В даташите на ATtiny2313 есть программные примеры на ассемблере для работы USI в качестве SPI. Я их переписал на Си, сохранив логику работы один к одному,  и успешно использую в своей работе.
Для демонстрации работы USI в качестве SPI, я возьму микроконтроллерные модули с ATtiny2313 и ATmega8, клавиатуру, в которой использую только одну кнопку и ЖК?.
Опыт №1. 2313-я MASTER 8-я SLAVE.
Скачиваем архив. В нём две папки. В папке USI_SPI — проект для ATtiny2313, а в папке SPI — для ATmega8A. Внимательно просмотрите исходники каждого проекта — там написано, что нужно раскомментировать и что нужно закомментировать для  настройки MASTER/SLAVE (Подсказка: там два варианта главной функции). Также в каждом проекте подключены заголовочный и Си-шный файлы для работы с ЖК? HD44780. Они необходимы для отображения принятых символов. Откомпилируйте проекты, чтобы 2313-я выступала в качестве MASTER, а 8-я — SLAVE и прошейте контроллеры. По разделу defane посмотрите назначение выводов, и,  соответственно им соберите макет (Подсказка: для подключения ЖК? (он подключается к SLAVE), что в 2313-й, что в 8-й используется порт D. PD0 — PD3 МК — DB4 — DB7 ЖК?, PD4 — RS, PD5 — EN). Кнопка (подключается к MASTER)  тоже вешается одинаково — на PD1.
Собрали макет. Подали питание. На ЖК? должна высветиться надпись ОК — значит , по крайней мере: 1) ЖК? подключён правильно; 2) компиляция и прошивка SLAVE прошла успешно. Нажимаем кнопку и наблюдаем на ЖК? SLAVE приём символов (я использовал десятичные цифры. Вот фотка где 2313 — MASTER.
 Опыт №2. 2313-я SLAVE 8-я MASTER.
Теперь компилируем  проекты, чтобы 2313-я выступала в качестве SLAVE, а 8-я — MASTER и соответственно прошиваем. ЖК? подключаем на 2313-ю, а кнопку — на 8-ю. Не забудьте ПОМЕНЯТЬ местами соединители с MISO на MOSI для 8-й. Повторяем действия из опыта №1. Убеждаемся в чёткой работе. Фотку демонстрировать не вижу смысла, т.к. она ничем не отличается, кроме подключения проводов.
В данной реализации SPI, что для ATtiny2313, что для ATmega8A, я не использовал прерывания, а также различные варианты тактирования для 2313. Всё это в Ваших руках, вернее в головах. Целью данной статьи было показать простейшие способы реализации интерфейса SPI.   Для tiny, точно так, как и в даташите, есть два варианта функций передачи данных. Я замерял частоту тактовых сигналов «быстрого» варианта с кварцем 20 МГц — реально вышло 10 МГц!
Готовые исходники, я думаю, пригодятся Вам в дальнейшем творчестве. Всем удачи.

Запись опубликована в рубрике Микроконтроллерный конструктор с метками LCD, SPI. Добавьте в закладки постоянную ссылку.

Использования внешнего прерывания INT0 и INT1.

В этой части разберем простой пример использования внешнего прерывания INT0 и INT1.

Если посмотрим на прошлую программу, то видно, что микроконтроллер практические все свои ресурсы тратит на отслеживание срабатывания порта PD0. Таким образом наша программа не может быть расширена, так как нужно будет все время возращаться к проверке порта ввода. Чтобы от этого избавиться, нужно задействовать внутренний модуль внешнего прерывания INTx.

Первым делом необходимо в технической документации МК посмотреть адрес вектора прерывания «External Interrupt Request 0».

В программе адрес INT0 нужно прописать сразу же после метки Reset. Так как наша программа будет обрабатываться в цикле аппаратного прерывания, то цикл «main» остается пустым. Важно помнить, что при использовании прерываний, цикл main должен присутствовать в программе. Не зависимо от того будет ли там что-то написано или нет.

Так как вывод прерывания INT0 припадает на порт PD2, то нужно перенести кнопку с PD0 на PD2 и произвести настройку порта на ввод.

Чтобы разрешить использование прерывания INT0, необходимо внести данные в регистр GIMSK, согласно таблице ниже.

Следующим шагом будет настройка условий прерывания. Параметры записываются в регистр MCUCR.

Как видно из таблицы, с помощью битов ISCxx можно настроить условие прерывания по переднему фронту, по заднему и по изменению логического состояния пина.

Перенесем нашу прошлую программу в прерывание INT0 и проверим ее работу в Proteus.

.device Attiny2313 ; указываем тип устройства

.include “tn2313def.inc” ; подключаем файл директив МК ATtiny2313

.def temp = r16 ; задаем имя нашему регистру общего назначения

.org 0x0000 ; начало программы с 0 адреса
rjmp reset

.org 0x001 ;адрес нашего прерывания

rjmp INT_0

reset:

ldi temp,ramend ; грузим значение ramend в регистр temp

out $3d, temp ;

ser temp ; настраиваем все выводы порта В на выход

out DDRB, temp ;

ldi temp,0b00000100;настрйока PD2 на вход

out PORTD,temp

ldi temp,(1

out GIMSK,temp

ldi temp,(1

out MCUCR,temp

sei

ldi r22,1

out PORTB,r22

main:

rjmp main

INT_0:

rcall delay

rol r22

out PORTB,r22

reti

delay:

clr r20

clr r21

d_1:

inc r20

cpi r20,200

brne d_1

d_2:

inc r21

cpi r21,50

brne d_1

ret

Как видим программа сильно упростилась. Сейчас нет необходимости отслеживать состояние выходного сигнала, тем самым мы экономим производительность время микроконтроллера.

В данном примере настроили прерывание по заднему фронту сигнала с порта PD2. Задержка delay предотвращает дребезг контакта и ложное выполнение программы.

На рисунке ниже видно срабатывание кнопки (канал А) и включение светодиода на порте B. Апааратное прерывание настроено на задний фронт сигнала, поэтому выполнение программы началось только после отпускания кнопки. Перед тем как на PВ2 установилась логическая единица, была выполнена задержка длительностью 100мс. Такого интервала вполне достаточно для предотвращения дребезга контакта.

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

Чтобы применить прерывание INT1 нужно внести дополнительные настройки в регистры GIMSK и MCUCR.

ldi temp,(1

out GIMSK,temp

ldi temp,(1

out MCUCR,temp

Таким образом, мы разрешили использование двух меток прерываний. Если в МК имеется вектор INT2 то по такому же образу можно добавить следующую метку.



AVR. Учебный курс. Использование ШИМ

Вот уже несколько раз я ругался странным словом ШИМ. Пора бы внести ясность и разьяснить что же это такое. Вообще, я уже расписывал этот режим работы, но все же повторюсь в рамках своего курса.
 

Вкратце, Широтно Импульсная Модуляция (в буржуйской нотации этот режим зовется PWMPulse Width Modulation) это способ задания аналогового сигнала цифровым методом, то есть из цифрового выхода, дающего только нули и единицы получить какие то плавно меняющиеся величины. Звучит как бред, но тем не менее работает. А суть в чем:
 

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

А вот если двигатель включать на десять секунд каждую минуту, то маховик раскрутится, но далеко не на полную скорость — большая инерция сгладит рывки от включающегося двигателя, а сопротивление от трения не даст ему крутится бесконечно долго.
 

Чем больше продолжительность включения двигателя в минуту, тем быстрей будет крутится маховик.
При ШИМ мы гоним на выход сигнал состоящий из высоких и низких уровней (применимо к нашей аналогии — включаем и выключаем двигатель), то есть нулей и единицы. А затем это все пропускается через интегрирующую цепочку (в аналогии — маховик). В результате интегрирования на выходе будет величина напряжения, равная площади под импульсами.
 

Меня скважность (отношение длительности периода к длительности импульса) можно плавно менять эту площадь, а значит и напряжение на выходе. Таким образом если на выходе сплошные 1, то на выходе будет напряжение высокого уровня, в случае моего робота, на выходе из моста L293 это 12 вольт, если нули, то ноль. А если 50% времени будет высокий уровень, а 50% низкий то 6 вольт. Интегрирующей цепочкой тут будет служить масса якоря двигателя, обладающего довольно большой инерцией.
 

 

А что будет если взять и гнать ШИМ сигнал не от нуля до максимума, а от минуса до плюса. Скажем от +12 до -12. А можно задавать переменный сигнал! Когда на входе ноль, то на выходе -12В, когда один, то +12В. Если скважность 50% то на выходе 0В. Если скважность менять по синусоидальному закону от максимума к минимуму, то получим… правильно! Переменное напряжение. А если взять три таких ШИМ генератора и гнать через них синусоиды сдвинутые на 120 градусов между собой, то получим самое обычное трехфазное напряжение, а значит привет бесколлекторные асинхронные и синхронные двигатели — фетиш всех авиамоделистов. На этом принципе построены все современные промышленные привода переменного тока. Всякие Unidrive и Omron Jxx

 
В качестве сглаживающей интегрирующей цепи в ШИМ может быть применена обычная RC цепочка:

 

Так, принцип понятен, приступаем к реализации.
ШИМ сигнал можно сварганить и на операционных усилителях и на микроконтроллере. Причем последние умеют это делать просто мастерски, благо все у них для этого уже есть.

 
Аппаратный ШИМ
В случае ATMega16 проще всего сделать на его ШИМ генераторе, который встроен в таймеры. Причем в первом таймере у нас целых два канала. Так что без особого напряга ATmega16 может реализовать одновременно четыре канала ШИМ.

 
Как это реализовано
У таймера есть особый регистр сравнения OCR**. Когда значение в счётном регистре таймера достигнает значения находящегося в регистре сравнения, то могут возникнуть следующие аппаратные события:

  • Прерывание по совпадению
  • Изменение состояния внешнего выхода сравнения OC**.

 
Выходы сравнения выведены наружу, на выводы микроконтроллера

 

 
На демоплате Pinboard к этим выводам как раз подключены светодиоды. А если поставить джамперы вдоль, в сторону надписи RC то к выводу ШИМ будет подключена интегрирующая цепочка.

 

 

Для Pinboard II разница в подключении невелика. Джамперы тут сгруппированы в один блок. А светодиоды и RC цепочки сгруппированы в левом верхнем углу платы.

Предположим, что мы настроили наш ШИМ генератор так, чтобы когда значение в счетном регистре больше чем в регистре сравнения, то на выходе у нас 1, а когда меньше, то 0.

 
Что при этом произойдет? Таймер будет считать как ему и положено, от нуля до 256, с частотой которую мы настроим битами предделителя таймера. После переполнения сбрасывается в 0 и продолжает заново.

 

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

 

Так что меняя значение в регистре сравнения можно менять скважность ШИМ сигнала. А если пропустить этот ШИМ сигнал через сглаживающую RC цепочку (интегратор) то получим аналоговый сигнал.

 
У таймера может быть сколько угодно регистров сравнения. Зависит от модели МК и типа таймера. Например, у Атмега16

  • Timer0 — один регистр сравнения
  • Timer1 — два регистра сравнения (16ти разрядных!)
  • Timer2 — один регистр сравнения

 
Итого — четыре канала. В новых AVR бывает и по три регистра сравнения на таймер, что позволяет одним МК организовать просто прорву независимых ШИМ каналов.

 
Самих режимов ШИМ существует несколько:

 
Fast PWM
В этом режиме счетчик считает от нуля до 255, после достижения переполнения сбрасывается в нуль и счет начинается снова. Когда значение в счетчике достигает значения регистра сравнения, то соответствующий ему вывод ОСхх сбрасыватся в ноль. При обнулении счетчика этот вывод устанавливается в 1. И все!

 
Частота получившегося ШИМ сигнала определяется просто: Частота процесора 8Мгц, таймер тикает до 256 с тактовой частотой. Значит один период ШИМ будет равен 8000 000/256 = 31250Гц. Вполне недурно. Быстрей не получится — это максимальная скорость на внутреннем 8Мгц тактовом генераторе. Но если переключить FUSE биты на внешний кварц то можно раскачать МК на 16Мгц.

 
Еще есть возможность повысить разрешение, сделав счет 8, 9, 10 разрядным (если разрядность таймера позволяет), но надо учитывать, что повышение разрядности, вместе с повышением дискретности выходного аналогового сигнала, резко снижает частоту ШИМ.

 

Phase Correct PWM
ШИМ с точной фазой. Работает похоже, но тут счетчик считает несколько по другому. Сначала от 0 до 255, потом от 255 до 0. Вывод OCxx при первом совпадении сбрасывается, при втором устанавливается.
Но частота ШИМ при этом падает вдвое, изза большего периода. Основное его предназначение, делать многофазные ШИМ сигналы, например, трехфазную синусоиду. Чтобы при изменении скважности не сбивался угол фазового сдвига между двумя ШИМ сигналами. Т.е. центры импульсов в разных каналах и на разной скважности будут совпадать.

 

 
Еще одна тонкость:
Чтобы не было кривых импульсов, то в регистр сравнения любое значение попадает через буфферный регистр и заносится только тогда, когда значение в счетчике достигнет максимума. Т.е. к началу нового периода ШИМ импульса.

 
Clear Timer On Compare
Сброс при сравнении. Это уже скорей ЧИМ — частотно-импульсно моделированный сигнал. Тут работает несколько иначе, чем при других режимах. Тут счетный таймер тикает не от 0 до предела, а от 0 до регистра сравнения! А после чего сбрасывается.

 

 
В результате, на выходе получаются импульсы всегда одинаковой скважности, но разной частоты. А чаще всего этот режим применяется когда надо таймером отсчитывать периоды (и генерить прерывание) с заданной точностью.

 
Например, надо нам прерывание каждую миллисекунду. И чтобы вот точно. Как это реализовать проще? Через Режим СТС! Пусть у нас частота 8Мгц.

 
Прескалер будет равен 64, таким образом, частота тиков таймера составит 125000 Гц. А нам надо прерывание с частотой 1000Гц. Поэтому настраиваем прерывание по совпадению с числом 125.

 
Дотикал до 125 — дал прерывание, обнулился. Дотикал до 125 — дал прерывание, обнулился. И так бесконечно, пока не выключим.

 
Вот вам и точная тикалка.

 
Нет, конечно, можно и вручную. Через переполнение, т.е. дотикал до переполнения, загрузил в обработчике прерывания заново нужные значение TCNTх=255-125, сделал нужные полезные дела и снова тикать до переполнения. Но ведь через СТС красивей! 🙂

 
Аппаратура
А теперь контрольные регистры, которыми все это безобразие задается и программируется. Опишу на примере Двухканального FastPWM на таймере 1. В других все похоже. Даташит в зубы и вперед.

 
Итак, тут правят бал регистры TCCR1A и TCCR1B. Гы, кто бы сомневался %)

 
Распишу их по битам.
Регистр TCCR1A, биты COM1A1:COM1A0 и COM1B1:COM1B0. Эта братия определяет поведение вывода сравнения OC1A и OC1B соответственно.

 

COMxx1COMxx0Режим работы выхода
00вывод отцеплен от регистра сравнения и не меняется никак.
01Поведение вывода зависит от режима заданного в WGM, различается для разных режимов (FastPWM, FC PWM, Compar out) и разных МК, надо сверяться с даташитом.
10прямой ШИМ (сброс при совпадении и установка при обнулении счета)
11обратный ШИМ (сброс при обнулении и установка при совпадении)

 
Регистр TCCR1A, биты WGM11 и WGM10 вместе с битами WGM12 и WGM13, находящимися в регистре TCCR1B задают режим работы генератора.

WGM13WGM12WGM11WGM10Режим работы
0101Fast PWM 8 бит
0110Fast PWM 9 бит
0111Fast PWM 10 бит

 
Другие комбинации битов WGM задают режимы Phase Correct PWM и CTC (сброс OCxx при совпадении). Если интересно, то читай даташит, я для себя много интересного там не нашел, кроме Phase Correct PWM. И то мне сейчас важней скорость, а не точность фазы 🙂

 
После остается только запустить таймер, установив бит CS10 (подсчет тактовых импульсов с делителем 1:1)

 
Пример кода:

 
Попробуем поиграться яркостью светодиодов с помощью ШИМ сигналов. Подключи джамперы, чтобы запитать светодиоды LED1 и LED2

 

 
Для версии Pinboard II все аналогично, с поправкой на другое расположение джамперов:

 

 
Теперь все готово, можно писать код. Вначале в раздел инициализации устройств добавляю настройку таймера на запуск ШИМ и подготовку выводов.

 

1
2
3
4
5
6
7
8
9
10
11
12
;FastPWM Init
	SETB	DDRD,4,R16	; DDRD.4 = 1 Порты на выход
	SETB	DDRD,5,R16	; DDRD.5 = 1
 
; Выставляем для обоих каналов ШИМ режим вывода ОС** сброс при совпадении. 
; COM1A = 10 и COM1B = 10
; Также ставим режим FAST PWM 8bit (таймер 16ти разрядный и допускает
; большую разрядность ШИМ сигнала. Вплоть до 10 бит.  WGM = 0101
; Осталось только запустить таймер на частоте МК CS = 001
 
	OUTI 	TCCR1A,2<<COM1A0|2<<COM1B0|0<<WGM11|1<<WGM10	 
	OUTI	TCCR1B,0<<WGM13|1<<WGM12|1<<CS10

;FastPWM Init SETB DDRD,4,R16 ; DDRD.4 = 1 Порты на выход SETB DDRD,5,R16 ; DDRD.5 = 1 ; Выставляем для обоих каналов ШИМ режим вывода ОС** сброс при совпадении. ; COM1A = 10 и COM1B = 10 ; Также ставим режим FAST PWM 8bit (таймер 16ти разрядный и допускает ; большую разрядность ШИМ сигнала. Вплоть до 10 бит. WGM = 0101 ; Осталось только запустить таймер на частоте МК CS = 001 OUTI TCCR1A,2<<COM1A0|2<<COM1B0|0<<WGM11|1<<WGM10 OUTI TCCR1B,0<<WGM13|1<<WGM12|1<<CS10

 
Готово! Теперь ШИМ таймера1 генерит сигнал на выходаx OC1А и OC1B

 
Закинем в регистры сравнения первого и второго канала число 255/3=85 и 255/2 = 128
Так как ШИМ у нас 8ми разрядный, то заброс идет только в младший разряд. Старший же остается нулем. Но регистры сравнения тут у нас 16ти разрядные поэтому грузить надо оба байта сразу. Не забыв запретить прерывания (это важно!!! ибо атомарный доступ)

 

1
2
3
4
5
6
7
	CLI
	OUTI	OCR1AH,0
	OUTI	OCR1AL,85
 
	OUTI	OCR1BH,0
	OUTI	OCR1BL,128
	SEI

CLI OUTI OCR1AH,0 OUTI OCR1AL,85 OUTI OCR1BH,0 OUTI OCR1BL,128 SEI

 
Поехали! 🙂

 
Прошиваем, тыкаемся в ноги микроконтроллера осциллографом — видим следующую картину по каналам:

 

 
Как мы и запланировали. С первого канала длительность импульса в 1/3 периода, а со второго в 1/2
Ну и светодиоды горят с разной яркостью. Один ярче, другой тусклей. Меняя значение в регистрах OCR*** мы можем менять скважность.

 
Давай сделаем так, чтобы светодиод плавно менял свою яркость от нуля до максимума. Как помнишь, у нас там была программа, с мигающем по таймеру0 светодиодом. Немного ее подправим, сделаем так, чтобы по таймеру не светодиод мигал, а менялось значение в регистрах сравнения OCR1A и OCR1B. Причем меняться оно будет в разные стороны 🙂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
; Main =========================================================
Main:	LDS	R16,TCNT	; Грузим числа в регистры
	LDS	R17,TCNT+1
 
	CPI	R16,0x10	; Сравниванем побайтно выдержку
	BRCS	NoMatch
	CPI	R17,0x01	; Выдержку сделали поменьше = 0x0110
	BRCS	NoMatch
 
; Если совпало то делаем экшн
Match:	CLI			; Запрет прерываний, т.к. атомарный доступ
 
; Меняем первый канал
; Особенность 16ти разрядных регистров в том, что их надо правильно читать и записывать.
; Читают вначале младший, потом старший байты. Так надо, чтобы младший не успел измениться
; (он ведь может тикать по таймеру) пока читают первым старший.  Укладывают их в обратном
; порядке. Сначала старший, потом младший. Правда для регистров OCR это не имеет большой 
; разницы -- они статичные, а вот для TCNT очень даже!
 
	IN	R16,OCR1AL	; Достали первый байт сравнения
	IN	R17,OCR1AH	; он 16ти разрядный, но старший байт будет 0
 
	INC	R16		; Увеличили
 
	OUT	OCR1AH,R17	; И сунули их обратно
	OUT	OCR1AL,R16
 
; Меняем второй канал
	IN	R16,OCR1BL	; Достали второй байт сравнения
	IN	R17,OCR1BH	; он 16ти разрядный, но старший байт будет 0
 
	DEC	R16		; Уменьшили
 
	OUT	OCR1BH,R17	; И сунули их обратно
	OUT	OCR1BL,R16	
	SEI			; Конец атомарного доступа
 
; Теперь надо обнулить счетчик, иначе за эту же итерацию главного цикла
; Мы сюда попадем еще не один раз -- таймер то не успеет натикать 255 значений
; чтобы число в первых двух байтах счетчика изменилось. 
 
	CLR	R16		; Нам нужен ноль
	CLI			; Таймер меняется и в прерывании. Нужен
				; атомарный доступ. Запрещаем прерывания
	OUT	TCNT0,R16	; Ноль в счетный регистр таймера
	STS	TCNT,R16	; Ноль в первый байт счетчика в RAM
	STS	TCNT+1,R16	; Ноль в второй байт счетчика в RAM
	STS	TCNT+2,R16	; Ноль в третий байт счетчика в RAM
	STS	TCNT+3,R16	; Ноль в первый байт счетчика в RAM
	SEI			; Разрешаем прерывания. 
; Не совпало - не делаем :) 
NoMatch:	NOP
 
	INCM	CCNT		; Шарманка вращается дальше, вхолостую
	JMP	Main

; Main ========================================================= Main: LDS R16,TCNT ; Грузим числа в регистры LDS R17,TCNT+1 CPI R16,0x10 ; Сравниванем побайтно выдержку BRCS NoMatch CPI R17,0x01 ; Выдержку сделали поменьше = 0x0110 BRCS NoMatch ; Если совпало то делаем экшн Match: CLI ; Запрет прерываний, т.к. атомарный доступ ; Меняем первый канал ; Особенность 16ти разрядных регистров в том, что их надо правильно читать и записывать. ; Читают вначале младший, потом старший байты. Так надо, чтобы младший не успел измениться ; (он ведь может тикать по таймеру) пока читают первым старший. Укладывают их в обратном ; порядке. Сначала старший, потом младший. Правда для регистров OCR это не имеет большой ; разницы — они статичные, а вот для TCNT очень даже! IN R16,OCR1AL ; Достали первый байт сравнения IN R17,OCR1AH ; он 16ти разрядный, но старший байт будет 0 INC R16 ; Увеличили OUT OCR1AH,R17 ; И сунули их обратно OUT OCR1AL,R16 ; Меняем второй канал IN R16,OCR1BL ; Достали второй байт сравнения IN R17,OCR1BH ; он 16ти разрядный, но старший байт будет 0 DEC R16 ; Уменьшили OUT OCR1BH,R17 ; И сунули их обратно OUT OCR1BL,R16 SEI ; Конец атомарного доступа ; Теперь надо обнулить счетчик, иначе за эту же итерацию главного цикла ; Мы сюда попадем еще не один раз — таймер то не успеет натикать 255 значений ; чтобы число в первых двух байтах счетчика изменилось. CLR R16 ; Нам нужен ноль CLI ; Таймер меняется и в прерывании. Нужен ; атомарный доступ. Запрещаем прерывания OUT TCNT0,R16 ; Ноль в счетный регистр таймера STS TCNT,R16 ; Ноль в первый байт счетчика в RAM STS TCNT+1,R16 ; Ноль в второй байт счетчика в RAM STS TCNT+2,R16 ; Ноль в третий байт счетчика в RAM STS TCNT+3,R16 ; Ноль в первый байт счетчика в RAM SEI ; Разрешаем прерывания. ; Не совпало — не делаем 🙂 NoMatch: NOP INCM CCNT ; Шарманка вращается дальше, вхолостую JMP Main

 
А теперь давайте включим режим с точной фазой (WGM = 0001) и посмотрим на то как будет меняться скважность.

 

1
2
	OUTI 	TCCR1A,2<<COM1A0|2<<COM1B0|0<<WGM11|1<<WGM10	 
	OUTI	TCCR1B,0<<WGM13|0<<WGM12|1<<CS10

OUTI TCCR1A,2<<COM1A0|2<<COM1B0|0<<WGM11|1<<WGM10 OUTI TCCR1B,0<<WGM13|0<<WGM12|1<<CS10

 

 
ШИМ на прерываниях.
Но вот засада — плата уже разведена, захотелось ШИМ, а выводы OCxx уже задействованы под другие цели.

 
Ничего страшного, малой кровью можно это исправить. Также запускаем ШИМ, только:

  • Отключаем выводы OCxx от регистра сравнения.
  • Добавляем два обработчика прерывания на сравнение и на переполнение. В прерывании по сравнению сбрасываем нужный бит, в прерывании по переполнению счетчика устанавливаем.

Все просто 🙂

 
Пример:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
;FastPWM Init на прерываниях
 
; ШИМ будет на выводах 3 и 6 порта D
	SETB	DDRD,3,R16	; DDRD.3 = 1 Порты на выход
	SETB	DDRD,6,R16	; DDRD.6 = 1
 
; Выставляем для обоих каналов ШИМ режим вывода ОС** выключеным. 
; COM1A = 00 и COM1B = 00
; Также ставим режим FAST PWM 8bit (таймер 16ти разрядный и допускает
; большую разрядность ШИМ сигнала. Вплоть до 10 бит.  WGM = 0101
; Осталось только запустить таймер на частоте МК CS = 001
 
	OUTI 	TCCR1A,0<<COM1A0|0<<COM1B0|0<<WGM11|1<<WGM10	 
	OUTI	TCCR1B,0<<WGM13|1<<WGM12|1<<CS10	
 
	SETB	TIMSK,OCIE1A,R16	; Включаем прерывание по сравнению А
	SETB	TIMSK,OCIE1B,R16	; Включаем прерывание по сравнению Б
	SETB	TIMSK,TOIE1,R16	; Включаем прерывание по переполнению Т1
					; Причем в режиме WGM=1010 переполнение
					; будет на FF т.е. таймер работает как
					; 8ми разрядный.

;FastPWM Init на прерываниях ; ШИМ будет на выводах 3 и 6 порта D SETB DDRD,3,R16 ; DDRD.3 = 1 Порты на выход SETB DDRD,6,R16 ; DDRD.6 = 1 ; Выставляем для обоих каналов ШИМ режим вывода ОС** выключеным. ; COM1A = 00 и COM1B = 00 ; Также ставим режим FAST PWM 8bit (таймер 16ти разрядный и допускает ; большую разрядность ШИМ сигнала. Вплоть до 10 бит. WGM = 0101 ; Осталось только запустить таймер на частоте МК CS = 001 OUTI TCCR1A,0<<COM1A0|0<<COM1B0|0<<WGM11|1<<WGM10 OUTI TCCR1B,0<<WGM13|1<<WGM12|1<<CS10 SETB TIMSK,OCIE1A,R16 ; Включаем прерывание по сравнению А SETB TIMSK,OCIE1B,R16 ; Включаем прерывание по сравнению Б SETB TIMSK,TOIE1,R16 ; Включаем прерывание по переполнению Т1 ; Причем в режиме WGM=1010 переполнение ; будет на FF т.е. таймер работает как ; 8ми разрядный.

 
Осталось только прописать обработчики и вектора:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
         .CSEG
         .ORG $000		; (RESET) 
         RJMP   Reset
         .ORG $002
         RETI			; (INT0) External Interrupt Request 0
         .ORG $004
         RETI 			; (INT1) External Interrupt Request 1
         .ORG $006
         RETI			; (TIMER2 COMP) Timer/Counter2 Compare Match
         .ORG $008
         RETI 			; (TIMER2 OVF) Timer/Counter2 Overflow
         .ORG $00A
         RETI			; (TIMER1 CAPT) Timer/Counter1 Capture Event
         .ORG $00C 
         RJMP Timer1_OCA		; (TIMER1 COMPA) Timer/Counter1 Compare Match A
         .ORG $00E
         RJMP Timer1_OCB		; (TIMER1 COMPB) Timer/Counter1 Compare Match B
         .ORG $010
         RJMP Timer1_OVF 		; (TIMER1 OVF) Timer/Counter1 Overflow
         .ORG $012
         RJMP	Timer0_OV 	; (TIMER0 OVF) Timer/Counter0 Overflow
         .ORG $014
         RETI 			; (SPI,STC) Serial Transfer Complete
         .ORG $016
         RETI     			; (USART,RXC) USART, Rx Complete
         .ORG $018
         RETI			; (USART,UDRE) USART Data Register Empty
         .ORG $01A
         RETI			; (USART,TXC) USART, Tx Complete
         .ORG $01C
         RETI			; (ADC) ADC Conversion Complete
         .ORG $01E
         RETI			; (EE_RDY) EEPROM Ready
         .ORG $020
         RETI			; (ANA_COMP) Analog Comparator
         .ORG $022
         RETI			; (TWI) 2-wire Serial Interface
         .ORG $024
         RETI			; (INT2) External Interrupt Request 2
         .ORG $026
         RETI			; (TIMER0 COMP) Timer/Counter0 Compare Match
         .ORG $028
         RETI			; (SPM_RDY) Store Program Memory Ready
 
	 .ORG   INT_VECTORS_SIZE      	; Конец таблицы прерываний
 
; Interrupts ==============================================
Timer0_OV:	PUSHF
		PUSH	R17
		PUSH	R18
		PUSH	R19
 
		INCM	TCNT
 
		POP	R19
		POP	R18
		POP	R17
		POPF
 
		RETI
 
; Вот наши обработчики на ШИМ
Timer1_OCA:	SBI	PORTD,3
		RETI
 
Timer1_OCB:	SBI	PORTD,6
		RETI
 
Timer1_OVF: 	CBI	PORTD,3
		CBI	PORTD,6
		RETI
; End Interrupts ==========================================

.CSEG .ORG $000 ; (RESET) RJMP Reset .ORG $002 RETI ; (INT0) External Interrupt Request 0 .ORG $004 RETI ; (INT1) External Interrupt Request 1 .ORG $006 RETI ; (TIMER2 COMP) Timer/Counter2 Compare Match .ORG $008 RETI ; (TIMER2 OVF) Timer/Counter2 Overflow .ORG $00A RETI ; (TIMER1 CAPT) Timer/Counter1 Capture Event .ORG $00C RJMP Timer1_OCA ; (TIMER1 COMPA) Timer/Counter1 Compare Match A .ORG $00E RJMP Timer1_OCB ; (TIMER1 COMPB) Timer/Counter1 Compare Match B .ORG $010 RJMP Timer1_OVF ; (TIMER1 OVF) Timer/Counter1 Overflow .ORG $012 RJMP Timer0_OV ; (TIMER0 OVF) Timer/Counter0 Overflow .ORG $014 RETI ; (SPI,STC) Serial Transfer Complete .ORG $016 RETI ; (USART,RXC) USART, Rx Complete .ORG $018 RETI ; (USART,UDRE) USART Data Register Empty .ORG $01A RETI ; (USART,TXC) USART, Tx Complete .ORG $01C RETI ; (ADC) ADC Conversion Complete .ORG $01E RETI ; (EE_RDY) EEPROM Ready .ORG $020 RETI ; (ANA_COMP) Analog Comparator .ORG $022 RETI ; (TWI) 2-wire Serial Interface .ORG $024 RETI ; (INT2) External Interrupt Request 2 .ORG $026 RETI ; (TIMER0 COMP) Timer/Counter0 Compare Match .ORG $028 RETI ; (SPM_RDY) Store Program Memory Ready .ORG INT_VECTORS_SIZE ; Конец таблицы прерываний ; Interrupts ============================================== Timer0_OV: PUSHF PUSH R17 PUSH R18 PUSH R19 INCM TCNT POP R19 POP R18 POP R17 POPF RETI ; Вот наши обработчики на ШИМ Timer1_OCA: SBI PORTD,3 RETI Timer1_OCB: SBI PORTD,6 RETI Timer1_OVF: CBI PORTD,3 CBI PORTD,6 RETI ; End Interrupts ==========================================

Почему я в этих обработчиках не сохраняю регистры и SREG? А незачем! Команды SBI меняют только конкретные биты (а больше нам и не надо), не влияя на флаги и другие регистры.

 
Запустили…

 

 
И получили полную херню. Т.е. ШИМ как бы есть, но почему то адово мерцает. А на осциллографе в этот момент полный треш. Кто виноват? Видимо конфликт прерываний. Осталось только выяснить где именно. Сейчас я вам дам практический пример реалтаймовой отладки 🙂

 
Итак, что мы имеем:

 
ШИМ, как таковой, работает. Скважность меняется. Значит наш алгоритм верен.
Но длительности скачут. Почему? Видимо потому, что что-то мешает им встать вовремя. Когда у нас возникают фронты? Правильно — по прерываниям. А прерывания по таймерам. Т.е. врать не должны. Однако так получается. Давайте узнаем каком месте у нас конфликт.

 
Первым делом надо добавить в код обработчика отладочную инфу. Будем в обработчике прерываний инвертировать бит. Пусть это будет PD7 — зашли в обработчик, инверснули. Зашли — инверснули. В результате, у нас на выходе этого бита будет прямоугольный сигнал, где каждый фронт — сработка прерываний. Послужит нам как линейка, отмеряющая время.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
; Interrupts ==============================================
Timer0_OV:	PUSHF
		PUSH	R17
		PUSH	R18
		PUSH	R19
 
		INCM	TCNT
 
		POP	R19
		POP	R18
		POP	R17
		POPF
 
		RETI
 
; Установка бита ШИМ канала А
Timer1_OCA:	SBI	PORTD,3
		RETI
 
; Установка бита ШИМ канала Б
Timer1_OCB:	SBI	PORTD,6
		RETI
 
;Сброс бита ШИМ канала А и Б
Timer1_OVF: 	CBI	PORTD,3
		CBI	PORTD,6
 
;DEBUG PIN BEGIN ---------------
		PUSHF
		INVBM	PORTD,7    
		POPF
;DEBUG PIN END -----------------
		RETI

; Interrupts ============================================== Timer0_OV: PUSHF PUSH R17 PUSH R18 PUSH R19 INCM TCNT POP R19 POP R18 POP R17 POPF RETI ; Установка бита ШИМ канала А Timer1_OCA: SBI PORTD,3 RETI ; Установка бита ШИМ канала Б Timer1_OCB: SBI PORTD,6 RETI ;Сброс бита ШИМ канала А и Б Timer1_OVF: CBI PORTD,3 CBI PORTD,6 ;DEBUG PIN BEGIN ————— PUSHF INVBM PORTD,7 POPF ;DEBUG PIN END —————— RETI

Инверсия бита невозможна без логических операций, поэтому надо сохранять флаги.

 

 
Из картинки стало понятно, что у нас накрывается прерывание по сравнению. Давайте попробуем посмотреть с какими прерыванием происходит конфликт. Особых вариантов у нас нет — прерываний у нас тут четрые. А наиболее очевиден конфликт Timer0_OV vs Timer1_OCA vs Timer1_OCB.

 
OCA и OCB конфликтуют только тогда, когда счетные регистры у них сравниваются — вызов происходит почти одновременно, но сами обработчики короткие — всего несколько тактов, поэтому дребезг не столь сильный.

 
А вот Timer0_OV делает довольно мощный прогруз стека и еще вычитает четырехбайтную переменную. Т.е. тактов на 20 может задержать обработчик установки бита Timer1_OC* от того и вылазят такие зверские дребезги.

 
Давайте проверим эту идею. Разрешим прерывания в обработчике Timer0_0V

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
; Interrupts ==============================================
Timer0_OV:	SEI
		PUSHF
		PUSH	R17
		PUSH	R18
		PUSH	R19
 
		INCM	TCNT
 
		POP	R19
		POP	R18
		POP	R17
		POPF
 
		RETI
 
; Установка бита ШИМ канала А
Timer1_OCA:	SBI	PORTD,3
		RETI
 
; Установка бита ШИМ канала Б
Timer1_OCB:	SBI	PORTD,6
		RETI
 
;Сброс бита ШИМ канала А и Б
Timer1_OVF: 	CBI	PORTD,3
		CBI	PORTD,6
		RETI

; Interrupts ============================================== Timer0_OV: SEI PUSHF PUSH R17 PUSH R18 PUSH R19 INCM TCNT POP R19 POP R18 POP R17 POPF RETI ; Установка бита ШИМ канала А Timer1_OCA: SBI PORTD,3 RETI ; Установка бита ШИМ канала Б Timer1_OCB: SBI PORTD,6 RETI ;Сброс бита ШИМ канала А и Б Timer1_OVF: CBI PORTD,3 CBI PORTD,6 RETI

 

 
Картина сразу исправилась. Теперь более важное (для нас важное) прерывание задвигает обработчик от Таймера 0. Но тут надо просекать возможные риски:

 

  • Более глубокий прогруз стека
  • Нарушается атомарный доступ к четырехбайтной переменной TCNT, поэтому если бы у нас было еще какое-то прерывание, меняющее TCNT то его надо было бы запрещать локально. Иначе бы мы получили такой трешняк, что проще заново прогу переписать, чем это отладить

.

 
ШИМ на таймерах
Когда совсем все плохо, то можно сделать на любом таймере. В обработчик прерывания по переполнению таймера заносим конечный автомат, который сначала загрузит в таймер длительность низкого уровня, а при следующем заходе — длительность высокого. Ну и, само собой, ноги процессора подергает как надо. Таким образом, на один таймер можно повесить дофига ШИМ каналов, но задолбаешься все с кодовой реализацией всего этого. И процессорное время жрать будет некисло. Не говоря уже про дребезги, о которых только что было сказано. Это для эстетов извращенцев :)))))

 
Исходник к статье

Сайт

Start
Main P16F628a
Main P18F1220
Main ATtiny2313 Assembler
Как создать проект MPLAB
Шаблон P16F628a
MOVLW MOVWF
Шаблон ATtiny2313
Программа управления светодиодом AVR ASSEMBLER
Программа управления светодиодом PIC
Proteus FAQ
Память ATtiny2313
Регистры ввода-вывода AVR
Порты AVR
Команды
Main ATtiny2313 C
Программа управления светодиодом AVR C
Программа переключения светодиода AVR ASM
Программа переключения светодиода PIC
Подтягивающие резисторы
Программа переключения светодиода AVR C
Программа переключения светодиода с использованием антидребезга AVR ASM
Работа с битами AVR C
Программа переключения светодиода с использованием антидребезга AVR С
Мигающий светодиод AVR ASM
Программа переключения светодиода с использованием антидребезга PIC ASM
Мигающий светодиод AVR C
Мигающий светодиод PIC ASM
Бегущие огни AVR C
Бегущие огни AVR ASM
Бегущие огни PIC ASM
Бегущие огни с использованием таймера AVR ASM
Бегущие огни с использованием таймера PIC ASM
Бегущие огни с использованием таймера AVR C
TCCR1B
T1CON – TIMER1 CONTROL REGISTER
Бегущие огни с использованием прерывания от таймера AVR ASM
Бегущие огни с использованием прерывания от таймера AVR C
Бегущие огни с использованием прерывания от таймера PIC ASM
TIMSK
Семь нот AVR ASM
Семь кнопок AVR ASM
Указатели-косвенная адресация AVR ASM
Семь кнопок PIC ASM
Семь нот PIC ASM
Семь нот с использованием прерывания PIC ASM
Таёта минус PIC ASM
Семь нот AVR C
Музыкальная шкатулка AVR ASM
ldi
out
rjmp
reti
cbi,sbi
rcall
dec
brne
in
sbrc,sbrs
push
pop
ret
breq
eor
lsl,lsr
brcc,brcs
brlo
cpi
sts
sei
lds
clr
inc
lpm
z
add
adc
mov
andi
rol
adiw
cp
Печать данных из Flash
Flash память AVR C
CodeVision музыкальная шкатулка AVR C
Музыкальная шкатулка AVR C
Flash память pgmspace.h
Функция _delay_ms и _delay_us AVR C
Кодовый замок AVR ASM
Семисегментный индикатор PIC ASM
0,1,2,3,4,5,6,7,8,9 PIC ASM
Таблица данных PIC ASM
Двоичные в двоичнодесятичные PIC ASM
Вывод числа на семисегментный индикатор PIC ASM
Счётчик нажатия кнопки PIC ASM
Таймер PIC ASM
Шаблон PIC18
Компаратор PIC ASM
Преобразование HEX в ASCII PIC18
Косвенная адресация(указатели) PIC18 ASM
Стек PIC18 ASM
Список PIC18 ASM
Пример 5.1 PIC18 Си стр152
Создание проэкта на Си mcc18
Жки PIC16F628A
Пример 5.3 PIC18 Си стр155
Пример 5.7 PIC18 Си стр162
string_h PIC18 mcc18
delays_h PIC18 mcc18
stdlib_h PIC18 mcc18
Пример 5.8 PIC18 Си стр166
Пример 6.15 PIC18 Си стр217-Прерывания
Пример 6.16 PIC18 Си стр219-Множественные прерывания
Пример 6.18 PIC18 Си стр232-Таймер реального времени
Пример 7.5 PIC18 Си стр266-Семисегментный индикатор
Пример 4-х разрядного семисегментного индикатора
Пример 7.13 PIC18 Си стр286-ЖКИ
Часы LCD
Генератор импульсов
Частотомер PIC16 ASM
Пример 7.7 PIC18 Си стр276-Жки
Пример 7.2 PIC18 Си стр257-Клавиатура 4×3
Пример 7.11 PIC18 Си стр282-Жки перемещение строки
Пример 7.12 PIC18 Си стр284-ЖКИ последовательная передача
PIC18 Си Калькулятор
Пример 8.3 PIC18 Си стр340-Температура и Часы
Пример 8.5 PIC18 Си стр350-USART RS232
USART SYNCHRONOUS MASTER TRANSMISSION
Асинхронная передача данных TxD
Асинхронный прием даннх RxD
PIC18 Вывод на дисплей Hex температуры..
PIC18F2480 USART FT232 DS18B20
PIC18F4550 DS18B20 с начала
PIC18F4550 DS18B20 Функция чтения температуры
PIC18F4550 LCD
Read ROM DS18B20 PIC18 LCD
Динамическое отображение температуры
Преобразование Hex в ASCII PIC18
Разработка с нуля
STM32F407VG Reference manual
Мигание светодиодом с CMSIS
Мигание светодиодом с StdPeriph
Задержка по прерыванию SysTick
Модульное программирование
Мигание светодиодов без функции delay
HAL CAN LOOPBACK

Программирование микроконтроллеров AVR ATtiny на Arduino IDE

Программирование микроконтроллеров AVR ATtiny на Arduino IDE

разделы: Arduino , Программаторы , AVR , дата: 23 февраля 2014г.

Часто можно слышать отзывы об Arduino, что это дорого, неэффективно, профанация идеи и т.п. Если задуматься, то окажется, что во многом эта критика справедлива. Одним Arduino сыт не будешь. Если мне требуется микроконтроллер для чего-то простого, например: дисплей и пара кнопок, то использование для такой тривиальной задачи Arduino, действительно можно сравнить с забиванием гвоздей электронным микроскопом. Но если отбросить эмоции и подумать, что наиболее ценное в Arduino-проектах? На мой взгляд, это колоссальный объем открытого кода написанного под различные проекты. Называя вещи своими именами, я не хочу писать с нуля программу для работы микроконтроллера с дисплеем, я хочу использовать уже готовую библиотеку, которую я использовал для Arduino. И не потому что мне «слабо», а потому что я не вижу смысла в изобретении еще одного велосипеда.

О портировании проектов Arduino для “младшего” семейства микроконтроллеров AVR ATtiny пойдет речь в этом посте.

Несколько ссылок:

1) Страница проекта реализующая данную возможность: arduino-tiny
Так же, в вопросе мне помогли разобраться следующие материалы:
2) Programming an ATtiny w/ Arduino 1.0
3) ISP программатор из Arduino. Разберемся и с ATtiny
4) Ошибка «please define PAGEL and BS2 signals in the configuration file for part» при прошивки ATtiny45/85

Из литератуты рекомендую почитать книгу: Андрей Евстифеев «Микроконтроллеры AVR семейства Tiny»

    Предполетная подготовка.
    • Что будем программировать?
    • Проект позволяет задействовать микроконтроллеры ATtiny84 (84/44/24), ATtiny85 (85/45/25), и ATtiny2313 (4313).
    • ATtiny84/44/24 это 14-pin микроконтроллеры с размером флеш-памяти под прошивку 8/4/2 Кбайта соответственно.
    • ATtiny85/45/25 — это то же самое, но на 8-pin. ATtiny2313/4313 — Выделяется из общего ряда являясь по сути ревизией AVR Classic AT90s2313. На борту имеется и I2C и UART, 20-pin, 2/4 Кбайта под прошивку. Вкусная штучка.

    Arduino использует старшее семейство микроконтроллеров ATmega. Портируя программы на ATtiny придется отказаться от некоторых плюшек. Что мы теряем кроме меньшей памяти и меньшего количества ног? Отказаться придется от UART и I2C интерфейсов(ATtiny2313 это по сути не совсем ATtiny). Если вас это не пугает, то идем дальше.

  1. Программатор. Для того чтобы залить прошивку в чип, нужен будет программатор. Здесь я буду использовать сам Arduino в качестве программатора.
  2. Используемое ПО: Slackware64-14.1 + Arduino-1.0.5
    Приступим:
  1. Сначала нужно добавить поддержку ATtiny для Arduino IDE. Заходим по первой ссылке на сайт проекта arduino-tiny На текущий момент я вижу два zip архива доступных для скачивания, для версий Arduino IDE v1.0 и v1.5. Хм. Я пользуюсь последней доступной версией 1.0.5, какой архив следует выбрать? Выбирать надо первое. Версия 1.5 еще только разрабатывается. Итак:
    $ cd sketchbook 
    $ mkdir hardware
    $ cd hardware
    $ wget http://arduino-tiny.googlecode.com/files/arduino-tiny-0100-0018.zip
    $ unzip ./arduino-tiny-0100-0018.zip
    Получаем папку tiny в которой лежит файл README. Открываем его вашим любимым текстовым редактором и внимательно читаем секцию INSTALLATION/УСТАНОВКА
    Если присмотреться, то мы уже дошли до этапа:
    * Create a new file named "boards.txt" in the tiny directory.  Following from
      the examples above, the file would be here...
    
          C:\Projects\Arduino\hardware\tiny\boards.txt
    
    * Open the "boards.txt" file and the "Prospective Boards.txt" file using your
      favourite text editor.
    
    * Copy board entries of interest from "Prospective Boards.txt" to "boards.txt"
      (or copy the entire contents of "Prospective Boards.txt" to "boards.txt").
      Board entries are delineated by a long line of pound-signs.
    
    * In the "boards.txt" file, change the "upload.using" entries to the
      appropriate value for your setup.
    
    * Save and close "boards.txt".  Close "Prospective Boards.txt".
    из всего этого следует только одна команда:
    $ cp -v  'Prospective Boards.txt' ./boards.txt
    
    после чего можно запускать Arduino IDE
    $ arduino
    

    Если все нормально, то в меню: “Сервис->Плата” увидим список поддерживаемых микроконтроллеров ATtiny:

    Здесь, пожалуй, сразу следует пояснить. oscillator — генератор тактовой частоты. Если вы купили микроконтроллер и еще не успели поменять fuse-биты, то генератор должен быть встроенным и работать на частоте 1MГц. Что будет, если ошибешься с частотой? Работать будет, но или медленнее или быстрее.

    BOD — детектор пониженного питания ака Brown-out Detection. Датчик позволяющий определить пониженный уровень питания и “мягко” выключить чип предотвратив дребезг питания. Дело в том, что выключение питания, процесс не мгновенный, чип доли секунды работает при не достаточном питании. В таком состоянии, программа зашитая в нем, начинает выполняться с произвольных адресов т.е. работать хаотически. Это чревато чем? Если ваша программа пишет в EEPROM, то в этом состоянии она запишет туда кашу.

  2. Программатор. Здесь все просто. Подключите Arduino к компьютеру, запустите Arduino IDE, и запишите программу из примеров: меню -> Файл-> Примеры->ArduinoISP. Программатор готов.
  3. Сборка схемы. Для прошивки через ISP интерфейс на каждом микроконтроллере имеются четыре контакта MOSI, MISO, SCK, RESET. ISP-программатор позволяет перепрошить чип уже впаянный в схему. Он так и называется In-System Programming внутрисхемный программатор. В связи с этим, контакты MOSI, MISO, SCK по совместительству имеют функции тех или иных цифровых/аналоговых выводов. Расположение контактов Вашего микроконтроллера можно посмотреть по datasheet на официальном сайте.

    У меня под рукой оказался ATtiny45

    Схема подключения такая

    Я использовал в качестве программатора Arduino на ATmega168. Конденсатор электролитический 10мФ x 16В. Минус на GND, плюс на RESET. Я не уверен, что он нужен на Arduino c ATmega328. Видел схемы без конденсатора, но шить через ATmega328 не пробовал.

  4. Прошивка. В Arduino IDE в меню Сервис — Программатор установите опцию: Arduino as ISP В меню “Плата” укажите тип прошиваемого микроконтроллера.
    Откройте из “Примеров” программу “Blink”. В самом начале, строку:
    int led=13
    исправте на
    int led =0
    К Pin0 (пятый контакт ИС) подключите подтягивающий резистор, на другой конец резистора анод светодиода, катод которого соедините с землей.
    Скомпилируйте и залейте программу. Работать должно сразу.
    При прошивке микроконтроллера может выдать предупреждение:
    please define PAGEL and BS2 signals in the configuration file for part
    
    Вашим любимым текстовым редактором откройте файл
    $ nano /opt/arduino/hardware/tools/avrdude.conf
    
    найдите секцию со своим микроконтроллером и добавьте в нее две строки
    pagel = 0x01;
    bs2 = 0x01;
    Попробуйте перепрошить микроконтроллер, предупреждение должно исчезнуть. Подробнее смотрите по четвертой ссылке

Программирование Attiny2313 с помощью Arduino Uno

Теперь у вас должен мигать светодиод на вашем Attiny 2313

. Обратите внимание, что заводская настройка по умолчанию — 1 МГц, если вы хотите запустить его на 8 МГц, используйте: burn bootloader.

Выберите плату -> Attiny2313 @ 8MHZ
Выберите -> Инструменты-> Программист-> Arduino в качестве ISP
выберите -> Инструменты-> Записать загрузчик

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

Когда вы используете его в своем проекте, будет хорошей идеей подключить А 0.1 мкФ через VCC и GND как можно ближе
к процессору, и резистор 10 кОм между RESET и VCC.

Связь с Attiny 2313

Всегда приятно иметь возможность получить отладочную информацию от вашего крошечного.
На Arduino вы привыкли использовать для этой цели Serial.print ().
К счастью, вы можете использовать это и на Attiny.
На самом деле у вас есть больше вариантов:

TinyDebugSerial — поставляется с файлами ядра (только вывод из attiny)
SoftwareSerial — используйте библиотеку SoftwareSerial (вход / выход attiny)
TinyKnockbang — использовать TinyISP (только output fram attiny)
RELAY_SERIAL — использовать TinyISP (Input / output attiny)
Более подробное объяснение: здесь

Решение для недостающего АЦП

В Atmel есть несколько замечаний по применению о том, как сделать дешевый АЦП, используя компаратор на Attiny2313.
Например:
http://www.atmel.com/Images/doc0942.pdf

К сожалению, они не предоставляют никаких примеров программирования. Но недавно я нашел простое решение
http://learn.adafruit.com/photocells/using-a-photocell

В эскизе внизу этой страницы используется digitalRead () для измерения времени в RC-сети.

В этом примере используется фоторезистор, но вы можете заменить его на потенциометр.
Я пробовал это с потенциометром 10 кОм и конденсатором 0,1 мкФ, который дал мне показания от 0 до 600
На скетче PIN 2 это PD2 на Attiny2313 — физически контакт # 4

Физические / логические номера контактов.
F.ex. пин 13 в примере мигания — это физический пин 16
См. памятку

Attiny2313 Программирование с помощью Arduino

Краткое введение:

Attiny2313 — это высокопроизводительный микроконтроллер RISC с низким энергопотреблением на базе AVR. Имеет 20 контактов. Он имеет 2 КБ или 4 КБ флэш-памяти, 128 или 256 байтов SRAM, 128 или 256 байтов EEPROM, 8-битный или 16-битный таймер, 1 x 4 канала PWM и 18 контактов GPIO. Но канала АЦП нет.Этот микроконтроллер также поддерживает связь UART, I 2 C, SPI (нет специального вывода для связи, выводы GPIO используются для связи).

Лист данных:

Для получения дополнительной информации см. Техническое описание микроконтроллера Attiny2313.

Настройка:

Чтобы запрограммировать этот микроконтроллер, нам потребуется помощь другого микроконтроллера, который будет использоваться для внутрисистемного программиста или ISP. Этот ISP используется для программирования микроконтроллеров AVR.Здесь мы будем использовать очень известную плату Arduino Uno в качестве ISP. Итак, в первую очередь нам нужно подключить микроконтроллер Attiny2313 к Arduino Uno. Для этого нам понадобятся гибкие провода. Подключение должно быть таким —

Arduino Uno —————> Attiny2313

контакт 13 ——————> контакт 19 (SCL)

контакт 12 ——————> контакт 18 (MISO)

контакт 11 ——————> контакт 17 (MOSI)

контакт 10 ——————> контакт 1 (СБРОС)

VCC ——————> контакт 20 (VCC)

Земля —————-> контакт 10 (GND)

После подключения этих контактов мы должны настроить программное обеспечение для работы.Очень полезным и распространенным программным обеспечением является Arduino IDE. Загрузите последнюю версию Arduino IDE с официального сайта Arduino arduino.cc. После загрузки и установки IDE нам потребуются некоторые модификации для нашей работы.

Загрузите библиотеку tiny.zip отсюда и распакуйте ее в папку « hardware » в среде Arduino IDE. Затем откройте IDE и подключите плату Arduino Uno через USB-порт. Затем перейдите в Файл > Примеры> ArduinoISP и откройте скетч, затем просто выберите плату из Tool> Board> Arduino Uno , затем выберите порт из Tool> Port> COM x .Затем просто загрузите эскиз, нажав кнопку загрузки.

Выберите эскиз ArduinoISP

ArduinoISP эскиз

Операция:

После успешной установки теперь мы должны записать код загрузчика на чистый микроконтроллер Attiny2313. Для этого сначала выбираем плату Attiny2313 с тактовой частотой 8 МГц. Затем просто выберите вариант загрузчика из формы Tool> Записать загрузчик .Может, это займет одну-две минуты.

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

Здесь мы используем эскиз Blink из Файл> Примеры> Основы> Blink . И измените контакт 13 по умолчанию на контакт 6, который вы найдете на следующем рисунке.И измените модуль программатора с Tool> Programmer> Arduino как ISP.

Затем загрузите эскиз из Sketch> Загрузить с помощью Programmer. Он загрузит эскиз в ваш микроконтроллер. Надеюсь, он будет работать правильно.

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

Если вы столкнулись с какой-либо проблемой, отправьте электронное письмо на адрес [email protected] Спасибо за то, что вы с нами.


Спасибо

aatishb / attiny-examples: Примеры эскизов Arduino для программирования ATTiny85

GitHub — aatishb / attiny-examples: Примеры эскизов Arduino для программирования ATTiny85

Файлы

Постоянная ссылка Не удалось загрузить последнюю информацию о фиксации.

Тип

Имя

Последнее сообщение фиксации

Время фиксации

Несколько примеров скетчей для программирования ATTiny85 с использованием программного обеспечения Arduino. ATTiny — это крошечный программируемый микроконтроллер стоимостью менее 1 доллара. Он отлично работает как недорогая, компактная и менее мощная альтернатива Arduino.

  • LilyTwinkle или ATTiny85
  • Миниатюрный программатор AVR и удлинительный кабель USB
  • TM1637 4-значный светодиодный дисплей (мы используем их для считывания напряжений, поскольку ATTiny не поддерживает последовательную связь)

При использовании LilyTwinkle или посадочного места SOIC ATTiny:

  • Тестовый зажим IC — SOIC 8-контактный
  • Перемычки между мужчинами и женщинами
  1. Используйте это руководство для установки драйверов ATtiny для Arduino IDE. В меню инструментов в Arduino IDE установите Board на «ATtiny 25/45/85», процессор на «ATtiny85», часы на «Internal 8 Mhz» и программатор на «USBtinyISP».

  2. Следуйте этим инструкциям, чтобы подключить ATtiny с помощью крошечного программатора AVR. Если вы не используете LilyTwinkle и у вас есть автономный ATTiny (DIP-след), подключите его к разъему на программаторе Tiny AVR.

  3. Откройте эти примеры в своей среде разработки Arduino. Вам нужно будет собрать соответствующую схему для каждого эскиза.

  4. Чтобы использовать светодиодный дисплей TM1637, вам необходимо установить библиотеку. В среде Arduino IDE перейдите в Sketch> Include Libraries> Manage Libraries и найдите 1637.Вы должны найти библиотеку Grove 4-Digit Display от Seeed Studio. Щелкните установить.

Построен Аатишем Бхатией, Шарон Де Ла Круз и Шефали Наяком при Совете Принстонского университета по науке и технологиям.

Функция TinyTone для воспроизведения музыкальных тонов на ATtiny85 была создана Дэвидом Джонсоном-Дэвисом.

Около

Примеры эскизов Arduino для программирования ATTiny85

Темы

ресурсов

Лицензия

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

Запрограммируйте attiny2313 с помощью Arduino

Это вторая часть настройки Arduino для программирования микроконтроллера Attiny. В предыдущих частях мы добавили поддержку различных микроконтроллеров. Для справки вот каким будет Attiny2313, когда вы это сделаете, контакты и соответствующие контакты Arduino показаны ниже, как вы можете видеть, вы по-прежнему получаете 16 контактов ввода / вывода, возможности I2C, 3 контакта PWM и последовательный интерфейс. для связи.

attiny2313 arduino

Вам нужно будет добавить поддержку ATtiny2313 согласно Программированию ATtiny85 с Arduino Uno, но вам нужно добавить следующие

http://drazzy.com/package_drazzy.com_index.json

Настройка подключения attiny2313 к плате Arduino

Подключите Attiny2313 к Arduino следующим образом

1) attiny2313 контакт 1 к контакту 10 Arduino сброс
2) attiny 2313 контакт 17 к контакту 11 Arduino MOSI
3) контакт 18 attiny2313 к контакту 12 Arduino MISO
4) контакт 19 attiny2313 к контакту 13 Arduino SCK
5) контакт attiny2313 10 к Arduino GND
6) attiny2313 контакт 20 к Arduino VCC

Макет

На схеме не показан светодиод, который мы подключили для тестирования, он был подключен к выводу 7.

ступеней

Откройте программу ArduinoISP и загрузите программу ArduinoISP на плату Arduino, чтобы превратить ее в программатора ISP.

1) Откройте программу ArduinoISP.
Файл> Примеры> ArduinoISP

2) Выберите последовательный порт.
Инструменты> Порт> COMX (введите здесь свой com-порт)

2) Выберите необходимую плату Arduino, в данном случае мы используем Arduino Uno.
Инструменты> Плата> Arduino Uno

3) Установите тип программатора как AVRISP MKII.
Инструменты> Программатор> AVRISP MKII

4) Нажмите кнопку загрузки.

5) Теперь ваш Arduino Uno настроен как программист ISP. Теперь, чтобы настроить Arduino для программирования Attiny с измененным примером мигания

6) Выберите цель AVR, на которую ISP Arduino будет программировать.
Инструменты> Плата> ATtinyx313

7) Измените плату для ISP Arduino, на которую нужно программировать.
Инструменты> Чип> ATtiny2313

8) Убедитесь, что частота для Arduino ISP установлена ​​на 8 МГц.
Инструменты> Часы> 8 МГц (внутренние)

Вы можете увидеть эти настройки на скриншоте ниже

9) Установить режим программатора.
Инструменты> Программист> Arduino как ISP

10) Наконец, запустите загрузку скетча в микроконтроллер Attiny2313
Файл> Загрузить

Это наш пример кода для загрузки

 // функция настройки запускается один раз, когда вы нажимаете кнопку сброса или включаете плату
void setup () {
  // инициализируем цифровой вывод 13 как выход.pinMode (7, ВЫХОД);
}

// функция цикла запускается снова и снова навсегда
void loop () {
  digitalWrite (7, ВЫСОКИЙ); // включаем светодиод (HIGH - уровень напряжения)
  задержка (1000); // ждем секунду
  digitalWrite (7, LOW); // выключаем светодиод, понижая напряжение
  задержка (1000); // ждем секунду
} 

Если вы подключите светодиод к контакту 7 вашего Attiny2313, вы увидите, что светодиодная вспышка включается и выключается, но это кажется немного медленным

Если вы хотите, вы можете записать загрузчик в Attiny, и микроконтроллер будет работать на частоте 8 МГц, а в примере выше светодиод будет мигать с правильной скоростью

Используйте ATtiny85 с Arduino IDE

Я купил новую плату Digispark ATtiny85.

Но два дня не смог использовать только из-за пакетов драйверов. И, наконец, после долгих поисков я нашел ответ. Я сослался на различные руководства и попробовал. Я получал ошибку для COM-порта в Arduino. Вот я за это решил.

Назначение выводов: все выводы могут использоваться в качестве цифровых входов / выходов

Вывод 0 → I2C SDA, PWM (светодиод на модели B)

Вывод 1 → PWM (светодиод на модели A)

Вывод 2 → I2C SCK, аналоговый В

Контакт 3 → Аналоговый вход (также используется для USB +, когда используется USB)

Контакт 4 → ШИМ, аналоговый (также используется для USB-, когда используется USB)

Контакт 5 → Аналоговый вход

Для удобная ссылка на контакты над Digispark — возможности контактов перечислены на задней панели.

Шаг 1. Установите драйвер Windows для ATtiny85

при использовании Arduino 1.6.6 или новее и windows — вам нужно будет загрузить и установить драйверы вручную. Загрузите, распакуйте и запустите «Установить драйверы» (в 32-битных системах) или «DPInst64» (в 64-битных системах).

Файлы драйвера расположены здесь:

Ссылка

После загрузки файла .zip> распакуйте его.

и запустите

Install drivers.exe (для 64-разрядной ОС)

DPinst64.exe (для 32-разрядной ОС)

Шаг 2: Установите пакеты платы для Arduino

Скопируйте этот URL-адрес и вставьте в Файл> настройки> дополнительный URL-адрес менеджера доски

  http: // digistump.com / package_digistump_index.json
  
  • Перейдите в меню «Инструменты», а затем в подменю «Плата» — выберите «Менеджер плат», а затем в раскрывающемся списке выберите «Содействие»:
  • Выберите пакет «Платы Digistump AVR» и нажмите « Установить ».
  • Вы увидите прогресс загрузки на нижней панели окна «Boards Manager», когда он будет завершен, рядом с этим элементом в списке будет отображаться «Установлено».
  • ПОЛЬЗОВАТЕЛИ WINDOWS: После завершения установки во всплывающем окне мастера установки драйверов нажмите «Далее» в этом окне, чтобы установить драйверы для плат Digistump (если они у вас уже установлены, этот установщик обновит их и установит любые, которые отсутствуют)
  • По завершении установки закройте окно «Менеджер плат» и выберите Digispark в меню «Инструменты» → «Платы».«Digispark (по умолчанию — 16,5 МГц)» — это плата, которую должны выбирать все новые пользователи.
  • На этом установка завершена! (Пользователи Linux см. Примечание ниже)

Linux Установите Если вы еще не установили правила udev, найденные здесь: Раздел устранения неполадок

ВНИМАНИЕ ПОЛЬЗОВАТЕЛИ LINUX: ПОЖАЛУЙСТА, ПРОВЕРЬТЕ СТРАНИЦУ УСТРАНЕНИЯ НЕИСПРАВНОСТЕЙ LINUX **

Шаг 3: Как для загрузки программы

Digispark работает немного иначе, чем некоторые продукты, совместимые с Arduino.Digispark программирует с другой процедурой.

В меню «Инструменты» выберите «Плата» → «Digispark» (по умолчанию — 16,5 МГц)

Введите код, откройте его.

Вам не нужно подключать ваш Digispark перед вызовом загрузки. Нажмите кнопку загрузки.

В нижнем поле состояния теперь будет предложено подключить Digispark — на этом этапе вам нужно подключить его — или отключить и снова подключить.

Вы увидите, как идет загрузка, и тогда ваш код будет немедленно запущен в Digispark.Если вы отключите Digispark и подключите его снова или подключите к другому источнику питания, перед запуском запрограммированного вами кода произойдет задержка в 5 секунд. Эта 5-секундная задержка — это проверка Digispark Pro, чтобы узнать, пытаетесь ли вы его запрограммировать.

Шаг 4: Устранение неполадок

Об этом нужно помнить

Digisparks не создают последовательные порты. Программное обеспечение digispark arduino обменивается данными напрямую с digispark через комбинацию необработанных низкоскоростных протоколов USB и протоколов HID, чтобы сэкономить место и быть более совместимым со спецификацией USB.При использовании программного обеспечения Digispark Arduino не имеет значения, что выбрано в списке последовательных портов — ни один из них не используется. Просто убедитесь, что Digispark выбран в меню Programmer, а Digispark (крошечное ядро) выбран в меню Board, и вы должны быть готовы к работе. При использовании программного обеспечения Digispark Arduino не имеет значения, что выбрано в списке последовательных портов — никто не используется. Просто убедитесь, что Digispark выбран в меню Programmer, а Digispark (крошечное ядро) выбран в меню Board, и вы должны быть готовы к работе.
  • Для примеров программ, если вы получаете сообщение «Устройство не найдено» даже после установки драйвера DigiUSB в папке примеров, попробуйте следующее: http://digistump.com/board/index.php/topic, 257.0.html
  • Если Windows не распознает «DigiUSB», а общую пару «HID-совместимое устройство» / «USB-устройство ввода», перейдите в Диспетчер устройств и найдите в категории «Устройства интерфейса пользователя» USB-устройство ввода с идентификатором поставщика. 0x16C0 и выберите «обновить драйвер» / «просмотреть мой компьютер» / «позвольте мне выбрать из списка», и там должен появиться DigiUSB.

Основы: мигание светодиода с помощью AVR

Заставить AVR мигать может показаться невероятно сложной задачей по сравнению с обычным миганием Arduino, но на самом деле это не так! В этом посте мы загрузим базовый пример мигания на ATtiny2313. Это идеально подходит для проектов, где использование Arduino было бы чрезмерным. Итак, приступим!

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

В этом примере мы будем работать на Mac. Есть варианты, доступные для Windows и Linux, суть такая же, как описано в этом посте.

Получите комплект платы разработчика ATtiny2313 и давайте откроем его!

ATtiny2313 является основным чипом в этом наборе. Стоит пролистать таблицу и получить представление о том, как она работает. Посмотрите таблицу здесь.

Припаять все детали. Убедитесь, что гнездо DIP совпадает с выемкой.

Пора добавить светодиод и резистор. В этом примере мы собираемся использовать вывод PB3. Этот вывод особенный, потому что он имеет 16-битный таймер! Это делает его очень приятным в использовании для затухания.

Хотя номера контактов на этой плате «странные», у этого есть много преимуществ, которые вы обнаружите, когда будете делать больше проектов с AVR.

Если вы еще не собрали USBTinyISP, сейчас самое подходящее время для этого. Вы можете следовать инструкциям здесь. Стрелка на приспособлении для крепления проводов совпадает со стрелкой на плате.

Пришло время программной части! Доступен очень удобный пакет, который устанавливает все вместе, под названием Crosspack. Скачайте здесь последнюю версию и установите ее.

Чтобы получить код с компьютера на микросхеме, необходимо скомпилировать и затем загрузить код. Мы можем справиться с этим с помощью make-файла. С помощью короткой команды терминала он будет делать все, что мы указали. Вот make-файл, который мы использовали для этого проекта.

Основные части make-файла, которые необходимо изменить (если вы использовали другой чип или программатор), — это устройство, часы, программатор, объекты и предохранители.

код

УБЕДИТЕСЬ, ЧТО ПРЕДОХРАНИТЕЛИ ПРАВИЛЬНО! Значения в make-файле, который мы используем, установлены для ATtiny2313.Вы действительно можете заблокировать свой AVR, если испортите предохранители. Это то, от чего вас защищает Arduino. Однако, если вы тренируетесь осмотрительность в отношении предохранителей, это не должно быть проблемой. Ознакомьтесь с калькулятором предохранителей AVR здесь.

Если вы используете другой программатор, отличный от USBTinyISP, вам придется изменить переменную PROGRAMMER.

Теперь давайте протестируем make-файл, открыв Терминал ( /Applications/Utilities/Terminal.app ) и введя команду make all .Вы должны увидеть текст, как показано на скриншоте ниже. Если вы этого не сделаете, обязательно исправьте это, прежде чем продолжить, проверив установку Crosspack.

Наконец, самое интересное — написание кода для загрузки в чип! Вы можете посмотреть наш код здесь.

_BV () — это макрос avr для сдвига битов влево. Для включения и выключения светодиода мы устанавливаем PORTB на 8 или 0 соответственно. Отсюда берется функция delay_ms , а число 17500 берется из вычислительного времени, которое требуется для выполнения цикла.Круто а!

Снова введите команду make all в Терминал, так как код изменился с момента последней компиляции. Обязательно исправьте все ошибки, прежде чем продолжить. Подключите USBtinyISP, и теперь давайте загрузим код! Введите команду make install . Вы должны увидеть какой-то длинный текст. На приведенном ниже снимке экрана показана конечная часть кода.

Если бы все было хорошо, теперь у вас есть мигающий светодиод, использующий avr! Совершенно круто, поздравляю! Если что-то не работает, вернитесь и проверьте make-файл, чтобы убедиться, что все в порядке.

Теперь бросьте вызов самому себе, чтобы пойти дальше и поиграть еще больше! Здесь есть отличный список ресурсов. Что ВЫ будете делать со своим avr? Дайте нам знать в Google+ и Twitter или покажите это на вечеринке роботов! Удачного взлома!

Tinyboard: 8-контактная универсальная плата ATTiny

Около

Tinyboard — это небольшая многоцелевая печатная плата (PCB), разработан для приложений, построенных на 8-контактных микроконтроллерах Atmel AVR Tiny (ATTiny25 / 45/85, ATTiny13 и т. Д.).Он разработан, чтобы быть достаточно гибким, чтобы разрешить перепрофилирование каждого вывода с использованием перемычек 0 Ом или других пассивных компонентов.


Характеристики

Малый размер
50 мм на 24,5 мм с двумя монтажными отверстиями M2
Возможность настройки контактов
Возможны различные конфигурации выводов (конечно, не все одновременно):
  • до двух повышающих преобразователей с измерением обратной связи с использованием аналого-цифрового преобразователя ATTiny (например, для питания цепочки светодиодов)
  • до пяти сильноточных коммутируемых выходов, управляемых N-канальными MOSFET-транзисторами (посадочное место SOT-23)
  • до пяти цифровых входов (опционально с внешними понижающими резисторами)
  • до пяти аналоговых входов с входными фильтрами нижних частот
  • до пяти линий цифрового вывода
Примеры конфигурации контактов см. Ниже.
Штекерные разъемы
Каждый вывод ATTiny PB0 — PB4 имеет собственный трехконтактный разъем для подключения внешние устройства. Заголовок имеет отрицательный вывод (обычно GND), положительный вывод (Vcc или Vin, настраивается с помощью 0-омной связи), и вывод ввода / вывода.
Несколько конфигураций питания
На плате две шины питания: нестабилизированное внешнее питание Vin, и стабилизированная мощность Vcc, используемая для питания микроконтроллера ATTiny. Различный возможны конфигурации:
  • с питанием от внешнего стабилизированного напряжения (Vin и Vcc соединены 0-омной линией)
  • питается от двух отдельных источников (Vcc с внешней стабилизацией для самого MCU и Vin для мощных компонентов)
  • питается от нестабилизированного питания Vin с бортовым регулятором напряжения.
Примеры конфигурации питания см. Ниже.
Программируемое внутри системы
Программируется внутри системы с использованием стандартного 10-контактного разъема, совместимого, например, с участием программист USBASP. Контакты, используемые для программирования (MOSI, MISO, SCK), могут быть отключен от остальной цепи во время программирования перемычками (J10 — J30).
Светодиод включения
Светодиодный индикатор включения питания, подключенный между Vcc и GND (разумеется, с резистором)
Запасные части
На плате есть два неподключенных SOT-23 и два посадочных места 1206, можно использовать для добавления дополнительных компонентов, вручную подключенных к остальной системе е.грамм. проводами.
Ручная пайка
Используемые посадочные места достаточно велики, чтобы их можно было также паять вручную. (Использованы следы SO-8, SOT-23, 1206 и 1210).
MCU 150 или 200 мил
Посадочное место микроконтроллера ATtiny (U1) было расширено для размещения узкие детали 8S1 (150 мил) и средние 8S2 (208 мил).
Открытый исходный код
Дизайн доступен в исходном виде на условиях GNU GPLv2 для дальнейшей модификации и развития.

Новости

2013-05-03
Добавлен раздел с примерами приложений, Первым приложением были простые велосипедные светодиодные фонари.
15.03.2013
Незначительные обновления веб-страницы, опубликован zip-файл с файлами Gerber.
14.03.2013
Получено уведомление от человека, который получил две доски Tinyboard через опцию Itead Studio с открытым исходным кодом. Спасибо, что дал мне знать! Однако мои собственные доски все еще находятся в Гонконге.
25.02.2013
файлов Gerber, отправленных в Itead Studio для изготовления. У них минимальный размер 5×5, поэтому я изменил вывод так, чтобы в этом измерении было две крошечные доски.
22.04.2013
Доски наконец-то прибыли, после отъезда из Гонконга более месяца назад. Производитель даже сделал прорезь из просверленных отверстий между ними. панели, чтобы их можно было отсоединить.
25.04.2013
Добавлен новый раздел: Известные ошибки

Примеры приложений

Tinyboard предназначен для перепрофилирования.Вот проекты Я с этим справился.

Простые светодиодные велосипедные фонари

Мне нужен простой светодиодный драйвер для детских велосипедов, проще, чем мои собственные велосипедные фары. Итак, я использовал Tinyboard с одним повышающим драйвером, мониторинг напряжения батареи, одна кнопка (с программным отключением питания) и один индикатор состояния. Tinyboard примерно того же размера, что и батарея 9V, поэтому я выбрал батарею 9V в качестве источника питания. Исходный код прошивки и файл README (содержащий описание прошивки и перечень материалов) доступны в репозитории Tinyboard Git.


Известные ошибки

  • Я, видимо, отправил на фабрику немного старую версию, и там отсутствует соединение между контактом 3 заголовка PB4 и посадочным местом R54. Ничего страшного, для большинства приложений R53 используется вместо R54, а отсутствующий след находится на расстоянии около двух миллиметров, поэтому его можно перекрыть, используя провод.
  • ATiny13 и ATiny25 / 45/85 имеют разные выходные контакты ШИМ, а также АЦП каналы не доступны на каждом контакте. Это означает, что повышающий преобразователь может быть построен на PB4 / PB3 ATtiny25 / 45/85, но не на ATiny13.в Аналогичным образом повышающий преобразователь на PB0 / PB1 может быть построен с использованием ATtiny13. Только. Возможное решение — перенаправить контакты PB0-PB2 на J10-J30 или рядом с ним. перемычки.

Загрузки

Этот проект является бесплатным программным обеспечением и может распространяться на условиях Стандартной общественной лицензии GNU, версия 2 (только).

  • Репозиторий Git (для загрузки используйте «git clone https://www.fi.muni.cz/~kas/git/tinyboard.git»).
  • Файлы плоттера в формате RS-274X («Гербер»): tinyboard-20130225-1807.молния (две панели, обшитые панелями под производственный процесс 5×5 см)
  • Архив с исходным кодом: TBD

Схемы

Схема была разработана с использованием gschem из пакета gEDA и доступна здесь в репозиторий git.


Примеры конфигураций питания

На плате две шины питания: Vin может быть более мощным нестабилизированным. шина для использования с полевыми МОП-транзисторами, а Vcc — это шина, по которой ATTiny MCU. Его напряжение должно соответствовать диапазону входного напряжения ATTiny.Vcc имеет развязывающий конденсатор C3 рядом с самой ATTiny.

Одинарная внешне стабилизированная мощность
Когда стабилизированное напряжение подается извне, его можно напрямую подключен к контакту 1 заголовка PWR1 (и контакту 2 для GND). Линии Vcc и Vin могут быть соединены вместе 0-омным звеном R2. U2 и U3 опущены, развязывающие конденсаторы C1 и C2 также могут быть опущены.
Две внешние шины питания
Шина для питания MCU должна быть подключена к контакту 1 разъема PWR1, GND к контакту 2 PWR1 и другой линии питания (возможно, более высокое напряжение для управляемые полевыми МОП-транзисторами) к линии контакта 3.U2 и U3 опущены, развязывающие конденсаторы C1 и C2 также могут быть опущены.
Источник нестабилизированный
Требуется регулятор напряжения: либо с посадочным местом SOT-23 как U2, например MCP170x или более крупный с посадочным местом SOT-223 как U3 (остерегайтесь распиновка, есть стабилизаторы напряжения СОТ-223 с разной распиновкой; этой плате необходимо, чтобы контакт 1 U3 был GND, контакт 2 и контакт (контакт 4) был Vout, а контакт 3 — Vin). Входящее питание должно быть подключено к контакту 3 разъем PWR1, а отрицательная сторона (GND) — к контакту 2.R2 опущен, необходимо выбрать C1 и C2. как рекомендовано для данного регулятора напряжения.


Примеры конфигураций контактов ввода / вывода

Каждый из пяти контактов ввода / вывода имеет свой собственный заголовок, от PB0 до PB4. Заголовок имеет три контакта:

  • Контакт 1 либо подключен к GND (заголовки PB1 — PB3), либо может быть подключенным к GND с помощью небольшого резистора или 0-омного звена R15 и R55. (Заголовки PB0 и PB4). Этот резистор можно использовать для измерения ток на выходе повышающего преобразователя, если он используется.
  • Контакт 2 либо подключен к соответствующему контакту ATTiny, либо к сток полевого МОП-транзистора или выход повышающего преобразователя.
  • Контакт 3 может быть подключен к Vin с помощью R13 — R53 (либо напрямую с 0-омные линки, или косвенно с ненулевыми резисторами). Или это может быть связано к Vcc с помощью 0-омных перемычек R14 — R54 или резисторов.

Прямой контакт
Чтобы напрямую подключить контакт ATTiny к контакту 2 соответствующего разъема, используйте 0-омное соединение Rx2 (R12 — R52).Полностью опустите Qx0, Rx0, Lx0, Dx0, Rx1 и Cx1.
Штифт с внешним вытягиванием, низкий
То же, что и выше, но используйте резистор Rx0 (от R10 до R50) в качестве резистора с малой нагрузкой.
Входной фильтр нижних частот для аналого-цифрового преобразователя
Поместите конденсатор вместо резистора на посадочное место Rx0 и используйте R12 как входной резистор. Все остальные Qx0, Dx0, Lx0, Rx1 и Cx1 можно опустить.
Выход, управляемый полевым МОП-транзистором
Используйте полевой МОП-транзистор с посадочным местом SOT-23 в качестве Qx0, потяните затвор ниже с помощью Rx0, и подключите сток к контакту 2 соответствующего заголовка, используя Rx1 (R11 — R51).Сократите посадочное место диода (D10, D50) для разъема PB0 и PB4.
Повышающий преобразователь
Можно использовать до двух повышающих преобразователей: первый с заголовком PB0, который также использует вывод PB1 ATTiny в качестве входа аналого-цифрового преобразователя для обратной связи. измерение, а второй с разъемом PB4 и выводом PB3 ATTiny как ADC. Поместите индуктор на L10 или L50, MOSFET с посадочным местом SOT-23 как Q10 или Q50, потяните затвор MOSFET на низкий уровень с помощью R10 или R50, поместите 0-омную ссылку как R11 и Диод Шоттки как D10 или D50.Используйте большой конденсатор как C11 или C51 и малый измерительный резистор R15 или R55. Для измерения обратной связи создайте входной фильтр нижних частот на PB1 или PB3 соответственно: используйте R25 / R45 в качестве входного резистора, и поставил небольшой конденсатор на посадочное место R20 / R40. Используйте выход PWM на PB0 / PB4, и вход аналого-цифрового преобразователя на PB1 / PB3. См. Теорию на странице в Википедии о преобразователе ускорения.

alexxlab

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *