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.
- 8-канальный 10-битный ADC со входами на PA0..PA7
- Измеритель температуры.
- Программируемый WDT с собственным генератором.
- Компаратор.
- Universal Serial Interface (USI).
- Отладка debugWIRE через 1 провод (PB3 или ~RESET). Это однопроводной аналог JTAG.
- Программирование в системе через порт SPI.
- Программируемое прерывание по изменению любого из 12 портов.
- Внутренний калиброванный генератор тактов.

4. Регистры

SREG - регистр статуса, отражает результат арифметических операций.
Регистровый файл из 32 ячеек находится с адреса 0x00 (R0) до адреса 0x1F (R31).

Регистры X Y Z (15 бит).
   R26    0x1A    X low byte
   R27    0x1B    X high byte
   R28    0x1C    Y low byte
   R29    0x1D    Y high byte
   R30    0x1E    Z low byte
   R31    0x1F    Z high byte

SPH and SPL – Stack Pointer High and Low
   0x5D   SPL
   0x5E   SPH

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

5. Каждое прерывание имеет индивидуальный бит разрешения прерывания. Есть еще Global Interrupt Enable bit в SREG. Для сброса и векторов прерывания выделены самые младшие ячейки памяти программ (по 2 ячейки на вектор). Чем меньше адрес (номер) вектора, тем выше его приоритет. Таким образом, RESET имеет наивысший приоритет, далее идет INT0. Когда происходит прерывание, общий бит разрешения приоритета очищается (SREG Bit 7 – I: Global Interrupt Enable), и все прерывания при этом запрещаются. Программа пользователя, однако, может записать в бит I единичку, разрешив тем самым вложенные прерывания, при этом все разрешенные прерывания могут прервать выполнение уже начавшегося прерывания (большое отличие от архитектуры MCS51). Бит I автоматически устанавливается при выполнении инструкции RETI (возврат из прерывания). Прерывание срабатывает с задержкой как минимум 4 такта.

Имеется 2 основных типа прерывания.
- первый тип срабатывает по событию, устанавливающему Interrupt Flag. Для этих прерываний программный счетчик устанавливается на соответствующий вектор прерывания для выполнения подпрограммы прерывания, и аппаратура сама очищает Interrupt Flag. Interrupt Flag может быть также очищен записью в него 1 (кажется нелогичным). Если условие прерывания произошло, когда соответствующий Interrupt Flag очищен, но этот Interrupt Flag устанавливается и запоминается до момента, пока это прерывание не будет разрешено (выполнится), либо пока этот Interrupt Flag не будет очищен программно (записью 1). Таким образом, при очищенном I-флаге события прерывания запоминаются в своем Interrupt Flag и ждут своего часа, чтобы выполниться в порядке своего приоритета, когда I-флаг будет установлен.
- второй тип прерываний срабатывает в течение всего времени присутствия условия прерывания. Эти прерывания не всегда имеют Interrupt Flag. Если условие прерывания исчезнет до момента разрешения прерывания, то такое прерывание не произойдет.
Когда AVR выходит из прерывания, он обязательно выполнит одну или несколько инструкций основной программы, даже если имеются ожидающие в очереди прерывания. SREG не сохраняется автоматически при выполнении прерываний, это должна делать программа обработки прерывания.

Когда используется инструкция 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.
EEARL – EEPROM Address Register, младший байт 0x1E (0x3E). Для ATtiny24 старший бит 7 этого регистра зарезервирован и должны быть записан в 0.
EEDR – EEPROM Data Register, 0x1D (0x3D)
EECR – EEPROM Control Register, 0x1C (0x3C)

Регистр EECR содержит важный набор битов для управления EEPROM (биты 6 и 7 зарезервированы).

5 EEPM1
4 EEPM0
Эти 2 бита определяют режим записи в EEPROM - см. таблицу

EEPM1 EEPM0 Время записи Режим функционирования
0 0 3.4 мс Atomic Operation - стирание и запись сразу
0 1 1.8 мс только стирание
1 0 1.8 мс только запись
1 1 - зарезервировано

