化简,化到最简!
运行以下程序,(无论节点在不在总线上。)send( )发送后,中断EPI发生,LED1亮。(节点进入错误消极状态)证实你的系统工作正常。<br />然后在此基础上完善你的程序。<br /><br />#pragma SMALL<br />#include<reg51.h><br />#include<sjareg.h><br />#define uchar unsigned char<br /><br />bdata uchar ws1;<br />sbit LED0=P1^0;<br />sbit LED1=P1^1;<br />sbit LED2=P1^2;<br /><br />uchar xdata *SJA_Adr=0x7f00;<br />#define can_read(RegAdr) SJA_Adr<br />#define can_write(RegAdr,Val) SJA_Adr=Val<br /><br />void initial() using 0<br />{<br />do{ <br />can_write(MOD,0x01);<br />}while(can_read(MOD)^0x01);<br /><br />can_write(CDR,0xcf);<br />can_write(OCR,0xfa);<br />can_write(IER,0x20); <br /><br />can_write(MOD,0);<br />}<br /><br />void main(void)<br />{ <br />LED0=0;<br />initial( );<br />IE=0x81; <br /><br />send( ); //can_write(CMR,1);<br /><br />LED2=!LED2;<br />while(1);<br />}<br /><br />void int0(void) interrupt 0 using 0<br />{<br />LED1=!LED1;<br />ws1=can_read(IR);<br />}<br /><br />再次运行该程序,LED1无反应。按下硬复位按键,可重复实验。<br /><br /><br />疑问?
一个SJA1000驱动程序究竟需要多少条语句?<br />学软件出身的是动辄100条以上的,我看到过一个SJA1000初始化程序写了200多行的,想模块化都不成。<br /><br />从心理学的角度讲,一个60条语句的程序是人能够保持清醒的界限,再大就会顾头不顾尾--越写越乱。也就是说,一个函数最好在60条以下。<br /><br />比喻,就好像一个人能够一气背60个英语单词,再多会怎么样?嘿嘿
<br />你的中断处理函数里没有做的事:清除数据溢出,释放接收缓冲区<br /><br />加一句:can_write(CMR,0x0c);<br /><br />就可以了<br />那样就不是最简了。
提示,我是“单”节点“发送”测试实验,比自测试“故意非正常应用”进一步化简——去掉了接收过程。目的是测试板子电路/芯片的连接正常与否。与接收没有任何连系,不可能发生数据溢出,也不可能接收到任何报文信息。<br />而且,我只开放了唯一的一个中断——错误认可中断(TXERR>127)。换句话说,即使有任何接收溢出错误发生,也不会触发中断/进入中断程序。那么,为什么要在中断程序中加“清除数据溢出,释放接收缓冲区”?<br /><br /><br /><br />程序目的:<br />“我明明启动发送了,为什么没有中断?”<br />“我的板子坏了吗?”<br />“我的板子电路设计错了吗?”<br />“我的程序运行了,怎么什么反应都没有?”<br /><br />
页:
[1]