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

📄 interruption.c

📁 Who to use ECAN network with dsPIC33F, Microchip microcontroller.
💻 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 + -