📄 vectors.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 + -