📄 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();
/*
00000000: 02 41 00 02 02 00 00 00 00 00 00 00 00 00 00 00 .A..............
00000010: 02 42 00 03 03 03 00 00 00 00 00 00 00 00 00 00 .B..............
00000020: 02 43 00 04 04 04 04 00 00 00 00 00 00 00 00 00 .C..............
00000030: 02 44 00 05 05 05 05 05 00 00 00 00 00 00 00 00 .D..............
00000040: 02 45 00 06 06 06 06 06 06 00 00 00 00 00 00 00 .E..............
00000050: 02 46 00 07 07 07 07 07 07 07 00 00 00 00 00 00 .F..............
00000060: 02 47 00 08 08 08 08 08 08 08 08 00 00 00 00 00 .G..............
00000070: 02 48 00 01 00 00 00 00 00 00 00 00 00 00 00 00 .H..............
00000080: 02 41 00 02 02 00 00 00 00 00 00 00 00 00 00 00 .A..............
00000090: 02 42 00 03 03 03 00 00 00 00 00 00 00 00 00 00 .B..............
000000A0: 02 43 00 04 04 04 04 00 00 00 00 00 00 00 00 00 .C..............
000000B0: 02 44 00 05 05 05 05 05 00 00 00 00 00 00 00 00 .D..............
000000C0: 02 45 00 06 06 06 06 06 06 00 00 00 00 00 00 00 .E..............
000000D0: 02 46 00 07 07 07 07 07 07 07 00 00 00 00 00 00 .F..............
000000E0: 02 47 00 08 08 08 08 08 08 08 08 00 00 00 00 00 .G..............
000000F0: 02 48 00 01 00 00 00 00 00 00 00 00 00 00 00 00 .H..............
00000100: 02 41 00 02 02 00 00 00 00 00 00 00 00 00 00 00 .A..............
00000110: 02 42 00 03 03 03 00 00 00 00 00 00 00 00 00 00 .B..............
00000120: 02 43 00 04 04 04 04 00 00 00 00 00 00 00 00 00 .C..............
00000130: 02 44 00 05 05 05 05 05 00 00 00 00 00 00 00 00 .D..............
00000140: 02 45 00 06 06 06 06 06 06 00 00 00 00 00 00 00 .E..............
00000150: 02 46 00 07 07 07 07 07 07 07 00 00 00 00 00 00 .F..............
00000160: 02 47 00 08 08 08 08 08 08 08 08 00 00 00 00 00 .G..............
00000170: 02 48 00 01 00 00 00 00 00 00 00 00 00 00 00 00 .H..............
00000180: 02 41 00 02 02 00 00 00 00 00 00 00 00 00 00 00 .A..............
00000190: 02 42 00 03 03 03 00 00 00 00 00 00 00 00 00 00 .B..............
000001A0: 02 43 00 04 04 04 04 00 00 00 00 00 00 00 00 00 .C..............
000001B0: 02 44 00 05 05 05 05 05 00 00 00 00 00 00 00 00 .D..............
000001C0: 02 45 00 06 06 06 06 06 06 00 00 00 00 00 00 00 .E..............
000001D0: 02 46 00 07 07 07 07 07 07 07 00 00 00 00 00 00 .F..............
000001E0: 02 47 00 08 08 08 08 08 08 08 08 00 00 00 00 00 .G..............
000001F0: 02 48 00 01 00 00 00 00 00 00 00 00 00 00 00 00 .H..............
00000200: 02 41 00 02 02 00 00 00 00 00 00 00 00 00 00 00 .A..............
*/
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 + -