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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 2
Зарегистрирован: Сб апр 13, 2024 05:19:33

Сообщение RoMario2024 »

Всем привет!


Как посчитать точно время на 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?
Реклама
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Пока не будет внешнего кварцованного тактирования tn13, точных временных интервалов не получите.
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1432
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="RoMario2024",url="/forum/viewtopic.php?p=4568578#p4568578"]Что еще можно придумать, что еще и заработает на Attiny13a?[/uquote]
Не пользоваться Ардуино IDE. А если пользуетесь, то говорите хотя бы какое ядро.
Поставщик валерьянки для Кота
Сообщения: 1926
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

От автора 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 не откалиброван на заводе.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 2
Зарегистрирован: Сб апр 13, 2024 05:19:33

Сообщение RoMario2024 »

[uquote="akl",url="/forum/viewtopic.php?p=4568588#p4568588"]Пока не будет внешнего кварцованного тактирования tn13, точных временных интервалов не получите.[/uquote]

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

Добавлено after 9 minutes 25 seconds:
[uquote="OKF",url="/forum/viewtopic.php?p=4568596#p4568596"][uquote="RoMario2024",url="/forum/viewtopic.php?p=4568578#p4568578"]Что еще можно придумать, что еще и заработает на Attiny13a?[/uquote]
Не пользоваться Ардуино IDE. А если пользуетесь, то говорите хотя бы какое ядро.[/uquote]
Если честно, я сами не знаю, какое ядро. Ардуино Нано с Али, Attiny13 с Чип Дипа, подключал 13 к Нано 4 проводами + питание и земля. Прошил Нано скетчем ArduinoASP, а далее прошил скетч в 13.
Где посмотреть какое ядро? Вот скрин Arduino IDE на всякий, если это поможет.
1713218866541.png
(31.67 КБ) 82 скачивания
И, кстати, "Не пользоваться Ардуино IDE" - а чем пользоваться для корректного решения задачи?

Добавлено after 17 minutes 10 seconds:
[uquote="veso74",url="/forum/viewtopic.php?p=4568679#p4568679"]От автора 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 не откалиброван на заводе.[/uquote]
Спасибо! Понятия не имею, как реализовать мою 60сек задержку на сторожевом таймере, поэтому возник более важный вопрос - может, выбрать что-то еще вместо tiny13 для решения моей задачи?

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

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

P.S. Заказал пяток attiny85-20pu DIP для эксперимента, но они придут
только через две недели.
Реклама
Вымогатель припоя
Сообщения: 599
Зарегистрирован: Ср янв 06, 2010 10:01:46

Сообщение metan »

RoMario2024 писал(а):attiny85-20pu
как лично по мне, так крайне сомнительный выбор чипа. Стоимость как у меги88, а возможностей несравнимо меньше.
Для себя применяю серию мега48/88/168/328. Полностью заменимы снизу вверх и адекватная стоимость.
Реклама
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Как вариант. Формирователь периода 10 минут (600 секунд) таймером тактируемым WDT.
TEST_10MIN.zip
(1.16 КБ) 153 скачивания
Аналогичный период точнее будет формировать tiny25 с часовым кварцем.
TEST_10MIN_TN25.zip
(1.2 КБ) 94 скачивания
OKF
Это не хвост, это антенна
Сообщения: 1432
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="RoMario2024",url="/forum/viewtopic.php?p=4568961#p4568961"]Если честно, я сами не знаю, какое ядро. Ардуино Нано с Али, Attiny13 с Чип Дипа, подключал 13 к Нано 4 проводами + питание и земля. Прошил Нано скетчем ArduinoASP, а далее прошил скетч в 13.
Где посмотреть какое ядро?[/uquote]
Ну вы же плату выбираете из списка плат. Какой? Для тини13 microCore, DIY tiny core, возможно ещё какая.
Из Arduino IDE можете использовать компилятор. Только не использовать функции Ардуино.
10 минут вполне точно должно отрабатывать и без кварцевого генератора.
Поставщик валерьянки для Кота
Сообщения: 1926
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

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

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

Для чего используется конструкция? Анализируйте и делитесь информацией хотя бы относительно времени (и clock МК)?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

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

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

Попадались пару раз tiny2313, которые через UART на 9600 не работали, ошибка по частоте большая была, только изменением OSCCAL выкрутился, там все ноги заняты были, ни кварц ни генератор не подключишь...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Встал на лапы
Сообщения: 142
Зарегистрирован: Вс авг 23, 2015 08:14:05

Сообщение Denis82 »

возьмите например 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 вы уже никогда не вернетесь :)
Поставщик валерьянки для Кота
Сообщения: 1926
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Denis82, еще раз просмотрите название темы :/.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 554
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

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

RoMario2024, возьмите аттини85, она может уже от кварца тактироваться, и в ней 2 таймера.
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
OKF
Это не хвост, это антенна
Сообщения: 1432
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

С кварцем и дурак сможет.)
Да нормально там всё и без кварца должно быть. Это ж не часы, а всего лишь 10-ти минутный таймер.
Вымогатель припоя
Аватара пользователя
Сообщения: 554
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

OKF, согласна. Но если ставится вопрос точности - то кварцу альтернативы нет )))
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
OKF
Это не хвост, это антенна
Сообщения: 1432
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

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

Добавлено after 4 hours 32 seconds:
Just_Fluffy, этот пример для того, что если руки кривые, то и кварц не поможет).
Вымогатель припоя
Аватара пользователя
Сообщения: 554
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

ну так стандартный делей не учитывает прерывания.
А миллис.... Ну вот никогда не понимала "костыли" в виде ардуины...
В принципе, для простой программы (а в тринадцатую тню другая и не влезет) хватает одного таймера, задающего периодичность выполнения суперцикла.
А уже в самом цикле делать все задержки и отсчеты на программных таймерах.
Тогда уже к периоду суперцикла можно привязать кучу задач, выполняющихся параллельно.
При этом таймер можно использовать и по прямому назначению - генерации ШИМ, если выходная частота таймера не сильно высокая.
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
Поставщик валерьянки для Кота
Сообщения: 1926
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

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 именно из-за этого и он один из моих любимых МК - заставляет думать "по-другому" при написании программного кода :).
Контактная информация:
OKF
Это не хвост, это антенна
Сообщения: 1432
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4570830#p4570830"]Ну вот никогда не понимала "костыли" в виде ардуины...[/uquote]
Ну так для домохозяек же.) Ни о чём не думай, используй библиотеки и примеры в сети.
Я ТС-у говорил уже об этом.
Модератор
Аватара пользователя
Сообщения: 19077
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

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

Вернуться в «AVR»