Нужна подсказка
- Войдите на сайт для отправки комментариев
Пнд, 03/09/2018 - 16:43
Доброго времени суток, уважаемые.
Приобрел ардуино уно и аттини 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); // вкл
}
}
а откуда такие странные частоты - 1.2, 4.8. 9.6 ? Стандартный ряд -1, 2, 4, 8 МГц
Может как раз в нестанлартной частоте вся проблема?
это частоты внутреннего генератора, которые выбираются для работы Аттини.
Библиотека ардуино настроено строго на определенные частоты и если Ваша частота отличается от стандартной, будет уплывать.
сам работал с тини13, подтверждаю стандартный ряд 4.8 или 9.6 плюс делитель на 8 установленный по умолчанию дает 1.2 МГц
ну да, ардуинка на 16Мгц кварцована. А разницы при делении частоты я не вижу, тем более я в программе ставлю 1000 милисекунд, а не конкретно делю частоту на определенный делитель.
ня в программе ставлю 1000 милисекунд, а не конкретно делю частоту на определенный делитель.
в МК нет никаких миллисекунд, а есть только тики системного таймера, которые получаются "конкретным делением частоты". А миллисекундами их обозвали в ардуино, чтоб чайники не пугались . Так что если частота неверная - то и эти "миллисекунды" будут далеки от настоящих
т.е мне надо задать коэффициент деления, чтобы получить 1 гц, а потом его в программу задавать конкретно для аттиньки?
ну у меня тини нормально тикает в комнате, если нагревать или охлаждать, то частота плывет. Прикол с температурой мне подсказали сам даже не думал, чё есть разница в температуре
т.е мне надо задать коэффициент деления, чтобы получить 1 гц, а потом его в программу задавать конкретно для аттиньки?
нет
вы как attiny прошиваете ? через Arduino IDE ? выберете плату с нужной частойтой, например ATtiny85 @ 8 MHz (internal oscillator; BOD disabled) и выберете в меню Записать загрузчик.
Потом уже прошиваете скетч и все должно быть нормально.
ну у меня тини нормально тикает в комнате, если нагревать или охлаждать, то частота плывет. Прикол с температурой мне подсказали сам даже не думал, чё есть разница в температуре
частота от температуры очень сильно зависима - не лечиться
вы как attiny прошиваете ? через Arduino IDE ?
Да, в ардуино выбираю ардуино IDE, потом выбираю Аттитни 13А, далее загрузчик загружаю (пробовал работоспособность атиньки при разных частотах), а
потом скетч записываю... но время не бьётся с ардуиновским (когда скетч в ардуино залит).
нее.. температура это не тот случай.. при 60000 микросекундах, вторая минута увеличивается на 2-3 секунды, третья на 2-3 сек и т.д
нее.. температура это не тот случай.. при 60000 микросекундах, вторая минута увеличивается на 2-3 секунды, третья на 2-3 сек и т.д
В минуте 60000 миллисекунд
Меньше процента погрешность - нормально для нестабилизированного генератора
ну с погрешностью согласен, но не в таком виде..
от одной секунды (1000 мс) - 1 процент это - 10мс..т.е каждую секунду будет либо на 10мс больше, либо меньше.. Далее: 10мс х на 60сек = 600мс..
от 1000мс остается 400мс, т.е за одну минуту уход частоты около полсекунды - это вполне нормально, а у меня 2-3сек..
Надо смотреть что оно там выставляет в делитель таймера. Сейчас не подскажу, т.к. недавно систему переставлял, и библиотек tiny13, коих и интернетах не одна, не ставил ещё.
Скорее всего millis() не соответствует физическим мс, и вместо 1000 надо другое число писать, под конкретную частоту внутреннего RC осциллятора. Ну и про температуру не забывать, ибо RC очень сильно плавает от неё.
от 1000мс остается 400мс, т.е за одну минуту уход частоты около полсекунды - это вполне нормально, а у меня 2-3сек..
частота чем задается? - внутренним осцилятором или внешним кварцем? - для внутреннего генератора 3сек в минуту - нормальная погрешность. У особо неудачных экземпляров и 10 сек бывает. Не зря в книжках пишут, что с внутренним тактом даже UART может не работать из-за ухода частоты.
ну с погрешностью согласен, но не в таком виде..
от одной секунды (1000 мс) - 1 процент это - 10мс..т.е каждую секунду будет либо на 10мс больше, либо меньше.. Далее: 10мс х на 60сек = 600мс..
от 1000мс остается 400мс, т.е за одну минуту уход частоты около полсекунды - это вполне нормально, а у меня 2-3сек..
каккое ты используешь ядро? прямо ссылку давай, потому что есть штуки три (минимум) разных, с разными способами счета миллис, есть с таймером1, с вочдогом и вообще без миллис.
(каккое ты используешь ядро? прямо ссылку давай, потому что есть штуки три (минимум) разных, с разными способами счета миллис, есть с таймером1, с вочдогом и вообще без миллис.)
мне кажется я в первом посте всё пояснил.
в нулевом посте..
в нулевом посте..
мне кажеться вам уже все разъяснили - хотите точность - используйте внешний генератор тактовых импульсов или часы с будильником
/quote]
частота чем задается? - внутренним осцилятором или внешним кварцем? - для внутреннего генератора 3сек в минуту - нормальная погрешность. У особо неудачных экземпляров и 10 сек бывает. Не зря в книжках пишут, что с внутренним тактом даже UART может не работать из-за ухода частоты.
внутренняя RC цепь..
да нууу.. что-то не так. если я с такой погрешностью (в 1 процент) поставлю просто 60 сек, то погрешность будет всего 0.6 сек.. это в принципе нормально.. какой смысл от микрухи если с неё при делении погрешность от полученной минуты более 10 процентов.. нее.. что-то не так..
в нулевом посте..
мне кажеться вам уже все разъяснили - хотите точность - используйте внешний генератор тактовых импульсов или часы с будильником
т.е Вы считаете, что кварцованная частота в 32768 Гц от часов пделит до 1 секунды намного точнее, чем получение 1 Гц от 9600 КГц?.. пусть даже с внетренним генератором..
в нулевом посте..
Нет, там ты вообще ничего не "объяснил". Еще раз спрашиваю - какое ядро? откуда его устанавливал?
Ядро (core) - это "добавка" в Ардуино ИДЕ, которая позволяет компилировать программы под Attiny13.
Сама ИДЕ, по умолчанию, не умеет работать с тинькой13, значит ты что-то установил, вот и спрашиваю ЧТО?
Есть несколько типов этих ядер. Поскольку ты в этом нихера не понимаешь, просто скажи, которое ты устанавливал. Тогда я смогу тебе точно указать, как именно настроить таймер, чтобы расхождения были в пределах 1%.
в нулевом посте..
мне кажеться вам уже все разъяснили - хотите точность - используйте внешний генератор тактовых импульсов или часы с будильником
т.е Вы считаете, что кварцованная частота в 32768 Гц от часов пделит до 1 секунды намного точнее, чем получение 1 Гц от 9600 КГц?.. пусть даже с внетренним генератором..
ГЫ! Забавный ты! Это не "он считает", это законы физики так считают. Их даже Путин (да хранит его небесный ковер тысячизвездный!) отменить не может! ;) ;) ;)
в нулевом посте..
мне кажеться вам уже все разъяснили - хотите точность - используйте внешний генератор тактовых импульсов или часы с будильником
т.е Вы считаете, что кварцованная частота в 32768 Гц от часов пделит до 1 секунды намного точнее, чем получение 1 Гц от 9600 КГц?.. пусть даже с внетренним генератором..
Я ничего не считаю, просто я уже с attiny работал сам все это прочуствовал и вступать в теоретические диспуты мне лень. Не верите - сами проводите эксперименты и читайте умные книжки.
Нет, там ты вообще ничего не "объяснил". Еще раз спрашиваю - какое ядро? откуда его устанавливал?
Ядро (core) - это "добавка" в Ардуино ИДЕ, которая позволяет компилировать программы под Attiny13.
Нет, там ты вообще ничего не "объяснил". Еще раз спрашиваю - какое ядро? откуда его устанавливал?
Ядро (core) - это "добавка" в Ардуино ИДЕ, которая позволяет компилировать программы под Attiny13.
Сама ИДЕ, по умолчанию, не умеет работать с тинькой13, значит ты что-то установил, вот и спрашиваю ЧТО?
[/quote]
вот это уже ближе..
слэнг что "ядро" 'это "core" я не знал..
просто говорю: - "Ставил вот отсюда"- https://github.com/orlv/at13/archive/master.zip
(радостно потирая ладошки)
Чувствую в правильном направлении двигают..)))
Вот в файлике "wiring.c" и находится ответ:
на "логических" 1000мс оно выдаст результат 1013мс. А на 60000мс (1мин), будет резульат 60811мс. Вот они 0.8 сек на 1 минуту.
Так что попробуйте заменить в своём коде числа "1000" и "60000" на "1013" и "60811", и расскажите про результат. Программировать tiny13 на частоту 9.6МГц.
1.с каких пор английский стал "слЭнгом"?????
2. В этом ядре время считается первым таймером. Довольно точно. Можно сделать тогнее, но тут важно, что частота не плавает, если ты не планируешь "её, из пламенного горна, бросать в леденящий холод" ;). Следовательно тебе нужно посидеть рядом с секундомером и заменить в коде 60000 в делей, на то, что даст нужный тебе результат.
спасибо, всем откликнувшимся..
как зашью тиньку обязательно отпишусь.. думаю в течение сегодня-завтра и зашью..
спасибо, всем откликнувшимся..
как зашью тиньку обязательно отпишусь.. думаю в течение сегодня-завтра и зашью..
вы бы задачу полностью описали, а то может вам ее вообще на 1 МГц прошить будет надежнее и еще спящий режим прикрутить чтоб от батарейки работала.
Вот в файлике "wiring.c" и находится ответ:
на "логических" 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??
чот не понял.. за 1секунду выдаст 1013мс, а за 60 сек - 60811?? а почему не 60780 = 1013 х 60.. или я туплю?
из файла - если частота тиньки = 9,6 Мгц, то какая частота f - которую делят на 37??
Посмотри внимательно содержимое файла wiring.c из core atiiny13. Частота таймера при 9.6МГц получается 37500Гц. Счетчик таймера установлен по переполнению одного байта, т.е. деление тактовой на 256. Там даже в комментариях к исходнику так написано.
P.S. На сколько я помню, тут гуру по tiny'кам наверно лучше подскажут, но в BOD'ах можно коррекцию RC сделать под определённые условия окружающей среды. Я просто этим в своих проектах не заморачивался, т.к. не нужна была прецизионная точность тактирования. Больше с ИОНами возился. ;)
"ovrf++; //Increment counter every 256 clock cycles" - вот где собака зарыта!!!
9600000 / 256 / 37 = 1013,513513513514 х 60 = 60810,81081081081..
всё, понял.. спасибо jdigreze , персональное!!!
для 1.2Мгц - 1 сек будет = 937,5мс , а 1 мин = 56250 мс... - я верно понял??
т.е для четного числа лучше пользоваться 1.2Мгц.. вроде так..
прошил тиньку на 9,6 Мгц - 28 минут работы - полет нормальный, сбилось в минус примерно на полсекунды..
попробую на 1.2 зашить..
Здравствуйте. Пришла ардуинка, прошил "блинком", прошилось нормально без ошибок НО! Частота мигания диода примерно , 5 секунд горит , 5 секунд не горит. А в скетче стоит delay (1000); Чипы MEGA 328 P AU, CH340, кварц на CH340 12MHz, на MEGA 328 стоял 12 MHz (?) переставил на 16 MHz - не изменилось ничего. Не подскажете в чем дело и как устранить?
Здравствуйте. Пришла ардуинка, прошил "блинком", прошилось нормально без ошибок НО! Частота мигания диода примерно , 5 секунд горит , 5 секунд не горит. А в скетче стоит delay (1000); Чипы MEGA 328 P AU, CH340, кварц на CH340 12MHz, на MEGA 328 стоял 12 MHz (?) переставил на 16 MHz - не изменилось ничего. Не подскажете в чем дело и как устранить?
Переставив кварц, наверно и загрузчик трэба изменить? Нет?
Ну да. Сначала бы сообщение при загрузке глянуть. Наблюдал похожее на плате с LGT328.
Ищите тему по WAVGAT - в ней написано, что делать.
Всем спасибо , нашел по вашим подсказкам решение. Я думал, что на плате оригинальный(как ни странно ) процессор, маркировка то оригинальная))
Но поставил "аддон" от WAVGAT и вроде бы заработало (во всяком случае тайминг "блинка" стал правильный)
Еще раз всем спасибо)