📄 interruption.c
字号:
/** *****************************************
INTERRUPTION.C
***************************************** **/
#include "p33fxxxx.h"
#include "constante.h"
#include "variable_globale.h"
#include "timer.h"
#include "ECAN1Drv.h"
#include "interruption.h"
#include "carte.h"
#include "qei.h"
#include "adc.h"
#include "lcd.h"
/* ********************
BUS CAN
******************** */
void __attribute__((interrupt, no_auto_psv))_C1Interrupt(void)
{
IFS2bits.C1IF = 0; // clear interrupt flag
if(C1INTFbits.TBIF)
{
C1INTFbits.TBIF = 0;
}
if(C1INTFbits.RBIF)
{
C1INTFbits.RBIF = 0;
// read the message
if(C1RXFUL1bits.RXFUL6==1) {rx_ecan1message.buffer=6;C1RXFUL1bits.RXFUL6=0;}
if(C1RXFUL1bits.RXFUL7==1) {rx_ecan1message.buffer=7;C1RXFUL1bits.RXFUL7=0;}
if(C1RXFUL1bits.RXFUL8==1) {rx_ecan1message.buffer=8;C1RXFUL1bits.RXFUL8=0;}
if(C1RXFUL1bits.RXFUL9==1) {rx_ecan1message.buffer=9;C1RXFUL1bits.RXFUL9=0;}
if(C1RXFUL1bits.RXFUL10==1) {rx_ecan1message.buffer=10;C1RXFUL1bits.RXFUL10=0;}
if(C1RXFUL1bits.RXFUL11==1) {rx_ecan1message.buffer=11;C1RXFUL1bits.RXFUL11=0;}
if(C1RXFUL1bits.RXFUL12==1) {rx_ecan1message.buffer=12;C1RXFUL1bits.RXFUL12=0;}
if(C1RXFUL1bits.RXFUL13==1) {rx_ecan1message.buffer=13;C1RXFUL1bits.RXFUL13=0;}
if(C1RXFUL1bits.RXFUL14==1) {rx_ecan1message.buffer=14;C1RXFUL1bits.RXFUL14=0;}
if(C1RXFUL1bits.RXFUL15==1) {rx_ecan1message.buffer=15;C1RXFUL1bits.RXFUL15=0;}
if(C1RXFUL2bits.RXFUL16==1) {rx_ecan1message.buffer=16;C1RXFUL2bits.RXFUL16=0;}
if(C1RXFUL2bits.RXFUL17==1) {rx_ecan1message.buffer=17;C1RXFUL2bits.RXFUL17=0;}
if(C1RXFUL2bits.RXFUL18==1) {rx_ecan1message.buffer=18;C1RXFUL2bits.RXFUL18=0;}
if(C1RXFUL2bits.RXFUL19==1) {rx_ecan1message.buffer=19;C1RXFUL2bits.RXFUL19=0;}
if(C1RXFUL2bits.RXFUL20==1) {rx_ecan1message.buffer=20;C1RXFUL2bits.RXFUL20=0;}
if(C1RXFUL2bits.RXFUL21==1) {rx_ecan1message.buffer=21;C1RXFUL2bits.RXFUL21=0;}
if(C1RXFUL2bits.RXFUL22==1) {rx_ecan1message.buffer=22;C1RXFUL2bits.RXFUL22=0;}
if(C1RXFUL2bits.RXFUL23==1) {rx_ecan1message.buffer=23;C1RXFUL2bits.RXFUL23=0;}
if(C1RXFUL2bits.RXFUL24==1) {rx_ecan1message.buffer=24;C1RXFUL2bits.RXFUL24=0;}
if(C1RXFUL2bits.RXFUL25==1) {rx_ecan1message.buffer=25;C1RXFUL2bits.RXFUL25=0;}
if(C1RXFUL2bits.RXFUL26==1) {rx_ecan1message.buffer=26;C1RXFUL2bits.RXFUL26=0;}
if(C1RXFUL2bits.RXFUL27==1) {rx_ecan1message.buffer=27;C1RXFUL2bits.RXFUL27=0;}
if(C1RXFUL2bits.RXFUL28==1) {rx_ecan1message.buffer=28;C1RXFUL2bits.RXFUL28=0;}
if(C1RXFUL2bits.RXFUL29==1) {rx_ecan1message.buffer=29;C1RXFUL2bits.RXFUL29=0;}
if(C1RXFUL2bits.RXFUL30==1) {rx_ecan1message.buffer=30;C1RXFUL2bits.RXFUL30=0;}
if(C1RXFUL2bits.RXFUL31==1) {rx_ecan1message.buffer=31;C1RXFUL2bits.RXFUL31=0;}
rx_ecan1message.buffer -= 8;
rx_ecan1message.filter = C1VECbits.FILHIT;
rxECAN1(&rx_ecan1message);
reception_ecan=1;
}
}
/* ********************
DMA
(0 -> Transmission bus CAN)
(2 -> R閏eption bus CAN)
******************** */
void __attribute__((interrupt, no_auto_psv)) _DMA0Interrupt(void)
{
IFS0bits.DMA0IF = 0; // Clear the DMA0 Interrupt Flag;
}
void __attribute__((interrupt, no_auto_psv)) _DMA2Interrupt(void)
{
IFS1bits.DMA2IF = 0; // Clear the DMA2 Interrupt Flag;
}
/* ********************
TIMER
******************** */
void __attribute__((__interrupt__,auto_psv)) _T1Interrupt(void)
{
IFS0bits.T1IF = 0;
#ifdef DEPLACEMENT
LED=!LED;
#endif
temps_timer1 += 1;
if(temps_timer1 == 10)
{
temps_timer1_ms +=1;
temps_timer1 = 0;
}
if(temps_timer1_ms >= 90e3)
{
//Arr阾 total
}
/* PINCE */
#ifdef PINCE
/* SERVO */
inc++; /* */ if(inc < 3*MS_TIMER1)
{ /* SI TPS < 3 ms */ if(inc==inc_servo_0) /* inc_0 = f(angle_0) */ SERVO_0=1; /* signal servo_0 a zero */ if(inc==inc_servo_1) /* inc_1 = f(angle_1) */ SERVO_1=1; /* signal servo_1 a zero */ } /* */ else /* SI TPS > 3 ms */ if(inc>=20*MS_TIMER1)
{ /* FIN DES TRAMES */ inc=0; /* */ SERVO_0=0; /* Debut nvle trame servo_0 */ SERVO_1=0; /* Debut nvle trame servo_1 */ }
/* ASSERVISSEMENT MOTEUR CC */
inc_moteur++;
inc2_moteur++;
if(inc_moteur == 10*MS_TIMER1)
{
inc_moteur = 0;
// R閏up閞ation des points
points_actuels = POS1CNT;
// Calcul consigne
points_voulus = points_objectif;
// if((points_actuels < points_objectif + NB_PAS_TOUR)&&(points_actuels > points_objectif - NB_PAS_TOUR))
// {
// points_voulus = points_objectif;
// } else {
// if(points_actuels < points_objectif)
// {
// points_voulus += consigne_vit_moteur++;
// } else
// if (points_actuels < points_objectif)
// {
// points_voulus -= consigne_vit_moteur++;
// }
// if(consigne_vit_moteur > NB_PAS_TOUR) consigne_vit_moteur = NB_PAS_TOUR;
// }
// if(inc2_moteur == 100*MS_TIMER1)
// {
// inc2_moteur = 0;
//
// if((consigne_vit_moteur < VITESSE_CONSIGNE_MAX)&&(points_voulus < points_objectif / 2.0))
// {
// if(consigne_vit_moteur < VITESSE_CONSIGNE_MAX) consigne_vit_moteur++;
// else
// {
// consigne_vit_moteur = VITESSE_CONSIGNE_MAX;
// sv_points = points_voulus;
// }
// } else if((points_voulus > sv_points)||((sv_points == 0)&&(points_voulus > points_objectif / 2.0)))
// {
// consigne_vit_moteur--;
// }
// }
//
// Asservissement
vitesse = KP*(points_voulus - points_actuels);
// Mise en forme du rapport cyclique
if(vitesse > VITESSE_MOTEUR_CC_MAX) vitesse = VITESSE_MOTEUR_CC_MAX;
if(vitesse < -1*VITESSE_MOTEUR_CC_MAX) vitesse = -1*VITESSE_MOTEUR_CC_MAX;
vitesse += VITESSE_MOTEUR_CC_0;
P1DC1 = vitesse;
}
#endif
/* FIN PINCE */
}
void __attribute__((__interrupt__,auto_psv)) _T3Interrupt(void)
{ IFS0bits.T3IF = 0;
}
#ifdef AFFICHAGE
void __attribute__((__interrupt__,auto_psv)) _ADC1Interrupt(void)
{
IFS0bits.AD1IF = 0; //Clear du flag
// capteur_distance = (double)ReadADC1(0);
capteur_distance = (double)ADC1BUF0;
//if(capteur_distance > 112)
// LED = 1;
//else LED = 0;
}
#endif
void rxECAN1(mID *message)
{
unsigned int ide=0;
unsigned int srr=0;
unsigned long id=0;
// mID *message = &rx_ecan1message;
/*
Standard Message Format:
Word0 : 0bUUUx xxxx xxxx xxxx
|____________|||
SID10:0 SRR IDE(bit 0)
Word1 : 0bUUUU xxxx xxxx xxxx
|____________|
EID17:6
Word2 : 0bxxxx xxx0 UUU0 xxxx
|_____|| |__|
EID5:0 RTR DLC
word3-word6: data bytes
word7: filter hit code bits
Substitute Remote Request Bit
SRR-> "0" Normal Message
"1" Message will request remote transmission
Extended Identifier Bit
IDE-> "0" Message will transmit standard identifier
"1" Message will transmit extended identifier
Remote Transmission Request Bit
RTR-> "0" Message transmitted is a normal message
"1" Message transmitted is a remote message
*/
/* read word 0 to see the message type */
ide=ecan1msgBuf[message->buffer][0] & 0x0001;
srr=ecan1msgBuf[message->buffer][0] & 0x0002;
/* check to see what type of message it is */
/* message is standard identifier */
if(ide==0)
{
message->id=(ecan1msgBuf[message->buffer][0] & 0x1FFC) >> 2;
message->frame_type=CAN_FRAME_STD;
}
/* mesage is extended identifier */
else
{
id=ecan1msgBuf[message->buffer][0] & 0x1FFC;
message->id=id << 16;
id=ecan1msgBuf[message->buffer][1] & 0x0FFF;
message->id=message->id+(id << 6);
id=(ecan1msgBuf[message->buffer][2] & 0xFC00) >> 10;
message->id=message->id+id;
message->frame_type=CAN_FRAME_EXT;
}
/* check to see what type of message it is */
/* RTR message */
if(srr==1)
{
message->message_type=CAN_MSG_RTR;
}
/* normal message */
else
{
message->message_type=CAN_MSG_DATA;
message->data[0]=(unsigned char)ecan1msgBuf[message->buffer][3];
message->data[1]=(unsigned char)((ecan1msgBuf[message->buffer][3] & 0xFF00) >> 8);
message->data[2]=(unsigned char)ecan1msgBuf[message->buffer][4];
message->data[3]=(unsigned char)((ecan1msgBuf[message->buffer][4] & 0xFF00) >> 8);
message->data[4]=(unsigned char)ecan1msgBuf[message->buffer][5];
message->data[5]=(unsigned char)((ecan1msgBuf[message->buffer][5] & 0xFF00) >> 8);
message->data[6]=(unsigned char)ecan1msgBuf[message->buffer][6];
message->data[7]=(unsigned char)((ecan1msgBuf[message->buffer][6] & 0xFF00) >> 8);
message->data_length=(unsigned char)(ecan1msgBuf[message->buffer][2] & 0x000F);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -