|
|
  |
Таймер1 в Atmega8, Прерывания |
|
|
|
Feb 2 2010, 20:26
|
Группа: Участник
Сообщений: 8
Регистрация: 29-10-09
Пользователь №: 53 278

|
Здравствуйте. Помогите разобраться, что неправильно? Не получается получить прерывания по переполнению. Пишу в codevision. Проверяю в протэусе. Программа прилагается.
Прикрепленные файлы
t1.txt ( 1.62 килобайт )
Кол-во скачиваний: 54
|
|
|
|
|
Feb 2 2010, 23:24
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
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 Потом убавите, а то слишком быстро мигать будет.
|
|
|
|
|
Feb 3 2010, 08:05
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 15-10-08
Из: Воронеж
Пользователь №: 40 984

|
Недавно начал изучать программирование МК, поэтому осмелюсь спросить, что плохого в задержках в обработчиках прерываний?
|
|
|
|
|
Feb 3 2010, 16:44
|
Группа: Участник
Сообщений: 8
Регистрация: 29-10-09
Пользователь №: 53 278

|
Цитата(Xenia @ Feb 3 2010, 02:24)  1) Уберите задержки из процедуры обработки прерывания ... 2) Разрешите прерывания! По умолчанию они запрещены: ... 3) делитель поставьте, хотя бы для начала: Спасибо, но задача состоит немного в другом. Я на вход таймера PIND.5(Т1) подаю импульсы и использую Т1 pin Rising Edge, тактируется от внешнего генератора, подключенного к выводу Т1, по нарастающему фронту поэтому TCCR1B=0x07. После отсчета 21 импульса (TCNT1=n1,n2) по переполнению должно идти прерывание. И вот следующий импульс делить на два импульса (для этого и задержки). Интересно вот, что нулевой таймер работает нормально, а первый, ГАДЮКА  , нет. А мне нужны они оба. КАК ЗАПУСТИТЬ? ЗАРАНЕЕ ВСЕМ СПАСИБО.
Сообщение отредактировал rezident - Feb 3 2010, 16:57
Причина редактирования: Излишнее цитирование.
|
|
|
|
|
Feb 6 2010, 00:00
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(kapitaneo @ Feb 3 2010, 18:44)  а первый, ГАДЮКА  , нет. это потому что Код if((PIND.3==0)&(PIND.0==1)&(PIND.1==1)&(PIND.2==1)) и то, что "CV мастер проекта" навставлял, заслуживает отдельного места вот здесь
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|