CRC-8, 16!

M

member_tdh

Guest
Hei kaikki jäsenet!
Vuonna projektiini,
haluan lähettää tiedot välillä 2 AVR kautta RS232.I käyttäen CRC-algoritmi on korjattu tietoja, mutta minun on käynnissä väärässä.En ole ymmärtänyt yksityiskohtia CRC menetelmä vielä.I post minun koodi vastaanotettu ja transmition, joku pls auttaa minua ...!?
Kiitos kaikille ystäville!

/ / Tämä
on toimitettava tiedot Rutiininomaisesti:

/************************************************* ****
Chip type: ATmega8515
Program Type:
applicationKello taajuus: 8.000000 MHz
Muistin malli: Pienet
Ulkopuolinen SRAM koko: 0
Data Stack koko: 128
************************************************** *** /

#
include <mega8515.h>
#
include <delay.h>
#
include <stdlib.h>

/ / Standard Input / Output toiminnot
#
include <stdio.h>

#
define BYTE unsigned char
#
define WORD unsigned int

mitätön Init ();

BYTE DiemGui, ViTriLed;
WORD ms;

bittinen bTransToPc = 0;

keskeyttää [TIM1_OVF] mitätön timer1_ovf_isr (void)
(
TCNT1H = 0xFF; / / keskeytä 1ms
TCNT1L = 0x83;

jos ( ms == 1000)
(
ms = 0;
jos ( DiemGui> 10) DiemGui = 5;
jos ( ViTriLed> 6) ViTriLed = 1;
bTransToPc = 1;
/ / Putchar ( 'B');
/ / Putchar (DiemGui);
/ / Putchar (ViTriLed);
)

)mitätön Init ()
(
PORTA = 0xFF;
DDRA = 0xFF;

PORTB = 0xFF;
DDRB = 0xFF;

PORTC = 0xFF;
DDRC = 0xFF;

PORTD = 0xFF;
DDRD = 0xFF;

PORTE = 0xFF;
DDRE = 0xFF;

/ / Timer / Counter 1 käynnistystoimien
/ / Clock source: System Clock
/ / Kellon arvo: 125,000 kHz
/ / Mode: Normal top = FFFFh
/ / OC1A output: lopettaa.
/ / OC1B output: lopettaa.
/ / Noise Canceler: Off
/ / Input Capture on Falling Edge
/ / Timer 1 Overflow Interrupt: Käytössä
/ / Input Capture Interrupt: Off
/ / Vertaa A Match Interrupt: Off
/ / Compare B Match Interrupt: Off
TCCR1A = 0x00;
TCCR1B = 0x03;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;

/ / Timer (s) / Counter (s) Interrupt (s) käynnistystoimien
TIMSK = 0x80;

/ / USART käynnistystoimien
/ / Communication Parameters: 8 Data, 1 Stop, No Parity
/ / USART Receiver: On
/ / USART Lähettimen: Käytössä
/ / USART Mode: Asynchronous
/ / USART Baud rate: 9600
UCSRA = 0x00;
UCSRB = 0x18;
UCSRC = 0x86;
UBRRH = 0x00;
UBRRL = 0x33;

/ / Global mahdollistaa katkaisevat
# ASM ( "sei")
)

/ / Toteaa maailmanlaajuisesti muuttujat tästä

mitätön main (void)
(
BYTE B1, B2, B3, B4, checksum;
Init ();

ViTriLed = 1;
DiemGui = 5;kun taas (1)
(
b1 = (DiemGui% 10) 0 x30;
b2 = (DiemGui/10) 0 x30;
b3 = (ViTriLed% 10) 0 x30;
b4 = (ViTriLed/10) 0 x30;
checksum = b1 ^ b2 ^ b3 ^ b4;
putchar ( 'B');
putchar (b1);
putchar (b2);
putchar (b3);
putchar (B4);
putchar (checksum);

);
)/ / Tämä
on Vastatut Data Rutiininomaisesti:

BYTE puskuri [10];

mitätön tärkeimmät ()
(
BYTE i, crc8;

Init ();

/ / saanut 5-Bytes
for (i = 0; i <5; i ) crc8 = crc8_calc (buffer, 5);

kun taas (1)
()

)BYTE crc8_calc (BYTE * byt, WORD-koko)
(
/ * Lasketaan CRC-8 arvoa käytetään CCITT-8 polynomi,
ilmaistuna X ^ 8 X ^ 5 X ^ 4 1 * /

BYTE CRC = (byte) 0xff;
WORD hakemisto;
BYTE b;

for (indeksi = 0; hakemisto <size; indeksi )
(
CRC ^ = byt [indeksi];
for (b = 0, b <8; b)
(
if (CRC & 0x80)
CRC = (CRC <<1) ^ 0x31;
muuten
CRC = (CRC <<1);
)
)
palata CRC;
)

Pls joku selittää, miten on CRC8 työ ...?
Kiitos kaikille!

 

Welcome to EDABoard.com

Sponsor

Back
Top