[CAN-bus/DeviceNet] 一个测试发送/必然中断的例子。

[复制链接]
2838|10
 楼主| wxj1952 发表于 2007-5-30 08:33 | 显示全部楼层 |阅读模式
AD, LED, AN, CAN, TE
化简,化到最简!<br /><br />运行以下程序,(无论节点在不在总线上。)send(&nbsp;)发送后,中断EPI发生,LED1亮。(节点进入错误消极状态)证实你的系统工作正常。<br />然后在此基础上完善你的程序。<br /><br />#pragma&nbsp;SMALL<br />#include&ltreg51.h&gt<br />#include&ltsjareg.h&gt<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br /><br />bdata&nbsp;uchar&nbsp;ws1;<br />sbit&nbsp;LED0=P1^0;<br />sbit&nbsp;LED1=P1^1;<br />sbit&nbsp;LED2=P1^2;<br /><br />uchar&nbsp;xdata&nbsp;*SJA_Adr=0x7f00;<br />#define&nbsp;can_read(RegAdr)&nbsp;&nbsp;SJA_Adr[RegAdr]<br />#define&nbsp;can_write(RegAdr,Val)&nbsp;&nbsp;SJA_Adr[RegAdr]=Val<br /><br />void&nbsp;initial()&nbsp;&nbsp;using&nbsp;0<br />{<br />do{&nbsp;<br />&nbsp;can_write(MOD,0x01);<br />}while(can_read(MOD)^0x01);<br /><br />can_write(CDR,0xcf);<br />&nbsp;can_write(IER,0x20);&nbsp;<br /><br />&nbsp;can_write(MOD,0);<br />}<br /><br />void&nbsp;main(void)<br />{&nbsp;<br />LED0=0;<br />initial(&nbsp;);<br />IE=0x81;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />send(&nbsp;);&nbsp;&nbsp;&nbsp;//can_write(CMR,1);<br /><br />LED2=!LED2;<br />while(1);<br />}<br /><br />void&nbsp;int0(void)&nbsp;interrupt&nbsp;0&nbsp;&nbsp;using&nbsp;0<br />{<br />LED1=!LED1;<br />ws1=can_read(IR);<br />}<br /><br />再次运行该程序,LED1无反应。按下硬复位按键,可重复实验。<br /><br />
lotto023 发表于 2007-5-30 09:12 | 显示全部楼层

怎么没有send()子函数啊?

  
lotto023 发表于 2007-5-30 09:56 | 显示全部楼层

SJA1000的复位引脚/RST怎么接啊?

  
lizk1979 发表于 2007-5-30 10:12 | 显示全部楼层

en

谢谢
lotto023 发表于 2007-5-30 10:48 | 显示全部楼层

我的实验板子坏了??

&nbsp;to:wxj1952<br />&nbsp;&nbsp;&nbsp;&nbsp;我测试了一下,发现的确是硬件问题,不知道您对DP-668的实验板熟不熟悉,我下到DP-668里测试了一下,还是不行,DP-668是ZLG已经做好的实验板,硬件连接都是已经连好了的,我看了一下操作指南,只要通过跳线把SJA1000的INT&nbsp;与MCU的INT0连接起来就可以,别的没有需要连接的.难道是我的实验板子坏了??
 楼主| wxj1952 发表于 2007-5-30 11:26 | 显示全部楼层

测板子至少要有逻辑笔工具

硬件不容易坏。要想找到硬件故障点,最好借助仿真器。或者把ZLG的技术人员叫来,他们做的板子,他们来保障用户能使用。<br /><br />send(&nbsp;)函数留给实验者自己编。我的send(&nbsp;)1000元求解还没人有答案。<br /><br />SJA1000复位管脚经8031RST接一个施密特反向器74ls14之类即可,不过最好还是用8031的P1脚控制,这样恢复EI、EPI、等等时省事。不用按复位键。<br /><br />把can_write(CDR,0xcf);改为can_write(CDR,0x4f);<br /><br />把can_write(MOD,0);改为can_write(MOD,4);即可用于BASIC_CAN实验。<br /><br /><br />
lotto023 发表于 2007-5-30 16:03 | 显示全部楼层

直接调用send( )空函数,测试程序还好用吗?

to:wxj1952<br />send(&nbsp;)函数留给实验者自己编。我的send(&nbsp;)1000元求解还没人有答案。<br />///////////////////////////////////////////////////////////////////<br /><br />&nbsp;&nbsp;&nbsp;<br />我是初学者,PELI模式下发送函数真地不太会编.水平有限,望见谅.<br />直接调用send(&nbsp;)空函数,测试程序还好用吗?<br /><br /><br /><br />把can_write(MOD,0);改为can_write(MOD,4);即可用于BASIC_CAN实验。<br />/////////////////////////////////////////////////////<br />BASIC_CAN模式下没有模式寄存器(MOD)啊,而且也没有IER寄存器,这段程序怎么用于BASIC下测试?
lotto023 发表于 2007-5-30 16:35 | 显示全部楼层

看我写得SEND()函数对不对?

<br />to:wxj1952&nbsp;<br />////////////////////////////////<br />我参考了一下别的程序,写了一个,望帮忙看一下对不对,多谢.多谢<br /><br />struct&nbsp;BASICCAN_BUFstruct{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;FrameID_H&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//帧ID高8位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;FrameLENTH&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//帧数据长度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;FrameKIND&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据帧或远程帧(0:数据;1:远程)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;FrameID_L3&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//帧ID低3位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Frame_Data[8];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据缓冲区<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br /><br /><br /><br />void&nbsp;Send(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.FrameID_H&nbsp;=&nbsp;0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.FrameLENTH=&nbsp;0x08;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.FrameKIND&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.FrameID_L3=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.Frame_Data[0]=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.Frame_Data[1]=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.Frame_Data[2]=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.Frame_Data[3]=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.Frame_Data[4]=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.Frame_Data[5]=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.Frame_Data[6]=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_BUF.Frame_Data[7]=0x00;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Write_SJAsendBUF();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANREG_write(0x01,0x01);&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />}<br /><br /><br />bit&nbsp;Write_SJAsendBUF(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;&nbsp;if((CANREG_read(0x02)&0x10)==0)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((CANREG_read(0x02)&0x04)!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANREG_write(10,send_BUF.FrameID_H);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANREG_write(11,(send_BUF.FrameLENTH)|(send_BUF.FrameKIND&lt&lt4)|(send_BUF.FrameID_L3&lt&lt5));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(send_BUF.FrameKIND==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&ltsend_BUF.FrameLENTH,i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANREG_write(12+i,send_BUF.Frame_Data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />}<br />
 楼主| wxj1952 发表于 2007-5-30 17:19 | 显示全部楼层

送你个发送程序。

void&nbsp;send(void)&nbsp;&nbsp;<br />{&nbsp;<br />can_write(CMR,0x01);<br />}<br /><br /><br /><br /><br />
 楼主| wxj1952 发表于 2007-5-30 17:42 | 显示全部楼层

一样!

把can_write(MOD,0);改为can_write(MOD,4);即可用于BASIC_CAN实验。<br />/////////////////////////////////////////////////////<br />BASIC_CAN模式下没有模式寄存器(MOD)啊,而且也没有IER寄存器,这段程序怎么用于BASIC下测试?<br /><br /><br />&nbsp;MOD&nbsp;地址是几?CR是几?
 楼主| wxj1952 发表于 2007-6-2 11:00 | 显示全部楼层

少了一条关键语句。

这个简化程序还少了一条关键的,否测不会中断。哪一条?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

757

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部