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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Работа таймера TMR1 в PIC16
loghir
сообщение May 23 2011, 10:34
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Запускаем таймер низким на RA0:
Код
if (RA0 == 0) // запуск TMR1
    {
    // регистр PIE1
    TMR1IE = 1;    // Разрешение прерывания по переполнению TMR1
    TMR1ON = 1;    // включить TMR1
    }

а затем, если не запущен TMR1, программа так и не выйдет из
Код
while (TMR1IF == 0) // (пауза 1,90735 Hz) ожидание флага по переполнению TMR1
{}
TMR1IF = 0;

вот тут я согрешил...
Цитата
зачем GIE = 1,

на всякий случай.
Цитата
да логику программы в целом.

и правильно, это только кусок общей программы.

Спасибо, буду пробовать.

Сообщение отредактировал loghir - May 23 2011, 10:44
Go to the top of the page
 
+Quote Post
sargein
сообщение May 23 2011, 10:47
Сообщение #17


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 31-01-10
Из: Минск
Пользователь №: 55 176



тоже не понял про прерывания, где interrupt isr()?
+добавить антидребезг

upd. косяк в частоте кварца, в конфиге стоит XT, а где #define _XTAL_FREQ?

Сообщение отредактировал sargein - May 23 2011, 10:55
Go to the top of the page
 
+Quote Post
loghir
сообщение May 23 2011, 11:35
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
где interrupt isr()

пока стараюсь далать максимально просто. Обхожусь без предзагрузки.

Цитата
+добавить антидребезг

а зачем? Более одно раза включить (выключить) таймер нельзя физически.

В документации на мой PICC 8.05pl2
Код
#define _XTAL_FREQ

(как и отдельно слова отсюда) я не нашел. При компиляции ошибок нет. blink.gif

Спасибо!!! Прога заработала.
Go to the top of the page
 
+Quote Post
xemul
сообщение May 23 2011, 12:31
Сообщение #19



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(sargein @ May 23 2011, 14:47) *
тоже не понял про прерывания, где interrupt isr()?

Упс-с, только сейчас заметил, что есть таки "TMR1IE = 1;"
Топикстартеру - счастливой отладки...
Цитата
+добавить антидребезг

Камлания вокруг TMR1 - это оно и есть
Цитата
upd. косяк в частоте кварца, в конфиге стоит XT, а где #define _XTAL_FREQ?

ТС не использует макросы DelayX3(x) (к счастью), TMR1 у него работает на все 65536, так что оно ему и не надо.

Цитата(loghir @ May 23 2011, 15:35) *
пока стараюсь далать максимально просто. Обхожусь без предзагрузки.

Вы продолжаете не понимать, что такое прерывания, зачем они нужны, и как с ними бороться в программе.
Цитата
В документации на мой PICC 8.05pl2
Код
#define _XTAL_FREQ

(как и отдельно слова отсюда) я не нашел. При компиляции ошибок нет. blink.gif

Ищите XTAL_FREQ в *.h (н-р, в папке samples\dalay)
Собственно компилятору знать тактовую частоту нафиг не нужно, но программеру иногда/обычно требуется.
Цитата
Спасибо!!! Прога заработала.

С GIE = TMR1IE = TMR1ON = 1 и без какого-либо обработчика прерываний? "Всё чудесатей и чудесатей..."
Go to the top of the page
 
+Quote Post
loghir
сообщение May 23 2011, 14:22
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



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

Цитата
С GIE = TMR1IE = TMR1ON = 1 и без какого-либо обработчика прерываний? "Всё чудесатей и чудесатей..."

Ну почему же? Да, обработчик прерываний у меня не выделен (пока!) в отдельную функцию. А так он вполне присутствует:
Код
while (TMR1IF == 0) // ожидание флага по переполнению TMR1
{}
TMR1ON  = 0; // выключить TMR1
TMR1IF = 0;  // сброс флага прерывания по переполнению TMR1

ну еще надо добавить в цикл
Код
GIE = 1;         // разрешены все немаскированные прерывания
PEIE = 1;        // разрешены все немаскированные прерывания от переферийных модулей

только что заработала прога счета нажатий на кнопку (с антидребезгом, само собой).

поправка: в PEIE не надо записывать 1 после каждого прерывания.
Go to the top of the page
 
+Quote Post
xemul
сообщение May 23 2011, 17:30
Сообщение #21



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 23 2011, 18:22) *
Ну почему же? Да, обработчик прерываний у меня не выделен (пока!) в отдельную функцию.

У Вас в последних сорцах должно было приключаться прерывание по переполнению TMR1. Какой кусок программы, по Вашему мнению, выполнялся при этом?
Цитата
А так он вполне присутствует:
Код
while (TMR1IF == 0) // ожидание флага по переполнению TMR1
{}
TMR1ON  = 0; // выключить TMR1
TMR1IF = 0;  // сброс флага прерывания по переполнению TMR1

Только не выделяйте это в отдельную функцию as is.
имхо, Вы продолжаете подтверждать, что продолжаете не понимать.
Цитата
ну еще надо добавить в цикл
Код
GIE = 1;         // разрешены все немаскированные прерывания
PEIE = 1;        // разрешены все немаскированные прерывания от переферийных модулей

только что заработала прога счета нажатий на кнопку (с антидребезгом, само собой).

поправка: в PEIE не надо записывать 1 после каждого прерывания.

Да и GIE = 1 достаточно сделать однажды, если только Вы не отключаете все прерывания в каких-то критических местах. (такого в Вашем коде я не заметил)
Go to the top of the page
 
+Quote Post
loghir
сообщение May 31 2011, 08:31
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата(sargein @ May 23 2011, 13:47) *
тоже не понял про прерывания, где interrupt isr()?

Только что написал. Спасибо, прекрасно работает!
Go to the top of the page
 
+Quote Post

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

 


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


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