Таймер на mege8 и 48
Добавлено: Вт янв 05, 2010 00:56:15
делаю часы реального времени. мк работает от внутреннего гены. На ногах внешней гены вист часовой кварц. Считаю его 2-ым таймером с делителем 1024. Для меги8 рабочий код:
в основной программе:
ASSR|=(1<<AS2); // Тактировать T2 от асинхронного генератора таймера
// Тактировать частотой 32768/1024=32 Гц, режим сброса по совпадению.
TCCR2|=(1<<CS20)|(1<<CS21)|(1<<CS22)|(1<<WGM21);
OCR2=(31); // (для 32 тактов OCR0=31!), совпадения с частотой 1 Гц.
TIMSK|=(1<<OCIE2); // Разрешить прерывание по совпадению Т2.
sei();
прерывание:
SIGNAL(SIG_OUTPUT_COMPARE2)
{
//здесь тикает 1 сек
if (sec==59)
{
sec=0;
if (min==59)
{
min=0;
if (hour==23) hour=0; else hour++;
}
else
min++;
}
else
sec++;
}
-----------------------------------------------------------------------
здесь вопросов нет. Всё работает.
С 48 мегой проблема
ASSR|=(1<<AS2); // Тактировать T2 от асинхронного генератора таймера
// Тактировать частотой 32768/1024=32 Гц, режим сброса по совпадению.
TCCR2A|=(1<<CS20)|(1<<CS21)|(1<<CS22)|(1<<WGM21);
OCR2A=(31); // (для 32 тактов OCR0=31!), совпадения с частотой 1 Гц.
TIMSK2|=(1<<OCIE2A); // Разрешить прерывание по совпадению Т2.
sei();
прерывание:
SIGNAL(SIG_OUTPUT_COMPARE2A)
{
//здесь тикает 1 сек
if (sec==59)
{
sec=0;
if (min==59)
{
min=0;
if (hour==23) hour=0; else hour++;
}
else
min++;
}
else
sec++;
}
НЕ ПАШЕТ
Генерацию осцилом проверил. Всё. Дальше идеи закончились.
p.s. пишу в WINAVR
в основной программе:
ASSR|=(1<<AS2); // Тактировать T2 от асинхронного генератора таймера
// Тактировать частотой 32768/1024=32 Гц, режим сброса по совпадению.
TCCR2|=(1<<CS20)|(1<<CS21)|(1<<CS22)|(1<<WGM21);
OCR2=(31); // (для 32 тактов OCR0=31!), совпадения с частотой 1 Гц.
TIMSK|=(1<<OCIE2); // Разрешить прерывание по совпадению Т2.
sei();
прерывание:
SIGNAL(SIG_OUTPUT_COMPARE2)
{
//здесь тикает 1 сек
if (sec==59)
{
sec=0;
if (min==59)
{
min=0;
if (hour==23) hour=0; else hour++;
}
else
min++;
}
else
sec++;
}
-----------------------------------------------------------------------
здесь вопросов нет. Всё работает.
С 48 мегой проблема
ASSR|=(1<<AS2); // Тактировать T2 от асинхронного генератора таймера
// Тактировать частотой 32768/1024=32 Гц, режим сброса по совпадению.
TCCR2A|=(1<<CS20)|(1<<CS21)|(1<<CS22)|(1<<WGM21);
OCR2A=(31); // (для 32 тактов OCR0=31!), совпадения с частотой 1 Гц.
TIMSK2|=(1<<OCIE2A); // Разрешить прерывание по совпадению Т2.
sei();
прерывание:
SIGNAL(SIG_OUTPUT_COMPARE2A)
{
//здесь тикает 1 сек
if (sec==59)
{
sec=0;
if (min==59)
{
min=0;
if (hour==23) hour=0; else hour++;
}
else
min++;
}
else
sec++;
}
НЕ ПАШЕТ
Генерацию осцилом проверил. Всё. Дальше идеи закончились.
p.s. пишу в WINAVR