Нужна подсказка

Игорь Я
Offline
Зарегистрирован: 03.09.2018
Доброго времени суток, уважаемые.
Приобрел ардуино уно и аттини 13А для своих поделок.
В ардуинку записал нижеописанную прогу и по онлайн таймеру сверял работу времени - всё работает ОК!
потом прошил эту прогу в аттини и...
работает, но время не совпидает, т.е уплывает в сторону увеличения (при частоте 9.6Мгц).
прошил на 4,8 стало уплывать в минус,
то же самое и на 1.2 Мгц.
Чувствую, что связано с коэффициентом деления, либо с внутренними задержками при выполнении операций.
Хотя повторюсь: - на ардуине всё работало без проблем.
Поясните пожалуйста.
Сам не программист, просто пытливый.
Спасибо заранее.
 
 
const int Relay_pin =3;
bool Relay; //1 вкл/ 0 нет
void setup() {
  pinMode(Relay_pin, OUTPUT);
  digitalWrite(Relay_pin, Relay = 1);
}
void loop() {
  static uint32_t past_1 = 0 ;
  if (Relay && millis() - past_1 >= 1000) // если прошла 1 сек
    digitalWrite(Relay_pin, Relay = 0); // выкл
  if (millis() - past_1 >= 60000) { // если прошло 60 сек
    past_1 = millis() ;
    digitalWrite(Relay_pin, Relay = 1); // вкл 
  }
}
b707
Offline
Зарегистрирован: 26.05.2017

а откуда такие странные частоты - 1.2, 4.8. 9.6 ? Стандартный ряд -1, 2, 4, 8 МГц

Может как раз в нестанлартной частоте вся проблема?

Игорь Я
Offline
Зарегистрирован: 03.09.2018

это частоты внутреннего генератора, которые выбираются для работы Аттини.

GarryC
Offline
Зарегистрирован: 08.08.2016

Библиотека ардуино настроено строго на определенные частоты и если Ваша частота отличается от стандартной, будет уплывать.

Pavel.N
Offline
Зарегистрирован: 18.08.2018

сам работал с тини13, подтверждаю стандартный ряд 4.8 или 9.6 плюс делитель на 8 установленный по умолчанию дает 1.2 МГц

Игорь Я
Offline
Зарегистрирован: 03.09.2018

ну да, ардуинка на 16Мгц кварцована. А разницы при делении частоты я не вижу, тем более я в программе ставлю 1000 милисекунд, а не конкретно делю частоту на определенный делитель.

b707
Offline
Зарегистрирован: 26.05.2017

Игорь Я пишет:

ня в программе ставлю 1000 милисекунд, а не конкретно делю частоту на определенный делитель.

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

Игорь Я
Offline
Зарегистрирован: 03.09.2018

т.е мне надо задать коэффициент деления, чтобы получить 1 гц, а потом его в программу задавать конкретно для аттиньки?

Pavel.N
Offline
Зарегистрирован: 18.08.2018

ну у меня тини нормально тикает в комнате, если нагревать  или охлаждать, то частота плывет. Прикол с температурой мне подсказали сам даже не думал, чё есть разница в температуре

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Игорь Я пишет:

т.е мне надо задать коэффициент деления, чтобы получить 1 гц, а потом его в программу задавать конкретно для аттиньки?

нет

вы как attiny прошиваете ? через Arduino IDE ? выберете плату с нужной частойтой, например ATtiny85 @ 8 MHz  (internal oscillator; BOD disabled) и выберете в меню Записать загрузчик.

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Pavel.N пишет:

ну у меня тини нормально тикает в комнате, если нагревать  или охлаждать, то частота плывет. Прикол с температурой мне подсказали сам даже не думал, чё есть разница в температуре

частота от температуры очень сильно зависима - не лечиться 

Игорь Я
Offline
Зарегистрирован: 03.09.2018

вы как attiny прошиваете ? через Arduino IDE ?