Запись стартует при записи бита 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), которые можно использовать просто как ячейки памяти.
GPIOR2   0x15 (0x35)
GPIOR1   0x14 (0x34)
GPIOR0   0x13 (0x33)

10. Для программирования работы тактового генератора есть специальные fuses:

- CKSEL3..0, выбор режима тактового генератора, при поставке с завода имеют состояние 0010, что означает калиброванный внутренний генератор 8 МГц.
- SUT1..0, время старта генератора, при поставке с завода имеет значение 10, что предназначено для старта с медленным возрастанием напряжения питания.
- CKDIV8, предустановленный фактор делителя тактовой частоты, при поставке с завода запрограммирован (CKDIV8=0). Это означает такое состояние бит CLKPS3..0 после сброса (0011), что частота тактового генератора делится на 8. Если этот бит не запрограммировать, то деления тактовой частоты не будет, при этом при сбросе биты CLKPS3..0 получают состояние 0000.

ПО пользователя может перезаписать значение бит CLKPS3..0, поменяв значение регистра CLKPR.

Clock Prescale Register – CLKPR
0x26 (0x46)
Bit 7 – CLKPCE: Clock Prescaler Change Enable
Бит CLKPCE должен быть установлен непосредственно перед изменением бит прескалера CLKPS3..0 (см. их описание далее), причем бит CLKPCE обновляется только тогда, когда остальные биты CLKPR сброшены в 0 (т. е. в CLKPR нужно записать для этого 0x80). Бит CLKPCE очищается аппаратно после 4-х циклов или сразу после записи бит CLKPS3..0.

Перезапись бита CLKPCE во время этого периода тайм-аута не продлевает этот период. Не устанавливайте бит CLKPCE в 0.

Bits 3..0 – CLKPS3..0: Clock Prescaler Select Bits 3 - 0
Выбирает делитель между выбранным источником тактов и внутренней тактовой частотой (internal system clock). Эти биты могут меняться runtime для подстройки тактовой частоты под требования выполняемой программы.

Для корректного изменения частоты служит специальная процедура (предназначенная для исключения случайной смены тактовой частоты):
- запись в CLKPR числа 0x80 - это устанавливает бит разрешения смены частоты и сбрасывает все остальные биты.
- сразу, в течение 4 тактов, записывают в CLKPR новый делитель частоты (биты CLKPS3..0) и очищают CLKPCE.

Пример:

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), в этом регистре энергопотреблением управляют биты:
Bit 5 – SE: Sleep Enable
Bits 4, 3 – SM1..0: Sleep Mode Select Bits

Для входа в режим энергопотребления выбирается режим энергопотребления, устанавливается бит SE и выполняется команда SLEEP.

Для более точного управления энергопотреблением для отключения отдельных узлов применяют регистр
PRR – Power Reduction Register, адрес 0x00 (0x20).

12. В ATtiny24 есть источник опорного напряжения (Internal Voltage Reference), используемое для BOD, и может использоваться как входное для ADC и компаратора. Для экономии питания Internal Voltage Reference заключается только в следующих случаях:

- разрешен BOD (программированием BODLEVEL [2..0] Fuse).
- когда bandgap reference подключено к компаратору (установкой бита ACBG в регистре ACSR).
- когда разрешен ADC.

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.
-----------+-------------+------------------+----------------------------------
№ вектора  | Адрес       |  Источник        | Определение прерывания
-----------+-------------+------------------+----------------------------------
1          | 0x0000      |  RESET           | External Pin, Power-on Reset,
           |             |                  | Brown-out Reset, Watchdog Reset
