• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::

論壇索引


Board index » All Posts (ventrox)




CANBUS 傳送資料的問題
#11
初級會員
初級會員


各位好
我這邊用的是 PIC18F4580
我CANBUS 可以成功的傳送資料
目前已經在同時傳送8個byte的資料了

想請問各位
因為PIC有三個 TX Buffer
兩個 RX Buffer

是不是可以利用不同Buffer 傳送比8byte還要長的資料?
如果不行,是否有其他方法?

麻煩各位幫我解答一下
謝謝

發表於: 2008/8/7 17:57
頂部


Re: 關於 PIC18F4480 的 CAN BUS 功能文提
#12
初級會員
初級會員


拜託各位
對我來說很重要
麻煩各位幫忙一下
謝謝

發表於: 2008/4/30 10:49
頂部


關於 PIC18F4480 的 CAN BUS 功能文提
#13
初級會員
初級會員


大家好
我用的是 PIC18F4480
請問一下
我如果想要傳送小數點
例如: 0.946521
請問CAN BUS是否支援這樣個功能? 有辦法做到嗎?
還是一定要整數?

因為我自己在試的時候,我看他的 TX_Buffer 都是 0
這是因為他本身只能傳送整數嗎?

謝謝

發表於: 2008/4/29 16:57
頂部


can18xx8.c 的程式有問題嘛?
#14
初級會員
初級會員


各位好
我在適用 can-bus 的部分
在看附上的 can18xx8.c 的程式裡面
我發現在 CanSendMessage 這個 function 裡面
都再利用一些 RXB0CON 的 buffer

我想問的,在傳出資料,應該要動的是 TXB0CON 而不是 RX

以下是程式碼

BOOL CANSendMessage(unsigned long id,
BYTE* Data,
BYTE DataLen,
enum CAN_TX_MSG_FLAGS MsgFlags)
{
BYTE i;
BYTE *ptr;

// Find the first empty transmitter.
if ( TXB0CON_TXREQ == 0 )
{
// TxBuffer0 is empty. Set WIN bits to point to TXB0
CANCON &= 0b11110001;
CANCON |= 0b00001000;
}
else if ( TXB1CON_TXREQ == 0 )
{
// TxBuffer1 is empty. Set WIN bits to point to TXB1
CANCON &= 0b11110001;
CANCON |= 0b00000110;
}
else if ( TXB2CON_TXREQ == 0 )
{
// TxBuffer2 is empty. Set WIN bits to point to TXB2
CANCON &= 0b11110001;
CANCON |= 0b00000100;
}
else
// None of the transmit buffers were empty.
return FALSE;

/*
* Now that WIN has remapped RXB0 to empty buffer, simply
* populate RXB0 buffer
*/

// Set transmit priority.
RXB0CON = MsgFlags & CAN_TX_PRIORITY_BITS;

// Populate Extended identifier information only if it is
// desired.
if ( !(MsgFlags & CAN_TX_FRAME_BIT) )
CANIDToRegs((BYTE*)&RXB0SIDH, id, CAN_CONFIG_XTD_MSG);
else
CANIDToRegs((BYTE*)&RXB0SIDH, id, CAN_CONFIG_STD_MSG);

RXB0DLC = DataLen;

if ( !(MsgFlags & CAN_TX_RTR_BIT) )
RXB0DLC |= 0b01000000;

// Populate data values.
ptr = (BYTE*)&RXB0D0;
for ( i = 0; i < DataLen; i++ )
ptr[i] = Data[i];

/*
* Mark this buffer as ready to start transmit.
* We are not using C bit field structure because RXB0 registers
* are remapped to one of the empty transmit buffers and their
* bit3 is not same as RXB0CON bit3. To avoid confusion, in-line
* assembly is used to directly set bit 3 of corresponding TXBnCON
* register.
*/
#if defined(MCHP_C18)
_asm
bsf RXB0CON, 3, 0
_endasm
#endif
#if defined(HITECH_C18)
asm("bsf _RXB0CON,3");
#endif

/*
* Restore CAN buffer mapping so that subsequent access to RXB0
* buffers are to the real RXB0 buffer.
*/
CANCON &= 0b11110001;

return TRUE;
}


