Comments 120
Наконец у меня нашлись время и желание реализовать такие же часы, как в статье — почти 7 лет прошло!
Только с ходу на ATtiny13A код не заработал. Проект компилировался (AVR/GNU C Compiler 5.4.0), двоичный файл через AVRDUDE записывался, но дальше инициализации дело не шло.
Почти час провозился, пока не установил причину. Нашёл статью, в которой описана работа с данными в программной области — в объявлении которых фигурирует макрокоманда PROGMEM
:
avr-libc: Data in Program Space
Для работы с такими данными нужно использовать функции pgm_*
. Заменил следующую строчку:
next_tick_no += intervals[interval_no];
на:
next_tick_no += pgm_read_byte(&intervals[interval_no]);
а также включил в проект заголовочный файл, содержащий объявление макрокоманды PROGMEM
и определения функций pgm_*
:
#include <avr/pgmspace.h>
и всё заработало, как часы! (Пардон за каламбур.)
Кроме того прочитал внимательно техническую спецификацию ИС, и удалось ещё больше сократить энергопотребление.
Если верить моему 250-рублёвому ЦММу, то за счёт отключения аналогового компаратора потребление тока микросхемой упало примерно на 53 микроампера. Отключение модуля АЦП однако ничего, кажется, не дало, но я этот код всё равно оставил:
void configLowPower() {
/* Power down the Analog Comparator.
From 7.1.1 Idle Mode:
If wake-up from the Analog Comparator interrupt is not required,
the Analog Comparator can be powered down by setting the ACD bit
in the Analog Comparator Control and Status Register – ACSR.
This will reduce power consumption in Idle mode. If the
ADC is enabled, a conversion starts automatically when this
mode is entered.
From 13.2.2 ACSR– Analog Comparator Control and Status Register,
Bit 7 – ACD: Analog Comparator Disable:
When this bit is written logic one, the power to the Analog
Comparator is switched off. This bit can be set at any time
to turn off the Analog Comparator. This will reduce power
consumption in Active and Idle mode. When changing the ACD bit,
the Analog Comparator Interrupt must be disabled by clearing
the ACIE bit in ACSR. Otherwise an interrupt can occur when
the bit is changed.
*/
ACSR &= ~_BV(ACIE);
ACSR |= _BV(ACD);
/*
From 7.3 Power Reduction Register:
Modules can be shut down in Idle and Active modes,
significantly helping to reduce the overall
power consumption.
See also:
19.1 Supply Current of I/O Modules, for examples.
*/
ADCSRA &= ~_BV(ADEN); // The ADC must be disabled before shut down
PRR |= _BV(PRADC); // Shut down ADC;
}
Функцию нужно вызвать однократно из главной процедуры во время инициализации.
Это что касалось программной части. Теперь насчёт аппаратной.
Для механизма на моих часах оказалось достаточно импульса длительностью 78 миллисекунд. Но посмотрим, как они себя поведут по мере дальнейшей разрядки батарейки — уже неделю работают без останова.
По поводу конденсатора. Во всех источниках, которые мне попались, пишут, что как раз таки наоборот — у электролитических конденсаторов, к коим относятся и танталовые, ток утечки намного выше, чем у керамических и плёночных конденсаторов. Кроме того у танталовых по сравнению с другими типами конденсаторов выше значения диэлектрической абсорпции.
Источники — используйте Wayback Machine, если статей по ссылкам в будущем не окажется:
Lowest Leakage capacitor type — edaboard.com.
Design femtoampere circuits with low leakage — Part 2: Component selection — EDN Network.
Capacitor Characteristics and Capacitor Specifications — ElectronicsTutorials.
Capacitor leakage and design for low energy battery powered devices — Electrical Engineering @ Stack Exchange.
Dielectric absorption — Wikipedia.
Преимуществами танталовых конденсаторов является их бо́льшая емкость при меньших размерах, более высокие надёжность и долговечность. Но есть и недостатки, два из которых я уже привёл.
Так или иначе танталовый конденсатор в моих краях — унобтаний. Поставил пока керамический емкостью 0,1 µF. Похоже, это самый ходовой вариант в роли Decoupling (или Bypass) конденсатора — как по-русски называется конденсатор в этой роли, не знаю. Позже заменю его на полипропиленовый.
В любом случае ОП написал полезную статью, и я многое узнал в ходе изучения проекта.
Ещё один момент отмечу для новичков — к коим я и себя, разумеется, причисляю. Когда вы выбираете внешний тактовый сигнал для работы ИС, то для программирования вам понадобится источник сигнала частотой выше 32 768 Гц, иначе большинство программаторов просто не смогут «говорить» с чипом на такой низкой скорости.
Я для этой цели на макетную плату добавил ещё пару ATtiny13A, которые генерируют сигнал прямоугольной формы через восьмибитный таймер/счётчик с ШИМ: один — ~32 кГц, второй — несколько мГц. Но вы можете использовать любую другую ИС с ШИМ — не обязательно AVR. Например, такой чип всего за два рубля — EEVblog #1132 — The 3 Cent Microcontroller!.
Код самого простого генератора сигнала для ATtiny13A, можете использовать его в своих проектах:
#include <avr/io.h>
#include <avr/sleep.h>
void slowClock() {
TCNT0 = 0;
OCR0A = 17;
TCCR0A = _BV(COM0A0) | _BV(WGM01) | _BV(WGM00);
TCCR0B |= _BV(WGM02);
TCCR0B |= _BV(CS01); // 9.6 MHz / 8 = 1.2 MHz
}
void fastClock() { /* Unprogram the CKDIV8 fuse for full speed */
TCNT0 = 0;
OCR0A = 0;
TCCR0A = _BV(COM0A0) | _BV(WGM01) | _BV(WGM00);
TCCR0B |= _BV(WGM02);
TCCR0B |= _BV(CS00);
}
int main(void) {
/* The Data Direction Register bit for the OC0x pin (DDR_OC0x)
must be set as output before the OC0x value is visible on the pin.
*/
DDRB = _BV(PB0);
//slowClock();
fastClock();
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_enable();
sleep_mode();
}
Просто подключите вывод OC0A
(PB0
на ATtiny13A) ко вводу CLKI
на вашем микроконтроллере и сможете программировать его любым программатором.
Надеюсь, кому-то эта информация пригодится.
А так весьма забавно получилось.
Рандомный ход секундной стрелки их здорово урасит.
Ведь и так когда слежу за секундной стрелкой кажется что она странно движется.
Вот например..
Кто-то очень умный, намного умнее, чем тот, что обучал бесенка, создал для приемной патриция особенные часы. Они тик-такали, как и все часы, но против всех обычных часовых правил тик-так их был нерегулярным. Тик-так-тик… а потом явная задержка на долю секунды дольше, чем до того… так-тик-так… а потом тик на долю секунды раньше, чем вы того ожидали. После десяти минут ожидания мыслительные способности даже самых опытных и подготовленных посетителей падали до нуля. Патриций, наверное, хорошо заплатил часовщику.Пратчетт — «Ноги из глины».
Думал в ремонт нести — а тут оказывается тенденции меняются и теперь это модно :)
– А с какой стати? – буркнул Шляпа. – Разве часы обязаны все показывать? У тебя часы показывают, какой год?
– Конечно, нет, – начала Алиса с полной готовностью, – но ведь…
– Но ведь, – перебил ее Шляпа, – ты не скажешь, что они негодные?
Основной потребитель энергии — двигатель, а он жрет одинаково, что с контроллером, что со штатным генератором. Tiny13A, кстати, ест на удивление мало. При внешнем тактировании на 32 кГц — меньше 10 мкА, а в спячке — меньше микроампера. Источник, стр. 127, 130.
http://skywatching.net/astro/kepler.php:
Чем ближе планеты к Солнцу, тем больше линейная и угловая скорости их обращения вокруг Солнца.
В общем 64 байта тут вполне достаточно будет, если слегка поразмышлять.
А часики получились забавные. Слегка нервные. )
Смысл заключался в имитировании гравитации на секундную стрелку.
Циферблат разделен на 6 зон по 30 градусов: 0-2, 2-4, 4-6, 6-8, 8-10, 10-0.
При этом было 4 поведения стрелки:
0-2 и 4-6: 1,6Гц
2-4: 2Гц
6-8 и 10-0: 0,625Гц
8-10: 0,5Гц
Получалось что средняя частота — 1Гц и часы идут правильно. А поведение стрелки намекало на гравитацию, в правой части циферблата стрелка падала вниз с бОльшей скоростью. А в левой части циферблата устало карабкалась вверх.
0-2 и 4-6: 0,625 с
2-4: 0,5 с
6-8 и 10-0: 1,6 с
8-10: 2 с
Каждый сектор состоит из 10 делений (6*10=60). Тогда время полного оборота стрелки будет:
6,25 + 5 + 6,25 + 16 + 20 + 16 = 69,5 с, а не 60, как должно быть.
Подвох тут в том, что в «медленных» секторах стрелка находится дольше, чем в «быстрых», а значит «медленные» сильнее влияют на среднюю скорость. Простое усреднение частот приведет к ошибке.
Так, что вполне реально питать от малого напряжения. Пост зачётный. Даже горящий вопрос «а нафига» висит в воздухе :).
Чтобы не было кривотолков, исправил на «конденсатор в цепи питания».
Первичные часы были местными мастерами переделаны таким образом что шли немного быстрее с 9 утра до 12 дня и с часа дня до 6 вечера, сохраняя суточный цикл. Таким образом немного увеличивалась длительность обеда и появлялась возможность свалить с работы минут на 20 раньше без палева.
Неравномерно идущие часы