Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Прерывания от таймеров


Автор: Specialist 28.7.2008, 16:22
Привет. Мне нужно сделать прерывание от таймера 0 каждые 2 мс и от таймера 1 каждые 64мс. Использую pic16F873A, компилятор Hi-Tech C for pic, симулирую в Proteus`е. 
Я отключил прерывание от таймера 2 (TMR2IE = 0;) Как сказано в даташите, но у меня всеравно строка 27 выполняется. На http://i.piccy.kiev.ua/i2/0f/83/abce3683b7a0806465c056eb76b2.png хорошо видно. Почему так ?

Код

#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){}
}    

Автор: xvr 29.7.2008, 12:40
Цитата(Specialist @ 28.7.2008,  16:22)
Привет. Мне нужно сделать прерывание от таймера 0 каждые 2 мс и от таймера 1 каждые 64мс. Использую pic16F873A, компилятор Hi-Tech C for pic, симулирую в Proteus`е. 
Я отключил прерывание от таймера 2 (TMR2IE = 0;) Как сказано в даташите, но у меня всеравно строка 27 выполняется. На http://i.piccy.kiev.ua/i2/0f/83/abce3683b7a0806465c056eb76b2.png хорошо видно. Почему так ?

Код

#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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)