我用紅色的部分標示我說的地方
謝謝

發表於: 2008/2/27 17:15
頂部


CAN 的 Normal mode 無法傳送資料?
#15
初級會員
初級會員


各位
想要請教一些問題

我目前用 CAN-BUS 是用這種方式去設定他


CANInitialize( 2,10,6,6,3, CAN_CONFIG_LINE_FILTER_OFF &
CAN_CONFIG_SAMPLE_ONCE &
CAN_CONFIG_VALID_STD_MSG &
CAN_CONFIG_PHSEG2_PRG_ON ) ;

CANSetOperationMode(CAN_OP_MODE_CONFIG) ;

CANSetMask(CAN_MASK_B1, RXB0_MASK, CAN_CONFIG_STD_MSG ) ; // Set Mask For Standard Data Frame
CANSetMask(CAN_MASK_B2, RXB1_MASK, CAN_CONFIG_STD_MSG ) ;

CANSetFilter(CAN_FILTER_B1_F1, RX_Filter0 , CAN_CONFIG_STD_MSG) ;
CANSetFilter(CAN_FILTER_B1_F2, RX_Filter1 , CAN_CONFIG_STD_MSG) ;
CANSetFilter(CAN_FILTER_B2_F1,RX_Filter2 , CAN_CONFIG_STD_MSG) ;
CANSetFilter(CAN_FILTER_B2_F2,RX_Filter3 , CAN_CONFIG_STD_MSG) ;
CANSetFilter(CAN_FILTER_B2_F3,RX_Filter4 , CAN_CONFIG_STD_MSG) ;
CANSetFilter(CAN_FILTER_B2_F4, RX_Filter5 , CAN_CONFIG_STD_MSG) ;

CANSetOperationMode(CAN_OP_MODE_NORMAL) ;

TX_Data_Buf1[0] = 0x58 ;
TX_Data_Buf1[1] = 0x42 ;
TX_Data_Buf1[2] = 0x43 ;
TX_Data_Buf1[3] = 0x44 ;
TX_Data_Buf1[4] = 0x45 ;
TX_Data_Buf1[5] = 0x06 ;
TX_Data_Buf1[6] = 0x07 ;
TX_Data_Buf1[7] = 0x08 ;

while (1)
{
NullCounter ++ ;

if ( NullCounter > 5000 )
{
NullCounter = 0 ;


TX_Data_Buf1[3] = 0x71; //ADRESH ;
TX_Data_Buf1[4] = 0x66; // ADRESL ;

if (CANIsTxReady( ) )
{
CANSendMessage( MESSAGE_ID1,TX_Data_Buf1,8,CAN_TX_PRIORITY_0 &
CAN_TX_STD_FRAME &
CAN_TX_NO_RTR_FRAME ) ;
PORTDbits.RD4 ^= 0xFF;
}

}

if ( CANIsRxReady() )

{
CANReceiveMessage(&RX_ID1,RX_Data_Buf1,&RX_Data_Len1,&RX1_Message_Flag ) ;

CANData[0] = RX_Data_Buf1[0] ; // Low Byte
CANData[1] = RX_Data_Buf1[3] ; // High Byte

PORTDbits.RD7 = 1;
PORTD = CANData[0];
ttt=PORTD;
PutD(ttt);
}

}


在以上的程式裡面
我設定的 filter 如下
#define MESSAGE_ID1 0x002
#define RX_Filter0 0x002
#define RX_Filter1 0x001
#define RX_Filter2 0x00
#define RX_Filter3 0x00
#define RX_Filter4 0x00
#define RX_Filter5 0x00
#define RXB0_MASK 0x7ff // 0b111 1111 1100
#define RXB1_MASK 0x7ff

如果我設定他的 operation mode 是 loopback mode
我可以成功的收回我自己丟出去的資料

目前我遇到的問題是
如果我改成 normal mode
我在 CanSendMessage 的地方設定一個 breakpoint
這樣我發現,他只會進入三次
第三次以後就不會在進入 CanSendMessage 這地方
不知道問題出在哪裡?