2          | 0x0001      |  EXT_INT0        | External Interrupt Request 0
3          | 0x0002      |  PCINT0          | Pin Change Interrupt Request 0
4          | 0x0003      |  PCINT1          | Pin Change Interrupt Request 1
5          | 0x0004      |  WATCHDOG        | Watchdog Time-out
6          | 0x0005      |  TIM1_CAPT       | Timer/Counter1 Capture Event
7          | 0x0006      |  TIM1_COMPA      | Timer/Counter1 Compare Match A
8          | 0x0007      |  TIM1_COMPB      | Timer/Counter1 Compare Match B
9          | 0x0008      |  TIM1_OVF        | Timer/Counter1 Overflow
10         | 0x0009      |  TIM0_COMPA      | Timer/Counter0 Compare Match A
11         | 0x000A      |  TIM0_COMPB      | Timer/Counter0 Compare Match B
12         | 0x000B      |  TIM0_OVF        | Timer/Counter0 Overflow
13         | 0x000C      |  ANA_COMP        | Analog Comparator
14         | 0x000D      |  ADC             | ADC Conversion Complete
15         | 0x000E      |  EE_RDY          | EEPROM Ready
16         | 0x000F      |  USI_STR         | USI START
17         | 0x0010      |  USI_OVF         | USI Overflow
-----------+-------------+------------------+----------------------------------

Внешние прерывания срабатывают по ножке INT0 или любой из PCINT11..0. Они даже срабатывают, если INT0 или PCINT11..0 сконфигурированы как выходы, что делает возможным программные прерывания. Прерывание PCI0 срабатывает, если меняется любая из разрешенных ножек PCINT7..0, PCI1 - если меняется любая из разрешенных PCINT11..8. Регистры PCMSK0 и PCMSK1 управляют этим. Прерывания по изменению PCINT11..0 детектируются асинхронно. Это включает, кроме того, просыпание устройства из энергосберегающих режимов, кроме Idle mode.
INT0 может срабатывать по фронту, спаду, и по фронту и спаду вместе, а также по низкому уровню, что управляется MCU Control Register – MCUCR, 0x35 (0x55), биты ISC01..0

Таблица 2.
-----+-----+-----------------------------------------------------------------ISC01|ISC00|Описание
-----+-----+-----------------------------------------------------------------
0    |0    |низкий уровень INT0 генерирует запрос на прерывание.
0    |1    |любое изм. лог. состояния INT0 генерирует запрос на прерывание.
1    |0    |спад на INT0 генерирует запрос на прерывание.
1    |1    |фронт на INT0 генерирует запрос на прерывание.
-----+-----+-----------------------------------------------------------------
GIMSK – General Interrupt Mask Register
0x3B (0x5B), имеет следующие биты:
Bit 6 – INT0: External Interrupt Request 0 Enable

Вместе с I битом Status Register (SREG) разрешает прерывание от внешнего сигнала. Биты ISC01..0 управляют типом срабатывания. Прерывание срабатывает, даже если ножка INT0 сконфигурирована как выход. Вектор прерывания External Interrupt Request - INT0.
Bit 5 – PCIE1: Pin Change Interrupt Enable 1

Вместе с I битом Status Register (SREG) разрешает прерывание от изменения на любой ножке PCINT11..8. Каждая ножка PCINT11..8 разрешается индивидуально регистром PCMSK1. Вектор прерывания Pin Change Interrupt Request - PCI1.

GIFR – General Interrupt Flag Register
0x3A (0x5A), флаги:
Bit 6 – INTF0: External Interrupt Flag 0 сигнализирует (лог. 1) о срабатывании прерывания INT0. Флаг очищается автоматически, если выполняется процедура по вектору прерывания INT0. Флаг можно очистить программно, записав туда лог. 1. Флаг всегда очищается, когда прерывание INT0 сконфигурировано как прерывание по уровню.
Bit 5 – PCIF1: Pin Change Interrupt Flag 1. То же самое, только сигнализирует о прерывании по изменению ножек PCINT11..8.
Bit 4– PCIF0: Pin Change Interrupt Flag 0. То же самое, только сигнализирует о прерывании по изменению ножек PCINT7..0.

PCMSK1 – Pin Change Mask Register 1
0x20 (0x40), биты:
Bits 3..0 – PCINT11..8: Pin Change Enable Mask 11..8
Единичка в соответствующем бите разрешает прерывание на соответствующей ножке PCINT11..8

