Свежие обсуждения
Микроконтроллеры

А таймер реального времени ATMega128

1 3 4

BCluster: Вопрос - после того как происходит это прерывание, счетчик разве сбрасывается?
Ответ - см. стр. 123 полного даташита на Mega128 (режим CTC - clear timer on compare).

BCluster: И ыще, я хоть там напишу PORTF=(PORTF^(17)) штоп мигать светодиодом все равно тормозить будет
Не-а, не будет. Вы ведь не перегружаете регистры таймера новыми значениями. Он как считал параллельно с процессором, так и считает. А вот когда Вы начинаете вмешиваться в процесс счета своими загрузками, тогда будут накапливаться проблемы.

BCluster: но умножение и деление не одно и тоже ?
В данном случае - нет. Аппаратное умножение в Mege есть, а аппаратного деления нет.

BCluster: Самое интереснойе - все заработало, заменил кварц на 12 мГц.
Сократив тем самым время работы обработчика прерываний как минимум вдвое. Вполне возможно, что теперь прерывания просто не теряются. Нельзя так обработчики пЕсать. Минимум самых необходимых действий - и ничего сверх этого.

 

во первых спасибо за ответы (:

раньше я писал так:
в обработчике только инкрементировал переменную, а все остальное делал в основном цикле - были теже самые проблемы...
PORTF=(PORTF^(17)) когда писал тоже самое

насчет умножения... судя по вашим словам получается что а*0.1 будет выполнятся быстрее чем а/10?

за СТС отдельное спасибо будем стараться работать с ним

 

BCluster: 4322000/43220 = 100 а не 10... и я на 256 не делю... там просто остались комменты... делил на 8

1) Нет там никаких комментов, в предделителе для таймера1 вы делите именно на 256: TCCR1B=0х04 CSR2-0=100, т.е. CLK/256. А потом эта частота для получения прерывания по переполнению делится ещё на 2260. Не знаю, как оно у вас работает тютя в тютю.

2) Ну да 100 Гц или 10 мс. Отсчитываете 10 раз и получаете 100 мс.

3) По-моему, вам ничего делить не надо, надо просто досчитать до 10, обнулиться и по-новой.

j++;
if (j==10)
{
j=0;
lcd_clear();
sprintf(buff,"%d",j);
lcd_puts(buff);
}

 

1. Просьбо - пишите мне "ты" вместо "вы"... мойа психика не выдерживает такого обращения (:

делил действительно на 8, наверное не тот исходнек запостил, прошу прощения

а зачем 10 раз вызывать прерывание, когда можно 1?

или изза этого деления глюки могут происходить временные?
ну пока проблема как бы решена на кварце в 12 мгц, но имхо должно было бы работать и на 4 и хоцца понять почему

 

1) Ну мы с вами пока на брудершафт не пили, так что писать вам "ты" не могу, и потом, вдруг вы из сигуранцы какой-нибудь, а я вот планирую крепость Аккерман посетить .

2) Ну покажите, как разрулить ситуацию одним прерыванием, у вас вроде требование было 100 мс точно. Или это примерно? И зачем вы делили на 2260?

3) Само деление не сложная процедура, но достаточно объёмная, особенно на си. Страшного ничего не произойдёт, если будете делить, так же впрочем, как и с 10 прерываниями вместо одного. Если конечно, у вас вагон процессорного времени.

4) Видимо, на 4 Мгц у вас элементарно не хватает времени на обработку прерываний, вы там долгоиграющие функции заложили, типа sprintf. Поэтому некоторые прерывания пропадают, значит следующий раз таймер1 вынужден считать от 0 до 65536, поскольку пропала инициализация таймера на 2260, отсюда тормознутость. Вот, кстати, одна из причин, зачем нужно быстрое выполнение прерывания.

5) Интересно, как же это у вас таймер0 заработал?

6) И попрошу вас напоследок, давайте выдавать на гора поменьше олбанского.

 

Ррр, ну ладно я попробовал
Одним прерыванием? Секунду
Кварц 4 МГц

делим на 8 а потом еще на 50к

TCCR1B = 0x00;
TCNT1H = 0x3C;
TCNT1L = 0xB0;
ICR1H = 0xC3;
ICR1L = 0x50;
TCCR1A = 0x00;
TCCR1B = 0x02;

таймер0 не заработал

насчет албанского договорились *THUMBS UP*

 

BCluster: Одним прерыванием? Секунду. Кварц 4 МГц делим на 8 а потом еще на 50к

Вот только не надо передёргивать. Вам решение (пусть и 10 прерываний) было дано на кварц 4,322 МГц, а вы даёте решение на кварц 4 МГц (с одним прерыванием). С какого припрыга, спрашивается? Так не пойдёт. Давайте всё-ж-таки решение на кварц 4,322 МГц с одним прерыванием.

Кстати, и на кварц 12 МГц не видно решения в одно прерывание.

 

ok, сейчас пересчитаю на 4.322

делим на 8 и на 54025

//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 10Hz
// actual value: 10,000Hz

TCCR1B = 0x00; //stop
TCNT1H = 0x2C; //setup
TCNT1L = 0xF7;

ICR1H = 0xD3;
ICR1L = 0x09;
TCCR1A = 0x00;
TCCR1B = 0x02; //start Timer

на 12 МГц

//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 10Hz
// actual value: 10,000Hz (0,0%)

TCCR1B = 0x00; //stop
TCNT1H = 0xB6; //setup
TCNT1L = 0xC2;

ICR1H = 0x49;
ICR1L = 0x3E;
TCCR1A = 0x00;
TCCR1B = 0x03; //start Timer

на 64 и 18750

 

Совсем другое дело. Что-то я плохой сегодня, невпопад отвечаю . Наверное, думаю о завтрашнем дне, иду сдавать практическое вождение.

 

GM: иду сдавать практическое вождение.

Успехов! Главное — не поехать по правой стороне