另外,我接另一個 PIC,裡面的程式是和以上的完全一樣
可是我卻都沒有收到任何資料

不知道各為能不能幫我解決這個問題?
我不曉得我問題出來哪裡
是不是要在另外處理什麼 buffer?
在送和接的部分?

麻煩各位了
謝謝

發表於: 2008/2/26 11:26
頂部


Re: 關於 CAN BUS 的 ID 問題
#16
初級會員
初級會員


我想要請教一下一些問題
我在範例程式裡面看到一些 filter
以我所了解的,就是利用 filter 和 mask 去判斷是不是自己要的資料

#define MESSAGE_ID1 0x120
#define RX_Filter0 0x110
#define RX_Filter1 0x00
#define RX_Filter2 0x00
#define RX_Filter3 0x0
#define RX_Filter4 0x00
#define RX_Filter5 0x00
#define RXB0_MASK 0x7ff // 0b111 1111 1100
#define RXB1_MASK 0x7ff

我看這裡面有定義 filter 的參數,還有丟出去的 id (0x120)
我找不到這些 filter 代表什麼
他用什麼方式去 filter 這些資料?

另外
他在設 Mask 和 Filter

CANSetMask(CAN_MASK_B1, RXB0_MASK, CAN_CONFIG_STD_MSG ) ; // Set Mask For Standard Data Frame
CANSetMask(CAN_MASK_B2, RXB1_MASK, CAN_CONFIG_STD_MSG ) ;

CANSetFilter(CAN_FILTER_B1_F1, RX_Filter0 , CAN_CONFIG_STD_MSG) ;
CANSetFilter(CAN_FILTER_B1_F2, RX_Filter1 , CAN_CONFIG_STD_MSG) ;
CANSetFilter(CAN_FILTER_B2_F1,RX_Filter2 , CAN_CONFIG_STD_MSG) ;
CANSetFilter(CAN_FILTER_B2_F2,RX_Filter3 , CAN_CONFIG_STD_MSG) ;
CANSetFilter(CAN_FILTER_B2_F3,RX_Filter4 , CAN_CONFIG_STD_MSG) ;
CANSetFilter(CAN_FILTER_B2_F4, RX_Filter5 , CAN_CONFIG_STD_MSG) ;

這些 CAN_MASK_B1,CAN_MASK_B2, CAN_FILTER_B1_F1, 等等
在哪裡定義?

我在 h 檔案裡面找到這樣的東西
可是不知道他代表什麼

enum CAN_MASK
{
CAN_MASK_B1,
CAN_MASK_B2
};



enum CAN_FILTER
{
CAN_FILTER_B1_F1,
CAN_FILTER_B1_F2,
CAN_FILTER_B2_F1,
CAN_FILTER_B2_F2,
CAN_FILTER_B2_F3,
CAN_FILTER_B2_F4
};

不知道能不能請教一下
定義這些 Rx_Filter 的方式是什麼?

#define MESSAGE_ID1 0x120
#define RX_Filter0 0x110
這兩個有什麼關係,或是會做怎麼樣的過濾?
謝謝

發表於: 2008/2/22 11:58
頂部


關於 CAN BUS 的 ID 問題
#17
初級會員
初級會員


