|
此程序成功解決換回問(wèn)題
奮戰(zhàn)好幾天幾度陷入入僵局!
終于攻破!哈哈,高興ing
2013年6月8日
小ARM菜菜
很好!
日照高科園
#include<string.h>
#include <PL3201_Addr_Map.h>
#include "pl3201.h"
#include "usart.h"
#include "string.h"
extern void Protocol_analysis (unsigned char *buf,unsigned char len) ;
sbit PLC_RX=P1^5;
sbit USART_TX=P2^2;
sbit USART_RX=P3^3;
uchar data PLC_Rxd_pointer;
uchar data PLC_Rxd_tlen;
uchar data PLC_send_pointer;
uchar data PLC_timer;
uchar data PLC_total_len;
uchar data PLC_Rxd_timer;
uchar data WDI;
bit bdata PLC_Rxd_state;
bit bdata PLC_Rxd_OK;
bit bdata PLC_sending;
bit data PLC_TX_EN=0;
uchar xdata PLC_recv_buf[50];
uchar xdata PLC_Tx_Buf[50];
uchar put_buf=0;
uint8_t start_rec_data;
uint8_t rec;
unsigned char nk;
void Check_sys_plc(void)
{
WDI=0x9a;
if(!(PLC_Rxd_timer||PLC_sending)) // no sending and receiving
{
PLC_rset();
}
// initsys_ref();
}
extern void send_usart_data(char *ptr,char len) ;
uint8_t usart_send_ok=0;
uint8_t plc_ok=0;
void Input_Rx_Process(void)
{
//if((PLC_recv_buf[3]==0)&(PLC_recv_buf[4]==0xff)) //回應(yīng)信號(hào)
//{
plc_ok=5;
while(plc_ok);
EA=0;
send_usart_data("B",1);
send_usart_data(PLC_recv_buf,1);
send_usart_data(PLC_recv_buf,PLC_recv_buf[0]);
usart_send_ok=5;
EA=1;
//}
PLC_Rxd_state=0;
}
extern uint8_t usart_rx_ok;
void timeint0 ( void ) interrupt 1
{
if(usart_rx_ok>0)
{
usart_rx_ok--;
USART_RX=0;
}
else
{
USART_RX=1;
}
if(usart_send_ok>0)
{
USART_TX=0;
usart_send_ok--;
}
else
{
USART_TX=1;
}
if(plc_ok>0)
{
PLC_RX=0;
plc_ok--;
}else
{
PLC_RX=1;
}
if ( PLC_Rxd_timer>0 )
{
PLC_Rxd_timer--;
}
else
{
PLC_Rxd_timer=0;
PLC_Rxd_state=0; // resume receive state
}
if ( PLC_timer>0 )
PLC_timer--;
//nk++;
//if(nk==20){nk=0;PLC_TX_EN=1;}
TH0=0x63; // 置定時(shí)器計(jì)數(shù) 100ms 中斷一次 ( 4.8MHz )
TL0=0xcc;
if ( WDI == 0x9a )
{
WDT_RST=0xa1; // 清看門狗
WDI=0;
}
}
uint8_t n,len;
void PLC_int ( void ) interrupt 7
{
uchar data state;
uchar data SSC_adr_bak;
uchar check;
SSC_adr_bak=SSC_ADR;
SSC_ADR=0x00;
state= SSC_DAT;
if ( ( state&0x01 ) == 1 ) //載波發(fā)送狀態(tài)
{ // 載波發(fā)送
if ( PLC_send_pointer !=PLC_total_len )
{
SSC_BUF=PLC_Tx_Buf[PLC_send_pointer]; //發(fā)送下一個(gè)字節(jié)
PLC_send_pointer++;
}
else
{ //發(fā)送完成
PLC_sending=0; // 清正在發(fā)送標(biāo)志
SSC_ADR=0X0;
SSC_DAT=0X0; // 發(fā)送指示燈滅
}
}
else
{
PLC_Rxd_timer=20; // 最大字節(jié)接收延時(shí)時(shí)間為1S
if ( ( state&0x04 ) == 0x04 ) //如果接收的是禎頭標(biāo)志
{
//幀
if ( PLC_Rxd_state == 0 ) //如果處于等待接收狀態(tài)
{
//接收第一個(gè)字節(jié),并準(zhǔn)備接收后面的字節(jié)
PLC_recv_buf[0]=SSC_BUF;
PLC_Rxd_pointer=0;
PLC_Rxd_state=1;
PLC_Rxd_tlen=PLC_recv_buf[0];
check=PLC_recv_buf[0];
if((check&0x80)!=0x80)
{
PLC_Rxd_state=0;
SSC_ADR=0X0;
SSC_DAT=0X0;
}
else
if((check&0x80)==0x80) //1shangxing 0xiaxing
{
PLC_Rxd_tlen&=0x7f;
if(PLC_Rxd_tlen>30)
{
PLC_Rxd_state=0;
SSC_ADR=0X0; //^@%$#^%$&%*&(*&)*()(%$#$@#%@#
SSC_DAT=0X0;
}
}
}
else // translate to rec
{
PLC_Rxd_state=0;
SSC_ADR=0X0;
SSC_DAT=0X0;
}
}
//數(shù)據(jù)流
else
{
if ( PLC_Rxd_state == 1 ) // 如果已經(jīng)接收了禎頭,繼續(xù)接收后續(xù)字節(jié)
{
PLC_recv_buf[PLC_Rxd_pointer]=SSC_BUF;
if(PLC_Rxd_pointer==0)
{
PLC_recv_buf[0]&=0x7f; //%$%$#^&%$&^%*%^(&*(*&)&*)^&%^#$
}
PLC_Rxd_pointer++;
if ( PLC_Rxd_pointer==PLC_Rxd_tlen )
{
PLC_Rxd_OK=1;
PLC_Rxd_state=0;
SSC_ADR=0;
SSC_DAT=0;
}
}
else
{
PLC_Rxd_state=0;
SSC_ADR=0X0;
SSC_DAT=0X0;
}
}
}
SSC_ADR=SSC_adr_bak;
}
/*void set_PLC_3200 ( void )
{
SSC_ADR=0XFF;
SSC_DAT=0XFF; // 禁止寫保護(hù)
SSC_ADR=0x01; // 選擇3201載波通訊控制寄存器1
SSC_DAT=40; // ZZZ 2007-10-15 前導(dǎo)1bit為40個(gè)
SSC_ADR=0x03; // 選擇3201載波通訊控制寄存器3
SSC_DAT=0xc0; // 開啟載波通訊功能,打開中斷,選擇接收狀態(tài)置為3200模式
SSC_ADR=0x04; // 設(shè)置捕獲門限
SSC_DAT=LIMIT_3200;
SSC_ADR=0XFF;
SSC_DAT=0XAA; // 使能寫保護(hù)
} */
void set_PLC_3105 ( void )
{
SSC_ADR=0XFF; // 2005.11.29 LXW
SSC_DAT=0XFF; // 禁止寫保護(hù)
SSC_ADR=0x01; // 選擇3105載波通訊控制寄存器1
SSC_DAT=64; // ZZZ 2007-10-15 前導(dǎo)1bit為64個(gè)
SSC_ADR=0x03; // 選擇3201載波通訊控制寄存器3
SSC_DAT=0xe0; // 開啟載波通訊功能,打開中斷,選擇接收狀態(tài)置為3105模式
SSC_ADR=0x04; // 設(shè)置捕獲門限
SSC_DAT=LIMIT_3105;
SSC_ADR=0XFF;
SSC_DAT=0XAA; // 使能寫保護(hù)
}
void initsys ( void )
{ // 控制看門狗喂狗時(shí)間長(zhǎng)度
CKCON=0xfF;
// 8位/16位運(yùn)算模式選擇位設(shè)置
ALU_MOD=0; // 設(shè)置成8位運(yùn)算模式
//載波通訊配置
//************ 3201的載波寄存器設(shè)置 **********//
set_PLC_3105 ( ); //上電為3105模式
SSC_ADR=0xFF;
SSC_DAT=0xFF;
SSC_ADR=0x02;
SSC_DAT=0x1F;
SSC_ADR=0xFF;
SSC_DAT=0x00;
//************ 3201的載波寄存器設(shè)置 **********//
EIE=0X01; // ( A9H 使能INT2中斷(EX2=1)
IT2=1; // ( C8H ) 為邊沿觸發(fā)方式(IT2=1)
//串口通訊配置
TMOD1 = 0x10 ; // 設(shè) T/C1 為1分頻模式,ZZZ
TMOD = 0x21 ; // 設(shè) T/C1 為定時(shí)方式2 設(shè)置為8位自裝載計(jì)數(shù)器 T/C0 為定時(shí)方式 1
SCON=0x50; // 工作方式1
PCON=0x80; // 波特率加倍
TH1=BPS2400;
TL1=BPS2400; // 加倍設(shè)定波特率 9.6MHz ( 按1分頻2400計(jì)算)
TR1=1; // 啟動(dòng)定時(shí)器1
// 定時(shí)器0中斷配置
TH0=0x63;
TL0=0xcc; // 定時(shí) 50 ms 一個(gè)定時(shí)中斷
TR0 = 1; // 啟動(dòng) T0 定時(shí)器
// 中斷級(jí)別設(shè)置
IP=0x42; // 定時(shí)器 T0 中斷為高級(jí)中斷
EIP=1; // 外部中斷2 為高級(jí)中斷
// 中斷允許設(shè)置
IE=0x82;
ES=1;
EA=1;
// 允許ET0=1定時(shí)器 T0 中斷; 開放中斷
}
void initsys_ref( void )
{ // 載波設(shè)置重置
uchar data s1;
uchar data GOLD_KSAMI;
if ( EIE!=1 )
EIE=0X01; // ( A9H 使能INT2中斷(EX2=1)
if ( IT2!=1 )
IT2=1; // ( C8H ) 為邊沿觸發(fā)方式(IT2=1)
SSC_ADR=0x02;
GOLD_KSAMI=SSC_DAT;
if ( GOLD_KSAMI!=0x1F )
{
SSC_ADR=0xFF;
SSC_DAT=0xFF;
SSC_ADR=0x02;
SSC_DAT=0x1F;
SSC_ADR=0xFF;
SSC_DAT=0x00;
}
// 串口設(shè)置重置
if ( TMOD1!=0x10 ) //2007-10-15 ZZZ
TMOD1 = 0x10 ; //1分頻模式
if ( TMOD!=0x21 )
TMOD = 0x21 ; // 設(shè) T/C1 為定時(shí)方式2 設(shè)置為8位自裝載計(jì)數(shù)器 T/C0 為定時(shí)方式 14
if ( PCON!=0x80 )
PCON=0X80; // 波特率加倍
s1=SCON;
s1=s1&0xf0;
if ( s1!=0x50 )
initsys ();
if ( TH1!=BPS2400 )
TH1=BPS2400;
if ( TR1!=1 )
TR1=1; // 啟動(dòng)定時(shí)器1
// 定時(shí)器0重置
/*嘻嘻,*/
/*
TMOD1=0x32; //time2方式2
SCON1=0x50; //
TH2=OMG;
TL2=OMG;
TR2 =1;
*/
if ( TR0!=1 )
TR0 = 1; // 啟動(dòng) T0 定時(shí)器
// 中斷設(shè)置重置
if ( IE!=0x82 )
IE=0x82;
if ( IP!=2 )
IP=2;
if ( EIP!=1 )
EIP=1; // 外部中斷2 為高級(jí)中斷
ES=1;
}
void PLC_rset(void)
{
uchar s1;
/*if( function_now == 0 )
{
// MEAN 3200 FUNCTION
SSC_ADR=0x03;
s1=SSC_DAT;
if ( ( s1&0xf0 )!=0xc0 )
set_PLC_3200 ();
} */
//else if ( function_now == 0xff ) //3105
//{
SSC_ADR=0x03;
s1=SSC_DAT;
if ( ( s1&0xf0 )!=0xe0 )
set_PLC_3105 ();
// }
}
void init_PLC3201(void)
{
uchar data i;
uchar data j;
for ( i=0; i<5; i++ ) //wait for the stabilization of power
{
for ( j=0; j<0xff; j++ );
}
for ( i=0; i<5; i++ )
{
for ( j=0; j<0xff; j++ );
}
PLC_Rxd_OK=0;
PLC_sending=0;
// PLC_Rxd_state=0;
PLC_Rxd_timer=0x00;
}
uint8_t Send_PLC_Data( const uint8_t *Src,uint8_t len)
{
memcpy (PLC_Tx_Buf ,Src, len);
PLC_total_len=len ;
PLC_send_pointer=0;
PLC_sending=1;
SSC_ADR=0x03;
SSC_DAT= ( SSC_DAT|0x01 );
SSC_BUF= PLC_Tx_Buf[PLC_send_pointer];
PLC_timer=30; // 載波發(fā)送過(guò)程延時(shí)控制1.5秒
while (PLC_sending)
{
if( 0==PLC_timer) return 0;//超時(shí)
}
if ( PLC_timer == 0 ) // PLC sending finish
{
SSC_ADR=0x03;
SSC_DAT= (SSC_DAT&0xFE); // 設(shè)置3201為REC狀態(tài)REDUNDANCY
PLC_sending=0;
}
return 1;//成功
}
|
|