Страница 1 из 1
часы на atmega16
Добавлено: Пн ноя 06, 2017 13:03:17
NIk_9
З0дравствуйте. У меня возникла проблема с написанием часов на atmega16.
Я хочу сделать кнопку Start_stop в функции инициализации таймера. Но он не работает.
void timer_ini(void)
{
TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)
if (!(PORTA&0b00000100))
{
start_stop=0;
if (start_stop==0)
{
TCCR1B |= (0<<CS12);//установим делитель.
}
}
if ((PORTA&0b00000100))
{
start_stop++;
if (start_stop==1)
{
TCCR1B |= (1<<CS12);//установим делитель.
}
}
TIMSK |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)
OCR1AH = 0b01111010; //записываем в регистр число для сравнения
OCR1AL = 0b00010010;
//TCCR1B |= (1<<CS12);//установим делитель.
}
Или нужно этот цикл писать не в этой функции?
Re: часы на atmega16
Добавлено: Пн ноя 06, 2017 13:41:13
Аlex
NIk_9 писал(а):Но он не работает.
Кто не работает ? Кнопка ? Или таймер ?
Если кнопка, то почему "Он" ? Если таймер, то причём тут кнопка ?
NIk_9 писал(а):Или нужно этот цикл писать не в этой функции?
Ну, вообще то, это Вам решать, как создателю программы. Логика работы устройства только Вам известна.
Прикольно

Где логика, сначала сбрасывать переменную в ноль, потом проверять её на этот ноль ?

Re: часы на atmega16
Добавлено: Пн ноя 06, 2017 13:52:26
NIk_9
Счетчик работает. Не работает кнопка.
в цикле я написал что если на PORTA 0b00000001 приходит земля то в значение переменной я занесу ноль и таймер перестанет считать.
Re: часы на atmega16
Добавлено: Пн ноя 06, 2017 14:34:51
BOB51
Остановка делается или по предделителю таймера (запись соответствует отключенному от предделителя входу таймера) или спецфлагом остановки/сброса предделителя таймера.

Re: часы на atmega16
Добавлено: Пн ноя 06, 2017 14:45:31
NIk_9
Я попытался сделать вот так но все равно не работает.
void timer_ini(void)
{
TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)
TCCR1B |= (i<<CS12);
TIMSK |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)
OCR1AH = 0b01111010; //записываем в регистр число для сравнения
OCR1AL = 0b00010010;
//TCCR1B |= (1<<CS12);//установим делитель.
}
//----------------------------------------------------
while(1)
{
if (!(PORTA&0b00000001))
{
start_stop=0;
if (start_stop==0)
{
i=0;
}
}
if ((PORTA&0b00000100))
{
if (start_stop==1)
{
i=1;
}
}
if (start_stop>1)
{
if (i>1)
{
i=0;
start_stop=0;
}
}
}
}
Re: часы на atmega16
Добавлено: Пн ноя 06, 2017 17:15:40
arkhnchul
приведите код целиком. И суньте его в теги code и spoiler.
Re: часы на atmega16
Добавлено: Вт ноя 07, 2017 09:12:15
metan
1. Вам уже сказали, где неверный код, почему в новом коде вы эту лажу повторили?
2. Где изменяется переменная start_stop и как она может стать >1?
3. Вы планируете использовать таймер еще для какой-то другой цели? Если нет, то оставьте функцию инициализации в покое, пусть себе считает. В обработчике прерывания просто при старте нужно обнулить переменную, и с ней уже работать. Всю обработку нажатий кнопок я бы сделал в главном цикле, или в отдельной процедуре, которая из него вызывается.
4. Вам очень не помешает посмотреть на исходные коды, которые были написаны до вас (в аналогичных разработках). В сети их полно. Там найдёте, как и старт сделать, и стоп.