Страница 1 из 3

Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 18:41:43
Amstron
Есть проблема с часами реального времени.
У меня мега 8 и стоит кварц на 16 мгц.
Я весь инет перерыл и овета не нашол...


Попщем в инете пишут, что надо протикать 256 раз по 62500 тиков и получится 16 000 000 тиков.

Вопщем в инете люди пишут, что в регистре TCNTn надо выставить 62500 и поставить счетчик на 1/256 . Делаю - не получается.
Не получается потомучто каждый раз начинает считать с 65535 (кроме первого раза).

Как у людей получается не понимаю....


У меня есдинственный выход на данный момент.
Записать в регистр сравнения 62500 и далать прерывания по сравнению.(или 3035 и делать прерывание по переполнению) и когда дойдет до 256, то это и будет секунда.

Не нравится мне это тем, что каждые 62500 тик программа будет уходить в прерывание.

И еще. если в этот момент будет работать другое прерывание, то надо это вызывать.
Разрешить прерывание в прерывании.

Да и из прерывания это прерывание вызывать не охото, а надо.


Подскажите как у людей работает????

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 18:55:01
blackx
Amstron писал(а): Подскажите как у людей работает????
Люди ставят часовой кварц на 32768 :)))

Выложите часть кода где у вас таймер настраивается.

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:01:30
Amstron
blackx писал(а):
Выложите часть кода где у вас таймер настраивается.
такого кода нет.
Подскажите как сделать на практике.

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:03:09
Аlex
такого кода нет.
Убила эта фраза, чесслово :))) :))) :)))

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:06:56
Amstron
Аlex писал(а):
такого кода нет.
Убила эта фраза, чесслово :))) :))) :)))
Давайте начнем с этого:
Спойлерinterrupt [TIM1_OVF] void timer1_ovf_isr(void) //прерывание по перепонению TC/1
{ sec ++;
if (sec == 60)
{min++, sec = 0;
if (min == 60)
{hours++, min = 0;
if (hours == 24) hours = 0;
}
}
}
как сделать так чтобы это прерывание срабатывало один раз в секунду?

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:13:25
Аlex
Давайте начнём не через @опу, ага ? :)
blackx писал(а):Выложите часть кода где у вас таймер настраивается.

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:19:50
Amstron
TCCR1B=0b100; // делитель на 256
TIMSK=0b1000101; // Разрешение прерывания по переполнению таймера/счетчика 0 , 1, 2

Подскажите как настроить, что бы счет начинался каждый раз с TCNT1 = 3035 /
тогда после 256 раз сложений 62500 получится 16 000 000 тиканей???

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:24:11
Аlex
Ну смотрите, Вы тактовую частоту таймера поделили на 256 предделителем, теперь таймер тикает с частотой 62500 Гц. Устанавливайте компаратор на это значение, и у Вас получатся прерывания каждые 1 Гц.

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:31:01
Amstron
Аlex писал(а):Ну смотрите, Вы тактовую частоту таймера поделили на 256 предделителем, теперь таймер тикает с частотой 62500 Гц. Устанавливайте компаратор на это значение, и у Вас получатся прерывания каждые 1 Гц.
Спасибо огромное.
Вот в этом и загвоздка.
как правильно называется этот компаратор - как выставить в нем число.
Таймер у меня TCCR1B
КОНТРОЛЛЕР - MEGA8

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:37:18
zero648
Устанавливаешь режим СТС таймера1:
; Включаем режим СТС Timer1, запускаем Timer1 делитель частоты 1:256 (001=1:1;010=1:8;011=1:64;100=1:256;101=1:1024)
TCCR1B = (0b01<<WGM12)|(0b100<<CS10);
и компаратор:
OCR1A=62500-1

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:38:08
dm211
Amstron писал(а): Вопщем в инете люди пишут, что в регистре TCNTn надо выставить 62500 и поставить счетчик на 1/256 . Делаю - не получается.
Не получается потомучто каждый раз начинает считать с 65535 (кроме первого раза).
Если я правильно понял.., чтоб каждый раз не начинал считать с 65536, а с 62500, TCNT надо прописывать внутри обработчика прерывания таймера.

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:40:50
Amstron
dm211 писал(а):
Amstron писал(а): Вопщем в инете люди пишут, что в регистре TCNTn надо выставить 62500 и поставить счетчик на 1/256 . Делаю - не получается.
Не получается потомучто каждый раз начинает считать с 65535 (кроме первого раза).
Если я правильно понял.., чтоб каждый раз не начинал считать с 65536, а с 62500, TCNT надо прописывать внутри обработчика прерывания таймера.
у меня делитель 256.
от сюда следует, что обработчика и не будет.
256 * 62500 = 16 000 000 Гц. 8)

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 19:44:45
dm211
Amstron писал(а): от сюда следует, что обработчика и не будет.
Ну как не будет, если он есть :))

