📄 main.c
字号:
/*****************************************
测试版本
MCU:ATMEGA8515
Frequence: 16M
描述:利用已有CAN TEST V1.0电路板进行调试,
可靠性测试已通过,并发现8515外部中断不稳定
的原因是没有在INT0脚加上拉电阻,加上后已能
够稳定地运行
调试过程中发现SJA1000的首地址设置有误,改过
后,当CAN发送数据时,程序能进入中断了,但发现
中断是由出错报警中断引起的,估计与波特率设置
有关。
通过修改CDR的参数,以及更换16M晶振,现在已能
正常地收发送数据了!!!!!!!!!!!!!
日期:2006.3.11
*****************************************/
#include "iom8515v.h"
#include "macros.h"
#include "MAIN.h"
#include "Timer.h"
#include "IO.h"
#include "CAN.h"
#pragma interrupt_handler Inter0:2
void Inter0(void)
{
uchar reg;
uchar CompCount;
uchar can_status;
CLI(); //关CPU中断
RevFlag=1;
reg=read_sja(4); //保存SJA1000的中断允许状态
write_sja(4,0x00); //重设中断允许状态为不允许任何中断
can_status=Receive(); //接收消息
if(can_status == 0x01)
{
for(CompCount=5;CompCount<13;CompCount++) //检查接收到的数据是否正确
{
if(RxBuffer[CompCount] != TransBuffer[CompCount])
{
RevFlag &= 0x00; //发现有不一致时,则清0标志位
}
}
}
else
Init_CAN(); //如果不是正确接收,则重新初始化
write_sja(4,reg); //重新写回中断允许模式
SEI();
}
//////////////////////////////////////////////////////////////////////////
void Status_lighting(uchar status)
{
if(status == 1)
PORTD |= BIT(5);
else if(status == 0)
PORTD &=~ BIT(5);
}
void delay_1ms( void )
{
uint k ;
for ( k = 0 ; k < ( 8*142-2 ) ; k++ ) // 定时1ms公式:xtal*142-2
;
}
void Delay (uint n)
{
uint p ;
for( p = 0 ; p < n ;p++ )
{
delay_1ms() ;
}
}
void main(void)
{
uchar lp_count;
CLI(); //关中断
IOIni(); //IO口初始化
Timer0Ini();
Delay(1000);
Init_CAN(); //CAN初始化
SEI();
while(1)
{
Key3=KeyInput(3);
if(KeyStatus == 1) //按键按下
{
KeyStatus=0;
CanTransmit(); //发送数据
}
if(RevFlag == 1) //如果正确接收到数据
{
RevFlag=0;
PORTD ^= BIT(5);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -