📄 adsbin.c
字号:
ANDLW 0x01
BNZ BIT81_ok
GOTO Error_Data
BIT81_ok:
NOP
RRCF PORTC, W, A
RLCF AAA10, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA10, W, 1
ANDLW 0x01
BNZ BIT82_ok
GOTO Error_Data
BIT82_ok:
NOP
RRCF PORTC, W, A
RLCF AAA10, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA10, W, 1
ANDLW 0x01
BNZ BIT83_ok
GOTO Error_Data
BIT83_ok:
NOP
RRCF PORTC, W, A
RLCF AAA10, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA10, W, 1
ANDLW 0x01
BNZ BIT84_ok
GOTO Error_Data
BIT84_ok:
NOP
RRCF PORTC, W, A
RLCF AAA10, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA10, W, 1
ANDLW 0x01
BNZ BIT85_ok
GOTO Error_Data
BIT85_ok:
NOP
RRCF PORTC, W, A
RLCF AAA10, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA10, W, 1
ANDLW 0x01
BNZ BIT86_ok
GOTO Error_Data
BIT86_ok:
NOP
RRCF PORTC, W, A
RLCF AAA10, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA10, W, 1
ANDLW 0x01
BNZ BIT87_ok
GOTO Error_Data
BIT87_ok:
NOP
RRCF PORTC, W, A
RLCF AAA10, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA10, W, 1
ANDLW 0x01
BNZ BIT88_ok
GOTO Error_Data
BIT88_ok:
NOP
//byte 11
RRCF PORTC, W, A
RLCF AAA11, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA11, W, 1
ANDLW 0x01
BNZ BIT89_ok
GOTO Error_Data
BIT89_ok:
NOP
RRCF PORTC, W, A
RLCF AAA11, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA11, W, 1
ANDLW 0x01
BNZ BIT90_ok
GOTO Error_Data
BIT90_ok:
NOP
RRCF PORTC, W, A
RLCF AAA11, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA11, W, 1
ANDLW 0x01
BNZ BIT91_ok
GOTO Error_Data
BIT91_ok:
NOP
RRCF PORTC, W, A
RLCF AAA11, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA11, W, 1
ANDLW 0x01
BNZ BIT92_ok
GOTO Error_Data
BIT92_ok:
NOP
RRCF PORTC, W, A
RLCF AAA11, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA11, W, 1
ANDLW 0x01
BNZ BIT93_ok
GOTO Error_Data
BIT93_ok:
NOP
RRCF PORTC, W, A
RLCF AAA11, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA11, W, 1
ANDLW 0x01
BNZ BIT94_ok
GOTO Error_Data
BIT94_ok:
NOP
RRCF PORTC, W, A
RLCF AAA11, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA11, W, 1
ANDLW 0x01
BNZ BIT95_ok
GOTO Error_Data
BIT95_ok:
NOP
RRCF PORTC, W, A
RLCF AAA11, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA11, W, 1
ANDLW 0x01
BNZ BIT96_ok
GOTO Error_Data
BIT96_ok:
NOP
//byte 12
RRCF PORTC, W, A
RLCF AAA12, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA12, W, 1
ANDLW 0x01
BNZ BIT97_ok
GOTO Error_Data
BIT97_ok:
NOP
RRCF PORTC, W, A
RLCF AAA12, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA12, W, 1
ANDLW 0x01
BNZ BIT98_ok
GOTO Error_Data
BIT98_ok:
NOP
RRCF PORTC, W, A
RLCF AAA12, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA12, W, 1
ANDLW 0x01
BNZ BIT99_ok
GOTO Error_Data
BIT99_ok:
NOP
RRCF PORTC, W, A
RLCF AAA12, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA12, W, 1
ANDLW 0x01
BNZ BIT100_ok
GOTO Error_Data
BIT100_ok:
NOP
RRCF PORTC, W, A
RLCF AAA12, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA12, W, 1
ANDLW 0x01
BNZ BIT101_ok
GOTO Error_Data
BIT101_ok:
NOP
RRCF PORTC, W, A
RLCF AAA12, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA12, W, 1
ANDLW 0x01
BNZ BIT102_ok
GOTO Error_Data
BIT102_ok:
NOP
RRCF PORTC, W, A
RLCF AAA12, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA12, W, 1
ANDLW 0x01
BNZ BIT103_ok
GOTO Error_Data
BIT103_ok:
NOP
RRCF PORTC, W, A
RLCF AAA12, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA12, W, 1
ANDLW 0x01
BNZ BIT104_ok
GOTO Error_Data
BIT104_ok:
NOP
//byte 13
RRCF PORTC, W, A
RLCF AAA13, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA13, W, 1
ANDLW 0x01
BNZ BIT105_ok
GOTO Error_Data
BIT105_ok:
NOP
RRCF PORTC, W, A
RLCF AAA13, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA13, W, 1
ANDLW 0x01
BNZ BIT106_ok
GOTO Error_Data
BIT106_ok:
NOP
RRCF PORTC, W, A
RLCF AAA13, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA13, W, 1
ANDLW 0x01
BNZ BIT107_ok
GOTO Error_Data
BIT107_ok:
NOP
RRCF PORTC, W, A
RLCF AAA13, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA13, W, 1
ANDLW 0x01
BNZ BIT108_ok
GOTO Error_Data
BIT108_ok:
NOP
RRCF PORTC, W, A
RLCF AAA13, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA13, W, 1
ANDLW 0x01
BNZ BIT109_ok
GOTO Error_Data
BIT109_ok:
NOP
RRCF PORTC, W, A
RLCF AAA13, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA13, W, 1
ANDLW 0x01
BNZ BIT110_ok
GOTO Error_Data
BIT110_ok:
NOP
RRCF PORTC, W, A
RLCF AAA13, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA13, W, 1
ANDLW 0x01
BNZ BIT111_ok
GOTO Error_Data
BIT111_ok:
NOP
RRCF PORTC, W, A
RLCF AAA13, F, 1
NOP
NOP
NOP
NOP
MOVF PORTC, W, A
XORWF AAA13, W, 1
ANDLW 0x01
BNZ BIT112_ok
GOTO Error_Data
//alles fehlerfrei empfangen
BIT112_ok:
NOP
OK_Data:
BCF PORTC, 1, A
BSF PORTC, 2, A // komplettes Frame empfangen
BSF INTCON, GIEH, A
MOVLW 0 // false , korrekter Empfang
RETURN 0
_endasm
} // adsb_in
/***DF***************************************************************/
//ermittelt Formatnummer der Daten in adsb[]
byte adsb_DF(void)
{
byte DF;
DF = adsb[0];
DF = DF >> 3;
return DF;
}
/***CRC**************************************************************/
/****
DF0 (56 bit) 00000=0L Short Air to Air ACAS CRC32 xor ACID
DF4 (56 bit) 00100=2L Surveillance (roll call) Altitude CRC32 xor ACID
DF5 (56 bit) 00101=2H Surveillance (roll call) IDENT Reply CRC32 xor ACID
DF11 (56 bit) 01011=5H Mode S Only All-Call Reply (Acq. Squitter if II=0) CRC32 xor IRID or 000000
DF16 (112 bit) 10000=8L Long Air to Air ACAS
DF17 (112 bit) 10001=8H ADS-B Extended Squitter CRC88 xor 000000
DF18 (112 bit) 10001=9LH TIS-B CRC88 xor 000000
DF19 (112 bit) 10011=9H ADS-M Military Extended Squitter CRC88 xor 000000
DF20 (112 bit) 10100=AL Comm B Altitude Reply CRC88 xor ACID
DF21 (112 bit) 10101=AH Comm. B IDENT Reply CRC88 xor ACID
DF22 10110=BL Military use only
DF24 11000=CL Comm. D Extended Length Message (ELM)
******/
/***
DF11: DF(5) - CA(3) - AA(24) - PI(24)
DF17: DF(5) - CA(3) - AA(24) - ME(56) - PI(24) extended squitter S.72 3-52
Airborn position squitter 0.4 ... 0.6 sec
Surface position squitter 0.4 ... 0.6 sec oder 4.8 ... 5.2 sec
Identification squitter 4.8 ... 5.2 aber wenn surface-low dann 9.8 ... 10.2 sec
Airborne velocity squitter 0.4 ... 0.6 sec
***/
/**
Beispieldaten:
*8D484395990052B2E80B027D687F; DF=17 1000 1___ / CA=5 _101 / AA=484395 / ME=990052B2E80B02 / PI=7D687F
*8D3C65039990FB9E286404A0043E;
*8D4BAA499945161668800268C26E;
*8D3C662B903D006914A84A707D6A;
*A028023C2010C231595820AA9001; DF20 1010 0000
**/
// stimme die CRC ?
// ok -> 1
// falsch -> 0
char adsb_CRC_OK(void)
{
adsb_CRC();
if (adsb_DF() < 16)
{
if ( (CRC.byte2 == adsb[4]) && (CRC.byte1 == adsb[5]) && (CRC.byte0 == adsb[6]) ) return 1;
}
else
{
if ( (CRC.byte2 == adsb[11]) && (CRC.byte1 == adsb[12]) && (CRC.byte0 == adsb[13]) ) return 1;
}
return 0;
}
//ermittelt CRC der Daten in adsb[]
void adsb_CRC(void)
{
if (adsb_DF() < 16) adsb_CRC_56(); // CRC32
else adsb_CRC_112(); // CRC88
}
// input 11 Byte = 88 Bit Daten
// output 3 Byte = 24 Bit Daten
void adsb_CRC_112(void)
{
DWORD poly; //32 bit
char i;
DWORD data, data1, data2;
//poly = 0xFFFA0480;
poly.byte3 = 0xFF;
poly.byte2 = 0xFA;
poly.byte1 = 0x04;
poly.byte0 = 0x80;
data.byte3 = adsb[0];
data.byte2 = adsb[1];
data.byte1 = adsb[2];
data.byte0 = adsb[3];
data1.byte3 = adsb[4];
data1.byte2 = adsb[5];
data1.byte1 = adsb[6];
data1.byte0 = adsb[7];
data2.byte3 = adsb[8];
data2.byte2 = adsb[9];
data2.byte1 = adsb[10];
data2.byte0 = 0;
for (i=1; i<89; i++)
{
if (data.byte3 & 0x80) data._dword ^= poly._dword; // xor
data._dword <<= 1;
if (data1.byte3 & 0x80) data._dword |= 1; // or
data1._dword <<= 1;
if (data2.byte3 & 0x80) data1._dword |= 1; // or
data2._dword <<= 1;
}
CRC.byte2 = data.byte3;
CRC.byte1 = data.byte2;
CRC.byte0 = data.byte1;
}
// input 4 Byte = 32 Bit Daten
// output 3 Byte = 24 Bit Daten
void adsb_CRC_56(void)
{
DWORD poly; //32 bit
char i;
DWORD data;
//poly = 0xFFFA0480;
poly.byte3 = 0xFF;
poly.byte2 = 0xFA;
poly.byte1 = 0x04;
poly.byte0 = 0x80;
data.byte3 = adsb[0];
data.byte2 = adsb[1];
data.byte1 = adsb[2];
data.byte0 = adsb[3];
for (i=1; i<33; i++)
{
if (data.byte3 & 0x80) data._dword ^= poly._dword; // xor
data._dword <<= 1;
}
CRC.byte2 = data.byte3;
CRC.byte1 = data.byte2;
CRC.byte0 = data.byte1;
}
// schreibt in den usb-Sendepuffer einen String entsprechend adsb[]
void adsb_StringOut(void)
{
char k;
send_RAW = 1;
k = 0;
dataPacket._byte[k++] = '*';
dataPacket._byte[k++] = hex2asc_H(adsb[0]);
dataPacket._byte[k++] = hex2asc_L(adsb[0]);
dataPacket._byte[k++] = hex2asc_H(adsb[1]);
dataPacket._byte[k++] = hex2asc_L(adsb[1]);
dataPacket._byte[k++] = hex2asc_H(adsb[2]);
dataPacket._byte[k++] = hex2asc_L(adsb[2]);
dataPacket._byte[k++] = hex2asc_H(adsb[3]);
dataPacket._byte[k++] = hex2asc_L(adsb[3]);
dataPacket._byte[k++] = hex2asc_H(adsb[4]);
dataPacket._byte[k++] = hex2asc_L(adsb[4]);
dataPacket._byte[k++] = hex2asc_H(adsb[5]);
dataPacket._byte[k++] = hex2asc_L(adsb[5]);
dataPacket._byte[k++] = hex2asc_H(adsb[6]);
dataPacket._byte[k++] = hex2asc_L(adsb[6]);
if (adsb_DF() >= 16)
{
dataPacket._byte[k++] = hex2asc_H(adsb[7]);
dataPacket._byte[k++] = hex2asc_L(adsb[7]);
dataPacket._byte[k++] = hex2asc_H(adsb[8]);
dataPacket._byte[k++] = hex2asc_L(adsb[8]);
dataPacket._byte[k++] = hex2asc_H(adsb[9]);
dataPacket._byte[k++] = hex2asc_L(adsb[9]);
dataPacket._byte[k++] = hex2asc_H(adsb[10]);
dataPacket._byte[k++] = hex2asc_L(adsb[10]);
dataPacket._byte[k++] = hex2asc_H(adsb[11]);
dataPacket._byte[k++] = hex2asc_L(adsb[11]);
dataPacket._byte[k++] = hex2asc_H(adsb[12]);
dataPacket._byte[k++] = hex2asc_L(adsb[12]);
dataPacket._byte[k++] = hex2asc_H(adsb[13]);
dataPacket._byte[k++] = hex2asc_L(adsb[13]);
}
dataPacket._byte[k++] = ';';
// auf Wunsch die Zeit anhaengen wenn switch1 geschlossen ist oder ein mode>15
if (!Switch1 | TimeCode)
{
if (Time1.b7 != Time2.b0) // wurde MSB von TMR0H veraendert?
{
Time2._byte++;
if (!Time2._byte) Time3._byte++;
}
dataPacket._byte[k++] = '#';
dataPacket._byte[k++] = hex2asc_H(Time3._byte);
dataPacket._byte[k++] = hex2asc_L(Time3._byte);
dataPacket._byte[k++] = hex2asc_H(Time2._byte);
dataPacket._byte[k++] = hex2asc_L(Time2._byte);
dataPacket._byte[k++] = hex2asc_H(Time1._byte);
dataPacket._byte[k++] = hex2asc_L(Time1._byte);
dataPacket._byte[k++] = hex2asc_H(Time0._byte);
dataPacket._byte[k++] = hex2asc_L(Time0._byte);
dataPacket._byte[k++] = ';';
}
dataPacket._byte[k++] = 0x0A;
dataPacket._byte[k++] = 0x0D;
counter2 = k;
}
byte hex2asc_H(byte B)
{
return (hex2asc_L(B>>4));
}
byte hex2asc_L(byte B)
{
B &= 0x0F;
if (B<10) return (B+'0');
else return (B-10+'A');
}
/** EOF adsbin.c ***************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -