會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





usb轉RS485下指令沒有反應/ pic16f877
新會員
註冊日期:
2012/07/19 02:31
所屬群組:
註冊會員
文章: 18
等級: 2; EXP: 97
HP : 0 / 49
MP : 6 / 904
離線
我目前想做一對多控制用USB轉RS485 ,用CCS C編譯
目前僅能印出HH.下指令卻沒有反應無法接收指令。
我該如何修改程式,下面是我的接線方式
(pc-->usb to rs485-->max485-->pic16f877)
DI=PinC6 ,RO=pinC7,DE=RE=pinC5

#include <16F877A.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP
#use delay(clock=12000000)
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, enable = PIN_C5, stream=STREAM_UART)
#define RS485_RX_BUFFER_SIZE 64
#define RS485_USE_EXT_INT FALSE
#define RS485_ID 0x09

#define RS485_ENABLE_PIN PIN_C5
#define RS485_TX_PIN PIN_C6
#define RS485_RX_PIN PIN_C7

#include <rs485.c>

#include <string.h>

int8 data_received[32];
void main(void)
{ char c;
int i,n;
output_low(RS485_ENABLE_PIN);
rs485_init();
printf("HH. \r\n");
while(TRUE)
{
delay_ms(300);
if(rs485_get_message(data_received, FALSE)){
if(data_received[2] ==a)
{ printf("LL \r\n"); delay_ms(400);}
}
}
}

3月04日 22:00:34
轉換PDF檔 列印


Re: usb轉RS485下指令沒有反應/ pic16f877
新會員
註冊日期:
2012/07/19 02:31
所屬群組:
註冊會員
文章: 18
等級: 2; EXP: 97
HP : 0 / 49
MP : 6 / 904
離線
上一層樓接法是A=B ,B=A 同樣會遇下列問題。
大家好我做了一些測試,
還有遇到一問題如果我A=A,B=B接傳送資料會出現亂碼
以下面程式 H.他會顯示k,傳送字串n會回傳$這先符號,
如果我用A=B ,B=A 這樣接法一開始會顯示H.正確符號,但傳資料給資沒反應。
因為RS485找不到資料,所以直接參考msp430晶片rs485寫法。
請問我問題出在哪?

https://www.taiwaniot.com.tw/product/t ... rs485rs422-max485-module/
我max485是直接用模組

#include <16F877A.h> // PIC16F877 header file
#fuses HS, NOWDT, NOPROTECT, NOLVP // for debug mode
#device 16f877*=16, ADC=10 // 10 bits ADC
#use delay(clock=12000000) // for 8Mhz crystal
//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STREAM=STREAM_UART,errors)
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, stream=STREAM_UART)
#include <string.h>
#define LED_PIN PIN_D0

//#include <thermistorc.c>
void main(void)
{ char c;
int i,n;
n=3;
set_tris_d(0);
output_high(PIN_D0);//DE,RE
output_high(PIN_D1);//DE,RE
printf("H. \r\n");
while(TRUE)
{

if (kbhit(STREAM_UART))
{ delay_ms(100);
c = fgetc(STREAM_UART);
delay_ms(10);
if(c=='n')
{
printf("L\r\n");
output_high(PIN_D3);

}
}
}}

3月06日 02:56:17
轉換PDF檔 列印


Re: usb轉RS485下指令沒有反應/ pic16f877
資深會員
註冊日期:
2007/03/29 00:43
所屬群組:
註冊會員
文章: 183
等級: 12; EXP: 58
HP : 0 / 289
MP : 61 / 9788
離線
用 ICD 追進去不就知道了嗎?

3月06日 19:26:21
轉換PDF檔 列印


Re: usb轉RS485下指令沒有反應/ pic16f877
資深會員
註冊日期:
2009/04/07 13:30
所屬群組:
註冊會員
文章: 171
等級: 12; EXP: 13
HP : 0 / 278
MP : 57 / 7760
離線
RS485 需要注意的地方之一為:
同一時間內最多只能一個點對 RS485 線路發送資料,
否則訊號就會互相影響.

