Обсуждаем контроллеры компании Atmel.
Ответить

Millis на Attiny13 и точный отсчет времени

Пн апр 15, 2024 09:12:33

Всем привет!


Как посчитать точно время на Attiny13a?

В процессе экспериментов установил, что Арду Нано (для теста) - миллис работает отлично, задал 10 минут, он отсчитал ровно 10 минут 00 сек.
К слову, Delay 600000 отсчитал на той же Нано 9 минут 59 сек, что вполне хорошо.


В 13-шке миллис вообще работает через пень-колоду, в любое время срабатывает (обычно позже указанных 5 секунд).

Delay - не вариант, но и он работает очень неточно, к тому же вешает систему.

С зависанием выкрутился пока приращением vrodeMillis++ на каждой delay(1), на 10 минут ошибается на 30 секунд, ужас, но что поделать, пока так.

Пробовал все частоты - думал, вдруг поможет, не помогло вообще никак.


Вопрос - вообще есть какой-то способ с помощью Attiny13 отсчитать ровно 10 минут с точностью до секунды?


И еще вопрос. Понравилось пользоваться функцией для ежеминутного срабатывания.
if (millis() % 60000 == 0)

Но, как сказал Alexgyver, эта функция сильно замедляет всю программу, может сработать больше одного раза (т.к. 60000 может держаться два или три прохода условия), а также это условие может вообще проскочить 60000 и не выполниться никогда.

Что еще можно придумать, что еще и заработает на Attiny13a?

Re: Millis на Attiny13 и точный отсчет времени

Пн апр 15, 2024 09:36:41

Пока не будет внешнего кварцованного тактирования tn13, точных временных интервалов не получите.

Re: Millis на Attiny13 и точный отсчет времени

Пн апр 15, 2024 09:55:00

Что еще можно придумать, что еще и заработает на Attiny13a?

Не пользоваться Ардуино IDE. А если пользуетесь, то говорите хотя бы какое ядро.

Re: Millis на Attiny13 и точный отсчет времени

Пн апр 15, 2024 13:32:56

От автора MicroCore:
The ATtiny13 only has one timer, timer0. On "regular" arduinos like the UNO, this timer is used for generating millis() and micros(). On the ATtiny13 I'm using the watchdog for generating millis and micros, which frees timer0. The reason for the error you're seeing is that WDT_vect

У ATtiny13 есть только один таймер — timer0. На «обычных» Arduinoх, таких как UNO, этот таймер используется для генерации millis() и micros(). На ATtiny13 я использую сторожевой таймер для генерации милли и микро, который освобождает таймер 0. Причина ошибки, которую вы видите, заключается в том, что WDT_vect

https://github.com/MCUdude/MicroCore/issues/23

Столкнулся с этим моментом некоторое время назад. Используйте millis(), micros() для безответственных дел. Отчет о времени напр. через таймер. Тогда придется не использовать задержку. (Если для небольших периодов можно например nop в цикле).

И "точное время" из внутреннего генератора, тем более: без индивидуальная коррекция OSCALL - невозможно. А некоторые экземпляры МК сильно отличаются частотой внутреннего генератора и там вероятно OSCALL не откалиброван на заводе.

Re: Millis на Attiny13 и точный отсчет времени

Вт апр 16, 2024 01:30:13

Пока не будет внешнего кварцованного тактирования tn13, точных временных интервалов не получите.


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

Добавлено after 9 minutes 25 seconds:
Что еще можно придумать, что еще и заработает на Attiny13a?

Не пользоваться Ардуино IDE. А если пользуетесь, то говорите хотя бы какое ядро.

Если честно, я сами не знаю, какое ядро. Ардуино Нано с Али, Attiny13 с Чип Дипа, подключал 13 к Нано 4 проводами + питание и земля. Прошил Нано скетчем ArduinoASP, а далее прошил скетч в 13.
Где посмотреть какое ядро? Вот скрин Arduino IDE на всякий, если это поможет.

1713218866541.png
(31.67 KiB) Скачиваний: 14


И, кстати, "Не пользоваться Ардуино IDE" - а чем пользоваться для корректного решения задачи?

Добавлено after 17 minutes 10 seconds:
От автора MicroCore:
The ATtiny13 only has one timer, timer0. On "regular" arduinos like the UNO, this timer is used for generating millis() and micros(). On the ATtiny13 I'm using the watchdog for generating millis and micros, which frees timer0. The reason for the error you're seeing is that WDT_vect

У ATtiny13 есть только один таймер — timer0. На «обычных» Arduinoх, таких как UNO, этот таймер используется для генерации millis() и micros(). На ATtiny13 я использую сторожевой таймер для генерации милли и микро, который освобождает таймер 0. Причина ошибки, которую вы видите, заключается в том, что WDT_vect

https://github.com/MCUdude/MicroCore/issues/23

Столкнулся с этим моментом некоторое время назад. Используйте millis(), micros() для безответственных дел. Отчет о времени напр. через таймер. Тогда придется не использовать задержку. (Если для небольших периодов можно например nop в цикле).