我在網頁上看到一些範例程式 (我用的是 http://www.microchip.com.tw/modules/m ... nglefile.php?cid=6&lid=71 這個連結裡面的範例)
修改了一下配合我自己要的東西

我看到裡面有一些內建的 functions
CANSendMessage
CANReceiveMessage

裡面都有他的自己訂的指令

CANSendMessage( MESSAGE_ID1,TX_Data_Buf1,1,CAN_TX_PRIORITY_0 &
CAN_TX_STD_FRAME &
CAN_TX_NO_RTR_FRAME ) ;

CANReceiveMessage(&RX_ID1,RX_Data_Buf1,&RX_Data_Len1,&RX1_Message_Flag ) ;


上面我是有看到這樣的定義
unsigned char Var1,Var2 ;

unsigned long TX_ID1 ;
BYTE TX_Data_Buf1[8] ;

unsigned long RX_ID1 ;
BYTE RX_Data_Buf1[8] ;
BYTE RX_Data_Len1 ;
enum CAN_RX_MSG_FLAGS RX1_Message_Flag ;

unsigned long RX_ID2 ;
BYTE RX_Data_Buf2[8] ;
BYTE RX_Data_Len2 ;
enum CAN_RX_MSG_FLAGS RX2_Message_Flag ;



#define MESSAGE_ID1 0x200
#define RX_Filter0 0x200
#define RX_Filter1 0x000
#define RX_Filter2 0x00
#define RX_Filter3 0x00
#define RX_Filter4 0x00
#define RX_Filter5 0x00
#define RXB0_MASK 0x7ff // 0b111 1111 1100
#define RXB1_MASK 0x7ff


我想請問的是
我如何去設定現在我丟出去的 ID (就是要丟給誰)
我想這裡就是 MESSAGE_ID1 這一個,對不對? 這個 MESSAGE_ID1 是要寫我要傳給誰的 ID?

另外,我要怎麼設定自己這一個 PIC 的 ID 是什麼? 我以上都沒有看到 RX_ID1 的設定值。RX_ID1 應該就是我自己的 ID,只要我看到這樣的指令就代表我去讀接下來的資料。可是,哪裡有設定 RX_ID1?

還有,CANReceiveMessage(&RX_ID1,RX_Data_Buf1,&RX_Data_Len1,&RX1_Message_Flag ) ;
,在 RX_ID1 前面有一個 &,是什麼意思?

另外,MESSAGE_ID1 和 TX_ID1 是什麼差別?

簡單說,我想要知道如何設定我每一個的 ID 是什麼,好讓我可以傳出資料,也知道哪一個要去讀他

謝謝各位

發表於: 2008/1/24 18:12
頂部


Re: 如何讓 Timer1 使用內部的石英震盪器
#18
初級會員
初級會員


謝謝

另外,近來 timer 的頻率 Fosc 一定是會經過 除四嗎?
有沒有辦法讓他直接是 Fosc (16Mhz) ?
謝謝

發表於: 2008/1/11 16:15
頂部


Re: 如何讓 Timer1 使用內部的石英震盪器
#19
初級會員
初級會員


意思就是我直接這樣設定 T1CON 就可以讓 TIMER1 接 16mHz 的石英震盪器?
謝謝


參照:

Ryang 寫到:
APP001 的主振盪器是接一個 16mHz 的石英晶體。
Timer1 的外接了一個 32768Hz 的石英晶體。
另外也有一個 OSC 的插座,可以支援你想要使用的頻率,只要將 Jumper 由XTAL跳到OSC就可以了。
參照:
OpenTimer1( TIMER_INT_ON &
T1_16BIT_RW &
T1_SOURCE_INT &
T1_PS_1_1 &
T1_OSC1EN_OFF );

這樣設 Timer1 是可以讓 Timer1動作炳使用內部的 clock,但是別忘了還要設定 Timer1 計數植。
當然你也可以直接設定 : TCON=b10000101; 這樣 Timer1 也會動的。但中斷要另外設定。


發表於: 2008/1/11 11:08
頂部


如何讓 Timer1 使用內部的石英震盪器
#20
初級會員
初級會員


請問一下
我這邊用的是 PIC18F4480 +EVM APP001 Rev.2 的版子

版子上面有一個 16kHz 的石英震盪器
可是我想要用的是版子上面接好的石英震盪器 (16 Mhz)

我想要知道如何不用 16kHz 而是用 16Mhz 的那個

是不是設定

OpenTimer1( TIMER_INT_ON &
T1_16BIT_RW &
T1_SOURCE_INT &
T1_PS_1_1 &
T1_OSC1EN_OFF );

這樣就可以了嗎? 意思是把 T1CON 的
bit 1 和 bit 3 設成 0 就可以了嗎?
謝謝

發表於: 2008/1/10 16:27
頂部



« 1 (2) 3 4 »



:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------