Режим ЗАХВАТа (Input Capture)
Для начала разберёмся, что же всё-таки будем захватывать. А захватывать мы будем значение таймера TMR2 или TMR3. В микроконтроллере DSPIC33FJ32GP204 есть 2 модуля CCP. В режиме захвата оба модуля будем считать одинаковыми. Далее будем рассматривать модуль CCP1. Все действия с модулем CCP1 можно проделывать и с CCP2.
Для управления модулем CCP1 предназначен регистр CCP1CON. В данной статье мы рассмотрим настройки, предназначенные для режима захвата. Режим работы выбирается 4-мя последними битами (CCP1M3:CCP1M0). Так вот из них старшие 2 бита должны быть 01 – это означает, что активен режим захвата.
0100 – захват по каждому заднему фронту сигнала.
0101 – захват по каждому переднему фронту сигнала.
0110 – захват по каждому 4-му переднему фронту сигнала
0111 – захват по каждому 16-му переднему фронту сигнала.
Для работы модуля ССР1 предназначен одноимённый вход/выход CCP1 (RC2). В режиме захвата он является входом. Например, используем режим «захват по каждому 4-тому переднему фронту сигнала. Так вот после прихода 4-го импульса на вход CCP1 произойдёт захват значения таймера TMR1 или TMR3, т.е. присвоит регистру CCPR1, значение, например, таймера TMR1 (конечно если захват происходит для таймера TMR1). А вот регистр T3CON, кроме настройки самого таймера TMR3, определяет какой таймер и с каким модулем CCP работает. Для этого используется 6 и 3 разряд регистра T3CON (обратите внимание, не соседние биты!) Возможны три варианта работы:
10, 11 – для двух модулей CCP (в режиме сравнение/захват) используется таймер TMR3;
00 - для двух модулей CCP (в режиме сравнение/захват) используется таймер TMR1;
01 – тогда таймер TMR1 работает с модулем CCP1, а таймер TMR3 с модулем CCP2 (оба модуля CCP работают в режиме сравнение/захват)
А теперь перейдём к примеру и немножко поиграем. Сделаем своеобразную игру. Для начала игры нужно нажать на кнопку «Запустить». После этого светодиоды образуют бегущий огонь, причём каждый следующий светодиод будет гореть меньше времени, чем предыдущий. Для остановки бегущего огня необходимо нажать на кнопку «Остановить». Естественно чем меньше горит светодиод, тем меньше шансов успеть остановиться именно на нём. Для игры мы каждому светодиоду присвоим определённое количество очков по принципу: «чем меньше горит светодиод, тем больше очков можно за него получить».
Создаём следующую схему в PROTEUS
Итак, принцип работы схемы:
После нажатия на кнопку «Запустить», запускается бегущий огонь. Кнопка запустить подключена к каналу RC7, хотя можно подключить её на любой другой канал – это не принципиально. За текущее положение горящего светодиода отвечает таймер TMR3. Весь диапазон данного таймера разделён на неравномерные участки. В зависимости от текущего участка загорается определённый светодиод. При переполнении таймера всё начинается сначала. И так непрерывно до тех пор, пока не нажмём на кнопку «Остановить». Не спроста данная кнопка подключена к каналу RC2, точнее она подключена ко входу модуля CCP1. В программе мы настроим, чтобы модуль CCP1 работал в режиме захвата по КАЖДОМУ заднему фронту (т.е. происходил захват сразу при нажатии на кнопку). А захват означает, что в регистре CCPR1, окажется значение регистра TMR3. Блокируем бегущий огонь и выводим то состояние светодиода, при котором была нажата кнопка. Ну а если что не понятно, то при помощи программы можно во всём разобраться.
Таймер TMR0 предназначен для того, чтобы определять моменты когда нужно читать значение таймера TMR3 в режиме бегущего огня. Когда я составлял программу, то попытался отказаться от таймера
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.