Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega 16 (Bascom) Тормозят часы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Stasevuch
Казалось бы ни чем особо не примечательная программа - вывод текущего времени на LCD. Но вот незадача - часы идут но крайне медленно ( с 10-12 секундным запазданием). Естественно , при изменениях значения тактовой кварца отставание так же меняется - но это не выход. На симуляции в Proteus - всё Ок (естественно)! Часовой кварц отсутсвует в схеме. Где копать -то ?!

$regfile = "m16def.dat"
$crystal = 4000000
Enable Interrupts
Config Clock = Soft

Clock:

Locate 1 , 1
Lcd Time$

Goto Clock
haker_fox
Цитата(Stasevuch @ Dec 26 2007, 06:55) *
Часовой кварц отсутсвует в схеме. Где копать -то ?!

Собственно Вы уже ответили на свой вопрос. Какая же может быть точность без часового кварца? Тут и с часовым кварцом порой некоторые неточности наблюдаются, а без него вообще о стабильности говорить не стоит.
bzx
Часовой, не часовой,... главное брать резонатор с высокой точностью. А то, что считается, что точность часового кварца выше - дак это стереотип.
Stasevuch
На форуме есть тема об отставании на 4 секунды в сутки (вполне можно говорить о точности кварца).
Aesthete Animus
У меня подобная ситуация возникала, когда я ошибся с регистром переполнения таймера (OCRn). В даташите приведена формула для опрделения частоты вызова прерываний таймера при использовании режима CTC:


где
- частота прерываний
- частота кварца
- величина прескаллера таймера. Может равняться (для ATmega16) 1, 8, 64, 256 или 1024
(Формула получена умножением на два формулы для вычисления частоты генерации сигнала, представленной в документации. Для контроллера ATmega16, документация doc2466, стр. 77)

Нужно использовать именно CTC режим - тогда удается довольно тонко подобрать делители частоты кварца. У меня обработка секундного интервала (при чтстоте кварца 16МГц) выглядит так:

Инициализация:
Код
TCCR0 = (1 << WGM01)|(1 << CS02); // CTC режим, преаскаллер 256
TCNT0 = 0;
OCR0 = 249;
    
TIMSK = (1 << OCIE0); // Включаем прерывание по сравнению


В результате, прерывание будет вызываться 250 раз в секунду. Обработка прерывания выглядит так:
Код
uint8_t t = 0, timer_flag = 0;
SIGNAL (SIG_OUTPUT_COMPARE0)
{
    ++t
    if (t == 250)
    {
        t = 0;

       // Этот флаг используется, как событие секундного таймера
        timer_flag = 1;
    }
  
}


В вашем случае (для частоты 4 МГц) нужно задать прескаллер таймера равным 64:
Код
TCCR0 = (1 << WGM01)|(1 << CS01)|(1 << CS00);

Замечу, что это не единственный и не лучший способ добиться секундного интервала на частоте 4МГц. В общем случае, делать такие настройки, чтобы вызовы прерываний таймера проиходили как можно реже. Для этого стоит прескаллер устанавливать в максимально возможное значение и далее подбирать границу переполнения, так чтобы частота делилась нацело.
defunct
По приведенному коду получается, что в bascom есть некий "черный ящик" - Time$. Ну, а разбираться почему этот черный ящик работает не так как хотелось бы - дело неблагодарное.

Автору - напишите часы самостоятельно, следуя советам из комента #5.
Stasevuch
Автор растяпаangry.gif ! Часовой кварц на специально для него предназначеных выводах микроконтроллера решил вопрос на раз - тему можно считать закрытой. Как оказалось - тамера Atmeg-и работают с кварцем задающего генератора , а функция Time и проистекающие от неё (Day,Week...) звызаны с часовым кварцем. Ну по крайней мере такова особенность Bascom.
Aesthete Animus
Цитата(Stasevuch @ Dec 28 2007, 23:07) *
Как оказалось - тамера Atmeg-и работают с кварцем задающего генератора , а функция Time и проистекающие от неё (Day,Week...) звызаны с часовым кварцем. Ну по крайней мере такова особенность Bascom.

С часовым кварцем работает таймер №2. На него похоже и завязаны фукнции Time, Day. Все-таки настоятельно рекомендую программировать часики вручную - меньше шансов наступить на грабли.
zltigo
Цитата(Aesthete Animus @ Dec 29 2007, 21:59) *
рекомендую программировать часики вручную...

Забываетесь это-же Basic - за что "боролись", понимаешь.
Aesthete Animus
Цитата(zltigo @ Dec 29 2007, 23:14) *
Забываетесь это-же Basic - за что "боролись", понимаешь.

Я когда-то боролся за Basic? Да боже упаси... wink.gif
Stasevuch
С учётом сжатых сроков выделенных на разработку ,отсутсвием предварительного опыта работы микроконтроллерами и их переферией , учить С было некогда. Так что школьный курс бейсика пришелся очень кстати.
radan
Исходниками не поделитесь? Не для себя прошу - для нашего форума по Баскому http://bascomavr.3bb.ru/.
Stasevuch
Цитата(radan @ Dec 30 2007, 20:40) *
Исходниками не поделитесь? Не для себя прошу - для нашего форума по Баскому http://bascomavr.3bb.ru/.


Вобщем то проект довольно специфичен. Atmega 16 + LCD 2*16 + AD420 . Всё сводится к формированию тока в пределах 4-20 ма по заданному закону. Так сказать больше промышленная ориентация проекта , нежели бытовая .Если он в действительности может быть полезен для пополнения коллекции Вашего сайта - то пожалуйста.
radan
Информации много не бывает. На форуме http://bascomavr.3bb.ru/ мы стараемся собрать воедино разрозненную информацию по Баскому. Кое что есть и на http://ledeffects.net/pages/?id=12.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.