Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
06.09.2011, 19:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Счетчик-таймер на ATtiny
Манипулируйте счётчиком через регистр TCCR2.
Правда, нужно ещё контролировать состояние, в котором остался выход. Вам надо, чтобы при отключенной пищалке выход был лог. 0.
Это всё делается через этот регистр.
|
|
|
|
06.09.2011, 20:05
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Счетчик-таймер на ATtiny
Godzilla82,
Не уверен, так ли я сделал?
PHP код:
|
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
unsigned char sec,min;
trigger ^= 1;
time += start;
if (time › 5999) { // окончание счёта
if(start == -1) beep = 1; // включаем динамик, если был обратный отсчёт
start = 0;
time = 0;
PORTC &= ~WORK; // выключение индикатора "счёт"
}
sec = time % 60;
min = time / 60;
clock[0] = sec % 10;
clock[1] = sec / 10;
clock[2] = min % 10;
clock[3] = min / 10;
// мой код:
if((beep) && (trigger)) {TCCR2 = 0x1C; OCR2 = 0x3D;} //по окончанию обратного счета сигнал 1 кГц
else TCCR2 = 0x00, OCR2 = 0x00; //stop
}
// Timer2:
TCNT2 = 0x00;
|
И еще вопрос, нельзя ли сделать, чтобы trigger переключался через 0.5 сек.?
|
|
|
|
07.09.2011, 01:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Счетчик-таймер на ATtiny
Сообщение от Dimitrij
|
Не уверен, так ли я сделал?
|
Ну почти. Регистр OCR2 вообще не надо трогать. Настроили его на 500 мкс и забыли.
Когда используется выход OC2. Есть 3 варианта. При совпадении счётчика и OCR2 можно:
1. установить выход в 1
2. установить выход в 0
3. переключить выход
При включении таймера нам нужен 3-й вариант. При выключении - второй. Мне лень высчитывать, какие значения TCCR2 соответствуют тому или иному режиму. Сами посчитайте.
Сообщение от Dimitrij
|
PHP код:
|
// Timer2:
TCNT2 = 0x00;
|
|
А это к чему относится? Такая строчка должна быть только при инициализации.
Сообщение от Dimitrij
|
И еще вопрос, нельзя ли сделать, чтобы trigger переключался через 0.5 сек.?
|
Да всё можно сделать. Вернёмся к тому, что было. Ещё одна дополнительная переменная.
|
|
|
|
07.09.2011, 11:45
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Счетчик-таймер на ATtiny
Godzilla82,
"Век живи, век учись..."
Так?
PHP код:
|
if((beep) && (trigger)) TCCR2 = 0x1C; //по окончанию обратного счета сигнал 1 кГц
else TCCR2 = 0x2C; //выход ОС2 в 0
...
// Timer2: 125 kHz
// 1 мс
TCNT2 = 0x00;
OCR2 = 0x3D;
|
Цитата:
|
Ещё одна дополнительная переменная.
|
А нужна ли она? Это уже чистая эстетика.
|
|
|
|
07.09.2011, 12:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Счетчик-таймер на ATtiny
Сообщение от Dimitrij
|
"Век живи, век учись..."
|
...чтобы на старости лет остаться дураком.
Сообщение от Dimitrij
|
Так?
PHP код:
|
if((beep) && (trigger)) TCCR2 = 0x1C; //по окончанию обратного счета сигнал 1 кГц
else TCCR2 = 0x2C; //выход ОС2 в 0
...
// Timer2: 125 kHz
// 1 мс
TCNT2 = 0x00;
OCR2 = 0x3D;
|
|
Наверное. Мне лень проверять каждый бит. Если когда надо - пищит, а когда не надо - на выходе 0 - то так
Сообщение от Dimitrij
|
А нужна ли она? Это уже чистая эстетика.
|
У вас таймер настроен на 1 сек. А вы хотите включать/выключать пищалку через 0,5 сек. Свободных таймеров не осталось.
Надо в имеющийся таймер с меньшим периодом поставить счётчик. И когда счётчик отсчитает нужный интервал - установить какой-нить флаг. Флаг trigger не годится, так как он переключается с интревалом 1 сек для мигания точки. Если и точке можно мигать с интревалом 0,5 сек - тогда в качестве флага можно использовать переменную trigger.
Конечно, по восприятию удобно, когда и мигание точки и пикание идёт с интервалом 0,5 сек. То есть, полсекунды - горит/пищит, полсекунды - потушена/молчит. Тогда по количеству "писков" и "появлений" точки можно уже считать сек. А это уже и называется эстетикой. А зачем создавать прибор, которым не удобно пользоваться?
|
|
|
|
07.09.2011, 20:35
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Счетчик-таймер на ATtiny
Сообщение от Godzilla82
|
Наверное.
|
По битам правильно, меня интересовал сам синтаксис.
Сообщение от Godzilla82
|
в имеющийся таймер с меньшим периодом поставить счётчик.
|
А как? Пробовал поставить в Таймер0 tik++, не получилось, хотя у него период около 2 мсек. Таймер1 трогать не хочется, хотя с ним у меня что-то получалось. А как использовать Таймер2 не знаю. Точно
Цитата:
|
на старости лет останусь дураком.
|
|
|
|
|
08.09.2011, 07:34
|
|
Прохожий
Регистрация: 12.03.2010
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Счетчик-таймер на ATtiny
я в своих проектах при расчете таймеров часто использую программулину AVRCALC
http://www.avrcalc.com/download.html,
задаешь в ней частоту кварца, период срабатывания таймера и на выходе получаешь значения для регистров таймера.
|
|
|
|
08.09.2011, 13:39
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Счетчик-таймер на ATtiny
Сообщение от greenrat
|
получаешь значения для регистров таймера
|
Что-то наподобии у меня есть.
Все, на что я способен:
PHP код:
|
unsigned char tik,tik1;
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
unsigned char sec,min;
tik++;
if (tik › 9) {
tik = 0;
time += start;
if (time › 5999) { // окончание счёта
if(start == -1) beep = 1; // включаем динамик, если был обратный отсчёт
start = 0;
time = 0;
PORTC &= ~WORK; // выключение индикатора "счёт"
}
}
sec = time % 60;
min = time / 60;
clock[0] = sec % 10;
clock[1] = sec / 10;
clock[2] = min % 10;
clock[3] = min / 10;
if((beep) && (trigger)) TCCR2 = 0x1C; //по окончанию обратного счета сигнал 1 кГц
else TCCR2 = 0x2C; //stop
tik1++; //trigger через 0.5 сек.
if (tik1›4) {tik1=0; trigger ^= 1;}
}
// Timer1: 125 kHz
// 100 ms
TCCR1A = 0x00;
TCCR1B = 0x0B;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x30;
OCR1AL = 0xD3;
OCR1BH = 0x00;
OCR1BL = 0x00;
|
Можно ли это упростить?
Последний раз редактировалось Dimitrij; 08.09.2011 в 13:44.
|
|
|
|
08.09.2011, 15:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Счетчик-таймер на ATtiny
Сообщение от Dimitrij
|
Можно ли это упростить?
|
Можно. Сделать интервал таймера 500 мс.
PHP код:
|
trigger ^= 1;
tik_time ^=1;
if(tik_time) { траляля }
|
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
08.09.2011, 16:32
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Счетчик-таймер на ATtiny
Godzilla82,
Большое спасибо! Все работает, как надо. Буду воплощать в железе. По моему, тема закрыта. С Вашей помощью немного продвинулся в программировании. Все просто, когда знаешь.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:09.
|
|