Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

CRC-8 or 16. Pls help me!

Status
Not open for further replies.

member_tdh

Member level 5
Joined
Feb 6, 2006
Messages
86
Helped
1
Reputation
2
Reaction score
1
Trophy points
1,288
Activity points
2,187
Hi all members!
In my project, i want to sent data between 2 AVR via RS232. I using CRC algorithm to corrected data, but my program is running wrong. I have not understand detail about CRC method yet. I post my code received and transmition, anybody pls help me...!?
Thanks all friends !

//This's Transmit Data Routine:

/*****************************************************
Chip type : ATmega8515
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
*****************************************************/

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

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

#define BYTE unsigned char
#define WORD unsigned int

void Init();

BYTE DiemGui, ViTriLed;
WORD msec;

bit bTransToPc=0;

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0xFF; //interrupt 1ms
TCNT1L=0x83;

if (++msec==1000)
{
msec=0;
if (++DiemGui>10) DiemGui=5;
if (++ViTriLed>6) ViTriLed=1;
bTransToPc=1;
// putchar('B');
// putchar(DiemGui);
// putchar(ViTriLed);
}

}


void Init()
{
PORTA=0xFF;
DDRA=0xFF;

PORTB=0xFF;
DDRB=0xFF;

PORTC=0xFF;
DDRC=0xFF;

PORTD=0xFF;
DDRD=0xFF;

PORTE=0xFF;
DDRE=0xFF;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare 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) initialization
TIMSK=0x80;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Global enable interrupts
#asm("sei")
}

// Declare your global variables here

void main(void)
{
BYTE b1,b2,b3,b4,checksum;
Init();

ViTriLed=1;
DiemGui=5;


while (1)
{
b1=(DiemGui%10)+0x30;
b2=(DiemGui/10)+0x30;
b3=(ViTriLed%10)+0x30;
b4=(ViTriLed/10)+0x30;
checksum=b1^b2^b3^b4;
putchar('B');
putchar(b1);
putchar(b2);
putchar(b3);
putchar(b4);
putchar(checksum);

};
}


//This's Received Data Routine:

BYTE buffer[10];

void main()
{
BYTE i,crc8;

Init();

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

while(1)
{


}

}


BYTE crc8_calc(BYTE *byt, WORD size )
{
/* Calculate CRC-8 value; uses The CCITT-8 polynomial,
expressed as X^8 + X^5 + X^4 + 1 */

BYTE crc = (BYTE) 0xff;
WORD index;
BYTE b;

for( index=0; index<size; index++)
{
crc ^= byt[index];
for( b=0; b<8; ++b )
{
if( crc & 0x80 )
crc = (crc << 1) ^ 0x31;
else
crc = (crc << 1);
}
}
return crc;
}

Pls anybody explain how is CRC8 work...?
Thanks all!
 

Hi!
I am not sure about CRC functions my self but if you agree to use 16 bit crc in ur program then i can send u the functions for 16 bit CRC calculation which are guranteed to work.

Regards.
 

Hi Waseem!
First, i want to say thanks for your reply and i'm so sorry about's slowly my reply. Some days ago i was trying to use CRC method in my program but not success. So i'm thank you very much if you can send to me your code to use CRC method to correct data (via RS232).
Could you post up to this Forum or you can send to me via my mail (member_tdh@yahoo.com).
I am thanks you very much!
Good luck and see your reply soon!
Thanks the HKJ's help!
 

Here is a simple and fast CRC-16 that I use. It is very fast since it uses two lookup tables.

Code:
unsigned short CRC16 ( puchMsg, usDataLen ) /* The function returns the CRC as a unsigned short type */
{          
          unsigned char *puchMsg ; /* message to calculate CRC upon */
          unsigned short usDataLen ; /* quantity of bytes in message */
          unsigned char uchCRCHi = 0xFF ; /* high byte of CRC initialized */
          unsigned char uchCRCLo = 0xFF ; /* low byte of CRC initialized */
          unsigned uIndex ; /* will index into CRC lookup table */
          while (usDataLen--) /* pass through message buffer */
          {
                uIndex = uchCRCLo ^ *puchMsg++ ; /* calculate the CRC */
                uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex] ;
                uchCRCHi = auchCRCLo[uIndex] ;
          }
          return (uchCRCHi << 8 | uchCRCLo) ;
}



Code:
/* Table of CRC values for high–order byte */
static unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
} ;

static char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
};


-Goodluck

-ServoPump
 

Hi!
I use the same functions as posted by servopump but still i m sending my complete project code to ur yahoo account. I have used these functions myself and they are perfect.

Best of luck.

Regards.
 

Hi every body! Have good luck on the new week!

i was received yours infomation, i want to say thank so much to every body. Thank you very much for yours hepls!thanks!
 

find CRC details in Appendix B
 

Thank you servopump
!!!
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top