Да, в ардуино выбираю ардуино IDE, потом выбираю Аттитни 13А, далее загрузчик загружаю (пробовал работоспособность атиньки при разных частотах), а
потом скетч записываю... но время не бьётся с ардуиновским (когда скетч в ардуино залит).

Игорь Я
Offline
Зарегистрирован: 03.09.2018

нее.. температура это не тот случай.. при 60000 микросекундах, вторая минута увеличивается на 2-3 секунды, третья на 2-3 сек и т.д

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Игорь Я пишет:

нее.. температура это не тот случай.. при 60000 микросекундах, вторая минута увеличивается на 2-3 секунды, третья на 2-3 сек и т.д

В минуте 60000 миллисекунд
Меньше процента погрешность - нормально для нестабилизированного генератора

Игорь Я
Offline
Зарегистрирован: 03.09.2018

ну с погрешностью согласен, но не в таком виде..

от одной секунды (1000 мс) - 1 процент это - 10мс..т.е каждую секунду будет либо на 10мс больше, либо меньше.. Далее:  10мс х на 60сек = 600мс..

от 1000мс остается 400мс, т.е за одну минуту уход частоты около полсекунды - это вполне нормально, а у меня 2-3сек..

 

jdigreze
Offline
Зарегистрирован: 14.01.2018

Надо смотреть что оно там выставляет в делитель таймера. Сейчас не подскажу, т.к. недавно систему переставлял, и библиотек tiny13, коих и интернетах не одна, не ставил ещё.

Скорее всего millis() не соответствует физическим мс, и вместо 1000 надо другое число писать, под конкретную частоту внутреннего RC осциллятора. Ну и про температуру не забывать, ибо RC очень сильно плавает от неё.

b707
Offline
Зарегистрирован: 26.05.2017

Игорь Я пишет:

от 1000мс остается 400мс, т.е за одну минуту уход частоты около полсекунды - это вполне нормально, а у меня 2-3сек..

 

частота чем задается? - внутренним осцилятором или внешним кварцем? - для внутреннего генератора 3сек в минуту - нормальная погрешность. У особо неудачных экземпляров и 10 сек бывает. Не зря в книжках пишут, что с внутренним тактом даже UART может не работать из-за ухода частоты.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Игорь Я пишет:

ну с погрешностью согласен, но не в таком виде..

от одной секунды (1000 мс) - 1 процент это - 10мс..т.е каждую секунду будет либо на 10мс больше, либо меньше.. Далее:  10мс х на 60сек = 600мс..

от 1000мс остается 400мс, т.е за одну минуту уход частоты около полсекунды - это вполне нормально, а у меня 2-3сек..

 

каккое ты используешь ядро? прямо ссылку давай, потому что есть штуки три (минимум) разных, с разными способами счета миллис, есть с таймером1, с вочдогом и вообще без миллис.

Игорь Я
Offline
Зарегистрирован: 03.09.2018

(каккое ты используешь ядро? прямо ссылку давай, потому что есть штуки три (минимум) разных, с разными способами счета миллис, есть с таймером1, с вочдогом и вообще без миллис.)

мне кажется я в первом посте всё пояснил.

 

Игорь Я
Offline
Зарегистрирован: 03.09.2018

в нулевом посте..

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Игорь Я пишет:

в нулевом посте..

мне кажеться вам уже все разъяснили - хотите точность - используйте внешний генератор тактовых импульсов или часы с будильником

Игорь Я
Offline
Зарегистрирован: 03.09.2018

b707 пишет:

/quote]

частота чем задается? - внутренним осцилятором или внешним кварцем? - для внутреннего генератора 3сек в минуту - нормальная погрешность. У особо неудачных экземпляров и 10 сек бывает. Не зря в книжках пишут, что с внутренним тактом даже UART может не работать из-за ухода частоты.

внутренняя RC цепь..

да нууу.. что-то не так. если я с такой погрешностью (в 1 процент) поставлю просто 60 сек, то погрешность будет всего 0.6 сек.. это в принципе нормально.. какой смысл от микрухи если с неё при делении погрешность от полученной минуты более 10 процентов.. нее.. что-то не так..

