| Цитата(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
|