⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sys_isr.c

📁 用ADE7169F16单片机实现了单向多费4率电能表
💻 C
字号:
/*************************************
;Ade7169 demo program     
;*************************************
;AUTHOR:        Su RuTong
;DATE:          03 09 2006
;*************************************/

#include "Hal.h"
#include "sys_isr.h"
#include "sys_init.h"
//#include "Io8052.h"
#include "utilities.h"
#include "sys_event.h"
#include "Display.h"
#include "Public.h"
#include "UART.h"
#include "Measure.h"



// ext. int0 interrupt service
#ifdef __IAR_SYSTEMS_ICC__
#pragma vector=extern0
__interrupt void _int0_isr(void)
#else
void _int0_isr(void) interrupt 0
#endif
{
    IE0=0;
    _Lcd_Write(0x00,0x80);//Logo
    if(!(P1&SCROLL_UP_PIN))                                          // LCD Page up
    {
        LcdDispFlag |= LCD_DISP_FLG_PAGEUP;
        bManDisp=1;
        LcdInterval = 8;//_SysPotInfo.disptime;
        //P0=0x00;
    }
    else if(!(P1&SCROLL_DOWN_PIN))                                    // LCD Page down
    {
        LcdDispFlag |= LCD_DISP_FLG_PAGEDOWN;
        bManDisp=1;
        LcdInterval = 8;//_SysPotInfo.disptime;
        //P0=0xff;
    }
}

// timer0 interrupt service 5ms
#ifdef __IAR_SYSTEMS_ICC__
#pragma register_bank=1
#pragma vector=timer0
__interrupt void _timer0_isr(void)
#else
void _timer0_isr(void) interrupt 1 using 1
#endif
{
    static unsigned char data timer0_10ms=2;
    static unsigned char data timer0_100ms=20;
    static unsigned char data timer0_500msCnt=100;
    static unsigned char data timer0_1s=200;
    TF0=0;
    // Manual reload
    TH0=0xc4;
    TL0=0x3c;//b4
    
    // 10ms
    if(--timer0_10ms==0)
    {
        timer0_10ms=2;
        // UART rec byte timeout proc
        if(Uart_Rec_Tout_Cnt!=0x00)
        {
            if(--Uart_Rec_Tout_Cnt==0x00)
            {
                // Re-init UART REC
                Re_Init_Uart_Rec();
            }
        }

        if(Uart_Snd_Tout_Cnt!=0x00)
        {
            if(--Uart_Snd_Tout_Cnt==0x00)
            {
                // Re-init Uart send
                Re_Init_Uart_Snd();
            }
        }
    }
    // 100ms
    if(--timer0_100ms==0)
    {
        timer0_100ms=20;
    }
    // 500ms
    if(timer0_500msCnt--==0)
    {
        timer0_500msCnt=100;
        ADD_EVT(EVT_OF_500MS);
    }

    // 1s
    if(--timer0_1s==0)
    {
        timer0_1s=200;
        
        if(bManDisp==0)
        {
            LcdDispFlag|=LCD_DISP_FLG_ACTIVE;
        }
        //P0 ^= BIT3;////CF2_LED=!CF2_LED;                                   // For debug
        ADD_EVT(EVT_OF_SECOND);
        // HEARTBEAT_LED=!HEARTBEAT_LED;
        // PD=~PD; //(BIT1|BIT2);// LED1_ON()
        if(Uart_Snd_Delay_cnt)
        {
            if(--Uart_Snd_Delay_cnt==0x00)
            {
                if(!bIn_Send)
                {
                    ADD_EVT(EVT_OF_COMM);
                }
                else
                {
                    Uart_Snd_Delay_cnt=1;
                }
            }
        }
    }
    ADD_EVT(EVT_OF_TICK);
}

// ext. int1 interrupt service
#ifdef __IAR_SYSTEMS_ICC__
#pragma vector=extern1
__interrupt void _int1_isr(void)
#else
void _int1_isr(void) interrupt 2
#endif
{
    IE1=0;
}

// timer1 interrupt service
// 5ms timming
#ifdef __IAR_SYSTEMS_ICC__
#pragma register_bank=1
#pragma vector=timer1
__interrupt void _timer1_isr(void)
#else
void _timer1_isr(void) interrupt 3 using 1
#endif
{
    #if 0
    static unsigned char timer1_10msCnt=2;
    static unsigned char timer1_100msCnt=20;
    static unsigned char timer1_500msCnt=100;
    static unsigned char timer1_1sCnt=200;

    TH1=0xEC;
    TL1=0x78;
    
    if(timer1_10msCnt--==0)
    {
        timer1_10msCnt=2;
    }

    if(timer1_100msCnt--==0)
    {
        timer1_100msCnt=20;
    }

    if(timer1_500msCnt--==0)
    {
        timer1_500msCnt=100;
        ADD_EVT(EVT_OF_500MS);
    }

    if(timer1_1sCnt--==0)
    {
        timer1_1sCnt=200;
        if(bManDisp==0)
        {
            LcdDispFlag|=LCD_DISP_FLG_ACTIVE;
        }
        ADD_EVT(EVT_OF_SECOND);
    }
    #endif
}

// Timer2 interrupt service
#ifdef __IAR_SYSTEMS_ICC__
#pragma register_bank=1
#pragma vector=timer2
__interrupt void _timer2_isr(void)
{
}
#else
void _timer2_isr(void) interrupt 5 using 1
{
}
#endif

// temperature ADC interrupt service
#ifdef __IAR_SYSTEMS_ICC__
#pragma vector=itemp_ADC
__interrupt void _temp_isr(void)
{
}
#else
void _temp_isr(void) interrupt 6
{
}
#endif

// isp/iic interrupt service
#ifdef __IAR_SYSTEMS_ICC__
#pragma vector=ispi_i2c
__interrupt void _ispi_i2c_isr(void)
#else
void _ispi_i2c_isr(void) interrupt 7
#endif
{
    if((CFG&BIT5)==0)
    {
        if((SPI2CSTAT&BIT7)/*BUSY*/){goto SPII2C_END;}
        if((SPI2CSTAT&BIT6)/*MMERR*/){goto SPII2C_END;/* todo No ACK */}
        if((SPI2CSTAT&BIT5)/*SPIRxOF*/){goto SPII2C_END;/* todo Rx In */}
        if((SPI2CSTAT&BIT4)/*SPIRxIRQ*/){goto SPII2C_END;/* todo Tx complete */}
    }
SPII2C_END:
    SPI2CSTAT=0;
}

// power supply interrupt service
#ifdef __IAR_SYSTEMS_ICC__
#pragma vector=ipsm
__interrupt void _psm_isr(void)
#else
void _psm_isr(void) interrupt 8
#endif
{
	_evt_word_of_power=IPSME;     // read the enable register first
	_evt_word_of_power&=IPSMF;    // see which enabled interrupts are set
	ADD_EVT(EVT_OF_POWER_DOWN);
	// parse flag  todo .0 .1 .7
	// flag.0: FVDC--Vdcin < 1.2V
	// flag.1: FBSO--VSW switches from VDD to VBAT.
	// flag.2: FBAT--VBAT falls below BATVTH or when the VBAT measurement is ready.
	// flag.3: FVSW--VSW changes by VSWDIF or when VSW measurement is ready.
	// flag.4: RESERVED--This bit must be kept cleared for proper operation
	// flag.5: FSAG--Voltage SAG Interrupt flag.
	// flag.6: FPSM--PSM Interrupt flag.
	// flag.7: FPSR--Set when the VDD power supply has been restored. This occurs when the source of VSW changes from VBAT to VDD.
	green=0;
	IPSMF=green;
	SCRATCH1 = SEC;
    SCRATCH2 = MIN;
    SCRATCH3 = HOUR;
    _Lcd_Write(0x0a,0x04);        // battery ICON
}

// watchdog timer interrupt service
#ifdef __IAR_SYSTEMS_ICC__
#pragma vector=iwdt
__interrupt void _wdt_isr(void)
{
}
#else
void _wdt_isr(void) interrupt 11
{
}
#endif






















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -