Микроконтроллеры AVR: Режимы работы таймеров/счетчиков
В микроконтроллере ATmega328 есть три таймера. 2 из низ по 8 бит (T0, T2) и один 16 бит (T1). Для них всех есть одинаковые режимы работы, представленные ниже:- Обычный режим работы. Самый распространенный режим, когда таймер просто считает приходящие импульсы и при переполнении счетного регистра устанавливает флаг прерывания по переполнению. При этом счетный регистр сбрасывается в 0 и подсчет импульсов начинается сначала.
- Режим подсчета импульсов (Сброс при совпадении). Также называется CTC. В этом режиме при совпадении счетного регистра с одним из регистров сравнения выставляется флаг прерывания по совпадению, счетный регистр обнуляется и подсчет начинается сначала. При этом по совпадению может меняться сигнал на выходе таймера, соответствующего используемому регистру совпадения.
- Режим ШИМ. В данном режиме изменяется ширина импульса в зависимости от значения, записанного в регистр совпадения. Для 8-битного таймера, к примеру, если записать в регистр совпадения число 10, состояние логической единицы на выходе совпадения будет 10 тактов из 256, а логический 0 246 тактов из 256 (для неинверсного режима). В инверсном же режиме 10 тактов будет состояние логического 0 и 246 тактов логической единицы.
- Режим коррекции фазы ШИМ. В обычном режиме ШИМ мы получаем плавающую фазу выходного сигнала. Для того, чтобы этого избежать, в режиме коррекции фазы ШИМ при достижении максимального значения, счетный регистр таймера/счетчика начинает уменьшатся. Это происходит циклически.
- Асинхронный режим работы. В асинхронном режиме работы к микроконтроллеру подключается внешний кварцевый резонатор 32 кГц. Чаще всего этот режим используется для работы таймера/счетчика T2 в качестве часов реального времени.
- Режим коррекции фазы и частоты ШИМ. Отличается от режима коррекции фазы ШИМ лишь моментом обновления регистра сравнения. Регистр сравнения обновляется когда значение счетного регистра достигает минимума.
- Режим захвата. При поступлении сигнала от аналогового компаратора, а также на вывод ICP1 (14 ножка) значение счетного регистра сохраняется в регистре захвата, устанавливая при этом флаг прерывания по захвату.
avrprog.blogspot.com
Микроконтроллеры AVR: Таймер/счетчик T1 (16 бит)
Характеристики таймера/счетчика T1 (16 бит):- Два независимых выхода по совпадению
- Таймер сброса при совпадении
- Один вход захвата
- Блок шумоподавления входа захвата
- Изменяемый период ШИМ сигнала
- Фазовый корректор ШИМ сигнала
- Изменяемый период ШИМ сигнала
- Тактовый генератор
- Три независимых источника прерывания
Регистры таймера/счетчика T1:
- TCNT1
- OCR1A — регистр сравнения A (16 бит)
- OCR1B — регистр сравнения B (16 бит)
- TIMSK1 — регистр маски прерываний для таймера/счетчика T1
- TIFR1 — регистр флагов прерываний для таймера/счетчика T1
- TCCR1A — регистр управления A
- TCCR1B — регистр управления B
- TCCR1C — регистр управления C
- ICR1 — регистр захвата (16 бит)
Регистр TCCR1A:
Режим работы таймера/счетчика T1 устанавливается регистрами TCCR1A и TCCR1B
Биты COM1A1 (7) и COM1A0 (6) влияют на то, какой сигнал появится на выводе OC1A (15 ножка) при совпадении с A (совпадение значения счетного регистра TCNT1 со значением регистра сравнения OCR1A):1. Обычный режим
- 00 — вывод OC1A не функционирует
- 01 — изменение состояния вывода OC1A на противоположное при совпадении с A
- 10 — сброс вывода OC1A в 0 при совпадении с A
- 11 — установка вывода OC1A в 1 при совпадении с A
- 00 — вывод OC1A не функционирует
- 01 — если биты WGM13 — WGM10 установлены в (0000 — 1101), вывод OC1A не функционирует
- 01 — если битыWGM13 — WGM10 установлены в 1110 или 1111, изменение состояния вывода OC0A на противоположное при совпадении с A
- 10 — сброс вывода OC1A в 0 при совпадении с A, установка вывода OC1A в 1 если регистр TCNT1 принимает значение 0x00 (неинверсный режим)
- 11 — установка вывода OC1A в 1 при совпадении с A, установка вывода OC1A в 0 если регистр TCNT1 принимает значение 0x00 (инверсный режим)
3. Режим коррекции фазы ШИМ
- 00 — вывод OC1A не функционирует
- 01 — если биты WGM13 — WGM10 установлены в (0000 — 1100, 1010, 1100 — 1111), вывод OC1A не функционирует
- 01 — если битыWGM13 — WGM10 установлены в 1101 или 1011, изменение состояния вывода OC1A на противоположное при совпадении с A
- 10 — сброс вывода OC1A в 0 при совпадении с A во время увеличения значения счетчика, установка вывода OC1A в 1 при совпадении с A во время уменьшения значения счетчика
- 11 — установка вывода OC1A в 1 при совпадении с A во время увеличения значения счетчика, сброс вывода OC1A в 0 при совпадении с A во время уменьшения значения счетчика
Биты COM1B1 (5) и COM1B0 (4) влияют на то, какой сигнал появится на выводе OC0B (12 ножка) при совпадении с B (совпадение значения счетного регистра TCNT1 со значением регистра сравнения OCR1B):
1. Обычный режим
- 00 — вывод OC1B не функционирует
- 01 — изменение состояния вывода OC1B на противоположное при совпадении с B
- 10 — сброс вывода OC1B в 0 при совпадении с B
- 11 — установка вывода OC1B в 1 при совпадении с B
- 00 — вывод OC1B не функционирует
- 01 — вывод OC1B не функционирует
- 10 — сброс вывода OC1B в 0 при совпадении с B, установка вывода OC1B в 1 если регистр TCNT1 принимает значение 0x00 (неинверсный режим)
- 11 — установка вывода OC1B в 1 при совпадении с B, установка вывода OC1B в 0 если регистр TCNT1 принимает значение 0x00 (инверсный режим)
3. Режим коррекции фазы ШИМ
- 00 — вывод OC1B не функционирует
- 01 — вывод OC1B не функционирует
- 10 — сброс вывода OC1B в 0 при совпадении с B во время увеличения значения счетчика, установка вывода OC1B в 1 при совпадении с B во время уменьшения значения счетчика
- 11 — установка вывода OC1B в 1 при совпадении с B во время увеличения значения счетчика, сброс вывода OC1B в 0 при совпадении с B во время уменьшения значения счетчика
Биты WGM13 (4) , WGM12 (3) регистра TCCR1B и биты WGM11 (1) , WGM10 (0) регистра TCCR1A устанавливают режим работы таймера/счетчика T1:
- 0000 — обычный режим
- 0001 — коррекция фазы PWM, 8-бит
- 0010 — коррекция фазы PWM, 9-бит
- 0011 — коррекция фазы PWM, 10-бит
- 0100 — режим счета импульсов (OCR1A) (сброс при совпадении)
- 0101 — PWM, 8-бит
- 0110 — PWM, 9-бит
- 0111 — PWM, 10-бит
- 1000 — коррекция фазы и частоты PWM (ICR1)
- 1001 — коррекция фазы и частоты PWM (OCR1A)
- 1010 — коррекция фазы PWM (ICR1)
- 1011 — коррекция фазы и частоты PWM (OCR1A)
- 1100 — режим счета импульсов (ICR1) (сброс при совпадении)
- 1101 — резерв
- 1110 — PWM (ICR1)
- 1111 — PWM (OCR1A)
Бит ICNC1 (7) регистра TCCR1B управляет схемой подавления помех блока захвата (0 — выключена / 1 — включена).
Бит ICES1 (6) регистра TCCR1B выбирает активный фронт регистра захвата (0 — по спадающему фронту сигнала / 1 — по нарастающему фронту сигнала).
Биты CS12 (2), CS11 (1), CS10 (0) регистра TCCR1B устанавливают режим тактирования и предделителя тактовой частоты таймера/счетчика T1:
- 000 — таймер/счетчик T1 остановлен
- 001 — тактовый генератор CLK
- 010 — CLK/8
- 011 — CLK/64
- 100 — CLK/256
- 101 — CLK/1024
- 110 — внешний источник на выводе T1 (11 ножка) по спаду сигнала
- 111 — внешний источник на выводе T1 (11 ножка) по возрастанию сигнала
Биты FOC1A (7) и FOC1B (6) регистра TCCR1С принудительно устанавливают значение на выводах OC1A и OC1B.
Регистр TIMSK1:
Управление прерываниями от таймера осуществляется в регистре TIMSK1.
Бит ICIE1 (5) разрешает прерывание по захвату, биты OCIE1B (2) и OCIE1A (1) разрешают прерывания при совпадении с A и B, бит TOIE1 (0) разрешает прерывание по переполнению при установке 1. Если в эти биты записать 0, прерывания от таймера/счетчика будут запрещены.
Также есть регистр флагов прерываний TIFR1, который показывает какое прерывание поступило от таймера/счетчика T0.Регистр TIFR1:
Биты ICF1 (5), OCF1B (2), OCF1A (1) и TOV1 (0) устанавливаются в 1 в зависимости от того, какое прерывание поступило — захват, совпадение с A, B или переполнение.
avrprog.blogspot.com
Микроконтроллеры AVR: Таймер/счетчик T0 (8 бит)
Характеристики таймера/счетчика T0 (8 бит):- Два независимых выхода по совпадению
- Таймер сброса при совпадении
- Изменяемый период ШИМ сигнала
- Фазовый корректор ШИМ сигнала
- Тактовый генератор
- Три независимых источника прерывания
Регистры таймера/счетчика T0:
- TCNT0 — счетный регистр таймера/счетчика T0
- OCR0A — регистр сравнения A
- OCR0B — регистр сравнения B
- TIMSK0 — регистр маски прерываний для таймера/счетчика T0
- TIFR0 — регистр флагов прерываний для таймера/счетчика T0
- TCCR0A — регистр управления A
- TCCR0B — регистр управления B
Источником тактового сигнала для таймера/счетчика T0 может быть как тактовый сигнал используемый для всего микроконтроллера с использованием предделителя, так и сигнал, поступающий на вход T0 (6 ножка). Если не выбрано ни одного источника тактового сигнала, то таймер/счетчик останавливается.
Режим работы таймера/счетчика T0 устанавливается регистрами TCCR0A и TCCR0B.Регистр TCCR0A:
Биты COM0A1 (7) и COM0A0 (6) влияют на то, какой сигнал появится на выводе OC0A (12 ножка) при совпадении с A (совпадение значения счетного регистра
1. Обычный режим
- 00 — вывод OC0A не функционирует
- 01 — изменение состояния вывода OC0A на противоположное при совпадении с A
- 10 — сброс вывода OC0A в 0 при совпадении с A
- 11 — установка вывода OC0A в 1 при совпадении с A
- 00 — вывод OC0A не функционирует
- 01 — если бит WGM02 регистра TCCR0B установлен в 0, вывод OC0A не функционирует
- 01 — если бит WGM02 регистра TCCR0B установлен в 1, изменение состояния вывода OC0A на противоположное при совпадении с A
- 10 — сброс вывода OC0A в 0 при совпадении с A, установка вывода OC0A в 1 если регистр TCNT0 принимает значение 0x00 (неинверсный режим)
- 11 — установка вывода OC0A в 1 при совпадении с A, установка вывода OC0A в 0 если регистр TCNT0 принимает значение 0x00 (инверсный режим)
3. Режим коррекции фазы ШИМ
- 00 — вывод OC0A не функционирует
- 01 — если бит WGM02 регистра TCCR0B установлен в 0, вывод OC0A не функционирует
- 01 — если бит WGM02 регистра TCCR0B установлен в 0, изменение состояния вывода OC0A на противоположное
- 10 — сброс вывода OC0A в 0 при совпадении с A во время увеличения значения счетчика, установка вывода OC0A в 1 при совпадении с A во время уменьшения значения счетчика
- 11 — установка вывода OC0A в 1 при совпадении с A во время увеличения значения счетчика, сброс вывода OC0A в 0 при совпадении с A во время уменьшения значения счетчика
Биты COM0B1 (5) и COM0B0 (4) влияют на то, какой сигнал появится на выводе OC0B (11 ножка) при совпадении с B (совпадение значения счетного регистра TCNT0 со значением регистра сравнения OCR0B):
1. Обычный режим
- 00 — вывод OC0B не функционирует
- 01 — изменение состояния вывода OC0B на противоположное при совпадении с B
- 10 — сброс вывода OC0B в 0 при совпадении с B
- 11 — установка вывода OC0B в 1 при совпадении с B
- 00 — вывод OC0B не функционирует
- 01 — резерв
- 10 — сброс вывода OC0B в 0 при совпадении с B, установка вывода OC0B в 1 если регистр TCNT0 принимает значение 0x00 (неинверсный режим)
- 11 — установка вывода OC0B в 1 при совпадении с B, установка вывода OC0B в 0 если регистр TCNT0 принимает значение 0x00 (инверсный режим)
3. Режим коррекции фазы ШИМ
- 00 — вывод OC0B не функционирует
- 01 — резерв
- 10 — сброс вывода OC0B в 0 при совпадении с B во время увеличения значения счетчика, установка вывода OC0B в 1 при совпадении с B во время уменьшения значения счетчика
- 11 — установка вывода OC0B в 1 при совпадении с B во время увеличения значения счетчика, сброс вывода OC0B в 0 при совпадении с B во время уменьшения значения счетчика
Биты WGM01 (1) , WGM00 (0) регистра TCCR0A устанавливают режим работы таймера/счетчика T0:
- 00 — обычный режим
- 01 — режим коррекции фазы ШИМ
- 10 — режим подсчета импульсов (сброс при совпадении)
- 11 — режим ШИМ
Биты FOC0A (7) и FOC0B (6) регистра TCCR0B принудительно устанавливают значение на выводах OC0A и OC0B.
Биты CS02 (2), CS01 (1), CS00 (0) регистра TCCR0B устанавливают режим тактирования и предделителя тактовой частоты таймера/счетчика T0:
- 000 — таймер/счетчик T0 остановлен
- 001 — тактовый генератор CLK
- 010 — CLK/8
- 011 — CLK/64
- 100 — CLK/256
- 101 — CLK/1024
- 110 — внешний источник на выводе T0 (6 ножка) по спаду сигнала
- 111 — внешний источник на выводе T0 (6 ножка) по возрастанию сигнала
Регистр TIMSK0:
Биты OCIE0B (2) и OCIE0A (1) разрешают прерывания при совпадении с A и B, а бит TOIE0 (0) разрешает прерывание по переполнению при установке 1. Если в эти биты записать 0, прерывания от таймера/счетчика будут запрещены.
Регистр TIFR0:
Биты OCF0B (2), OCF0A (1) и TOV0 (0) устанавливаются в 1 в зависимости от того, какое прерывание поступило — совпадение с A, B или переполнение.
avrprog.blogspot.com
Микроконтроллеры AVR: Таймер/счетчик T2 (8 бит)
Характеристики таймера/счетчика T2 (8 бит):- Два независимых выхода по совпадению
- Таймер сброса при совпадении
- Изменяемый период ШИМ сигнала
- Фазовый корректор ШИМ сигнала
- Тактовый генератор
- Возможность работы от независимого внешнего часового тактового генератора 32 кГц
- Три независимых источника прерывания
- Делитель частоты 10-бит
- Асинхронный режим
Регистры таймера/счетчика T2:
- TCNT2 — счетный регистр таймера/счетчика T2
- OCR2A — регистр сравнения A
- OCR2B — регистр сравнения B
- TIMSK2 — регистр маски прерываний для таймера/счетчика T2
- TIFR2 — регистр флагов прерываний для таймера/счетчика T2
- TCCR2A — регистр управления A
- TCCR2B — регистр управления B
- ASSR — регистр асинхронного режима
- GTCCR — главный регистр всех таймеров/счетчиков
Источником тактового сигнала для таймера/счетчика T2 может быть тактовый сигнал используемый для всего микроконтроллера с использованием предделителя. Если не выбран коэффициент деления, то таймер/счетчик останавливается.
Режим работы таймера/счетчика T2 устанавливается регистрами TCCR2A и TCCR2B аналогично таймеру/счетчику T0.Регистр TCCR2B:
Разница лишь в битах CS22 (2), CS21 (1), CS20 (0) регистра TCCR2B которые устанавливают режим тактирования.
- 000 — таймер остановлен
- 001 — CLK
- 010 — CLK/8
- 011 — CLK/32
- 100 — CLK/64
- 101 — CLK/128
- 110 — CLK/256
- 111 — CLK/1024
Регистр ASSR:
Бит EXCLK (6) регистра ASSR разрешает использование внешнего тактового сигнала от кварцевого резонатора 32 кГц при записи в него 1.
Бит AS2 (5) регистра ASSR управляет способом тактирования (1 — от внешнего резонатора 32 кГц, подключенного к TOSC1 (9 ножка) / 0 — от внутреннего генератора CLK)/
Бит TCN2UB (4) регистра ASSR показывает доступен ли для записи регистр TCNT2 (1-недоступен / 0 — доступен).
Бит OCR2AUB (3) регистра ASSR показывает доступен ли для записи регистр OCR2A (1-недоступен / 0 — доступен).
Бит OCR2BUB (2) регистра ASSR показывает доступен ли для записи регистр OCR2B (1-недоступен / 0 — доступен).
Бит TCR2AUB (1) регистра ASSR показывает доступен ли для записи регистр TCCR2A (1-недоступен / 0 — доступен).
Бит TCR2BUB (0) регистра ASSR показывает доступен ли для записи регистр TCCR2B (1-недоступен / 0 — доступен).Регистр GTCCR:
Бит PSRASY (1) регистра GTCCR сбрасывает предделитель таймера/счетчика T2 если установить в 1, после этого бит сбрасывается в 0 автоматически.
Бит PSRASYNC (0) регистра GTCCR сбрасывает предделитель таймера/счетчика T0 и T1 если установить в 1, после этого бит сбрасывается в 0 автоматически.
Бит TSM (0) регистра GTCCR запрещает автоматический сброс битов PSRASY и PSRASYNC регистра GTCCR.
avrprog.blogspot.com
Микроконтроллер ATmega328 — описание, характеристики
От iteh 26/02/2018 | 7 989 просмотров | Микроконтроллеры AVRМикроконтроллер ATMega328 является 8-ми разрядным CMOS микроконтроллером с низким энергопотреблением, основанным на усовершенствованной AVR RISC архитектуре.
ATmega328/P — микроконтроллер семейства AVR, как и все остальные имеет 8-битный процессор и позволяет выполнять большинство команд за один такт.
Память:
- 32 kB Flash (память программ, имеющая возможность самопрограммирования)
- 2 kB ОЗУ
- 1 kB EEPROM (постоянная память данных)
Периферийные устройства:
- Два 8-битных таймера/счетчика с модулям сравнения и делителями частоты
- 16-битный таймер/счетчик с модулем сравнения и делителем частоты, а также с режимом записи
- Счетчик реального времени с отдельным генератором
- Шесть каналов PWM (аналог ЦАП)
- 6-канальный ЦАП со встроенным датчиком температуры
- Программируемый последовательный порт USART
- Последовательный интерфейс SPI
- Интерфейс I2C
- Программируемый сторожевой таймер с отдельным внутренним генератором
- Внутренняя схема сравнения напряжений
- Блок обработки прерываний и пробуждения при изменении напряжений на выводах микроконтроллера
Специальные функции микроконтроллера ATmega328:
- Сброс при включении питания и программное распознавание снижения напряжения питания
- Внутренний калибруемый генератор тактовых импульсов
- Обработка внутренних и внешних прерываний
- 6 режимов сна (пониженное энергопотребление и снижение шумов для более точного преобразования АЦП)
Напряжения питания и скорость процессора:
- 1.8 — 5.5 В при частоте до 4 МГц
- 2.7 — 5.5 В при частоте до 10 МГц
- 4.5 — 5.5 В при частоте до 20 МГц
Файлы:
>> Скачать даташит ATMega328
Похожие записи
robolive.ru
ATMEGA328P-PU как замена Arduino
Раз уж Arduino стал практически мейнстримом, напишу обзор про микроконтроллеры ATMEGA328Данный микроконтроллер является сердцем Arduino Uno, Nano, Pro Mini и ряда других плат.
Но Arduino — это слишком просто. Купил, подключил, загрузил программу и вот уже гордо мигает светодиод на плате. Мы же легких путей не ищем и
Итак зачем все это нужно?
Ну во первых, это экономия в деньгах (Правда с ценами на Pro Mini очень сомнительная)
Во вторых, экономия места
В третьих, микросхемы без всяких преобразователей и светодиодов очень экономичны, что немаловажно в проектах с батарейным питанием.
В четвертых, проекты на Arduino весьма неопрятны из за мотка проводов вокруг платы. Микроконтроллеры же вполне можно паять на макетках или нормальных печатных платах.
Ну и в пятых, это ведь интересно и познавательно!
Заказал я данные микросхемы на Алиэксперсс. Лот состоит из 10 микроконтроллеров, 10 панелек для них, и 10 кварцевых резонаторов на 16МГц. Сейчас лот подорожал до $35 и купить за адекватную цену Atmegу можно разве что на Таобао.
Заказ шел целых 97 дней. Трек быстро отозвался в Китае и завис, не дойдя до России. Я успел пообщаться с продавцом, открыть спор и выиграть его, когда нежданно посылка нарисовалась в Москве. Деньги я вернул продавцу на PayPal, видимо у него где-то есть еще и магазин.
Итак все довольны — продавец получил заслуженную прибыль, а я долгожданный товар.
Подробное описание ATMEGA328 можно посмотреть на сайте atmel.com.
Буковка «P» в названии означает низкое энергопотребление, а PU-корпус DIP28, который удобно паять обычным паяльником.
Сам товар:
Контроллер с панелькой и кварцем
Как это все готовить?
Для программирования взят очень дешевый программатор USBasp за 3.14 (Пи?) баксов.
Для простоты, используем ICSP разъем стандартной Arduino UNO
В панельку Arduino вставляем наш микроконтроллер.
Далее качаем и устанавливаем драйвер для программатора. Запускам стандартную ArduinoIDE, выбираем в меню «Сервис->Программатор->USBasp», плату ArduinoUNO и нажимаем «Записать загрузчик». После окончания процесса загрузки мы получаем контроллер, такой же как и в UNO, в который можно уже в дальнейшем заливать программы через стандартный USB Ардуины.
Далее мне захотелось использовать встроенный кварцевый резонатор на 8МГц, чтобы иметь минимум деталей на плате.
Открываем файл с описанием микроконтроллера c:\Program Files (x86)\Arduino\hardware\arduino\boards.txt
Копируем блок с Uno и правим в нм Фьюзы. Это специальные биты для настроки контроллера. Прочитать про них можно здесь. Сконфигурировать при помощи онлайн-калькулятора. Загрузив в калькулятор значения от UNO я устанавливаю стандартное значение с встроенным кварцем на 8МГц.
Затем заменяю значение в файле с описанием плат и получаю такое описание:
tmega328_8.name=Atmega328 (5V, 8 MHz internal)
atmega328_8.upload.protocol=arduino
atmega328_8.upload.maximum_size=30720
atmega328_8.upload.speed=57600
atmega328_8.bootloader.low_fuses=0xE2
atmega328_8.bootloader.high_fuses=0xDE
atmega328_8.bootloader.extended_fuses=0x05
atmega328_8.bootloader.path=optiboot
atmega328_8.bootloader.file=optiboot_atmega328.hex
atmega328_8.bootloader.unlock_bits=0x3F
atmega328_8.bootloader.lock_bits=0x0F
atmega328_8.build.mcu=atmega328p
atmega328_8.build.f_cpu=8000000L
atmega328_8.build.core=arduino
atmega328_8.build.variant=standard
Затем в среде Arduino выбираю свой микроконтроллер и снова прошиваю загрузчик.
Все, я получил микроконтроллер, в который можно заливать скетчи на Arduino UNO плате, а затем использовать его без внешнего кварца.
Можно не прошивать контроллеру загрузчик, но тогда заливать в него программы всегда придется через программатор.
Чтобы не соединять самому 10пинвый разъем на USBasp к 6-ти пиновому ICSP на Arduino заказал такой переходник
Потом подумал, и заказал такой переходник для программатора, позволяющий обходится без Arduino Uno. Так что надеюсь, следующие микросхемы буду шить с большим комфортом.
Рекомендую ли я данные микроконтроллеры — скорее нет. При цене на Arduino Pro Micro — $2.88 это не особенно целесообразно. Сейчас я бы купил Atmega8 стоимостью около 1$ или Atiny, для проектов, где не нужно возможности Atmega328.
Где я все это планирую применять?
Хочу сделать сенсорные беспроводные выключатели света, вентиляторов и др. устройств, причем разместить их прямо в корпусах выключателей.
В люстрах, для получения радиокоманд от этих выключателей, а также для диммирования.
В миниатюрном погодном датчике на аккумуляторе за окном.
В контроллере управления вентилятором на кухне и в ванной.
Да мало ли сколько еще «нужных и полезных» устройств можно сделать?
А как же мозг не вскипел все это реализовывать?
Ну конечно же был помощник
Все статьи мои статьи можно найти в моем блоге samopal.pro
mysku.ru
Пишем свою операционку для Arduino. Шаг 1 — настраиваем таймер — Misc
Люблю я на досуге поиграться с 8-битными AVR-микроконтроллерами. Почему? Потому что они просты в использовании и программировании, у них весьма очевидное внутреннее устройство, но при всем этом они позволяют быстро, дешево и без sms запиливать достаточно нетривиальные проекты. Arduino (и всевозможные дешевые китайские клоны, разумеется) — вообще достаточно популярная железка (и среда разработки) среди погромистов и инженеров. Имея на руках пару breadboard’ов и клубок проводов для них, с Arduino вы сможете без пайки собрать макет какого-нибудь проекта и закодить его, практически не напрягаясь.
Но я сюда пишу не для того, чтобы поднять продажи китайцам, а чтобы заняться настоящей хардкорной разработкой под AVR. Сегодня мы с вами начнем писать настоящую операционную систему с вытесняющей многозадачностью, которую потом запустим на обычных железяках Arduino! Но это еще не все, ведь мы будем писать эту ОСь на C C++14, сдабривая все это щедрым количеством ассемблерных вставок и макросов. Вот это будет пламенная смесь! А назовем мы нашу операционную систему пафосно — Atmos!
Перед тем, как начать, я должен сказать, что подобные ОС достаточно профессионального уровня и с длительной поддержкой уже существуют. Это, например, кросс-платформенная богатая на фичи и толстая FreeRTOS, или компактная (но не очень удобная) Femto OS. Вы, конечно, можете открыть их исходные коды и постараться разобраться, в чем я вам желаю удачи. Но я в этом цикле статей поясню базовые принципы, которые стоят за созданием такой операционки для AVR и буду писать ее по шагам, разжевывая подробно каждый этап. Если вы готовы вместе со мной окунуться в раскаленные пучины кода, то вперед!
Сперва я отвечу на вопрос, который мог у вас возникнуть: «В AVR и так памяти для кода и оперативки раз-два и обчелся, какая нах*й еще многозадачность?!». Ну тогда сначала определим, зачем нам вообще может понадобиться операционная система с вытесняющей многозадачностью для AVR8. Например, у вас в контроллере несколько кусков кода (функций/задач), которые должны выполняться независимо и одновременно, а пихать их все в один цикл — не комильфо. Или, например, одна из этих функций должна ожидать определенных условий и только тогда запускаться. Особенно, если такие условия выставляются другими уже работающими задачами. Или часть времени у вас контроллер вообще должен простаивать, а все эти задачи должны приостанавливаться на заданный промежуток времени. А когда ни одна из задач не выполняется, вообще неплохо было бы переключить контроллер в режим экономии энергии. И так далее. «Оке, это, вроде бы, полезные фишки, ну а что с памятью?» — спросите вы. А с памятью все не так плохо. В 3-4 килобайта можно уместить массу функционала со стороны ОС. Даже если брать Atmega8 — у этого контроллера 8 кб доступно, итого у вас останется еще ~4 килобайта для ваших задач. А с оперативкой вот что: на каждую задачу будет необходимо выделить блок оперативной памяти определенного размера, порядка 40 байтов (для архитектуры reduced tiny — почти в два раза меньше). Сама ОС тоже потребует около 20 байтов оперативной памяти. А дальше все уже зависит от того, сколько памяти требует ваш код. Если брать ту же Atmega8, то для трех выполняемых задач и ОС потребуется порядка 140 байтов оперативки из 1 килобайта доступной. Почему именно такие цифры, увидим дальше, по ходу разработки. По-моему, это не очень большое количество ресурсов, которое у вас отожрет ОС, особенно, если вы не планируете забить контроллер под завязку. Конечно, независимо работающие задачи могут потребовать больше кода со своей стороны (для синхронизации доступа к портам, например), но в любом случае оверхед не будет слишком объемным.
Ну, а теперь поехали! Для начала определим, а можно ли вообще такую ОСь запилить под 8-битные AVR. Что нам для
kaimi.io