Arduino -> AVR | Функция Delay

iDimaX
Offline
Зарегистрирован: 03.04.2015

Функция Delay делает задержку в 13.3 сек вместо 10. Выставлял разные частоты для МК но результата не дало. все то же. Как побороть? ПРошивал Attiny13a с помощу Arduino.

iDimaX
Offline
Зарегистрирован: 03.04.2015
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;}
  }                              

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

iDimaX, что то ваш никнейм уж слишком на мой похож.. )

По сути. Подкрутите регистр OSCCAL. Прочтите программатором  текущее значение, потом в скетче вставьте OSCCAL= на единицу больше. Норма точности -3%. Внутренний генератор не предназначен для точного счёта времени. Хочется точно -используйте кварц.

iDimaX
Offline
Зарегистрирован: 03.04.2015

dimax пишет:

iDimaX, что то ваш никнейм уж слишком на мой похож.. )

По сути. Подкрутите регистр OSCCAL. Прочтите программатором  текущее значение, потом в скетче вставьте OSCCAL= на единицу больше. Норма точности -3%. Внутренний генератор не предназначен для точного счёта времени. Хочется точно -используйте кварц.

В качестве програматора у меня только Arduino UNO. Вряд ли им можно считать что-то. Или можно?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

iDimaX, конечно можно. Это вообще не зависит от типа программатора, скорее от программы.  avrdude запросто читает и записывает osccal, 

avrdude.exe -p (чип)  -c (программер)  -P (порт) -U calibration:r:file.txt:d  И в файлик запишется значение osccal в десятичной системе счисления.

Можно ещё и обычным скетчем считать любые фузы, сигнатуры, и Osccal, но подготовительной возни слишком много, быстрее программатором.

Я бы конечно сделал на одной ардуине частотомер, а на этой тиньке запустил бы таймер в режиме генератора с известной частотой. И подстройкой osccal добился бы максимального совпадения измеряемой частоты с заданной таймеру регистрами.

iDimaX
Offline
Зарегистрирован: 03.04.2015

dimax пишет:

iDimaX, конечно можно. Это вообще не зависит от типа программатора, скорее от программы.  avrdude запросто читает и записывает osccal, 

avrdude.exe -p (чип)  -c (программер)  -P (порт) -U calibration:r:file.txt:d  И в файлик запишется значение osccal в десятичной системе счисления.

Можно ещё и обычным скетчем считать любые фузы, сигнатуры, и Osccal, но подготовительной возни слишком много, быстрее программатором.

Я бы конечно сделал на одной ардуине частотомер, а на этой тиньке запустил бы таймер в режиме генератора с известной частотой. И подстройкой osccal добился бы максимального совпадения измеряемой частоты с заданной таймеру регистрами.

 

Как в скейче выставить osccal для МК? Попробую наугад менять чтоль. В каком интеркале значения osccal??

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

зачем наугад? Прочесть программатором минутное дело. В регистр писать в секции сетап. на последний вопрос ответ есть в даташите, Oscillator Calibration Register

iDimaX
Offline
Зарегистрирован: 03.04.2015

dimax пишет:

зачем наугад? Прочесть программатором минутное дело. В регистр писать в секции сетап. на последний вопрос ответ есть в даташите, Oscillator Calibration Register

Пробывал на 2х Attiny13a в DIP и SOIC корпусе, результат тот же. Их все нужно коректировать?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

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