Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Таймер1 в Atmega8
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
kapitaneo
Здравствуйте. Помогите разобраться, что неправильно? Не получается получить прерывания по переполнению.
Пишу в codevision. Проверяю в протэусе. Программа прилагается.
Xenia
1) Уберите задержки из процедуры обработки прерывания, только придурки их там ставят smile.gif.
Изобразите что-нибудь по-проще, например:
Код
{
  TCNT1H = n1;   // Reinitialize Timer
  TCNT1L = n2;
  PORTC.3 ^= 1;  // Bit 0 inverse
}

Здесь операция XOR инвертирует младший бит C-порта. Т.е. после отработки прерывания этот бит будет заменяться на противоположный. Если на этом пине висит светодиод, то он будет моргать с частотой вдвое медленней, чем частота таймера (первый такт горит, второй не горит).

2) Разрешите прерывания! По умолчанию они запрещены:
TIFR = 0x4; // TOV1, только T1 используется
TIMSK = 0x4; // TOIE1

3) делитель поставьте, хотя бы для начала:
TCCR1B = 0x3; // делитель - 64
Потом убавите, а то слишком быстро мигать будет.
_Pasha
Цитата(Xenia @ Feb 3 2010, 03:24) *
1) Уберите задержки из процедуры обработки прерывания, только придурки их там ставят smile.gif.

lol.gif Это в FAQ надо вынести!
vv_gulyaev
Недавно начал изучать программирование МК, поэтому осмелюсь спросить, что плохого в задержках в обработчиках прерываний?
Сергей Борщ
Цитата(vv_gulyaev @ Feb 3 2010, 10:05) *
что плохого в задержках в обработчиках прерываний?
То, что пока вы в этом прерывании ничего не делаете, все остальные прерывания стоят в очереди вместо того, чтобы обработаться.
_Pasha
Цитата(vv_gulyaev @ Feb 3 2010, 12:05) *
что плохого в задержках в обработчиках прерываний?

Представьте себе систему(МК), в которой все дышит - она(оно) обрабатывает какие-то события, которые получает из разных источников прерываний, что-то считает, формирует какие-то управляющие сигналы. А потом приходит лесник с плохо стриженной бородой, и топором хрясь... и вешает всю систему, позволяя ей только одно - тупо перебирать инструкции nop/jmp. Это нехорошо.
МП41
А ещё, покуда длится задержка, таймер может несколько раз переполниться.
kapitaneo
Цитата(Xenia @ Feb 3 2010, 02:24) *
1) Уберите задержки из процедуры обработки прерывания
...
2) Разрешите прерывания! По умолчанию они запрещены:
...
3) делитель поставьте, хотя бы для начала:


Спасибо, но задача состоит немного в другом. Я на вход таймера PIND.5(Т1)
подаю импульсы и использую Т1 pin Rising Edge, тактируется от внешнего генератора, подключенного к выводу Т1, по нарастающему фронту поэтому TCCR1B=0x07. После отсчета 21 импульса (TCNT1=n1,n2) по переполнению должно идти прерывание. И вот следующий импульс делить на два импульса (для этого и задержки). Интересно вот, что нулевой таймер работает нормально, а первый, ГАДЮКА sad.gif, нет. А мне нужны они оба.
КАК ЗАПУСТИТЬ?

ЗАРАНЕЕ ВСЕМ СПАСИБО.
defunct
Цитата(kapitaneo @ Feb 3 2010, 18:44) *
а первый, ГАДЮКА sad.gif, нет.

это потому что
Код
if((PIND.3==0)&(PIND.0==1)&(PIND.1==1)&(PIND.2==1))

и то, что "CV мастер проекта" навставлял,
заслуживает отдельного места вот здесь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.