Перейти к содержанию
    

Таймер1 в Atmega8

Здравствуйте. Помогите разобраться, что неправильно? Не получается получить прерывания по переполнению.

Пишу в codevision. Проверяю в протэусе. Программа прилагается.

t1.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Уберите задержки из процедуры обработки прерывания, только придурки их там ставят :).

Изобразите что-нибудь по-проще, например:

{
  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

Потом убавите, а то слишком быстро мигать будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Уберите задержки из процедуры обработки прерывания, только придурки их там ставят :).

:lol: Это в FAQ надо вынести!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Недавно начал изучать программирование МК, поэтому осмелюсь спросить, что плохого в задержках в обработчиках прерываний?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что плохого в задержках в обработчиках прерываний?
То, что пока вы в этом прерывании ничего не делаете, все остальные прерывания стоят в очереди вместо того, чтобы обработаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что плохого в задержках в обработчиках прерываний?

Представьте себе систему(МК), в которой все дышит - она(оно) обрабатывает какие-то события, которые получает из разных источников прерываний, что-то считает, формирует какие-то управляющие сигналы. А потом приходит лесник с плохо стриженной бородой, и топором хрясь... и вешает всю систему, позволяя ей только одно - тупо перебирать инструкции nop/jmp. Это нехорошо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А ещё, покуда длится задержка, таймер может несколько раз переполниться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Уберите задержки из процедуры обработки прерывания

...

2) Разрешите прерывания! По умолчанию они запрещены:

...

3) делитель поставьте, хотя бы для начала:

 

Спасибо, но задача состоит немного в другом. Я на вход таймера PIND.5(Т1)

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

КАК ЗАПУСТИТЬ?

 

ЗАРАНЕЕ ВСЕМ СПАСИБО.

Изменено пользователем rezident
Излишнее цитирование.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а первый, ГАДЮКА :(, нет.

это потому что

if((PIND.3==0)&(PIND.0==1)&(PIND.1==1)&(PIND.2==1))

и то, что "CV мастер проекта" навставлял,

заслуживает отдельного места вот здесь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...