ATtiny24 |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Общее описание ресурсов и возможностей микроконтроллера ATtiny24. 1. 32 рабочих регистра, flash 2К программ, 128 SRAM, 128 EEPROM. 2. SOIC-14, 12 портов ввода вывода, PB3..PB0, PA7..PA0. Чтобы использовать PB3 в качестве порта ввода-вывода, нужно запрограммировать в 0 fuse RSTDISBL (по умолчанию эта ножка работает как RESET или порт debugWIRE - вывод 4). 3. Аппаратные ресурсы - Один 8-битный и один 16-битный таймер, каждый из них может генерить 2 PWM. 4. Регистры SREG - регистр статуса, отражает результат арифметических операций. Регистры X Y Z (15 бит). SPH and SPL – Stack Pointer High and Low Стек расходуется в сторону уменьшения адресов. Каждое прерывание или вызов подпрограммы уменьшает стек на 2, а каждый возврат из подпрограммы - увеличивает на 2. 5. Каждое прерывание имеет индивидуальный бит разрешения прерывания. Есть еще Global Interrupt Enable bit в SREG. Для сброса и векторов прерывания выделены самые младшие ячейки памяти программ (по 2 ячейки на вектор). Чем меньше адрес (номер) вектора, тем выше его приоритет. Таким образом, RESET имеет наивысший приоритет, далее идет INT0. Когда происходит прерывание, общий бит разрешения приоритета очищается (SREG Bit 7 – I: Global Interrupt Enable), и все прерывания при этом запрещаются. Программа пользователя, однако, может записать в бит I единичку, разрешив тем самым вложенные прерывания, при этом все разрешенные прерывания могут прервать выполнение уже начавшегося прерывания (большое отличие от архитектуры MCS51). Бит I автоматически устанавливается при выполнении инструкции RETI (возврат из прерывания). Прерывание срабатывает с задержкой как минимум 4 такта. Имеется 2 основных типа прерывания. Когда используется инструкция CLI, все прерывания немедленно запрещаются. Более не будут вызываться прерывания, даже если хотя бы одно из них произошло одновременно с CLI. Пример показывает использование CLI для корректной записи в EEPROM: ;[Пример кода на ассемблере] in r16, SREG ; сохранить значение SREG cli ; запрет прерываний во время критичных операций sbi EECR, EEMPE ; запуск записи в EEPROM sbi EECR, EEPE out SREG, r16 ; восстановление значения SREG (бит I) //[Пример кода на языке C]
char cSREG; cSREG = SREG; // сохранить значение SREG _CLI(); // запрет прерываний во время критичных операций EECR |= (1 << EEMPE); // запуск записи в EEPROM EECR |= (1 << EEPE); SREG = cSREG; // восстановление значения SREG (бит I) Когда выполняется инструкция SLI, разрешающая прерывания, инструкция сразу за SLI будет выполнена до любого прерывания. ;[Пример кода на ассемблере] sei ; установка флага Global Interrupt Enable ; (глобальное разрешение прерываний) sleep ; вход в режим сна, ожидание прерывания ; Внимание: будет произведен вход в режим сна перед любыми
; прерываниями, ожидающими своей обработки.
//[Пример кода на языке C] _SEI(); // установка флага Global Interrupt Enable // (глобальное разрешение прерываний) _SLEEP(); // вход в режим сна, ожидание прерывания /* Внимание: вход в режим сна будет произведен перед любыми прерываниями, ожидающими своей обработки. */
6. 2К байт памяти программ позволяет сохранять 1024 команды (каждая команда требует 2 байта). Нижние (младшие) ячейки памяти SRAM совмещают 32 регистра общего назначения (R0..R31, 0x0000..0x001F), 64 регистра ввода/вывода (0x0020..0x005F) и 128 Internal SRAM (0x0060..0x00DF). Доступ к ячейкам SRAM требует 2 цикла. Если к регистрам ввода/вывода обращаются с помощью команд IN и OUT, то должны использоваться адреса 0x00..0x3F, если же используются инструкции LD/LDS/LDD и ST/STS/STD (которые также применяются для доступа к R0..R31 и SRAM), то для регистров ввода/вывода к адресу добавляется смещение 0x20. 7. EEPROM организовано как отдельное пространство размером в 128 байт. Обмен с EEPROM происходит через EEPROM Address Registers, EEPROM Data Register, and the EEPROM Control Register (эти регистры находятся среди ранее упомянутых 64 регистров ввода/вывода). EEPROM можно записывать/считывать побайтно как с помощью программы микроконтроллера, так и через интерфейс SPI с помощью программатора. После записи байта EEPROM некоторое время недоступно (связано с технологией flash), и программы микроконтроллера имеет возможность определить момент, когда запись окончена. EEARH – EEPROM Address Register, старший байт 0x1F (0x3F). Для ATtiny24 все биты этого регистра зарезервированы и должны быть записаны в 0. Регистр EECR содержит важный набор битов для управления EEPROM (биты 6 и 7 зарезервированы). 5 EEPM1
Запись стартует при записи бита EEPE. Если бит EEPE установлен, то запись любых значений в EEPM1 и EEPM0 игнорируется. RESET сбрасывает EEPM1 и EEPM0 в 0, даже если активна операция записи. 3 EERIE: EEPROM Ready Interrupt Enable. Если этот бит установлен, то включается прерывание (constant interrupt), когда EEPROM готова к записи. 2 EEMPE: EEPROM Master Program Enable. Этот бит определяет, будет ли запись 1 в EEPE иметь эффект или нет. Когда EEMPE установлен, то установка EEPE в течение 4-х циклов запускает запись в EEPROM. Если EEMPE==0, то установка EEPE не дает никакого эффекта. Когда программно бит EEMPE установлен, то он аппаратно очищается после 4-х циклов. 1 EEPE: EEPROM Program Enable. Запись 1 запускает процесс записи в соответствии с установленным режимом (если EEMPE установлен, см. значение бита EEMPE). Бит EEPE очищается аппаратно по окончании цикла записи. Когда EEPE установлен, то процессор останавливается на 2 цикла перед выполнением следующей инструкции. 0 EERE: EEPROM Read Enable. Запускает чтение, после этой инструкции процессор останавливается на 4 цикла перед выполнением следующей инструкции, и потом считанные данные сразу доступны в регистре EEDR. Перед чтением нужно обязательно убедиться, что бит EEPE==0 - пока процесс записи не завершен, невозможно ни читать из EEPROM, ни изменять регистры EEARH и EEARL. Для предотвращения порчи содержимого EEPROM при медленном нарастании питания необходимо включить внутренний Brown-out Detector (BOD), который удерживает микроконтроллер в состоянии сброса, пока напряжение питания не придет в норму. 8. Все зарезервированные биты должны записываться 0 для обеспечения совместимости с последующими версиями AVR. 9. Есть 3 регистра ввода/вывода общего назначения (General Purpose I/O Register), которые можно использовать просто как ячейки памяти. 10. Для программирования работы тактового генератора есть специальные fuses: - CKSEL3..0, выбор режима тактового генератора, при поставке с завода имеют состояние 0010, что означает калиброванный внутренний генератор 8 МГц. ПО пользователя может перезаписать значение бит CLKPS3..0, поменяв значение регистра CLKPR. Clock Prescale Register – CLKPR Перезапись бита CLKPCE во время этого периода тайм-аута не продлевает этот период. Не устанавливайте бит CLKPCE в 0. Bits 3..0 – CLKPS3..0: Clock Prescaler Select Bits 3 - 0 Для корректного изменения частоты служит специальная процедура (предназначенная для исключения случайной смены тактовой частоты): Пример: CLKPR = 0x80; CLKPR = 0x03; //частота выбранного источника будет делиться на 8 // (это значение по умолчанию после стирания // ATtiny24, или при поставке с завода). Таким образом, при поставке с завода ATtiny запрограммирован на работу от внутреннего генератора 8 МГц, при этом тактовая частота ядра будет 1 МГц, никаких внешних компонентов не требуется. Есть специальный регистр OSCCAL, адрес 0x31 (0x51), для точной калибровки частоты внутреннего генератора (точнее, чем на заводе). 11. Управление питанием и режимы сна. Существует много режимов энергосбережения - Idle, ADC Noise Reduction, Power-down, Stand-by. За подробностями лучше обратиться к руководству. Режимом управляет регистр MCUCR – MCU Control Register, адрес 0x35 (0x55), в этом регистре энергопотреблением управляют биты: Для входа в режим энергопотребления выбирается режим энергопотребления, устанавливается бит SE и выполняется команда SLEEP. Для более точного управления энергопотреблением для отключения отдельных узлов применяют регистр 12. В ATtiny24 есть источник опорного напряжения (Internal Voltage Reference), используемое для BOD, и может использоваться как входное для ADC и компаратора. Для экономии питания Internal Voltage Reference заключается только в следующих случаях: - разрешен BOD (программированием BODLEVEL [2..0] Fuse). 13. Для сброса Watchdog Timer (WDT) есть команда WDR. Сброс WDT также происходит при сбросе чипа и когда WDT запрещен. WDT тактируется от внутреннего генератора 128 КГц. WDT может быть сконфигурирован для генерирования прерывания вместо сброса. Это весьма полезно для просыпания из режима Power-down. Fuse WDTON управляет режимом включения WDT, см. datasheet. 14. MCUSR – MCU Status Register 0x34 (0x54) Флаги этого регистра показывают, от какого источника произошел сброс. 15. WDTCSR – Watchdog Timer Control and Status Register 0x21 (0x41) 16. Прерывания, их вектора: Таблица 1. Внешние прерывания срабатывают по ножке INT0 или любой из PCINT11..0. Они даже срабатывают, если INT0 или PCINT11..0 сконфигурированы как выходы, что делает возможным программные прерывания. Прерывание PCI0 срабатывает, если меняется любая из разрешенных ножек PCINT7..0, PCI1 - если меняется любая из разрешенных PCINT11..8. Регистры PCMSK0 и PCMSK1 управляют этим. Прерывания по изменению PCINT11..0 детектируются асинхронно. Это включает, кроме того, просыпание устройства из энергосберегающих режимов, кроме Idle mode. Таблица 2. Вместе с I битом Status Register (SREG) разрешает прерывание от внешнего сигнала. Биты ISC01..0 управляют типом срабатывания. Прерывание срабатывает, даже если ножка INT0 сконфигурирована как выход. Вектор прерывания External Interrupt Request - INT0. Вместе с I битом Status Register (SREG) разрешает прерывание от изменения на любой ножке PCINT11..8. Каждая ножка PCINT11..8 разрешается индивидуально регистром PCMSK1. Вектор прерывания Pin Change Interrupt Request - PCI1. GIFR – General Interrupt Flag Register PCMSK1 – Pin Change Mask Register 1 PCMSK0 – Pin Change Mask Register 0 17. Все порты AVR имеют подлинную функциональность Read-Modify-Write. Это означает, что режим работы любого одного порта можно поменять свободно (командами SBI и CBI) без нежелательного изменения состояния остальных портов. То же самое относится и к изменению логического состояния выходов и разрешения/запрещения верхних нагрузочных резисторов для входов. Выходной буфер симметричен снизу и сверху (это не открытый сток или коллектор), имеет нагрузочную способность достаточную, чтобы управлять светодиодом (само собой, через резистор). Все ножки имеют защитные диоды по плюсу и минусу. После включения питания/сброса все выводы находятся в третьем состоянии, нагрузочные резисторы (pull-up) отключены. Для каждого порта (а их у ATtiny два - A и B) есть 3 регистра - Data Register – PORTx, Data Direction Register – DDRx, и Port Input Pins – PINx (вместо x подставляется A или B). В регистре MCUCR есть еще бит PUD, который запрещает нагрузочные верхние резисторы на ножках потов (pull-up), сразу на всех. Если в DDRxn (вместо x подставляется A или B, вместо n подставляется номер бита порта) записан 1, то Pxn работает как выход, если 0, то как вход. Если в PORTxn записывается 1 и ножка Pxn сконфигурирована как вход, то активируется pull-up резистор. Чтобы отключить этот резистор, нужно записать в PORTxn лог. 0 или сконфигурировать ножку Pxn как выход. Ножка порта находится в третьем (отключенном) состоянии, когда активен сброс, а также если отсутствует тактовый сигнал. Если в PORTxn записывается 1 и ножка Pxn сконфигурирована как выход, то включается верхний ключ Pxn (на выходе 1), если в PORTxn записывается 0, то включается нижний ключ (на выходе 0). Записью лог. 1 в PINxn переключает величину PORTxn на противоположную, независимо от состояния DDRxn. Таким образом, инструкция SBI может использоваться для смены состояния одиночного бита порта. Переключение режима порта между входом и выходом. Когда происходит переключение от третьего состояния ({DDxn, PORTxn} = 0b00) до выходного состояния high ({DDxn, PORTxn} = 0b11), может с равной вероятностью произойти промежуточное состояние либо разрешенное pull-up ({DDxn, PORTxn} = 0b01), либо выходной ноль ({DDxn, PORTxn} = 0b10). Переключение между входом с pull-up и выходом low дает аналогичную проблему. Чтобы избежать этого, пользователь должен использовать промежуточное состояние - либо третье состояние ({DDxn, PORTxn} = 0b00), либо выходное состояние high ({DDxn, PORTxn} = 0b10). Таблица 3 суммирует алгоритм управления портами:
Независимо от состояния Data Direction bit DDxn, порт можно прочитать через PINxn Register bit. Чтение порта стробируется тактовой частотой и сигнал также проходит с физической ножки через триггер Шмитта. В результате происходит физическая задержка чтения данных. Пример показывает, как установить PB0 и PB1 в high, PB2 и PB3 в low, задать PB4 и PB5 как входы и включить pull-up на PB4. ;[Пример кода на ассемблере]
; Задать нагрузочные резисторы и установить выходы в лог. 1.
; Задать направление (вход или выход) для выводов порта. ldi r16, (1 << PB4) |(1 << PB1) |(1 << PB0) ldi r17, (1 << DDB3)|(1 << DDB2)|(1 << DDB1)|(1 << DDB0) out PORTB,r16 out DDRB,r17 ; Вставка команды nop для синхронизации: nop ; Чтение выводов портов: in r16,PINB Если используется режим Sleep, то для входов прочитайте из datasheet раздел Digital Input Enable and Sleep Modes. 18. Неиспользуемые ножки лучше куда-нибудь подключить. Самый простейший способ - сконфигурировать их как вход с включенным pull-up. Если требования к энергопотреблению в режиме RESET высокие, то лучше использовать внешние pull-up или pull-down. Прямое подключение к земле (GND) или к питанию (Vcc) не рекомендуется, поскольку это может генерировать большие токи при случайном конфигурировании этих портов как выходов. 19. Есть 3 технологии доступа снаружи к содержимому микроконтроллера. - debugWIRE Используются 3 провода - GND (подсоединяется к ножке GND ATtiny24), Vcc (подсоединяется к ножке Vcc ATtiny24), RESET (подсоединяется к ножке RESET ATtiny24). Технология debugWIRE применяется для отладки. Для передачи сигналов в двух направлениях debugWIRE использует только одну ножку процессора - RESET. Чтобы технология debugWIRE заработала, нужно запрограммировать debugWIRE Enable fuse DWEN (DWEN=0). С завода ATtiny24 поставляется с незапрограммированной DWEN (DWEN=1), и при этом debugWIRE запрещена. При использовании debugWIRE желательно иметь ножку RESET свободной от внешних компонентов - pull-up резистор не требуется, а если он есть, то должен быть не менее 10 кОм, и не должно быть никаких конденсаторов. При старте AVR Studio проверяет доступность debugWIRE, и если debugWIRE не работает (DWEN=1), то AVR Studio предлагает разрешить debugWIRE (DWEN=0) с помощью ISP. Для этого к ATtiny24 должны быть подключены все 6 проводов интерфейса ISP (см. далее). Как только DWEN fuse запрограммирован (DWEN=0), для дальнейшей отладки нужны только 3 провода интерфейса debugWIRE, остальные неиспользуемые ножки ISP-интерфейса AT JTAGICE2 переводятся в высокоимпедансное состояние. - ISP In System Programming - интерфейс программирования ATtiny24. В этом режиме можно программировать память программ (Flash) и энергонезависимую память (EEPROM). В качестве ISP программатора может выступать AVR JTAGICE mkII или другой (в Интернете можно найти описание простых ISP-программаторов, использующих LPT). Эмулятор AVR JTAGICE mkII имеет оба интерфейса - debugWIRE и ISP. Сигналы этих интерфейсов находятся на одном и том же разъеме (см. далее). Если DWEN fuse запрограммирован (DWEN=0), то работает debugWIRE, и режим ISP для AVR JTAGICE mkII отключен, и наоборот, если DWEN fuse не запрограммирован (DWEN=1), то работает только ISP. Переход ISP-->debugWIRE происходит путем записи DWEN=0 с помощью ISP. Для возврата из режима debugWIRE-->ISP применяется специальная процедура (эти действия происходят в AVR Studio): 1. Подсоединяем AVR JTAGICE mkII к целевой плате через 6-штырьковый интерфейс ISP (см. ниже). ISP-интерфейс состоит из 6 проводов: Таблица 4
На рисунке показана цоколевка ISP-разъема для подключения AT JTAGICE2 (это вид на штырьки папы, устанавливаемые на печатную плату, пайка на заднем плане). В таблице номера штырьков разъема указаны в первом столбце, а цвета проводов на кабеле AVR JTAGICE mkII - в третьем столбце. В АTtiny24 для интерфейса ISP задействованы ножки интерфейса SPI: Таблица 5
Чтобы можно было легко подключать эмулятор AVR JTAGICE mkII для отладки через debugWIRE и для внутрисхемного программирования чипа через технологию ISP, целесообразно придерживаться при проектировании устройства следующих правил: Если условия а), б), в) выполняются, то можно спокойно развести 6-штырьковый коннектор ISP на плате в соответствии с таблицей 5 и рисунком 1, и использовать этот коннектор для debugWIRE и ISP. - High-Voltage Programming - программирование с использованием программатора, обычно для чипа, не впаянного в плату. В этом режиме можно программировать память программ (Flash) и энергонезависимую память (EEPROM), "перемычки" (fuses), и биты защиты (Lock bits). Интерфейс использует 7 проводов. На ATtiny24 используются те же ножки, что и в интерфейсе ISP, только функция их несколько меняется, и добавляется еще ножка 2, порт PB0 (см. datasheet). 20. ADC 10 бит, абсолютная точность +-2 младших бита, время преобразования 13..260 мкс, 8 мультиплексированных каналов, 12 дифференциальных каналов с программируемым усилением (x1 или x20), на одном канале ADC температурный сенсор, 1.1V встроенное эталонное напряжение и многое другое. Входы ADC заведены на порт A - PA0..PA7 и называются ADC0..ADC7. Девятый канал ADC8 заведен на термодатчик. В качестве опорного напряжения может использоваться внутренний опорный стабилизатор 1.1V, Vcc (для недифференциальных 8-ми каналов) или внешнее опорное напряжение (при этом внутренний опорный стабилизатор 1.1V отключается, чем экономится электроэнергия). ADMUX – ADC Multiplexer Selection Register -----+-----+---------------------------------------------------------------------------------- Канал мультиплексора и дифференциальное усиление выбирается оставшимися битами регистра ADMUX - MUX5..0. Возможно дифференциальное измерение между входами и включение усиления (бит MUX0). Более подробно смотрите datasheet. Термодатчик выбирается кодом “100010”в MUX5..0. По поводу корректной смены канала перед измерениями читайте datasheet. ADCSRA – ADC Control and Status Register A ADC Prescaler Selections
ADCL и ADCH – ADC Data Register DIDR0 – Digital Input Disable Register 0 |