打印
[CAN-bus/DeviceNet]

化简,化到最简!

[复制链接]
1586|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wxj1952|  楼主 | 2007-8-2 13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CAN, AN, AD, LED, TE
运行以下程序,(无论节点在不在总线上。)send( )发送后,中断EPI发生,LED1亮。(节点进入错误消极状态)证实你的系统工作正常。
然后在此基础上完善你的程序。

#pragma SMALL
#include<reg51.h>
#include<sjareg.h>
#define uchar unsigned char

bdata uchar ws1;
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;

uchar xdata *SJA_Adr=0x7f00;
#define can_read(RegAdr)  SJA_Adr[RegAdr]
#define can_write(RegAdr,Val)  SJA_Adr[RegAdr]=Val

void initial()  using 0
{
do{ 
can_write(MOD,0x01);
}while(can_read(MOD)^0x01);

can_write(CDR,0xcf);
can_write(OCR,0xfa);
can_write(IER,0x20); 

can_write(MOD,0);
}

void main(void)

LED0=0;
initial( );
IE=0x81;         

send( );   //can_write(CMR,1);

LED2=!LED2;
while(1);
}

void int0(void) interrupt 0  using 0
{
LED1=!LED1;
ws1=can_read(IR);
}

再次运行该程序,LED1无反应。按下硬复位按键,可重复实验。


相关帖子

沙发
wxj1952|  楼主 | 2007-8-3 10:36 | 只看该作者

疑问?

一个SJA1000驱动程序究竟需要多少条语句?
学软件出身的是动辄100条以上的,我看到过一个SJA1000初始化程序写了200多行的,想模块化都不成。

从心理学的角度讲,一个60条语句的程序是人能够保持清醒的界限,再大就会顾头不顾尾--越写越乱。也就是说,一个函数最好在60条以下。

比喻,就好像一个人能够一气背60个英语单词,再多会怎么样?

使用特权

评论回复
板凳
太阳之母| | 2007-8-3 18:50 | 只看该作者

嘿嘿


你的中断处理函数里没有做的事:清除数据溢出,释放接收缓冲区

加一句:can_write(CMR,0x0c);

就可以了

使用特权

评论回复
地板
wxj1952|  楼主 | 2007-8-3 19:18 | 只看该作者

那样就不是最简了。

提示,我是“单”节点“发送”测试实验,比自测试“故意非正常应用”进一步化简——去掉了接收过程。目的是测试板子电路/芯片的连接正常与否。与接收没有任何连系,不可能发生数据溢出,也不可能接收到任何报文信息。
而且,我只开放了唯一的一个中断——错误认可中断(TXERR>127)。换句话说,即使有任何接收溢出错误发生,也不会触发中断/进入中断程序。那么,为什么要在中断程序中加“清除数据溢出,释放接收缓冲区”?



程序目的:
“我明明启动发送了,为什么没有中断?”
“我的板子坏了吗?”
“我的板子电路设计错了吗?”
“我的程序运行了,怎么什么反应都没有?”

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

757

帖子

1

粉丝