Таймер 2 в Atmega8

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 5
Зарегистрирован: Чт авг 10, 2017 17:20:09

Сообщение 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;

Не работает.
Хотелось бы заменить индикатор на семи-сегментный светодиодный, который бы работал от внешнего кварца.
Может кто подскажет причину неудачи?
Вложения
1x2.zip
(153.34 КБ) 171 скачивание
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

1 - Вы включили таймер на режим работы от внешнего кварца. Так и задумано? Если вы планируете тактирование таймера от МК - это одно. Если от кварца, который подключается к TIMER2 - это другое.
2- Отучайте себя писать магические числа.
ASSR=0x08;
TCCR2=0x01;

Код: Выделить всё

   ASSR = (1<<AS2);
   TCCR2 = (1<<CS20);

   TIMSK |= (1<<TOIE2);
Контактная информация:
Реклама
Родился
Сообщения: 5
Зарегистрирован: Чт авг 10, 2017 17:20:09

Сообщение 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'

Хотел использовать внешний кварц
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение 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> в нём должно быть прописано, но она у тебя и так есть
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение 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 или более раз выше, чем частота таймера.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

попробу ещё #include <mega8_bits.h> в нём они есть.

Добавлено after 47 seconds:
дописать сразу после #include <mega8.h>
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Родился
Сообщения: 5
Зарегистрирован: Чт авг 10, 2017 17:20:09

Сообщение ViktorLozov »

Спасибо за подсказки.
Я вставил в тело проекта настройки таймера 2 из другого рабочего проекта простым копированием. Там таймер превосходно работает от внешнего кварца. Пробовал копировать другие таймеры. Проект их не видит. Что нужно сделать, чтобы проект их увидел?
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а что значит "не видит"?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Родился
Сообщения: 5
Зарегистрирован: Чт авг 10, 2017 17:20:09

Сообщение ViktorLozov »

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here
PORTC.0=1; ----------------- не устанавливается бит
}
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Глобальное разрешение прерываний не забыли включить?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а таймер точно идёт (кварц исправен, фьюзы правильно стоят?)

Добавлено after 7 minutes 29 seconds:
глобальное, а локальное для переполнения Т2
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Родился
Сообщения: 5
Зарегистрирован: Чт авг 10, 2017 17:20:09

Сообщение ViktorLozov »

Спасибо большое за помощь.
Вставил:
// Global enable interrupts
#asm("sei")
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а зачем динамическую индикацию тактировать отдельно, она вроде к частоте не очень критична?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

Вернуться в «AVR»