З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);//установим делитель.
}
Или нужно этот цикл писать не в этой функции?
часы на atmega16
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: часы на atmega16
Кто не работает ? Кнопка ? Или таймер ?NIk_9 писал(а):Но он не работает.
Если кнопка, то почему "Он" ? Если таймер, то причём тут кнопка ?
Ну, вообще то, это Вам решать, как создателю программы. Логика работы устройства только Вам известна.NIk_9 писал(а):Или нужно этот цикл писать не в этой функции?
ПрикольноNIk_9 писал(а):Код: Выделить всё
start_stop=0; if (start_stop==0)
Где логика, сначала сбрасывать переменную в ноль, потом проверять её на этот ноль ?
Re: часы на atmega16
Счетчик работает. Не работает кнопка.
в цикле я написал что если на PORTA 0b00000001 приходит земля то в значение переменной я занесу ноль и таймер перестанет считать.
в цикле я написал что если на PORTA 0b00000001 приходит земля то в значение переменной я занесу ноль и таймер перестанет считать.
Re: часы на atmega16
Остановка делается или по предделителю таймера (запись соответствует отключенному от предделителя входу таймера) или спецфлагом остановки/сброса предделителя таймера.

Re: часы на atmega16
Я попытался сделать вот так но все равно не работает.
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;
}
}
}
}
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
приведите код целиком. И суньте его в теги code и spoiler.
Re: часы на atmega16
1. Вам уже сказали, где неверный код, почему в новом коде вы эту лажу повторили?
2. Где изменяется переменная start_stop и как она может стать >1?
3. Вы планируете использовать таймер еще для какой-то другой цели? Если нет, то оставьте функцию инициализации в покое, пусть себе считает. В обработчике прерывания просто при старте нужно обнулить переменную, и с ней уже работать. Всю обработку нажатий кнопок я бы сделал в главном цикле, или в отдельной процедуре, которая из него вызывается.
4. Вам очень не помешает посмотреть на исходные коды, которые были написаны до вас (в аналогичных разработках). В сети их полно. Там найдёте, как и старт сделать, и стоп.
2. Где изменяется переменная start_stop и как она может стать >1?
3. Вы планируете использовать таймер еще для какой-то другой цели? Если нет, то оставьте функцию инициализации в покое, пусть себе считает. В обработчике прерывания просто при старте нужно обнулить переменную, и с ней уже работать. Всю обработку нажатий кнопок я бы сделал в главном цикле, или в отдельной процедуре, которая из него вызывается.
4. Вам очень не помешает посмотреть на исходные коды, которые были написаны до вас (в аналогичных разработках). В сети их полно. Там найдёте, как и старт сделать, и стоп.


