|
|
  |
Вопрос по калибровке внутрен. генератора с помощью 32768 кварца |
|
|
|
Dec 28 2008, 15:28
|
Группа: Новичок
Сообщений: 5
Регистрация: 25-12-06
Пользователь №: 23 876

|
Разбираюсь с вопросом по калибровке внутреннего генератора с помощью 32768 кварца вот код из книги Шпака "Прграммирование на язеке С для микр. AVR и PIC" чип ATmega169, частота Taimer1 8Mгц Код void Calibration(void) { unsigned char calibrate = 0; int temp; unsigned char tempL; CLKPR = _BV(CLKPCE); /* Устанавливаем разряд разрешения изменения кооэффициента масштабирования частоты генератора в регистре CLKPR микроконтр. Это специальные регистры ATmega169 */ CLKPR = _BV(CLKPS1) | _BV(CLKPS0); // Коэффициент деления 8 // Внутрений RC 8Mгц / 8 = 1Мгц TIMSK2 = 0; //сбрасываем разряды OCIE2A и TOIE2 ASSR = _BV(AS2); // Использование внешнегом кварца 32768 кГц для T/C2 OCR2A = 200; //Использование регистра сравнения А T/C2 TIMSK0 = 0; // Удаляем все источники прерывания TCCR1B = _BV(CS10); // Запускаем T/C1 без предделителя TCCR2A = _BV(CS20); // Запускаем T/C2 без предделителя while((ASSR & 0x01) | (ASSR & 0x04)); // Ожидание сброса рязрядов TCN2UB и TCR2UB for(int i = 0; i < 10; i++) _delay_loop_2(30000); // Ожидание стабилизации внешнего генератора while(!calibrate) { //////////////////////// этот блок написан как рекомндует ATMEL/////////// cli(); // TIFR1 = 0xFF; // Удаление флагов // TIFR2 = 0xFF; // TCNT1H = 0; // Обнуляем счетный регистр TCNT1L = 0; TCNT2 = 0; // Обнуляем счетный регистр while ( !(TIFR2 && (1<<OCF2A)) ); // TCCR1B = 0; // sei(); // //////////////////////////////////////////////////////////////////////////// if ( (TIFR1 && (1<<TOV1)) ) // Если переполнение счетчика { temp = 0xFFFF; } else // Если переполнения нет то считываем { tempL = TCNT1L; temp = TCNT1H; temp = (temp << 8); temp += tempL; } if (temp > 6250) //если внутренний генератор "спешит" ... { OSCCAL--; //уменьшаем значение регистра калибровки } else if (temp < 6120) // если отстает { OSCCAL++; //увеличиваем } else calibrate = 1; // частота коректна TCCR1B = _BV(CS10); } } обьясните пожалуйста почему такая большая пауза для стабилизации внешнего кварца, нигде не нашел ответа, и почему значение выбранное для коректировки генератора лежит в пределах 6120 - 6250 какак я понял 32768/200= 163,84 тогда получается 8000000/8/163,84 = 6103,5 и еще как синхронизировать внутрений генератор с помощью часового кварца если нет специальных регистров для коректировки
|
|
|
|
|
Dec 28 2008, 17:37
|
Группа: Новичок
Сообщений: 5
Регистрация: 25-12-06
Пользователь №: 23 876

|
то-ли вопрос непонятен, то-ли некому ответить
|
|
|
|
|
Dec 28 2008, 20:34
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(vpadm @ Dec 28 2008, 18:28)  Код //////////////////////// этот блок написан как рекомндует ATMEL/////////// cli(); // TIFR1 = 0xFF; // Удаление флагов // TIFR2 = 0xFF; // TCNT1H = 0; // Обнуляем счетный регистр TCNT1L = 0; TCNT2 = 0; // Обнуляем счетный регистр while ( !(TIFR2 && (1<<OCF2A)) ); // TCCR1B = 0; // sei(); // //////////////////////////////////////////////////////////////////////////// жуть какая-то, интересно где атмел так рекомендует ? Цитата(vpadm @ Dec 28 2008, 18:28)  и почему значение выбранное для коректировки генератора лежит в пределах 6120 - 6250 какак я понял 32768/200= 163,84 тогда получается 8000000/8/163,84 = 6103,5 Видимо это поправка на "ветер" в связи с очень "синхронным" запуском таймеров
|
|
|
|
|
Dec 28 2008, 23:12
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 28-02-08
Пользователь №: 35 466

|
Цитата(vpadm @ Dec 28 2008, 18:28)  и почему значение выбранное для коректировки генератора лежит в пределах 6120 - 6250 какак я понял 32768/200= 163,84 тогда получается 8000000/8/163,84 = 6103,5 А я, так понимаю, это потому, что изменение OSCCAL на 1 дает изменение частоты около 2-х %: "Incrementing CAL6..0 by 1 will give a frequency increment of less than 2% in the frequency range 7.3 - 8.1 MHz."- из документации. Т.е. шаг изменения частоты примерно = 2%. 6250 - 6120 = 130, что примерно составляет 2%, и если вы попали в этот диапазон, то можно считать, что внутренний генератор откалиброван, т.к. точней установить частоту не получится. Насчет кварца - ответ про добротность поддерживаю на 100%. А вообще - не благодарное это дело калиброваться от 32768. Если нет сильной необходимости - не рекомендую, проблем потом можно поймать много.
Сообщение отредактировал interrupt - Dec 28 2008, 23:32
|
|
|
|
|
Dec 29 2008, 12:26
|
Группа: Новичок
Сообщений: 5
Регистрация: 25-12-06
Пользователь №: 23 876

|
to singlskv
жуть какая-то, интересно где атмел так рекомендует ?
рекомендует в своей документации, РЕЖИМ РАБОТЫ Т\Cn В АСИНХРОНОМ РЕЖИМЕ это я нашел в книге "Микроконтроллеры AVR семейств Tiny и Mega фирмы "ATMEL""
Всем спасибо!
|
|
|
|
|
Dec 29 2008, 12:34
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(vpadm @ Dec 29 2008, 15:26)  рекомендует в своей документации, РЕЖИМ РАБОТЫ Т\Cn В АСИНХРОНОМ РЕЖИМЕ это я нашел в книге "Микроконтроллеры AVR семейств Tiny и Mega фирмы "ATMEL"" TCNT1H = 0; // Обнуляем счетный регистр TCNT1L = 0; TCNT2 = 0; // Обнуляем счетный регистр Просто ответьте сами себе на вопрос, чему будет равен TCNT1 когда TCNT2 станет == 1 ?
|
|
|
|
|
Dec 29 2008, 12:40
|
Группа: Новичок
Сообщений: 5
Регистрация: 25-12-06
Пользователь №: 23 876

|
код не мой, это книга Шпака, но в документации Atmel именно такая последовательность рекомендуется
Сообщение отредактировал vpadm - Dec 29 2008, 12:40
|
|
|
|
|
Dec 29 2008, 17:25
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(vpadm @ Dec 29 2008, 15:40)  ...но в документации Atmel именно такая последовательность рекомендуется дайте ссылку где так рекомендуют Цитата код не мой, это книга Шпака, Понятно, но Вы вроде разобраться как это работает собирались ? Подсказываю, сразу после: TCNT2 = 0; // Обнуляем счетный регистр буквально на следующем такте может оказаться: TCNT == 1 т.о., в этом примере "сознательно" вносится погрешность в настройке генератора в 1/201(%), те ~0,5%
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|