Страница 1 из 1
Таймер 2 в Atmega8
Добавлено: Чт авг 10, 2017 17:36:54
ViktorLozov
Здравствуйте! Скачал проект термометра (в скрепке). Хочу вставить таймер 2, формирующий прерывания:
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here
PORTC.0=1;
}
// Timer/Counter 2 initialization
// Clock source: TOSC1 pin
// Clock value: PCK2
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x01;
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
Не работает.
Хотелось бы заменить индикатор на семи-сегментный светодиодный, который бы работал от внешнего кварца.
Может кто подскажет причину неудачи?
Re: Таймер 2 в Atmega8
Добавлено: Чт авг 10, 2017 20:21:18
Demiurg
1 - Вы включили таймер на режим работы от внешнего кварца. Так и задумано? Если вы планируете тактирование таймера от МК - это одно. Если от кварца, который подключается к TIMER2 - это другое.
2- Отучайте себя писать магические числа.
ASSR=0x08;
TCCR2=0x01;
Код: Выделить всё
ASSR = (1<<AS2);
TCCR2 = (1<<CS20);
TIMSK |= (1<<TOIE2);
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 07:02:41
ViktorLozov
ASSR = (1<<AS2);
TCCR2 = (1<<CS20);
TIMSK |= (1<<TOIE2);
После замены получил:
Error........main_.c(83): undefined symbol'AS2'
Error........main_.c(83): undefined symbol'CS20'
Error........main_.c(83): undefined symbol'TOIE2'
Хотел использовать внешний кварц
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 07:21:13
Ivanoff-iv
CVAVR их не знает, или в дефайны вынести надо, типа #define AS2 3 // AS2 он заменит на 3 => (1<<3) = 0x08 но от магических чисел уйдём
или пока 0х08
Добавлено after 5 minutes 39 seconds:
номера битов придётся в даташите брать
Добавлено after 1 minute 39 seconds:
или #include <mega8.h> в нём должно быть прописано, но она у тебя и так есть
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 07:34:02
Z_h_e
С асинхронным режимом таймера не приходилось работать. Советую почитать в ДШ про него, там много чего написано.
Вот как его надо запускать.
1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2.
2. Select clock source by setting AS2 as appropriate.
3. Write new values to TCNT2, OCR2, and TCCR2.
4. To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and TCR2UB.
5. Clear the Timer/Counter2 Interrupt Flags.
6. Enable interrupts, if needed.
Обратите внимание, что тактовая частота ядра должна быть в 4 или более раз выше, чем частота таймера.
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 07:42:53
Ivanoff-iv
попробу ещё #include <mega8_bits.h> в нём они есть.
Добавлено after 47 seconds:
дописать сразу после #include <mega8.h>
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 07:57:55
ViktorLozov
Спасибо за подсказки.
Я вставил в тело проекта настройки таймера 2 из другого рабочего проекта простым копированием. Там таймер превосходно работает от внешнего кварца. Пробовал копировать другие таймеры. Проект их не видит. Что нужно сделать, чтобы проект их увидел?
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 08:12:23
Ivanoff-iv
а что значит "не видит"?
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 08:15:20
ViktorLozov
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here
PORTC.0=1; ----------------- не устанавливается бит
}
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 08:33:29
Z_h_e
Глобальное разрешение прерываний не забыли включить?
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 09:12:21
Ivanoff-iv
а таймер точно идёт (кварц исправен, фьюзы правильно стоят?)
Добавлено after 7 minutes 29 seconds:
глобальное, а локальное для переполнения Т2
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 10:44:33
ViktorLozov
Спасибо большое за помощь.
Вставил:
// Global enable interrupts
#asm("sei")
Re: Таймер 2 в Atmega8
Добавлено: Пт авг 11, 2017 11:32:17
Ivanoff-iv
а зачем динамическую индикацию тактировать отдельно, она вроде к частоте не очень критична?