Arduino -> AVR | Функция Delay
- Войдите на сайт для отправки комментариев
Вс, 05/04/2015 - 11:12
Функция Delay делает задержку в 13.3 сек вместо 10. Выставлял разные частоты для МК но результата не дало. все то же. Как побороть? ПРошивал Attiny13a с помощу Arduino.
byte led = 1; //вывод светодиода 9 byte brightness = 1; // переменная отвечающая за яркость byte fadeAmount = 1; // переменная, которая задает скорость изменения яркости за цикл byte min_led = 1; // Минимальное значения яркости byte max_led = 255; // Максимальное значения яркости byte h=22; // byte m=17; // Текущее время byte s=50; // boolean LED_Off=0; boolean LED_On=0; boolean LED_time=0; // используется для проверки работоспособности void setup() { pinMode(led, OUTPUT); pinMode(0, OUTPUT); } void loop() { s+=10; analogWrite(led, brightness); if (s==60) // Счет времени { m++; s=0; if (m==60) { m=0; h++; if (h==24) { h=0; } } } if ( h==19 && m==45 && s==0 ) { LED_Off=1; } // Проверка времени на затухание if ( h==7 && m==30 && s==0 ) { LED_On=1; } // Проверка времени на загорание if (LED_Off==1 && brightness>min_led-1) // Выключение ленты { brightness -= fadeAmount; analogWrite(led, brightness); } if (LED_On==1 && brightness<max_led) // Включение ленты { brightness += fadeAmount; analogWrite(led, brightness); } if (brightness==min_led) { LED_Off=0; } if (brightness==max_led) { LED_On=0; } delay(10000); if (LED_time==0) { digitalWrite(0, 1); LED_time=1;} else { digitalWrite(0, 0);LED_time=0;} }iDimaX, что то ваш никнейм уж слишком на мой похож.. )
По сути. Подкрутите регистр OSCCAL. Прочтите программатором текущее значение, потом в скетче вставьте OSCCAL= на единицу больше. Норма точности -3%. Внутренний генератор не предназначен для точного счёта времени. Хочется точно -используйте кварц.
iDimaX, что то ваш никнейм уж слишком на мой похож.. )
По сути. Подкрутите регистр OSCCAL. Прочтите программатором текущее значение, потом в скетче вставьте OSCCAL= на единицу больше. Норма точности -3%. Внутренний генератор не предназначен для точного счёта времени. Хочется точно -используйте кварц.
В качестве програматора у меня только Arduino UNO. Вряд ли им можно считать что-то. Или можно?
iDimaX, конечно можно. Это вообще не зависит от типа программатора, скорее от программы. avrdude запросто читает и записывает osccal,
avrdude.exe -p (чип) -c (программер) -P (порт) -U calibration:r:file.txt:d И в файлик запишется значение osccal в десятичной системе счисления.
Можно ещё и обычным скетчем считать любые фузы, сигнатуры, и Osccal, но подготовительной возни слишком много, быстрее программатором.
Я бы конечно сделал на одной ардуине частотомер, а на этой тиньке запустил бы таймер в режиме генератора с известной частотой. И подстройкой osccal добился бы максимального совпадения измеряемой частоты с заданной таймеру регистрами.
iDimaX, конечно можно. Это вообще не зависит от типа программатора, скорее от программы. avrdude запросто читает и записывает osccal,
avrdude.exe -p (чип) -c (программер) -P (порт) -U calibration:r:file.txt:d И в файлик запишется значение osccal в десятичной системе счисления.
Можно ещё и обычным скетчем считать любые фузы, сигнатуры, и Osccal, но подготовительной возни слишком много, быстрее программатором.
Я бы конечно сделал на одной ардуине частотомер, а на этой тиньке запустил бы таймер в режиме генератора с известной частотой. И подстройкой osccal добился бы максимального совпадения измеряемой частоты с заданной таймеру регистрами.
Как в скейче выставить osccal для МК? Попробую наугад менять чтоль. В каком интеркале значения osccal??
зачем наугад? Прочесть программатором минутное дело. В регистр писать в секции сетап. на последний вопрос ответ есть в даташите, Oscillator Calibration Register
зачем наугад? Прочесть программатором минутное дело. В регистр писать в секции сетап. на последний вопрос ответ есть в даташите, Oscillator Calibration Register
Пробывал на 2х Attiny13a в DIP и SOIC корпусе, результат тот же. Их все нужно коректировать?
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=6
http://forum.arduino.cc/index.php?topic=89781.321 пост #321
Поставил. Tiny13, 9.6 Код:
int duration; void setup() { pinMode ( 3, INPUT); pinMode ( 4, OUTPUT); } void loop(){ duration = pulseIn ( 3, HIGH, 100000); digitalWrite (4, LOW); if ( duration < 1300){ digitalWrite ( 4 , HIGH); } }В ИДЕ появилось оптимизация кода GCC_Flags. Размер кода:
Default -O1 -O3
874 697 672
Слышал что корректируют attiny13.build.f_cpu=1200000