找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1669|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

PIC單片機(jī):為什么寫的程序光跑飛啊,新手一枚

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1013883 發(fā)表于 2022-4-15 12:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
程序通電我設(shè)置一個(gè)燈亮A,進(jìn)入主函數(shù)后,CAN發(fā)送成功或者失敗對(duì)應(yīng)的燈會(huì)亮,但是我只通電不進(jìn)行任何操作,A燈一直在那里閃,那不就是跑飛了嗎?我禁止看門狗了呀!好困惑

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

  4. int  CAN_FLAG;   //定義標(biāo)志寄存器、


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


  6. void initcan()
  7. {
  8.         
  9.         TRISA=0x20;/*RA5設(shè)置為輸入,RA0-RA3端口設(shè)置為輸出(1入,0出)*/
  10.         TRISC=0xFF;/*RC0-RC3端口設(shè)置為輸入,全為輸入*/
  11.     TRISB=0x08;//把CANRX/RB3設(shè)置為輸入,CANTX/RB2設(shè)置為輸出
  12.     CANCON=0x80;            //請(qǐng)求進(jìn)入CAN配置模式REQOP=100
  13.     while(CANSTAT&0x80==0){;}//等待進(jìn)入CAN配置模式OPMODE=100,CANSTA&1000 0000,只有第八位為1才不為0,該寄存器只有100配置方式為1,
  14.                            //所以程序進(jìn)入其他值時(shí)一直在循環(huán)空語句等待配置方式進(jìn)入
  15. //以下為波特率的設(shè)定
  16.     BRGCON1=0x01;                       
  17.     BRGCON2=0x90;
  18.     BRGCON3=0x42;
  19. //設(shè)置發(fā)送郵箱0標(biāo)識(shí)符號(hào)和發(fā)送數(shù)據(jù)
  20.     CIOCON=0x00; //CAN輸入輸出控制寄存器
  21.     TXERRCNT=0x00;//初始化發(fā)送錯(cuò)誤計(jì)數(shù)寄存器
  22.     TXB0CON=0x03;//發(fā)送優(yōu)先級(jí)為最高優(yōu)先級(jí),TXPRI=11
  23.     TXB0SIDH=0xFF;//設(shè)置“發(fā)送"緩沖器0的標(biāo)準(zhǔn)標(biāo)識(shí)符,設(shè)置標(biāo)準(zhǔn)標(biāo)識(shí)符高字節(jié)寄存器 ,擴(kuò)展標(biāo)識(shí)符位EID28:EID21   
  24.     TXB0SIDL=0xE0;//設(shè)置標(biāo)準(zhǔn)標(biāo)識(shí)符低字節(jié)寄存器,擴(kuò)展標(biāo)識(shí)符位EID20:EID18  
  25.     TXB0DLC=0x08;//設(shè)置數(shù)據(jù)長度為8個(gè)字節(jié)
  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. //設(shè)置接收郵箱0的標(biāo)識(shí)符和初始化數(shù)據(jù)
  35.     RXB0SIDH=0xFF;//設(shè)置"接收"緩沖器0的標(biāo)準(zhǔn)標(biāo)識(shí)符,擴(kuò)展標(biāo)識(shí)符位EID28:EID21
  36.     RXB0SIDL=0xE0;//擴(kuò)展標(biāo)識(shí)符位EID20:EID18  
  37.     RXB0CON=0x20;//僅接收標(biāo)準(zhǔn)標(biāo)識(shí)符有效的信息,bit=0表示RXBO采用過濾器0
  38.     RXB0DLC=0x08;//設(shè)置數(shù)據(jù)長度為8個(gè)字節(jié)
  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;//設(shè)置"接收"過濾器0的標(biāo)準(zhǔn)標(biāo)識(shí)符,擴(kuò)展標(biāo)識(shí)符"過濾位"EID28:EID21  
  49.     RXF0SIDL=0xE0;//擴(kuò)展標(biāo)識(shí)符“過濾位”EID20:EID18  
  50.     RXM0SIDH=0x00;//設(shè)置"接收"屏蔽器0的標(biāo)準(zhǔn)標(biāo)識(shí)符
  51.     RXM0SIDL=0x00;
  52. //CAN進(jìn)入相應(yīng)的工作模式
  53.     CANCON=0x00;//=0x40為進(jìn)入自測(cè)試模式;0x00為進(jìn)入正常操作模式。
  54.     while(CANSTAT&0xE0){;}//等待進(jìn)入CAN正常模式OPMODE=000,CANSTA&1110 0000,
  55.                           //只有第6.7.8位為0(000為CAN正常模式)才能不滿足括號(hào)內(nèi)條件,
  56.                           //從而跳出循環(huán),反之則等待。
  57. //初始化CAN中斷
  58.     PIR3=0x00;//清除所有中斷
  59.     PIE3=0x01;//使能接收緩沖器0的接收中斷
  60.     IPR3=0x01;//接收緩沖器0的接收中斷為最高優(yōu)先級(jí)。   
  61. }


  62. //************接收緩沖器0接收中斷服務(wù)程序**************

  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;//清除接收中斷標(biāo)志
  76.         RXB0CONbits.RXFUL=0;//打開接收緩沖器來接收信息
  77. }

  78. //********延時(shí)程序********
  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;//點(diǎn)亮第一個(gè)LED//
  94.         DELAY();
  95.         PORTA=0xFF;//關(guān)閉LED //
  96.       
  97.         while(1)
  98.         {
  99.             //*********CAN發(fā)送********//        
  100.                 TXB0CONbits.TXREQ=1;  //請(qǐng)求發(fā)送,TXREQ=1,發(fā)送終止位/發(fā)送丟失仲裁狀態(tài)位/發(fā)送錯(cuò)誤檢測(cè)狀態(tài)位都清除
  101.                 while(PIR3bits.TXB0IF!=1)//等待發(fā)送完成,TXB0IF緩沖器0完成中斷標(biāo)志位,只有當(dāng)該位為1時(shí)才完成了信息的發(fā)送,可重新裝載
  102.                 {
  103.                      if(COMSTATbits.TXBO)//發(fā)送錯(cuò)誤計(jì)數(shù)大于255則該位為1
  104.                         {
  105.                                 PORTA=0xF0;/*向PORTA發(fā)送數(shù)據(jù),點(diǎn)亮兩個(gè)LED,說明發(fā)送失敗*/
  106.                                 TXB0CONbits.TXABT=1;//中止發(fā)送
  107.                                 TXB0CONbits.TXREQ=0;//TXREQ發(fā)送請(qǐng)求位置0,因?yàn)榘l(fā)送成功后它自動(dòng)清零,他沒有發(fā)送成功,所以要手動(dòng)清零
  108.                                 TXERRCNT= 0x00;//清除發(fā)送錯(cuò)誤計(jì)數(shù)器
  109.                                 break;
  110.                         }        
  111.                 }
  112.                      if(PIR3bits.TXB0IF=1)//說明緩沖器0完成了信息的發(fā)送//
  113.                      {
  114.                           PORTA=0xF4;/*向PORTA發(fā)送數(shù)據(jù),點(diǎn)亮RA3控制的第一個(gè)LED,說明CAN發(fā)送成功*/   
  115.                      }
  116.               //********CAN接收********//
  117.                 while(CAN_FLAG==0)//等待接收數(shù)據(jù)
  118.                         {
  119.                                 if(COMSTATbits.RXBP)//接收器總線錯(cuò)誤過半位=1則為(接收錯(cuò)誤計(jì)數(shù)>127)
  120.                                 {
  121.                                         PORTA=0xF4;//點(diǎn)亮第一個(gè)LED//
  122.                                         DELAY();
  123.                                         PORTA=0xFF;//關(guān)閉LED //
  124.                                         PORTA=0xF8;//點(diǎn)亮第二個(gè)LED //
  125.                                         DELAY();
  126.                                         PORTA=0xFF;//關(guān)閉LED //
  127.                                         PORTA=0xF0;//點(diǎn)亮兩個(gè)LED,說明接收失敗 //
  128.                                         TXERRCNT= 0x00;//清除發(fā)送錯(cuò)誤計(jì)數(shù)器
  129.                                         break;        
  130.                                 }        
  131.                         }
  132.                 if(PIR3bits.TXB0IF=1)//說明緩沖器0完成了信息的發(fā)送//
  133.                      {
  134.                           PORTA=0xF8;/*點(diǎn)亮RA3控制的第2個(gè)LED,說明CAN接收成功*/
  135.                          }     
  136.                 CAN_FLAG=0;                 //清除接收到的標(biāo)志
  137.                 TXB0CONbits.TXREQ=0;        //禁止發(fā)送
  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. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:301191 發(fā)表于 2022-4-16 04:50 | 只看該作者
頂一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:401564 發(fā)表于 2022-4-16 15:23 | 只看該作者
1,在這用PIC單片機(jī)的人少
2,會(huì)PIC又會(huì)CAN的就更少了
回復(fù)

使用道具 舉報(bào)

地板
ID:1013883 發(fā)表于 2022-4-18 16:36 | 只看該作者
Y_G_G 發(fā)表于 2022-4-16 15:23
1,在這用PIC單片機(jī)的人少
2,會(huì)PIC又會(huì)CAN的就更少了

哎呀呀,困擾好久了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表