И "точное время" из внутреннего генератора, тем более: без индивидуальная коррекция OSCALL - невозможно. А некоторые экземпляры МК сильно отличаются частотой внутреннего генератора и там вероятно OSCALL не откалиброван на заводе.

Спасибо! Понятия не имею, как реализовать мою 60сек задержку на сторожевом таймере, поэтому возник более важный вопрос - может, выбрать что-то еще вместо tiny13 для решения моей задачи?

Только мне нужна
1. Миниатюрность (в идеале в дип корпусе,а то SOIC паять тяжеловато).
2. Экономичность по питанию и 3-4 вольта для нормальной работы.
3. Дешевизна.

Готов на неудобства типа покупки программатора именно для этой задачи (хотя USBISP тоже есть, но я его не использую, шью через ArduinoISP в Arduino IDE, так удобнее).

P.S. Заказал пяток attiny85-20pu DIP для эксперимента, но они придут
только через две недели.

Re: Millis на Attiny13 и точный отсчет времени

Вт апр 16, 2024 08:33:24

RoMario2024 писал(а):attiny85-20pu
как лично по мне, так крайне сомнительный выбор чипа. Стоимость как у меги88, а возможностей несравнимо меньше.
Для себя применяю серию мега48/88/168/328. Полностью заменимы снизу вверх и адекватная стоимость.

Re: Millis на Attiny13 и точный отсчет времени

Вт апр 16, 2024 08:44:52

Как вариант. Формирователь периода 10 минут (600 секунд) таймером тактируемым WDT.
TEST_10MIN.zip
(1.16 KiB) Скачиваний: 38


Аналогичный период точнее будет формировать tiny25 с часовым кварцем.
TEST_10MIN_TN25.zip
(1.2 KiB) Скачиваний: 15

Re: Millis на Attiny13 и точный отсчет времени

Вт апр 16, 2024 11:05:41

Если честно, я сами не знаю, какое ядро. Ардуино Нано с Али, Attiny13 с Чип Дипа, подключал 13 к Нано 4 проводами + питание и земля. Прошил Нано скетчем ArduinoASP, а далее прошил скетч в 13.
Где посмотреть какое ядро?

Ну вы же плату выбираете из списка плат. Какой? Для тини13 microCore, DIY tiny core, возможно ещё какая.
Из Arduino IDE можете использовать компилятор. Только не использовать функции Ардуино.
10 минут вполне точно должно отрабатывать и без кварцевого генератора.

Re: Millis на Attiny13 и точный отсчет времени

Вт апр 16, 2024 11:35:59

В сообщении выше следует читать: автор MicroCore сделал всё необходимое, но функции millis, micros сделани уже с помощью WDT. С соответствующими неудобствами и нестыковками. (не нужно делать ничего дополнительного)

А согласно быстрым собств. тестам, вляния колебания температуры к клока и jitter в AVR хуже, напр. от PIC. Если хотите точности, то хотя бы кварц /в ATtiny13A нет возможности/ или внешой генератор.

Для чего используется конструкция? Анализируйте и делитесь информацией хотя бы относительно времени (и clock МК)?

Re: Millis на Attiny13 и точный отсчет времени

Вт апр 16, 2024 12:59:54

RoMario2024 писал(а):Насколько я понял, к Attiny13 не подключишь кварц, только внешний генератор, а у меня габариты девайса не позволяют кучу дополнительных элементов , к сожалению. И цена девайса тоже возрастет, а мне это также критично.

Сейчас кварцевые генераторы это одна деталька, размером +- с тот же самый кварц, и стоят не на много дороже этого кварца.

Ну или как выше писали, при старте, читаем OSCCAL, прибавляем/отнимаем +-1, перезаписываем, компилируем, шьем, замеряем, мало (много)? Меняем OSCCAL дальше, пока не подойдем максимально близко к 10:00:000. Но при изменении температуры оно потом все равно уедет :dont_know:

Попадались пару раз tiny2313, которые через UART на 9600 не работали, ошибка по частоте большая была, только изменением OSCCAL выкрутился, там все ноги заняты были, ни кварц ни генератор не подключишь...

Re: Millis на Attiny13 и точный отсчет времени

Ср апр 17, 2024 07:06:38

возьмите например STM32G030C6T6, его можно купить и подешевле ATTINY13, по размерам тоже сопоставимо, корпус правда LQFP48, но не думаю что это проблема, я и лутом под них платы делал, а с фоторезистом вообще в легкую

зато получите полноценные RTC на борту и свои 10 минут отсчитаете с точностью до сотых секунды если не лучше :) по энергопотреблению STM32 думаю даже лучше AVR будет (но это не точно), и если прям сильно важно энергопотребление смотрите STM32L серию, она специально сделана для батарейных девайсов

ну и ко всему прочему получите кучу дополнительной периферии

