📄 process.c
字号:
#include <iom16.h>
#include <stdio.h>
#include <string.h>
#include <ina90.h>
#include "Public.h"
#include "Process.h"
void Delay(void);
uint times ;
void (* reset) (void) ;
extern void USART_Transmit( unsigned char data );
/* Return 0 (FALSE) if the receive buffer is empty */
unsigned char DataInReceiveBuffer( void )
{
if(USART_RxHead == USART_RxTail)
return 0;
else
return 1;
}
void Delay(void)
{
uchar i;
if( Work_Mode == 0xA2)
{ // 控制机模式
for(i = 0 ; i < 30 ; i++ )
_NOP();
}
else
{
for(i = 0 ; i < 50 ; i++ )
_NOP();
}
}
/* Host 模式下的输入数据*/
signed char Read_Data(uchar * data)
{
*data = PINA;
return TRUE;
}
void Out_Data(uchar * data)
{
PORTB |= (*data&0x0f) ;
PORTB &= ((*data&0x0f)|0xf0) ;
PORTD |= (*data&0xf0) ;
PORTD &= ((*data&0xf0)|0x0f) ;
}
void WatchDog(void)
{
if((time_100ms%6)>=0&&(time_100ms%6)<3)
DOG_H ;
else DOG_L ;
}
void Usart_Process(void)
{
uchar i,j ;
if( DataInReceiveBuffer() == 1 )
{
for(i = USART_RxTail ; i < USART_RxHead ; )
{
if(USART_RxBuf[i++] == '$' && USART_RxBuf[USART_RxHead ] == '^')
{
i ++ ;
switch (USART_RxBuf[i++])
{
case '0':
if(Send_Mode!= 0xA0)
{
Send_Mode= 0xA0 ;
EEPROM_write(0x90,Send_Mode);
}
Send_String("$A0^");
Send_Enable = TRUE ;
break;
case '1':
if(Send_Mode != 0xA1 )
{
Send_Mode= 0xA1 ;
EEPROM_write(0x90,Send_Mode);
}
Send_String("$A1^");
break;
case '2':
if(Work_Mode != 0xA2 )
{
Work_Mode= 0xA2 ;
EEPROM_write(0x80,Work_Mode);
Send_String("$A2^");
reset=0;
reset ();//while(1); //工作模式发生改变 需要复位CPU,使用外部 Watchdog 完成
}
Send_String("$A2^");
break;
case '3':
if(Work_Mode != 0xA3 )
{
Work_Mode= 0xA3 ;
EEPROM_write(0x80,Work_Mode);
Send_String("$A3^");
reset=0;
reset ();while(1); //工作模式发生改变 需要复位CPU,使用外部 Watchdog 完成
}
Send_String("$A3^");
break;
case '4':
for(j = 0; j < 24 ; j++)
EEPROM_write(0xA0+j,USART_RxBuf[i++]);
for(j = 0; j < 24 ; j++)
tempbuf[j] = EEPROM_read(0xA0+j);
Send_String("$A4");
Send_String(tempbuf);
Send_String("^");
for(j = 0; j < 12 ; j++)
{
Send_DataBuf[j] = AscToHex(EEPROM_read(0xA0+2*j),EEPROM_read(0xA0+2*j+1));
}
break;
case '5':
for(j = 0; j < 24 ; j++)
EEPROM_write(0xC0+j,USART_RxBuf[i++]);
for(j = 0; j < 24 ; j++)
tempbuf[j] = EEPROM_read(0xC0+j);
Send_String("$A5");
Send_String(tempbuf);
Send_String("^");
for(j = 0; j < 12 ; j++)
{
Send_DataBuf[j] = AscToHex(EEPROM_read(0xC0+2*j),EEPROM_read(0xC0+2*j+1));
}
break;
case '8':
Send_Mode=EEPROM_read(0x90);
if(Send_Mode == 0xA0)
Send_String("$A0^");
else if(Send_Mode == 0xA1)
Send_String("$A1^");
else
Send_String("$AE^"); // error
break;
case '9':
Work_Mode=EEPROM_read(0x80);
if(Work_Mode == 0xA2)
Send_String("$A2^");
else if(Work_Mode == 0xA3)
Send_String("$A3^");
else
Send_String("$AE^"); // error
break;
case 'A':
for(j = 0; j < 24 ; j++)
tempbuf[j] = EEPROM_read(0xA0+j);
Send_String("$AA");
Send_String(tempbuf);
Send_String("^");
break;
case 'B':
for(j = 0; j < 24 ; j++)
tempbuf[j] = EEPROM_read(0xC0+j);
Send_String("$AB");
Send_String(tempbuf);
Send_String("^");
break;
case 'C':
Send_String("$AC");
itostr(tempbuf,Report.Ok);
Send_String(tempbuf);
Send_String("-");
itostr(tempbuf,Report.Error);
Send_String(tempbuf);
/* Send_String("-");
itostr((char*)tempbuf,Report.Over);
Send_String(tempbuf);*/
Send_String("^");
break;
default:
break;
}
if( USART_RxBuf[USART_RxHead ] == '^')
USART_RxTail = USART_RxHead = 0 ;
}
}
// memset(USART_RxBuf,'\0',64);
}
}
void Host_Process(void)
{
uchar i ;
if(Send_Enable == TRUE)
{
IBFA_L;
OBFA_H;
time_10ms = 0 ;
Send_Over=FALSE;
Send_Enable=FALSE;
times = 0;
INTRA_H;
Delay();
INTRA_L; // 给下位机产生中断信号
Delay();
INTRA_H;
Delay();
while( PC2_IN ==0x00 ) //等待 从机响应中断
{
if(times >delay*30)
{
// #if DEBUG == 1
// Send_String("$S0");
// #endif
LED_Mode = 3 ;
goto M5_2;
}
times ++ ;
}
Out_Data(Send_DataBuf); // 发送第一个字节数据
OBFA_H;Delay();
OBFA_L;Delay();// 输出缓冲区满给从机
for(i = 1 ; i < 12 ; i++ )
{
times = 0 ;
while( ACKA !=0x00 ) // 从机接受应答
{
if(times>delay)
{
// #if DEBUG == 1
// Send_String("$S");
// #endif
// Report.Over ++;
LED_Mode = 3 ;//3
goto M5_2;
}
times ++ ;
}
Out_Data(Send_DataBuf+i);
OBFA_H;Delay();
OBFA_L;Delay();
}
// read data
times = 0;
IBFA_L;//Delay();
for(i = 0 ; i < 12 ; i++ )
{
times = 0 ;
while( STBA !=0x00 )
{
if(times>delay)
{
// #if DEBUG == 1
// Send_String("$R");
// #endif
// Report.Over ++;
LED_Mode = 3 ;//3
goto M5_2;
}
times ++ ;
}
Read_Data(Read_DataBuf+i);
IBFA_H;Delay();//输入缓冲满
IBFA_L;Delay();//数据主机已读出
}
Report.Ok ++;
LED_Mode=1;
IBFA_L;
OBFA_H;
Delay();
return ;
M5_2:
Report.Error ++;
IBFA_L;
OBFA_H;
Delay();
}
}
void Device_Process(void)
{
uchar i ;
// char s[10];
time_10ms = 0 ;
STBA_H;
ACKA_H;
PC2_H; // 响应中断
//Delay(); //Delay(); Delay();
for(i = 0 ; i < 12 ; i++ )
{
times = 0;
while( OBFA != 0 )
{
if(times>delay)
{
// #if DEBUG == 1
// Send_String("$R");
// #endif
// Report.Over ++;
LED_Mode = 4;
goto M5_2;
}
times ++ ;
}
// 主机输出缓冲满则读出数据
Read_Data(Read_DataBuf+i);
ACKA_L;PC2_L;Delay();
ACKA_H;PC2_H;Delay(); // ack有低到高表示已将数据读出
}
// 判断接收数据是否正确
if( Read_DataBuf[11] != 0xCC
||(Read_DataBuf[0] != 0xAA && Read_DataBuf[0] != 0xA5))
{
LED_Mode = 4 ;
//#if DEBUG == 1
// Send_String("Error");
//#endif
for(i = 0 ;i <12 ; i++ )
{
USART_Transmit( (HexToAsc(Read_DataBuf[i])&0xff00)>>8); // Echo the received character
USART_Transmit( HexToAsc(Read_DataBuf[i])&0x00ff); // Echo the received character
}
goto M5_2;
}
/// Send data
times = 0;
while( IBFA !=0x00 )
{
if(times >delay)
{
// #if DEBUG == 1
// Send_String("$S0");
// #endif
goto M5_2;
}
times ++ ;
}
Out_Data(Read_DataBuf);
STBA_H;Delay();
STBA_L;Delay(); // 选通发送第一字节数据
for(i = 1 ; i < 12 ; i++ )
{
times = 0;
while( IBFA != 0x00 )
{
if(times>delay)
{
// #if DEBUG == 1
// Send_String("$S");
// #endif
// Report.Over ++;
LED_Mode = 4 ;
goto M5_2;
}
times ++ ;
}
Out_Data(Read_DataBuf+i);
STBA_H;Delay();
STBA_L;Delay();//选通发送下一字节数据
}
Report.Ok ++;
LED_Mode = 2 ;
/*
#if DEBUG == 1
Send_String("$AK^");
// Read_DataBuf[12]=0;
// Send_String(Read_DataBuf);
// sprintf(s,"times= %d\n\r",Report.Ok);
//
s[0]='0'+(Report.Ok%100000)/10000;
s[1]='0'+(Report.Ok%10000)/1000;
s[2]='0'+(Report.Ok%1000)/100;
s[3]='0'+(Report.Ok%100)/10;
s[4]='0'+(Report.Ok%10);
s[5]=0;
Send_String((uchar*)s);
Send_String("\n\r");
#endif
*/
STBA_H;
PC2_L;
ACKA_H;
Delay();
return ;
M5_2:
Report.Error ++;
STBA_H;
PC2_L;
ACKA_H;
Delay();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -