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

📄 at90can128._c

📁 不可多得的atmel公司canbus通讯程序(at90can128)
💻 _C
字号:
#define _MAIN_H
#include "AT90CAN128.H"

uint8 CS = 0;
uint8 volatile CHA = 0;

BOOL LED[5] = {FALSE,FALSE,FALSE,FALSE,FALSE};
BOOL volatile send_mark = TRUE;
BOOL volatile display_mark = TRUE;
uint8 send_time = 0;
uint8 display_time = 0;


void PORT_Init(void)
{
	PORTA = 0xFF;
	DDRA  = 0xFF;	//数码管
   
	PORTB = 0xFF;
	DDRB  = 0x00;
   
	PORTC = 0xFF; //m103 output only
	DDRC  = 0xFF;
   
	PORTD = 0xFF;//PD4
	DDRD  = 0x10;
   
	PORTE = 0xFF;
	DDRE  = 0x00;
   
	PORTF = 0xFF;	
   DDRF  = 0x00;
   
	PORTG = 0xFF;
	DDRG  = 0x00;
//=======================================================================
//ADEN置位即启动ADC,否则ADC功能关闭。在转换过程中关闭ADC将立即中止正在进
//行的转换。
//=======================================================================
	ADCSRA = (0 << ADEN);				//	关闭数/模转换器
//=======================================================================
//ACD 置位时,模拟比较器的电源被切断。可以在任何时候设置此位来关掉模拟比较器。这
//可以减少器件工作模式及空闲模式下的功耗。改变ACD 位时,必须清零ACSR 寄存器的
//ACIE 位来禁止模拟比较器中断。否则ACD 改变时可能会产生中断。
//当ACIE 位被置"1” 且状态寄存器中的全局中断标志I 也被置位时,模拟比较器中断被激
//活。否则中断被禁止。
//=======================================================================
	ACSR = (1 << ACD) | (0 << ACIE);	//	关闭模拟比较器
//=======================================================================
//	EEWE复位值不定
//=======================================================================
	EECR = 0;
}


//////////////////////////////////////////////////////////////////////
//TIMER0 initialize - prescale:1024
// WGM: CTC
// desired value: 1mSec
// actual value:  1.019mSec (-1.9%)
// 定时器0=2毫秒=寄存器比较值11059200*2/1024/1000-1=21.6-1=20.6=0x35
//--------------------------------------------------------------------
//FOC0A WGM00 COM0A1 COM0A0 WGM01 CS02 CS01 CS00
//        0                   1    1    0    1 
//////////////////////////////////////////////////////////////////////
void TIMER0_Init(void)
{
	TCCR0 = 0x00; //stop
 	ASSR  = 0x00; //set async mode
 	TCNT0 = 0xF9; //set count
 	OCR0  = 0x07;
 	TCCR0 = 0x0D; //start timer	
	TIMSK0 = (1 << OCIE0);					//	使能T0=自动重装中断(1<<TOIE0)|
}


//////////////////////////////////////////////////////////////////////
//TIMER2 initialize - prescale:1024
// WGM: CTC
// desired value: 5mSec
// actual value:  5.000mSec (0.0%)
// 256-11059200*5/1024/1000/10=256-54=202=0xCA(5毫秒)
// 定时器2=10毫秒=寄存器比较值11059200*10/1024/1000-1=108-1=107=0x6B
//--------------------------------------------------------------------
//FOC2A WGM20 COM2A1 COM2A0 WGM21 CS22 CS21 CS20
//        0                   1     1    1    1
//////////////////////////////////////////////////////////////////////
void TIMER2_Init(void)
{
	TCCR2 = 0x00; //stop
 	TCNT2 = 0xD9; //setup
 	OCR2  = 0x27;
 	TCCR2 = 0x0F; //start	
	TIMSK2 = (1 << OCIE2);					//	使能T2=自动重装中断(1<<TOIE0)|
}


void Watchdog_Init(void)
{
	WDR();				//	看门狗计数清零
	WDTCR = (1 << WDE) | (1 << WDP2) | (1 << WDP1) | (0 << WDP0);  //	使能watchdog,并且,采用128K分频,典型溢出时间5V时1S
} 


//////////////////////////////////////////////////////////////////////
// a = PA7(pa0)			 
// b = PA6(pa1)
// c = PA5(pa2)
// d = PA4(pa3)
// e = PA3(pa4)
// f = PA2(pa5)
// g = PA1(pa6);
// h = PA0(pa7)		
//////////////////////////////////////////////////////////////////////
uint8 ExChange(uint8 num)
{
   uint8 i;
   uint8 KK1 = num;
   uint8 KK2 = num;
   uint8 K_Hi = 0;
   uint8 K_Lo = 0;
   uint8 K;
	
//----------------------------------------------------------------- 
//bit0-->bit7   //bit1-->bit6   //bit2-->bit5   //bit3-->bit4     
//----------------------------------------------------------------- 
	for (i=0;i<4;i++)
	{
			K_Hi <<= 1;
			if (KK1 & 0x01)
				K_Hi |= 0x01;
			KK1 >>= 1; 
	} 
//----------------------------------------------------------------- 
//bit7-->bit0   //bit6-->bit1   //bit5-->bit2   //bit4-->bit3     
//----------------------------------------------------------------- 
	for (i=0;i<4;i++)
	{
			K_Lo <<= 1;
			if (KK2 & 0x10)
				K_Lo |= 0x01;
			KK2 >>= 1; 
	}
	K = ((K_Hi << 4) | K_Lo);
	return (K);
}
   

void DISPLAY_LED(void)
{
	if (LED[0])
		LED1_ON();
	else
		LED1_OFF();

	if (LED[1])
		LED2_ON();
	else
		LED2_OFF();

	if (LED[2])
		LED3_ON();
	else
		LED3_OFF();

	if (LED[3])
		LED4_ON();
	else
		LED4_OFF();

	if (LED[4])
		LED5_ON();
	else
		LED5_OFF();
}


#pragma interrupt_handler TIMER0_COMP_ISR:iv_TIMER0_COMP
void TIMER0_COMP_ISR(void)
{
	CS++;
	if (CS > 1)
		CS = 0;
	switch (CS)
	{
		case 0:
			CS2_OFF();
		 	CS1_ON();
		    break;
		case 1:
		   	CS1_OFF();
		 	CS2_ON();
			break;
	}  		   
 	PORTA = ~ExChange(DISPLAY_CODE(CS));
}


#pragma interrupt_handler TIMER2_COMP_ISR:iv_TIMER2_COMP
void TIMER2_COMP_ISR(void)
{
	if (!send_mark)
	{
		send_time++;
		if (send_time >= 100)
		{
			send_mark = TRUE;
			send_time = 0;
		}
	}
	if (!display_mark)
	{
			display_time++;
			if (display_time >= 25)
			{
			    display_time = 0;
				display_mark = TRUE;
			}
		}
}


void CHA_Init(void)
{
		CHA++;
		if (CHA >= 100)
			CHA = 0;
}

void main(void)
{
	uint8 i,len;

	CLI();
	PORT_Init();
	TIMER0_Init();	 
	TIMER2_Init();	 
	USART1_Init();
	TJA1040_DISABLE();
	NOP();
	NOP();   
	TJA1040_ENABLE();
	NOP();
	NOP();
	CAN_Init();
	Watchdog_Init();
	SEI();
	while (1)
	{
		CANPAGE = 0x00;
		if (CANSTMOB & (1 << RXOK))
		{
    		CANSTMOB &= ~(1 << RXOK);
			for (i = 0 ; i < 16 ; i++)
				rec_Buf[i] = 0x00;
			rec_Buf[0] = CANIDT1;
			rec_Buf[1] = CANIDT2;
			rec_Buf[2] = CANIDT4;
			if (rec_Buf[2] & 0x02)
				rec_Buf[2] = 1;		//	remote frame
			else
				rec_Buf[2] = 0;		//	data frame
			len = CANCDMOB & 0x0F;
			for (i = 0 ; i < len ; i++)
				rec_Buf[3+i] = CANMSG;
			USART1_Begin_Send();
			CANCDMOB = 0x88;
        } 
		CHA = CANGIT & 0x7F;
//		DISPLAY_LED();
//		if (display_mark)
		{	
			display_mark = FALSE;
			DISPLAY_Init(CHA);
		}
		WDR();
	}
}


//熔丝位配置(打勾表示0,不打勾表示1)
//                 1                              0
//WDTON	        WDT关闭	                        WDT打开
//CKDIV8	禁止系统时钟8分频	           允许系统时钟8分频
//EESAVE	全片擦除时擦除EERROM数据	全片擦除时保留EERROM数据	
//DWEN	       禁止单线调试					  使能单线调试	

//BOD检测电平选择:
//BODLEVEL2..0	BOD门槛电压
//111	BOD禁止
//110	1.8V
//101	2.7V
//100	4.3V   			   (选择4.3V)
//其余	保留

//时钟源选择:
//系统时钟源	CKSEL3..0
//低功耗晶振(小振幅)	1111-1000
//大振幅晶振	0111-0110
//低频晶振	0101-0100
//128kHz内部RC振荡	0011
//可校准内部RC振荡	0010
//外部时钟	0000
//保留选项	0001	

⌨️ 快捷键说明

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