Код:
Features
Core
Arm® 32-bit Cortex®-M0+ CPU, frequency up to 64 MHz
-40°C to 85°C operating temperature
Memories
Up to 64 Kbytes of Flash memory with protection
8 Kbytes of SRAM with HW parity check
CRC calculation unit
Reset and power management
Voltage range: 2.0 V to 3.6 V
Power-on/Power-down reset (POR/PDR)
Low-power modes:Sleep, Stop, Standby
VBAT supply for RTC and backup registers
Clock management
4 to 48 MHz crystal oscillator
32 kHz crystal oscillator with calibration
Internal 16 MHz RC with PLL option
Internal 32 kHz RC oscillator (±5 %)
Up to 44 fast I/Os
All mappable on external interrupt vectors
Multiple 5 V-tolerant I/Os
5-channel DMA controller with flexible mapping
12-bit, 0.4 µs ADC (up to 16 ext. channels)
Up to 16-bit with hardware oversampling
Conversion range: 0 to 3.6V
8 timers
16-bit for advanced motor control, four 16-bit general-purpose, two watchdogs, SysTick timer
Calendar RTC with alarm and periodic wakeup from Stop/Standby
Communication interfaces
Two I2C-bus interfaces supporting Fast-mode Plus (1 Mbit/s) with extra current sink, one supporting SMBus/PMBus and wakeup from Stop mode
Two USARTs with master/slave synchronous SPI; one supporting ISO7816 interface, LIN, IrDA capability, auto baud rate detection and wakeup feature
Two SPIs (32 Mbit/s) with 4- to 16-bit programmable bitframe, one multiplexed with I2S interface
Development support
serial wire debug (SWD)
All packages ECOPACK 2 compliant
All packages ECOPACK 2 compliant


ну и минус, после того как освоите STM32 на AVR вы уже никогда не вернетесь :)

Re: Millis на Attiny13 и точный отсчет времени

Ср апр 17, 2024 07:46:33

Denis82, еще раз просмотрите название темы :/.

Re: Millis на Attiny13 и точный отсчет времени

Пт апр 19, 2024 18:52:05

Denis82 писал(а):после того как освоите STM32 на AVR вы уже никогда не вернетесь
Не факт :)
Я возвращаюсь. Но да, армы рвут аврки как тузик грелку.

RoMario2024, возьмите аттини85, она может уже от кварца тактироваться, и в ней 2 таймера.

Re: Millis на Attiny13 и точный отсчет времени

Пт апр 19, 2024 20:33:46

С кварцем и дурак сможет.)
Да нормально там всё и без кварца должно быть. Это ж не часы, а всего лишь 10-ти минутный таймер.

Re: Millis на Attiny13 и точный отсчет времени

Пт апр 19, 2024 21:56:42

OKF, согласна. Но если ставится вопрос точности - то кварцу альтернативы нет )))

Re: Millis на Attiny13 и точный отсчет времени

Сб апр 20, 2024 10:24:52

Ну, с этим не поспоришь.) Хотя...
Когда то сталкивался с похожим как у ТС с одним из ядер. Проблема была с удлинением delay на 1,2 мгц (на 9,6 ОК). Удлиняли прерывания от таймера. Но миллис отрабатывал нормально.
Поэтому, если ТС сформулирует свою задачу, то можно попробовать подсказать решение.

Добавлено after 4 hours 32 seconds:
Just_Fluffy, этот пример для того, что если руки кривые, то и кварц не поможет).

Re: Millis на Attiny13 и точный отсчет времени

Сб апр 20, 2024 10:26:35

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

Re: Millis на Attiny13 и точный отсчет времени

Сб апр 20, 2024 10:43:56

millis(), micros() в MicroCore сделали с WDT Oscillator. (Timer0 остается для приложений). WDT Oscillator имеетмеет худшую зависимость от напряжения и температуры, не калибруется на заводе и не можно калибрировать.

См. millis.S:
Код:
    ldi ZL, lo8(wdt_millis_counter)
    ld tmp1, Z
    subi tmp1, -19                      ; Add 19 (not 16) because the WDT clock isn't really 128 kHz

Подправляли "методом проб и ошибок", потому что без этого порядка будет еще хуже. Если для время используете Timer0, будет лучше. Он: по Fclock, он: по OSCALL. Но если не нужен таймер для чего другого. Так что при малом количестве ресурсов в МК - самое то. Мне нравится ATtiny13A именно из-за этого и он один из моих любимых МК - заставляет думать "по-другому" при написании программного кода :).

Re: Millis на Attiny13 и точный отсчет времени

Сб апр 20, 2024 11:05:15

Ну вот никогда не понимала "костыли" в виде ардуины...

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

Re: Millis на Attiny13 и точный отсчет времени

Сб апр 20, 2024 12:12:48

АТмега8, конечно, крупнее, чем АТтини13, но у АТмега8 внутренняя частота 1 МГц хорошо откалибрована - отклонение не более 0,5%.
на 10 минут это составит не более 3 секунд, а может и меньше.
я даже первые версии одного своего проекта делал без кварца, а там у меня работал секундомер для подсчета времени работы. но потом на форуме меня попросили поставить кварц для более точного подсчета времени. когда запущен процесс, то за несколько часов без кварца накапливалась заметная ошибка.
Ответить