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

📄 vectors.c

📁 在MICROCHIP的PIC18F2520上移植UCOSII操作系统
💻 C
字号:
/*
*********************************************************************************************************
*                                               uC/OS-II
*                                         The Real-Time Kernel
*
*                           (c) Copyright 2002, Nathan Brown, Longview, TX
*                                      http://www.sputnickonline.com/
*                                          All Rights Reserved
*
*                                   PIC18xxxx Interrupt Specific Code
*                                       V1.00 - October 27, 2002
*
* File : VECTORS.C
* By   : Nathan Brown
*********************************************************************************************************
*/

#include "includes.h"
#include <timers.h>
#include "mydefine.h"

extern INT16U  plus_number;//脉冲总数
extern INT16U  plus_number_multi;//多路脉冲输入,上位板提供脉冲
extern INT16U  plus_number_single;//下位机直接脉冲输入计数

extern INT8U	speed_or_temp;
extern INT8U	temperatureAD;
extern INT8U	speed_modifyAD;
extern OS_EVENT *FaultCheckmesQueue;
extern INT8U	Qmsg_temp2[2];

extern INT8U First_plus_flag;
extern INT8U TMR3OVERflag;

extern OS_EVENT *UartSendMutex;

extern SerialBuffer  ReceiveBuf;
extern OS_EVENT *S_ReceiveSem;
extern INT8U ReceiveNum;
extern INT8U SendDateNum ;
/*
*********************************************************************************************************
*                               INTERRUPT SERVICE ROUTINE HOOK
*
* Description:  This function is called when a interrupt service routine is call.  The state of the
*               current proccess is already saved.  This allows you to order the responses and to
                call your own coded for interrupts.
*
* Arguments  :  none
*
* Note(s)    :  1)  OSTimeTick() must be called from the timer routine that is pulsing at 10 to 100 times
*                   a second.
*               2)  You must clear the interrupt before calling OSTimeTick().
*********************************************************************************************************
*/
void CPUlowInterruptHook(void)
{
	if(INTCONbits.TMR0IF) 
		{                     // check for TMR0 overflow
        	INTCONbits.TMR0IF = 0;                  // clear interrupt flag
        	TMR0H = 0xB1;                           // set the timer to expire in 10 ms. (at 4MHz)
    		TMR0L = 0xDF;
		OSTimeTick();                           // Call required os timer
    	}
	if(INTCONbits.INT0IF)
	{
		INTCONbits.INT0IE = 0;
		INTCONbits.INT0IF = 0;
		Qmsg_temp2[0] = 1;
		Qmsg_temp2[1] = 1;
		OSQPost(FaultCheckmesQueue, (void *)&Qmsg_temp2[0]);
		INTCONbits.INT0IE = 1;
	
	}
	if(PIR1bits.ADIF)
		{
		//save the ad result 
	
		PIR1bits.ADIF = 0;
		ADCON0bits.ADON = 0;
		if(!speed_or_temp) 
		{
		speed_or_temp = 1 ;
		temperatureAD = ADRESH;	
		ADRESL = ADRESL;
		ADCON0 = 0x05;
		ADCON0bits.GO = 1;
		}
		else 
		{
		speed_or_temp = 0 ;
		speed_modifyAD= ADRESH;
		}
	}
	if(PIR2bits.TMR3IF)
		{
		PIE2bits.TMR3IE = 0;
		PIR2bits.TMR3IF = 0;
		TMR3OVERflag++;
		T3CONbits.TMR3ON = 0;
		TMR3H=0x00;
		TMR3L=0x00;		//T3定时器清零
		T3CONbits.TMR3ON = 1;		
		PIE2bits.TMR3IE = 1;
		}
	if(PIR2bits.CCP2IF)
		{
		
		PIR2bits.CCP2IF = 0;
		PIE2bits.CCP2IE = 0;
		if(First_plus_flag == 0)
			{
			First_plus_flag = 1;
			PIE2bits.TMR3IE = 0;
			PIR2bits.TMR3IF = 0;
			T3CONbits.TMR3ON = 0;
			TMR3H=0x00;
			TMR3L=0x00;		//T3定时器清零
			T3CONbits.TMR3ON = 1;
			PIE2bits.TMR3IE = 1;
			TMR3OVERflag = 0;
			PIE2bits.CCP2IE = 1;
			
			}
		else if(First_plus_flag ==1)
			{
			First_plus_flag = 2;
			PIE2bits.TMR3IE = 0;
			PIR2bits.TMR3IF = 0;
			T3CONbits.TMR3ON = 0;
			TMR3H=0x00;
			TMR3L=0x00;		//T3定时器清零
			}
		else;
			
		
		
	}
	if((PIR1bits.TXIF&TXSTAbits.TRMT)== 1)
		{
		if(SendDateNum >0)
			{
			TXREG = ReceiveBuf.S_Buffer[SendDateNum];
			SendDateNum--;
			}
		else 
			{
			TXSTAbits.TXEN = 0; 
//			OSMutexPost(UartSendMutex);
			}
		}
	if(PIR1bits.RCIF==1)
		{
		PIR1bits.RCIF = 0;
		T1CONbits.TMR1ON = 0;
		TMR1H = 0x0A;
		TMR1L = 0x00;
		T1CONbits.TMR1ON = 1;
		ReceiveBuf.S_Buffer[ReceiveNum]= RCREG;
		ReceiveNum++;
		}
	if(PIR1bits.TMR1IF)
		{
		T1CONbits.TMR1ON = 0;
		PIE1bits.TMR1IE = 0;
		PIR1bits.TMR1IF = 0;
		OSSemPost(S_ReceiveSem);
		}
	if(PIR2bits.HLVDIF)
		{
		PIR2bits.HLVDIF = 0;
		}
//AD转换,启动两次,转换完后关闭
//Timer3中断加标志,判断中断多少次如果超过最小速度则关闭timer3 和ccp2
//ccp2中断,则Timer3停止或启动得到测速值
/* Insert other interrupt items here */

}

#pragma interrupt CPUhighInterruptHook
void CPUhighInterruptHook(void)
{
    /* Insert high priority interrupt items here 
     * Do not make any OS function calls. */
     	if(INTCON3bits.INT1IF)
	{
		plus_number_multi++;
	}
	if(INTCON3bits.INT2IF)
	{
		plus_number_single++;
	}

}

⌨️ 快捷键说明

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