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

📄 main_30f.c

📁 Who to use ECAN network with dsPIC33F, Microchip microcontroller.
💻 C
字号:
#include "p30f4011.h"
#include "can.h"
#include "string.h"
#include "identificateur_PGBot.h"
#include "timer.h"
#include "string.h"
//#include "ECAN1Drv.h"

#define LED PORTBbits.RB0
#define FOSC 128e6
#define FCY FOSC/4
#define F_TMR1 1.0e+004
#define PR1_VAL (FCY/(F_TMR1))
/* CAN Baud Rate Configuration 		*/
#define FCAN  	FCY //parceque CANCKS = 1
#define BITRATE 1.0e6 
//Microchip
//#define NTQ 	20		// 20 Time Quanta in a Bit Time
//Nono
#define NTQ 	16		// 16 Time Quanta in a Bit Time
#define BRP_VAL		((FCAN/(2*NTQ*BITRATE))-1)

#define ID_CAN(x) (((x & 0x07C0) << 5) | ((x & 0x003F) << 2))


_FOSC(CSW_FSCM_OFF & XT_PLL16);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
_FGS(CODE_PROT_OFF);
_FICD(ICS_NONE);

void Configure_CAN_bus (void);
void envoie_string_ECAN(unsigned int id, char *msg);

void __attribute__((__interrupt__,auto_psv)) _T1Interrupt(void)
{
	IFS0bits.T1IF = 0; 
//	LED=!LED;

}

void main (void)
{
	unsigned char toto[9], *reception;
	int i;
	ADPCFG = 0xFFFF;						/* Port b en mode digital */
	
	TRISBbits.TRISB0 = 0;

//	TRISBbits.TRISB0 = 1;
	TRISBbits.TRISB1 = 1;
	TRISBbits.TRISB2 = 1;
		
	while(OSCCONbits.LOCK!=1);	/* attendre le verouillage de la pll */
	
		//TIMER 1 :
	ConfigIntTimer1(T1_INT_PRIOR_1 & T1_INT_ON);
	OpenTimer1(	T1_ON & T1_IDLE_CON & T1_GATE_OFF & T1_PS_1_1 & T1_SYNC_EXT_OFF & T1_SOURCE_INT,PR1_VAL);	           

	Configure_CAN_bus ();

LED = 0;	

	
	do{
		if(PORTBbits.RB1==1) {
			envoie_string_ECAN(DEP_PINCE, "DISTRIB"); // 8 car. max
			LED=1;
			while(CAN1IsRXReady(0)==0);
//			for(i=0;i<40000;i++);
//			CAN1ReceiveMessage (reception,8,0);
		if(strcmp(reception,"CHARGE O")==0) LED=0;
//				envoie_string_ECAN(DEP_PINCE, "CENTRE");
//			while(CAN1IsRXReady(0)==0);
			
//			CAN1ReceiveMessage (reception,8,0);
//			if(strcmp(reception,"DEPOSE O")!=0) envoie_string_ECAN(ERREUR, " 404    ");			
			while((PORTBbits.RB1==1));
		}	
		if(PORTBbits.RB2==1) {
			envoie_string_ECAN(DEP_PINCE, "CENTRE");
			while((PORTBbits.RB2==1));
		}
	}	while(1);
}


/*********************************************************************
  Configure CAN bus
*********************************************************************/

void Configure_CAN_bus (void)
{
	/* mode configuration */
	CAN1SetOperationMode(	CAN_IDLE_CON & 
							CAN_MASTERCLOCK_1 & 			//FCAN = FCY
							CAN_REQ_OPERMODE_CONFIG & 		//MODE CONFIGURATION
							CAN_CAPTURE_DIS);
	while(C1CTRLbits.OPMODE <=3);
//	C1CTRLbits.REQOP=4;
//	while(C1CTRLbits.OPMODE!=4);
	/* config des registres */
	CAN1Initialize( CAN_SYNC_JUMP_WIDTH1 &
					CAN_BAUD_PRE_SCALE(1),
					CAN_WAKEUP_BY_FILTER_DIS &
					CAN_PROPAGATIONTIME_SEG_TQ(7) &
					CAN_PHASE_SEG1_TQ(3) & CAN_PHASE_SEG2_TQ(5) & 
					CAN_SEG2_FREE_PROG & CAN_SAMPLE1TIME);

//	C1CTRLbits.CANCKS = 0x1;
//	C1CFG1bits.SJW = 0x0;		/* Synchronization Jump Width set to 1 TQ              */
//	C1CFG1bits.BRP = BRP_VAL;	/* Baud Rate Prescaler     							*/ 
//	C1CFG2bits.SEG1PH=0x2;		/* Phase Segment 1 time is 3 TQ                        */
//	C1CFG2bits.SEG2PHTS = 0x1;	/* Phase Segment 2 time is set to be programmable      */
//	C1CFG2bits.SEG2PH = 0x4;	/* Phase Segment 2 time is 5 TQ                        */
//	C1CFG2bits.PRSEG = 0x6;		/* Propagation Segment time is 7 TQ                    */
//	C1CFG2bits.SAM = 0x1;		/* Bus line is sampled three times at the sample point */
	
	/* config TX */
	CAN1SetTXMode(0,CAN_TX_STOP_REQ & CAN_TX_PRIORITY_HIGH);
	CAN1SetTXMode(1,CAN_TX_STOP_REQ & CAN_TX_PRIORITY_HIGH_INTER);
	CAN1SetTXMode(2,CAN_TX_STOP_REQ & CAN_TX_PRIORITY_LOW_INTER);

	/* config RX */
	CAN1SetRXMode(0,CAN_RXFUL_CLEAR & CAN_BUF0_DBLBUFFER_DIS);
	CAN1SetRXMode(1,CAN_RXFUL_CLEAR);

	/* filtres */
	CAN1SetFilter(0, CAN_FILTER_SID(0x0018) &	CAN_RX_EID_DIS, 0);
	/* Load mask filter register */
	CAN1SetMask(0, CAN_MASK_SID(0x00FC) &	CAN_MATCH_FILTER_TYPE, 0);

	/* mode normale */
	CAN1SetOperationMode(	CAN_IDLE_CON & CAN_CAPTURE_DIS &
												CAN_MASTERCLOCK_1 & CAN_REQ_OPERMODE_NOR);
	while(C1CTRLbits.OPMODE != 0);
//	C1CTRLbits.REQOP=2;
//	while(C1CTRLbits.OPMODE!=2);

	return;
}

void envoie_string_ECAN(unsigned int id, char *msg)
{
	//unsigned char i;
	
	CAN1SendMessage((ID_CAN((id|STRING))),0,msg, 8, 0);
//	ecan1WriteTxMsgBufId(0,id|STRING,0,0);
//	ecan1WriteTxMsgBufData(0,8,(msg[0])|(msg[1]<<8),(msg[2])|(msg[3]<<8),(msg[4])|(msg[5]<<8),(msg[6])|(msg[7]<<8));
//	C1TR01CONbits.TXREQ0=1;		
}

⌨️ 快捷键说明

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