Re: Часы реального времени на кварце 16 мГц

Добавлено: Пн фев 18, 2013 20:04:17
Amstron
dm211 писал(а):
Amstron писал(а): от сюда следует, что обработчика и не будет.
Ну как не будет, если он есть :))
да, вы правы.

это моя мечта... спасибо всем кто участвовал в решении моей маленькой проблемы ! :kiss:

Re: Часы реального времени на кварце 16 мГц

Добавлено: Вт фев 19, 2013 15:13:59
dm211
Amstron писал(а):Подскажите как настроить, что бы счет начинался каждый раз с TCNT1 = 3035 ]
Я только хотел обьяснить это- вот так--

Код: Выделить всё

interrupt [TIM1_OVF] void timer1_ovf_isr(void){
TCNT1 = 3035; // и дальше тикай,если не хочешь как на примере выше
}

Re: Часы реального времени на кварце 16 мГц

Добавлено: Вт фев 19, 2013 15:29:02
Amstron
dm211 писал(а):
Amstron писал(а):Подскажите как настроить, что бы счет начинался каждый раз с TCNT1 = 3035 ]
Я только хотел обьяснить это- вот так--

Код: Выделить всё

interrupt [TIM1_OVF] void timer1_ovf_isr(void){
TCNT1 = 3035; // и дальше тикай,если не хочешь как на примере выше
}
я знал, что так можно сделать.
Хотел, что бы у меня прерывание было один раз в секунду.

Re: Часы реального времени на кварце 16 мГц

Добавлено: Вт фев 19, 2013 15:38:48
ibiza11
так оно и будет 1 раз в секунду)))

Re: Часы реального времени на кварце 16 мГц

Добавлено: Вт фев 19, 2013 15:43:18
Amstron
ibiza11 писал(а):так оно и будет 1 раз в секунду)))
не будет! 256 раз как переполнится, так и будет секунда.

Re: Часы реального времени на кварце 16 мГц

Добавлено: Вт фев 19, 2013 15:50:45
ibiza11
так у вас же делитель стоит на 256.
16 МГц - тактирование микроконтроллера. делитель таймера = 256
16 МГц/256 = 62500 Гц. - тактирование таймера.
через 62500 тактов таймера пройдет ровно секунда и за это время произойдет единственное прерывание. :beer:

Re: Часы реального времени на кварце 16 мГц

Добавлено: Вт фев 19, 2013 16:22:08
Amstron
ibiza11 писал(а):так у вас же делитель стоит на 256.
16 МГц - тактирование микроконтроллера. делитель таймера = 256
16 МГц/256 = 62500 Гц. - тактирование таймера.
через 62500 тактов таймера пройдет ровно секунда и за это время произойдет единственное прерывание. :beer:
таймер начинает считать с 3035. далее , за 1 секунду таймер переполнется 256.
каждое переполнение будет иметь прерывание!!!

КТО ТУТ ПРАВ????????