亚洲春色中文字幕久久久-三上亚,91精品国产亚一区二区三区,久久久九色综合亚洲成色777,涩涩视频下载,国产午夜亚洲精品午夜鲁丝片,国产精品A一区二区三区腾讯导航,影音先锋色情AV在线看片,蜜臀国产在线视频,极品少妇高潮啪啪无码吴梦梦 ,精品人妻无码一区二区三区手机版
標題:
PIC單片機:為什么寫的程序光跑飛啊,新手一枚
[打印本頁]
作者:
SDDQ
時間:
2022-4-15 12:01
標題:
PIC單片機:為什么寫的程序光跑飛啊,新手一枚
程序通電我設置一個燈亮A,進入主函數后,CAN發送成功或者失敗對應的燈會亮,但是我只通電不進行任何操作,A燈一直在那里閃,那不就是跑飛了嗎?我禁止看門狗了呀!好困惑
#include "p18f458.h"
unsigned int i;
unsigned char j;
int CAN_FLAG; //定義標志寄存器、
//************初始化子程序***********//
void initcan()
{
TRISA=0x20;/*RA5設置為輸入,RA0-RA3端口設置為輸出(1入,0出)*/
TRISC=0xFF;/*RC0-RC3端口設置為輸入,全為輸入*/
TRISB=0x08;//把CANRX/RB3設置為輸入,CANTX/RB2設置為輸出
CANCON=0x80; //請求進入CAN配置模式REQOP=100
while(CANSTAT&0x80==0){;}//等待進入CAN配置模式OPMODE=100,CANSTA&1000 0000,只有第八位為1才不為0,該寄存器只有100配置方式為1,
//所以程序進入其他值時一直在循環空語句等待配置方式進入
//以下為波特率的設定
BRGCON1=0x01;
BRGCON2=0x90;
BRGCON3=0x42;
//設置發送郵箱0標識符號和發送數據
CIOCON=0x00; //CAN輸入輸出控制寄存器
TXERRCNT=0x00;//初始化發送錯誤計數寄存器
TXB0CON=0x03;//發送優先級為最高優先級,TXPRI=11
TXB0SIDH=0xFF;//設置“發送"緩沖器0的標準標識符,設置標準標識符高字節寄存器 ,擴展標識符位EID28:EID21
TXB0SIDL=0xE0;//設置標準標識符低字節寄存器,擴展標識符位EID20:EID18
TXB0DLC=0x08;//設置數據長度為8個字節
TXB0D0=0x00;
TXB0D1=0x01;
TXB0D2=0x02;
TXB0D3=0x03;
TXB0D4=0x04;
TXB0D5=0x05;
TXB0D6=0x06;
TXB0D7=0x07;
//設置接收郵箱0的標識符和初始化數據
RXB0SIDH=0xFF;//設置"接收"緩沖器0的標準標識符,擴展標識符位EID28:EID21
RXB0SIDL=0xE0;//擴展標識符位EID20:EID18
RXB0CON=0x20;//僅接收標準標識符有效的信息,bit=0表示RXBO采用過濾器0
RXB0DLC=0x08;//設置數據長度為8個字節
RXB0D0=0x00;
RXB0D1=0x00;
RXB0D2=0x00;
RXB0D3=0x00;
RXB0D4=0x00;
RXB0D5=0x00;
RXB0D6=0x00;
RXB0D7=0x00;
//初始化接收過濾器0和接收屏蔽
RXF0SIDH=0xFF;//設置"接收"過濾器0的標準標識符,擴展標識符"過濾位"EID28:EID21
RXF0SIDL=0xE0;//擴展標識符“過濾位”EID20:EID18
RXM0SIDH=0x00;//設置"接收"屏蔽器0的標準標識符
RXM0SIDL=0x00;
//CAN進入相應的工作模式
CANCON=0x00;//=0x40為進入自測試模式;0x00為進入正常操作模式。
while(CANSTAT&0xE0){;}//等待進入CAN正常模式OPMODE=000,CANSTA&1110 0000,
//只有第6.7.8位為0(000為CAN正常模式)才能不滿足括號內條件,
//從而跳出循環,反之則等待。
//初始化CAN中斷
PIR3=0x00;//清除所有中斷
PIE3=0x01;//使能接收緩沖器0的接收中斷
IPR3=0x01;//接收緩沖器0的接收中斷為最高優先級。
}
//************接收緩沖器0接收中斷服務程序**************
#pragma interrupt can_isr
#pragma code low_ISR=0x18
void low_ISR()
{
_asm
goto can_isr
_endasm
}
#pragma code
void can_isr()
{
if(PIR3bits.RXB0IF==1) CAN_FLAG=1;
PIR3bits.RXB0IF=0;//清除接收中斷標志
RXB0CONbits.RXFUL=0;//打開接收緩沖器來接收信息
}
//********延時程序********
void DELAY()
{
for(i=65000;i>1;i--);
{
for(j=650;j>1;j--);
}
}
//********主程序********
void main (void)
{
INTCON=0x00;//禁止所有中斷
initcan();//初始化
WDTCON=0;//=1看門狗使能,=0禁止看門狗
INTCON=0xc0;//使能中斷
PORTA=0xF4;//點亮第一個LED//
DELAY();
PORTA=0xFF;//關閉LED //
while(1)
{
//*********CAN發送********//
TXB0CONbits.TXREQ=1; //請求發送,TXREQ=1,發送終止位/發送丟失仲裁狀態位/發送錯誤檢測狀態位都清除
while(PIR3bits.TXB0IF!=1)//等待發送完成,TXB0IF緩沖器0完成中斷標志位,只有當該位為1時才完成了信息的發送,可重新裝載
{
if(COMSTATbits.TXBO)//發送錯誤計數大于255則該位為1
{
PORTA=0xF0;/*向PORTA發送數據,點亮兩個LED,說明發送失敗*/
TXB0CONbits.TXABT=1;//中止發送
TXB0CONbits.TXREQ=0;//TXREQ發送請求位置0,因為發送成功后它自動清零,他沒有發送成功,所以要手動清零
TXERRCNT= 0x00;//清除發送錯誤計數器
break;
}
}
if(PIR3bits.TXB0IF=1)//說明緩沖器0完成了信息的發送//
{
PORTA=0xF4;/*向PORTA發送數據,點亮RA3控制的第一個LED,說明CAN發送成功*/
}
//********CAN接收********//
while(CAN_FLAG==0)//等待接收數據
{
if(COMSTATbits.RXBP)//接收器總線錯誤過半位=1則為(接收錯誤計數>127)
{
PORTA=0xF4;//點亮第一個LED//
DELAY();
PORTA=0xFF;//關閉LED //
PORTA=0xF8;//點亮第二個LED //
DELAY();
PORTA=0xFF;//關閉LED //
PORTA=0xF0;//點亮兩個LED,說明接收失敗 //
TXERRCNT= 0x00;//清除發送錯誤計數器
break;
}
}
if(PIR3bits.TXB0IF=1)//說明緩沖器0完成了信息的發送//
{
PORTA=0xF8;/*點亮RA3控制的第2個LED,說明CAN接收成功*/
}
CAN_FLAG=0; //清除接收到的標志
TXB0CONbits.TXREQ=0; //禁止發送
TXB0D0=RXB0D0+1;
TXB0D1=RXB0D1+1;
TXB0D2=RXB0D2+1;
TXB0D3=RXB0D3+1;
TXB0D4=RXB0D4+1;
TXB0D5=RXB0D5+1;
TXB0D6=RXB0D6+1;
TXB0D7=RXB0D7+1;
}
}
復制代碼
作者:
人工置頂員
時間:
2022-4-16 04:50
頂一下
作者:
Y_G_G
時間:
2022-4-16 15:23
1,在這用PIC單片機的人少
2,會PIC又會CAN的就更少了
作者:
SDDQ
時間:
2022-4-18 16:36
Y_G_G 發表于 2022-4-16 15:23
1,在這用PIC單片機的人少
2,會PIC又會CAN的就更少了
哎呀呀,困擾好久了
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1