Игорь Я
Offline
Зарегистрирован: 03.09.2018

andycat пишет:

Игорь Я пишет:

в нулевом посте..

мне кажеться вам уже все разъяснили - хотите точность - используйте внешний генератор тактовых импульсов или часы с будильником

т.е Вы считаете, что кварцованная частота в 32768 Гц от часов пделит до 1 секунды намного точнее, чем получение 1 Гц от 9600 КГц?.. пусть даже с внетренним генератором..

 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Игорь Я пишет:

в нулевом посте..

Нет, там ты вообще ничего не "объяснил". Еще раз спрашиваю - какое ядро? откуда его устанавливал?

Ядро (core) - это "добавка" в Ардуино ИДЕ, которая позволяет компилировать программы под Attiny13.

Сама ИДЕ, по умолчанию, не умеет работать с тинькой13, значит ты что-то установил, вот и спрашиваю ЧТО?

Есть несколько типов этих ядер. Поскольку ты в этом нихера не понимаешь, просто скажи, которое ты устанавливал. Тогда я смогу тебе точно указать, как именно настроить таймер, чтобы расхождения были в пределах 1%.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Игорь Я пишет:

andycat пишет:

Игорь Я пишет:

в нулевом посте..

мне кажеться вам уже все разъяснили - хотите точность - используйте внешний генератор тактовых импульсов или часы с будильником

т.е Вы считаете, что кварцованная частота в 32768 Гц от часов пделит до 1 секунды намного точнее, чем получение 1 Гц от 9600 КГц?.. пусть даже с внетренним генератором..

 

ГЫ! Забавный ты! Это не "он считает", это законы физики так считают. Их даже Путин (да хранит его небесный ковер тысячизвездный!) отменить не может! ;) ;) ;)

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Игорь Я пишет:

andycat пишет:

Игорь Я пишет:

в нулевом посте..

мне кажеться вам уже все разъяснили - хотите точность - используйте внешний генератор тактовых импульсов или часы с будильником

т.е Вы считаете, что кварцованная частота в 32768 Гц от часов пделит до 1 секунды намного точнее, чем получение 1 Гц от 9600 КГц?.. пусть даже с внетренним генератором..

 

Я ничего не считаю, просто я уже с attiny работал сам все это прочуствовал и вступать в теоретические диспуты мне лень. Не верите - сами проводите эксперименты и читайте умные книжки.

jdigreze
Offline
Зарегистрирован: 14.01.2018

wdrakula пишет:

Нет, там ты вообще ничего не "объяснил". Еще раз спрашиваю - какое ядро? откуда его устанавливал?

Ядро (core) - это "добавка" в Ардуино ИДЕ, которая позволяет компилировать программы под Attiny13.

Вот и я про то же. Только обозвал библиотекой... Что конечно не совсем верно.

Игорь Я
Offline
Зарегистрирован: 03.09.2018

wdrakula пишет:

Нет, там ты вообще ничего не "объяснил". Еще раз спрашиваю - какое ядро? откуда его устанавливал?

Ядро (core) - это "добавка" в Ардуино ИДЕ, которая позволяет компилировать программы под Attiny13.

Сама ИДЕ, по умолчанию, не умеет работать с тинькой13, значит ты что-то установил, вот и спрашиваю ЧТО?

[/quote]

вот это уже ближе..

слэнг что "ядро" 'это "core" я не знал..

просто говорю: - "Ставил вот отсюда"- https://github.com/orlv/at13/archive/master.zip

 

Игорь Я
Offline
Зарегистрирован: 03.09.2018

(радостно потирая ладошки)

 Чувствую в правильном направлении двигают..)))

jdigreze
Offline
Зарегистрирован: 14.01.2018

Вот в файлике "wiring.c" и находится ответ:

	#elif F_CPU == 9600000
	x = ovrf / 37;

на "логических" 1000мс оно выдаст результат 1013мс. А на 60000мс (1мин), будет резульат 60811мс. Вот они 0.8 сек на 1 минуту.

Так что попробуйте заменить в своём коде числа "1000" и "60000" на "1013" и "60811", и расскажите про результат. Программировать tiny13 на частоту 9.6МГц.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Игорь Я пишет:
слэнг что "ядро" 'это "core" я не знал..

1.с каких пор английский стал "слЭнгом"?????

2. В этом ядре время считается первым таймером. Довольно точно. Можно сделать тогнее, но тут важно, что частота не плавает, если ты не планируешь "её, из пламенного горна, бросать в леденящий холод" ;). Следовательно тебе нужно посидеть рядом с секундомером и заменить в коде 60000 в делей, на то, что даст нужный тебе результат.

Игорь Я
Offline
Зарегистрирован: 03.09.2018

спасибо, всем откликнувшимся..

как зашью тиньку обязательно отпишусь.. думаю в течение сегодня-завтра и зашью..

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Игорь Я пишет:

спасибо, всем откликнувшимся..

как зашью тиньку обязательно отпишусь.. думаю в течение сегодня-завтра и зашью..

вы бы задачу полностью описали, а то может вам ее вообще на 1 МГц прошить будет надежнее и еще спящий режим прикрутить чтоб от батарейки работала.

Игорь Я
Offline
Зарегистрирован: 03.09.2018

jdigreze пишет:

Вот в файлике "wiring.c" и находится ответ:

	#elif F_CPU == 9600000
	x = ovrf / 37;

на "логических" 1000мс оно выдаст результат 1013мс. А на 60000мс (1мин), будет резульат 60811мс. Вот они 0.8 сек на 1 минуту.

Так что попробуйте заменить в своём коде числа "1000" и "60000" на "1013" и "60811", и расскажите про результат. Программировать tiny13 на частоту 9.6МГц.

чот не понял.. за 1секунду выдаст 1013мс, а за 60 сек - 60811?? а почему не 60780 = 1013 х 60.. или я туплю?

из файла - если частота тиньки = 9,6 Мгц, то  какая частота f - которую делят на 37?? 

jdigreze
Offline
Зарегистрирован: 14.01.2018

Игорь Я пишет:

чот не понял.. за 1секунду выдаст 1013мс, а за 60 сек - 60811?? а почему не 60780 = 1013 х 60.. или я туплю?

из файла - если частота тиньки = 9,6 Мгц, то  какая частота f - которую делят на 37?? 

Это я посчитал в Ecxel по формулам. Там постоянно набегающая погрешность из-за целочисленных вычислений. Если перешить таймер 1 на кратность 96, то, imho, можно ещё повысить точность, но в свете зависимости внутреннего RC от температуры, причём довольно существенного, мне кажется, что стоит попробовать просто скорректировать коэффициенты в основном теле программы.

Игорь Я пишет:
из файла - если частота тиньки = 9,6 Мгц, то  какая частота f - которую делят на 37??

Посмотри внимательно содержимое файла wiring.c из core atiiny13. Частота таймера при 9.6МГц получается 37500Гц. Счетчик таймера установлен по переполнению одного байта, т.е. деление тактовой на 256. Там даже в комментариях к исходнику так написано.

P.S. На сколько я помню, тут гуру по tiny'кам наверно лучше подскажут, но в BOD'ах можно коррекцию RC сделать под определённые условия окружающей среды. Я просто этим в своих проектах не заморачивался, т.к. не нужна была прецизионная точность тактирования. Больше с ИОНами возился. ;)

Игорь Я
Offline
Зарегистрирован: 03.09.2018

"ovrf++; //Increment counter every 256 clock cycles" - вот где собака зарыта!!!

9600000 / 256 / 37 = 1013,513513513514 х 60 = 60810,81081081081..

всё, понял.. спасибо jdigreze , персональное!!!

Игорь Я
Offline
Зарегистрирован: 03.09.2018

для 1.2Мгц - 1 сек будет = 937,5мс , а 1 мин = 56250 мс... - я верно понял??

т.е для четного числа лучше пользоваться 1.2Мгц.. вроде так..

Игорь Я
Offline
Зарегистрирован: 03.09.2018

прошил тиньку на 9,6 Мгц - 28 минут работы - полет нормальный, сбилось в минус примерно на полсекунды..

попробую на 1.2 зашить..

Глюм
Offline
Зарегистрирован: 12.11.2017

Здравствуйте. Пришла ардуинка, прошил "блинком", прошилось нормально без ошибок НО! Частота мигания диода примерно , 5 секунд горит , 5 секунд не горит. А в скетче стоит delay (1000); Чипы MEGA 328 P AU, CH340, кварц  на CH340 12MHz, на MEGA 328 стоял 12 MHz (?) переставил на 16 MHz - не изменилось ничего. Не подскажете в чем дело и как устранить?

 

bwn
Offline
Зарегистрирован: 25.08.2014

Глюм пишет:

Здравствуйте. Пришла ардуинка, прошил "блинком", прошилось нормально без ошибок НО! Частота мигания диода примерно , 5 секунд горит , 5 секунд не горит. А в скетче стоит delay (1000); Чипы MEGA 328 P AU, CH340, кварц  на CH340 12MHz, на MEGA 328 стоял 12 MHz (?) переставил на 16 MHz - не изменилось ничего. Не подскажете в чем дело и как устранить?

Переставив кварц, наверно и загрузчик трэба изменить? Нет?

Green
Онлайн
Зарегистрирован: 01.10.2015

Ну да. Сначала бы сообщение при загрузке глянуть. Наблюдал похожее на плате с LGT328.

Глюм
Offline
Зарегистрирован: 12.11.2017
При загрузке следующее сообщение:
Скетч использует 2070 байт (6%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 188 байт (9%) динамической памяти, оставляя 1860 байт для локальных переменных. Максимум: 2048 байт.
Неверная библиотека найдена в F:\arduino-nightly\libraries\GyverLibs-master: нет заголовочных файлов (.h), найденных в F:\arduino-nightly\libraries\GyverLibs-master
Неверная библиотека найдена в F:\arduino-nightly\libraries\GyverRTOS: нет заголовочных файлов (.h), найденных в F:\arduino-nightly\libraries\GyverRTOS
Неверная библиотека найдена в C:\Users\SERG\Documents\Arduino\libraries\GyverEncoder: нет заголовочных файлов (.h), найденных в C:\Users\SERG\Documents\Arduino\libraries\GyverEncoder
Неверная библиотека найдена в F:\arduino-nightly\libraries\GyverLibs-master: нет заголовочных файлов (.h), найденных в F:\arduino-nightly\libraries\GyverLibs-master
Неверная библиотека найдена в F:\arduino-nightly\libraries\GyverRTOS: нет заголовочных файлов (.h), найденных в F:\arduino-nightly\libraries\GyverRTOS
Неверная библиотека найдена в C:\Users\SERG\Documents\Arduino\libraries\GyverEncoder: нет заголовочных файлов (.h), найденных в C:\Users\SERG\Documents\Arduino\libraries\GyverEncoder
 
Типа всё ОК.
 
Ещё сделал следующее: вгрузил пример DigitalReadSerial, в Сериал-порт ардуина выдала кракозябры на частоте 9600бод. Но изменив 9600 на 2400 (уменьшив в 4 раза) всё нормализовалось - в сериале пошли в рядок нулики и единички.
А если в скетче указать :
void setup() {
 ,,,,,,,,,
  Serial.begin(38400);
,,,,,,,,,,
}
то нормально работать сериал начинает только на 9600 бод.
Т.е., как я понял, в бутлоадере выставлена частота не 16 мггц, а 4мггц? и нужно перепрошить бутлоадер?
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Ищите тему по WAVGAT - в ней написано, что делать.

Глюм
Offline
Зарегистрирован: 12.11.2017

Всем спасибо , нашел по вашим подсказкам решение. Я думал, что на плате оригинальный(как ни странно ) процессор, маркировка то оригинальная))

Но поставил "аддон" от WAVGAT  и вроде бы заработало (во всяком случае тайминг "блинка" стал правильный)

Еще раз всем спасибо)