且 MAX485 這類介面 IC 也確實需要自己控制 發送/接收 狀態,

而你的程式中,
明顥的並沒有 發送 / 接收 狀態的切換,
所以, 我想你目前的最大問題應該是這個了.

你可以參考以下的資料看看.


#include <16F877A.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP
#use delay(clock=12000000)
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, stream=STREAM_UART)

#define RS485_DE_PIN PIN_D0
#define RS485_TX_PIN PIN_C6
#define RS485_RX_PIN PIN_C7

#include <string.h>
// #include <rs485.h>

int8  serial_in[32];
int8  serial_len = 0;
int8  serial_ending = 0;
int16 wait_ending = 0;

void main(void)
{
  
char c;
  
int i,n;

//  output_low(RS485_DE_PIN);
//  rs485_init();

  
output_high(RS485_DE_PIN);   /* 轉為發送狀態 */
  
fprintf(STREAM_UART, "Start trying. Ha ! ha ! ");
  
delay_ms(3);
  
output_low(RS485_DE_PIN);   /* 轉為接收狀態 */

  
while(TRUE)
    {
       if(
kbhit(STREAM_UART))
         {
            
c = fgetc(STREAM_UART);   /* 取得一個輸入的字元 */
            
if(serial_len < 30 && c >= ' ' && serial_ending == 0)  serial_in[serial_len++] = c;
            
/* 把輸入接成字串 */

            
wait_ending = 5000;
            if(
c < ' ' || c == '$')  serial_ending = 1;
            
/* 是否有出現字串結束字元 rn 或 $ 等... */
         
}

       if(
wait_ending != 0 && serial_ending != 0)   /* 出現結束字元時, 等待傳送完全停止 */
         
{
            
wait_ending--;   /* 等待倒數中 */
            
if(wait_ending == 0)
              {
                 
serial_in[serial_len] = 0;   /* 把接收字串補上字串結尾 NULL */
                 
serial_len = 0;   /* 讓下次接收再重頭開始 */
                 
serial_ending = 0;   /* 清除掉字串結束的旗號, 好能重新開始 */

                 
output_high(RS485_DE_PIN);   /* 轉為發送狀態 */
                 
fprintf(STREAM_UART, "I see => %s rn", serial_in);
                 
delay_ms(3);
                 
output_low(RS485_DE_PIN);   /* 轉為接收狀態 */
              
}
         }
    }
}

附加檔案:



gif  Test-485.GIF (7.30 KB)
5620_5a9e9fdfd3cb9.gif 818X467 px

3月06日 22:04:45
轉換PDF檔 列印


Re: usb轉RS485下指令沒有反應/ pic16f877
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14501
等級: 73; EXP: 6
HP : 1080 / 1801
MP : 4833 / 76214
離線
問一下,你的 RS-485 是全雙工還是半雙工的接法?

1. 全雙工無須控制腳位直接一對一對接。

2. 半雙工需控制方向。但也有兩種方式: 一是 Multi-Master 方式,平常大家都處於輸入模式,要發言時再用 CDAM/CD 檢測的方式來使用 Bus。第二種是 Single Master to Multi Slave 的方式,也是比較常用的方式。

檢查一下是否 UART 的最後一筆資料是否還沒傳完程式已經切換成輸入模式了,造成最後一筆資料無法正確傳送出去。這與程式裡在做發送時檢查 TXIF 或 TRMT 位元有關。

最簡單的方式就是使用示波器來量測,比較一下UART 的傳送形與 RS-485 的輸出是否一樣? 有沒有輸出被砍掉了。

3月07日 10:34:43
轉換PDF檔 列印


Re: usb轉RS485下指令沒有反應/ pic16f877
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1007
等級: 28; EXP: 8
HP : 0 / 677
MP : 335 / 22515
離線
有時候問題出在 小細節上...
量量看終端電阻...
量量波形...等等

3月07日 14:53:46
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project