找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1088|回复: 3
打印 上一主题 下一主题
收起左侧

PIC单片机:为什么写的程序光跑飞啊,新手一枚

[复制链接]
跳转到指定楼层
楼主
ID:1013883 发表于 2022-4-15 12:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序通电我设置一个灯亮A,进入主函数后,CAN发送成功或者失败对应的灯会亮,但是我只通电不进行任何操作,A灯一直在那里闪,那不就是跑飞了吗?我禁止看门狗了呀!好困惑

  1. #include  "p18f458.h"
  2. unsigned int i;
  3. unsigned char j;

  4. int  CAN_FLAG;   //定义标志寄存器、


  5. //************初始化子程序***********//


  6. void initcan()
  7. {
  8.         
  9.         TRISA=0x20;/*RA5设置为输入,RA0-RA3端口设置为输出(1入,0出)*/
  10.         TRISC=0xFF;/*RC0-RC3端口设置为输入,全为输入*/
  11.     TRISB=0x08;//把CANRX/RB3设置为输入,CANTX/RB2设置为输出
  12.     CANCON=0x80;            //请求进入CAN配置模式REQOP=100
  13.     while(CANSTAT&0x80==0){;}//等待进入CAN配置模式OPMODE=100,CANSTA&1000 0000,只有第八位为1才不为0,该寄存器只有100配置方式为1,
  14.                            //所以程序进入其他值时一直在循环空语句等待配置方式进入
  15. //以下为波特率的设定
  16.     BRGCON1=0x01;                       
  17.     BRGCON2=0x90;
  18.     BRGCON3=0x42;
  19. //设置发送邮箱0标识符号和发送数据
  20.     CIOCON=0x00; //CAN输入输出控制寄存器
  21.     TXERRCNT=0x00;//初始化发送错误计数寄存器
  22.     TXB0CON=0x03;//发送优先级为最高优先级,TXPRI=11
  23.     TXB0SIDH=0xFF;//设置“发送"缓冲器0的标准标识符,设置标准标识符高字节寄存器 ,扩展标识符位EID28:EID21   
  24.     TXB0SIDL=0xE0;//设置标准标识符低字节寄存器,扩展标识符位EID20:EID18  
  25.     TXB0DLC=0x08;//设置数据长度为8个字节
  26.     TXB0D0=0x00;
  27.     TXB0D1=0x01;
  28.     TXB0D2=0x02;     
  29.     TXB0D3=0x03;
  30.     TXB0D4=0x04;
  31.     TXB0D5=0x05;
  32.     TXB0D6=0x06;
  33.     TXB0D7=0x07;
  34. //设置接收邮箱0的标识符和初始化数据
  35.     RXB0SIDH=0xFF;//设置"接收"缓冲器0的标准标识符,扩展标识符位EID28:EID21
  36.     RXB0SIDL=0xE0;//扩展标识符位EID20:EID18  
  37.     RXB0CON=0x20;//仅接收标准标识符有效的信息,bit=0表示RXBO采用过滤器0
  38.     RXB0DLC=0x08;//设置数据长度为8个字节
  39.     RXB0D0=0x00;
  40.     RXB0D1=0x00;
  41.     RXB0D2=0x00;
  42.     RXB0D3=0x00;
  43.     RXB0D4=0x00;
  44.     RXB0D5=0x00;
  45.     RXB0D6=0x00;
  46.     RXB0D7=0x00;
  47. //初始化接收过滤器0和接收屏蔽
  48.     RXF0SIDH=0xFF;//设置"接收"过滤器0的标准标识符,扩展标识符"过滤位"EID28:EID21  
  49.     RXF0SIDL=0xE0;//扩展标识符“过滤位”EID20:EID18  
  50.     RXM0SIDH=0x00;//设置"接收"屏蔽器0的标准标识符
  51.     RXM0SIDL=0x00;
  52. //CAN进入相应的工作模式
  53.     CANCON=0x00;//=0x40为进入自测试模式;0x00为进入正常操作模式。
  54.     while(CANSTAT&0xE0){;}//等待进入CAN正常模式OPMODE=000,CANSTA&1110 0000,
  55.                           //只有第6.7.8位为0(000为CAN正常模式)才能不满足括号内条件,
  56.                           //从而跳出循环,反之则等待。
  57. //初始化CAN中断
  58.     PIR3=0x00;//清除所有中断
  59.     PIE3=0x01;//使能接收缓冲器0的接收中断
  60.     IPR3=0x01;//接收缓冲器0的接收中断为最高优先级。   
  61. }


  62. //************接收缓冲器0接收中断服务程序**************

  63. #pragma interrupt can_isr
  64. #pragma code low_ISR=0x18
  65. void low_ISR()
  66. {
  67.      _asm
  68.      goto can_isr
  69.      _endasm
  70. }
  71. #pragma code
  72. void can_isr()
  73. {
  74.         if(PIR3bits.RXB0IF==1) CAN_FLAG=1;
  75.         PIR3bits.RXB0IF=0;//清除接收中断标志
  76.         RXB0CONbits.RXFUL=0;//打开接收缓冲器来接收信息
  77. }

  78. //********延时程序********
  79. void DELAY()
  80. {
  81.         for(i=65000;i>1;i--);
  82.       {  
  83.         for(j=650;j>1;j--);
  84.        }
  85. }


  86.      //********主程序********

  87. void main (void)
  88. {
  89.         INTCON=0x00;//禁止所有中断
  90.         initcan();//初始化
  91.         WDTCON=0;//=1看门狗使能,=0禁止看门狗
  92.         INTCON=0xc0;//使能中断
  93.         PORTA=0xF4;//点亮第一个LED//
  94.         DELAY();
  95.         PORTA=0xFF;//关闭LED //
  96.       
  97.         while(1)
  98.         {
  99.             //*********CAN发送********//        
  100.                 TXB0CONbits.TXREQ=1;  //请求发送,TXREQ=1,发送终止位/发送丢失仲裁状态位/发送错误检测状态位都清除
  101.                 while(PIR3bits.TXB0IF!=1)//等待发送完成,TXB0IF缓冲器0完成中断标志位,只有当该位为1时才完成了信息的发送,可重新装载
  102.                 {
  103.                      if(COMSTATbits.TXBO)//发送错误计数大于255则该位为1
  104.                         {
  105.                                 PORTA=0xF0;/*向PORTA发送数据,点亮两个LED,说明发送失败*/
  106.                                 TXB0CONbits.TXABT=1;//中止发送
  107.                                 TXB0CONbits.TXREQ=0;//TXREQ发送请求位置0,因为发送成功后它自动清零,他没有发送成功,所以要手动清零
  108.                                 TXERRCNT= 0x00;//清除发送错误计数器
  109.                                 break;
  110.                         }        
  111.                 }
  112.                      if(PIR3bits.TXB0IF=1)//说明缓冲器0完成了信息的发送//
  113.                      {
  114.                           PORTA=0xF4;/*向PORTA发送数据,点亮RA3控制的第一个LED,说明CAN发送成功*/   
  115.                      }
  116.               //********CAN接收********//
  117.                 while(CAN_FLAG==0)//等待接收数据
  118.                         {
  119.                                 if(COMSTATbits.RXBP)//接收器总线错误过半位=1则为(接收错误计数>127)
  120.                                 {
  121.                                         PORTA=0xF4;//点亮第一个LED//
  122.                                         DELAY();
  123.                                         PORTA=0xFF;//关闭LED //
  124.                                         PORTA=0xF8;//点亮第二个LED //
  125.                                         DELAY();
  126.                                         PORTA=0xFF;//关闭LED //
  127.                                         PORTA=0xF0;//点亮两个LED,说明接收失败 //
  128.                                         TXERRCNT= 0x00;//清除发送错误计数器
  129.                                         break;        
  130.                                 }        
  131.                         }
  132.                 if(PIR3bits.TXB0IF=1)//说明缓冲器0完成了信息的发送//
  133.                      {
  134.                           PORTA=0xF8;/*点亮RA3控制的第2个LED,说明CAN接收成功*/
  135.                          }     
  136.                 CAN_FLAG=0;                 //清除接收到的标志
  137.                 TXB0CONbits.TXREQ=0;        //禁止发送
  138.                 TXB0D0=RXB0D0+1;
  139.                 TXB0D1=RXB0D1+1;
  140.                 TXB0D2=RXB0D2+1;
  141.                 TXB0D3=RXB0D3+1;
  142.                 TXB0D4=RXB0D4+1;
  143.                 TXB0D5=RXB0D5+1;
  144.                 TXB0D6=RXB0D6+1;
  145.                 TXB0D7=RXB0D7+1;
  146.                
  147.         }
  148.         
  149.         
  150.         
  151.         
  152.         
  153. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2022-4-16 04:50 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:401564 发表于 2022-4-16 15:23 | 只看该作者
1,在这用PIC单片机的人少
2,会PIC又会CAN的就更少了
回复

使用道具 举报

地板
ID:1013883 发表于 2022-4-18 16:36 | 只看该作者
Y_G_G 发表于 2022-4-16 15:23
1,在这用PIC单片机的人少
2,会PIC又会CAN的就更少了

哎呀呀,困扰好久了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表