PCMSK0 – Pin Change Mask Register 0
0x12 (0x32)
Bits 7..0 – PCINT7..0: Pin Change Enable Mask 7..0. Единичка в соответствующем бите разрешает прерывание на соответствующей ножке PCINT7..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 суммирует алгоритм управления портами:

DDxn PORTxn PUD в MCUCR I/O Pull-up Примечание
0 0 X Input нет Tri-state (Hi-Z, третье состояние)
0 1 0 Input да Pxn дает вытекающий ток, если вывод снаружи подтянут к лог. 0.
0 1 1 Input нет Tri-state (Hi-Z, третье состояние)
1 0 X Output нет Output Low (Sink, открыт нижний ключ, верхний ключ закрыт)
1 1 X Output нет Output High (Source, открыт верхний ключ, нижний ключ закрыт)

Независимо от состояния 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 (см. ниже).
2. В сессии отладки, в меню Debug открываем "JTAGICE mkII Options", выбираем закладку "Connections".
3. Жмем на кнопу "disable debugWIRE".

ISP-интерфейс состоит из 6 проводов:

Таблица 4

имя цвет Функция Описание
1 MISO серый Master In – Slave Out Данные, принимаемые ISP-программатором от ATtiny24
2 Vcc фиол. ISP Power Питание
3 SCK чёрный Shift Clock Такты программирования, генерируются ISP-программатором
4 MOSI красн. Master Out - Slave In Данные, передаваемые в ATtiny24
5 RESET зелён. Target MCU Reset Сброс от ISP-программатора. Программирование осуществляется в состоянии сброса ATtiny24 - на ножке 4 (PB3 RESET) лог. 0
6 GND белый Ground  

На рисунке показана цоколевка ISP-разъема для подключения AT JTAGICE2 (это вид на штырьки папы, устанавливаемые на печатную плату, пайка на заднем плане). В таблице номера штырьков разъема указаны в первом столбце, а цвета проводов на кабеле AVR JTAGICE mkII - в третьем столбце.
Рисунок 1

В АTtiny24 для интерфейса ISP задействованы ножки интерфейса SPI:

Таблица 5

имя цвет Ножка ATtiny24
1 MISO серый выв. 8, порт PA5
2 Vcc фиол. выв. 1
3 SCK чёрный выв. 9, порт PA4
4 MOSI красн. выв. 7, порт PA6
5 RESET зелён. выв. 4, порт PB3 RESET
6 GND белый выв. 14

Чтобы можно было легко подключать эмулятор AVR JTAGICE mkII для отладки через debugWIRE и для внутрисхемного программирования чипа через технологию ISP, целесообразно придерживаться при проектировании устройства следующих правил:
     a) выв. 4, порт PB3 RESET вообще не использовать (чтобы работала отладка через debugWIRE), посадить на плюс питания через резистор 100 кОм, и вывести на ножку 5 интерфейса ISP (см. таблицу).
     б) выв. 7 (PA6), 8 (PA5), 9 (PA4) использовать в конструкции как выходы ATtiny24, чтобы внешние схемы не мешали работе ISP. Нельзя вешать конденсаторы на эти порты.
     в) если все-таки какой-то из вышеперечисленных выше портов используется как вход ATtiny24, то между схемой и микроконтроллером включить резисторы достаточно большого номинала (более 10 кОм), чтобы внешняя схема не шунтировала обмен по шине 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 отключается, чем экономится электроэнергия).
Как обычно, min выходная величина ADC (0) соответствует потенциалу земли и max (1023) соответствует опорному напряжению. Опорное напряжение выбирается битами Bit 7:6 – REFS1:REFS0: Reference Selection Bits, которые находятся в регистре ADMUX.

ADMUX – ADC Multiplexer Selection Register
0x07 (0x27)

-----+-----+----------------------------------------------------------------------------------
REFS1|REFS0|Какое опорное напряжение выбрано
-----+-----+----------------------------------------------------------------------------------
0    |0    |VCC, отключено от PA0 (AREF)
0    |1    |Внеш. оп. напр. на PA0 (AREF), внутр. источник оп. напр. отключен
1    |0    |Внутренний источник опорного напряжения 1.1V
1    |1    |Зарезервировано.
-----+-----+----------------------------------------------------------------------------------

Канал мультиплексора и дифференциальное усиление выбирается оставшимися битами регистра ADMUX - MUX5..0. Возможно дифференциальное измерение между входами и включение усиления (бит MUX0). Более подробно смотрите datasheet. Термодатчик выбирается кодом “100010”в MUX5..0. По поводу корректной смены канала перед измерениями читайте datasheet.

ADC разрешается установкой ADC Enable bit, ADEN в регистре ADCSRA.

ADCSRA – ADC Control and Status Register A
0x06 (0x26)
Bit 7 – ADEN: ADC Enable
Запись бита в 1 разрешает ADC. Если записать 0, то ADC отключается. Отключение во время измерения прерывает измерение. В целях экономии электроэнергии рекомендуется сбрасывать этот бит.
Bit 6 – ADSC: ADC Start Conversion
В режиме одиночного измерения запись этого бита в 1 запускает каждое измерение. В режиме Free Running постоянно повторяющиеся автоматически измерения) запись этого бита в 1 запускает первое измерение. Первое измерение, в отличие от всех последующих, требует 25 циклов для ADC вместо обычных 13, потому что первое преобразование требует инициализации ADC. При чтении бит ADSC единичкой сигнализирует, что измерение еще не завершено, а ноликом - измерение завершено.
Bit 5 – ADATE: ADC Auto Trigger Enable
Если бит ADATE=1 преобразование стартует по положительному перепаду выбранного триггерного сигнала. Источник сигнала выбирается установкой ADC Trigger Select bits, ADTS в регистре ADCSRB.
Bit 4 – ADIF: ADC Interrupt Flag
Этот бит устанавливается, когда измерение завершено и регистры данных ADC обновлены. Выполняется прерывание ADC Conversion Complete Interrupt, если установлены биты ADIE (см. далее) и I-bit в SREG. Флаг ADIF очищается автоматически аппаратно, когда запускается выполнение вектора прерывания ADC Conversion Complete. Флаг можно сбросить, записав лог. 1 в него, чем можно отменить ожидаемое прерывание.
Bit 3 – ADIE: ADC Interrupt Enable
Вместе с I-bit в SREG разрешает прерывание ADC Conversion Complete.
Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits
Выбор делителя тактовой частоты для ADC - делится системная частота.

ADC Prescaler Selections

ADPS2 ADPS1 ADPS0 Коэффициент деления
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128

ADCL и ADCH – ADC Data Register
ADCH 0x05 (0x25)
ADCL 0x04 (0x24)
Отсюда можно считать данные преобразования. Если бит ADLAR=0 (бит 4 в регистре ADCSRB 0x03 (0x23)), то 10-битный результат выровнен вправо (это состояние по умолчанию, биты 7..2 регистра ADCH ничего не значат), если ADLAR=1, то влево (биты 5..0 регистра ADCL ничего не значат). Подробнее см. datasheet.
Когда читается ADCL, то регистр данных ADC (парочка ADCH:ADCL) не может быть обновлен, пока не будет прочитан также и ADCH. Однако, если достаточно точности только 8 бит, то можно включить выравнивание влево и читать только регистр ADCH (старшие 8 бит результата).

DIDR0 – Digital Input Disable Register 0
0x01 (0x21), биты ADC7D..ADC0D
Когда какой-нибудь бит ADC7D..ADC0D записан в 1, то цифровой входной буфер на соответствующей ножке ADC запрещается. Соответствующий регистр PIN при этом будет всегда читаться как 0. Когда на ножку ADC7..0 подается аналоговое напряжение и соответствующий цифровой сигнал с этой ножки не нужен, то соответствующий бит ADC7D..ADC0D должен быть записан в 1 для уменьшения энергопотребления во входном цифровом буфере. Для увеличения точности ADC может использоваться специальный режим ADC Noise Canceler - читайте datasheet.