Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прерывания от таймеров 
V
    Опции темы
Specialist
Дата 28.7.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 12.5.2008
Где: Кривой Рог

Репутация: 1
Всего: 2



Привет. Мне нужно сделать прерывание от таймера 0 каждые 2 мс и от таймера 1 каждые 64мс. Использую pic16F873A, компилятор Hi-Tech C for pic, симулирую в Proteus`е. 
Я отключил прерывание от таймера 2 (TMR2IE = 0;) Как сказано в даташите, но у меня всеравно строка 27 выполняется. На графике хорошо видно. Почему так ?

Код

#include <pic.h>
#include <htc.h>
#include "delay.c"
//////////////////////////////////////
_XTAL_FREQ = 4000000;
__CONFIG(HS & WDTDIS & BORDIS & LVPDIS & DUNPROT & DEBUGDIS & UNPROTECT);

#define pin1 RA5
#define pin2 RB4

void interrupt
isr(void)
{

if(T0IF)
{

//====================================================================
    if(pin1 == 0) pin1 = 1; else pin1 = 0;
//====================================================================
T0IF = 0;        //Флаг переполнения таймера, обязательно нужно сбрасывать.
}

if(TMR2IF)
{
//====================================================================
    if(pin2 == 0) pin2 = 1; else pin2 = 0;
//====================================================================
TMR2IF = 0;        //Флаг переполнения таймера, обязательно нужно сбрасывать.
}

}

void main(void)
{
///////////////////////////////////////////////////////////
//Настройка портов
PORTA = 0;
PORTB = 0;
PORTC = 0;
TRISA=0b00011111;
TRISB=0b11100000;
TRISC=0b00000001;
OPTION = 0b10010010;// Настройка регистра, делитель 1:8 это 2 мс при 4мГц
ADCON0 = 0b11000001;
ADCON1 = 0b10000100;
T2CON = 0b00000100;

///////////////////////////////////////////////////////////
//mylcd_init();
GIE = 1;        //enable global interrupts
T0IE = 1;        //enable timer0 interrupt
TMR2IE = 0;        //enable timer2 interrupt

while (1){}
}    

PM MAIL WWW ICQ Skype   Вверх
xvr
Дата 29.7.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Specialist @ 28.7.2008,  16:22)
Привет. Мне нужно сделать прерывание от таймера 0 каждые 2 мс и от таймера 1 каждые 64мс. Использую pic16F873A, компилятор Hi-Tech C for pic, симулирую в Proteus`е. 
Я отключил прерывание от таймера 2 (TMR2IE = 0;) Как сказано в даташите, но у меня всеравно строка 27 выполняется. На графике хорошо видно. Почему так ?

Код

#include <pic.h>
#include <htc.h>
#include "delay.c"
//////////////////////////////////////
_XTAL_FREQ = 4000000;
__CONFIG(HS & WDTDIS & BORDIS & LVPDIS & DUNPROT & DEBUGDIS & UNPROTECT);

#define pin1 RA5
#define pin2 RB4

void interrupt
isr(void)
{

if(T0IF)
{

//====================================================================
    if(pin1 == 0) pin1 = 1; else pin1 = 0;
//====================================================================
T0IF = 0;        //Флаг переполнения таймера, обязательно нужно сбрасывать.
}

if(TMR2IF)
{
//====================================================================
    if(pin2 == 0) pin2 = 1; else pin2 = 0;
//====================================================================
TMR2IF = 0;        //Флаг переполнения таймера, обязательно нужно сбрасывать.
}

}

void main(void)
{
///////////////////////////////////////////////////////////
//Настройка портов
PORTA = 0;
PORTB = 0;
PORTC = 0;
TRISA=0b00011111;
TRISB=0b11100000;
TRISC=0b00000001;
OPTION = 0b10010010;// Настройка регистра, делитель 1:8 это 2 мс при 4мГц
ADCON0 = 0b11000001;
ADCON1 = 0b10000100;
T2CON = 0b00000100;

///////////////////////////////////////////////////////////
//mylcd_init();
GIE = 1;        //enable global interrupts
T0IE = 1;        //enable timer0 interrupt
TMR2IE = 0;        //enable timer2 interrupt

while (1){}
}    

Потому что запрет прерываний от таймера 2 (TMR2IE = 0) не запретит аппаратуре устанавливать TMR2IF в 1, но запретит прерываться. У вас строка 27 будет выполняться после переполнения таймера 2 по прерыванию, вызванному таймером 0

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.