реклама на сайте
подробности

 
 
> Atmega 16 (Bascom) Тормозят часы, Замедленная работа часов
Stasevuch
сообщение Dec 25 2007, 22:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 6-11-07
Пользователь №: 32 112



Казалось бы ни чем особо не примечательная программа - вывод текущего времени на LCD. Но вот незадача - часы идут но крайне медленно ( с 10-12 секундным запазданием). Естественно , при изменениях значения тактовой кварца отставание так же меняется - но это не выход. На симуляции в Proteus - всё Ок (естественно)! Часовой кварц отсутсвует в схеме. Где копать -то ?!

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

Clock:

Locate 1 , 1
Lcd Time$

Goto Clock


Сообщение отредактировал Stasevuch - Dec 25 2007, 22:56
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Aesthete Animus
сообщение Dec 28 2007, 11:16
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



У меня подобная ситуация возникала, когда я ошибся с регистром переполнения таймера (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МГц. В общем случае, делать такие настройки, чтобы вызовы прерываний таймера проиходили как можно реже. Для этого стоит прескаллер устанавливать в максимально возможное значение и далее подбирать границу переполнения, так чтобы частота делилась нацело.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Stasevuch   Atmega 16 (Bascom) Тормозят часы   Dec 25 2007, 22:55
- - haker_fox   Цитата(Stasevuch @ Dec 26 2007, 06:55) Ча...   Dec 26 2007, 00:35
- - bzx   Часовой, не часовой,... главное брать резонатор с ...   Dec 26 2007, 06:33
- - Stasevuch   На форуме есть тема об отставании на 4 секунды в с...   Dec 26 2007, 06:48
|- - defunct   По приведенному коду получается, что в bascom есть...   Dec 28 2007, 11:38
|- - Stasevuch   Автор растяпа ! Часовой кварц на специально д...   Dec 28 2007, 20:07
|- - Aesthete Animus   Цитата(Stasevuch @ Dec 28 2007, 23:07) Ка...   Dec 29 2007, 19:59
|- - zltigo   Цитата(Aesthete Animus @ Dec 29 2007, 21...   Dec 29 2007, 20:14
|- - Aesthete Animus   Цитата(zltigo @ Dec 29 2007, 23:14) Забыв...   Dec 29 2007, 20:26
- - Stasevuch   С учётом сжатых сроков выделенных на разработку ,о...   Dec 30 2007, 17:21
- - radan   Исходниками не поделитесь? Не для себя прошу - для...   Dec 30 2007, 17:40
|- - Stasevuch   Цитата(radan @ Dec 30 2007, 20:40) Исходн...   Dec 31 2007, 14:05
- - radan   Информации много не бывает. На форуме http://basco...   Dec 31 2007, 15:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01354 секунд с 7
ELECTRONIX ©2004-2016