Hi,
hier ein Demo vom Proton+ Compiler zum Thema Manchester Code
Code:
' Manchester ENCODE and DECODE, as well as CRC caulculator
Include "PROTON_G4.INT" ' Use an INTERNAL FONT
Dim ENCODER_LOOP as Byte
Dim CRC_LOOP as ENCODER_LOOP
Dim TempVar as Byte
Dim EncodedWord as Word
Dim ERROR_FLAG as Bit
Dim CRC_OUT as Word
Dim CRC_IN as Byte
Dim Y as Byte
Symbol CRCPolynomial = $1021 ' CRC-CCIT
TempVar = %10001001
Cls
For Y = 0 to 255
TempVar = Y
Print at 1,1,"TEMPVAR ", bin8 Tempvar
Gosub Encode ' MANCHESTER ENCODE the value held in TEMPVAR. Result in ENCODEDWORD
Print at 2,1,"ENC ", bin16 ENCODEDWORD
Gosub Decode ' MANCHESTER DECODE the value held in ENCODEDWORD. Result in TEMPVAR
Print at 5,1,"ERROR ",DEC ERROR_FLAG
CRC_IN = TempVar
Gosub Calc_CRC ' Calculate a CRC of variable X. Result in CRC.HIGHBYTE
Print at 3,1,"CRC " , bin8 CRC_OUT
CRC_IN = CRC_OUT.highbyte
Gosub Calc_CRC ' Calculate the CRC of variable X. Result in CRC.Lowbyte
Print at 4,1,"RESULT " , @CRC_OUT.lowbyte
Delayms 400
Next
Stop
'--------------------------------------------------------------------------------------------------
' Manchester Encode The byte value in TEMPVAR, and place the result in WORD variable ENCODEDWORD
' Note that:
' 1. TEMPVAR is the byte we want to encode
' 2. We will encode it into a 16 bit word, the low byte will contain the lower nibble of the encoded
' variable; ' the high byte will contain the upper nibble of the encoded variable
' 3. A “0” will be equated to a 0-1 transition
' 4. A “1” will be equated to 1-0 transition
' 5. The below subroutine will encode each 8-bit byte to a 16-bit word with an equal number of 1’s and 0’s.
' Run length is 1. The upside is that this is perfect for DC balancing the receiver’s bit slicer. The
' downside is that this results in doubling the bandwidth.
Encode:
EncodedWord = 0
Clear ENCODER_LOOP
Repeat
EncodedWord = EncodedWord << 2
EncodedWord.0 = 1 ' Default to Bit = 1
EncodedWord.1 = 0
If TempVar.0 = 0 Then
EncodedWord.0 = 0 ' Bit = 0
EncodedWord.1 = 1
Endif
TempVar = TempVar >> 1
Inc ENCODER_LOOP
Until ENCODER_LOOP > 7
Return
'--------------------------------------------------------------------------------------------------
' Note that:
' 1. We will decode ENCODEDWORD (lower byte) as the lower nibble of TEMPVAR
' 2. ENCODEDWORD ( high byte) as the upper nibble of TEMPVAR
' 3. ERROR_FLAG will return SET is an invalid value was found i.e. 1-1 or 0-0 together
Decode:
Clear ENCODER_LOOP
Clear ERROR_FLAG
Repeat
TempVar = TempVar << 1
If EncodedWord.0 = 0 Then If EncodedWord.1 = 1 Then TempVar.0 = 0 ' bit = 0
If EncodedWord.0 = 1 Then If EncodedWord.1 = 0 Then TempVar.0 = 1 ' bit = 1
If EncodedWord.0 = 0 Then If EncodedWord.1 = 0 Then Set ERROR_FLAG ' error in bit decode
If EncodedWord.0 = 1 Then If EncodedWord.1 = 1 Then Set ERROR_FLAG ' error in bit decode
EncodedWord = EncodedWord >> 2
Inc ENCODER_LOOP
Until ENCODER_LOOP > 7
Return
'--------------------------------------------------------------------------------------------------
' Calculate BYTE CRC; 16 bit crc based on CCIT polynomial
' Note:
' 1. The CRC polynomial was given in the Constant definition. Note that there is a plethora of material
' available on the internet about CRC calculations and the various polynomials used.
' 2. Caveat here: At the end of the CRC calculation on the transmitted data, the sum of the decoded CRC
' must equal to “0”. If the resulting CRC calculation is NOT 0 then there was a transmission error. Pay
' attention to the order in which you calculate the CRC when you transmit AND the order in which you
' calculate the CRC when you receive. Also when you transmit the CRC byte, remember to transmit
' High byte first. For further information, look at the below code.
Calc_CRC:
CRC_OUT = (CRC_IN * 256) ^ CRC_OUT
Clear CRC_LOOP
Repeat
ROL CRC_OUT , CLEAR
If STATUS.0 = 1 then
CRC_OUT = CRC_OUT ^ CRCPolynomial
Endif
Inc CRC_LOOP
Until CRC_LOOP > 7
Return
Include "FONT"
Vieleicht hilft es dir...
Frohe Weihnachten und einen guten Rutsch!
Bye Ulli
Lesezeichen