реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Таймер1 в Atmega8, Прерывания
kapitaneo
сообщение Feb 2 2010, 20:26
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 29-10-09
Пользователь №: 53 278



Здравствуйте. Помогите разобраться, что неправильно? Не получается получить прерывания по переполнению.
Пишу в codevision. Проверяю в протэусе. Программа прилагается.
Прикрепленные файлы
Прикрепленный файл  t1.txt ( 1.62 килобайт ) Кол-во скачиваний: 54
 
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 2 2010, 23:24
Сообщение #2


Гуру
******

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



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
Потом убавите, а то слишком быстро мигать будет.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 3 2010, 06:23
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Xenia @ Feb 3 2010, 03:24) *
1) Уберите задержки из процедуры обработки прерывания, только придурки их там ставят smile.gif.

lol.gif Это в FAQ надо вынести!
Go to the top of the page
 
+Quote Post
vv_gulyaev
сообщение Feb 3 2010, 08:05
Сообщение #4


Участник
*

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



Недавно начал изучать программирование МК, поэтому осмелюсь спросить, что плохого в задержках в обработчиках прерываний?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 3 2010, 08:41
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(vv_gulyaev @ Feb 3 2010, 10:05) *
что плохого в задержках в обработчиках прерываний?
То, что пока вы в этом прерывании ничего не делаете, все остальные прерывания стоят в очереди вместо того, чтобы обработаться.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 3 2010, 08:45
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(vv_gulyaev @ Feb 3 2010, 12:05) *
что плохого в задержках в обработчиках прерываний?

Представьте себе систему(МК), в которой все дышит - она(оно) обрабатывает какие-то события, которые получает из разных источников прерываний, что-то считает, формирует какие-то управляющие сигналы. А потом приходит лесник с плохо стриженной бородой, и топором хрясь... и вешает всю систему, позволяя ей только одно - тупо перебирать инструкции nop/jmp. Это нехорошо.
Go to the top of the page
 
+Quote Post
МП41
сообщение Feb 3 2010, 08:53
Сообщение #7


4 синих кубика
****

Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326



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


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
kapitaneo
сообщение Feb 3 2010, 16:44
Сообщение #8





Группа: Участник
Сообщений: 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) по переполнению должно идти прерывание. И вот следующий импульс делить на два импульса (для этого и задержки). Интересно вот, что нулевой таймер работает нормально, а первый, ГАДЮКА sad.gif, нет. А мне нужны они оба.
КАК ЗАПУСТИТЬ?

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

Сообщение отредактировал rezident - Feb 3 2010, 16:57
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 6 2010, 00:00
Сообщение #9


кекс
******

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



Цитата(kapitaneo @ Feb 3 2010, 18:44) *
а первый, ГАДЮКА sad.gif, нет.

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

и то, что "CV мастер проекта" навставлял,
заслуживает отдельного места вот здесь
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01432 секунд с 7
ELECTRONIX ©2004-2016