// TX skalgo'2016--2017 // Manchester coding // 21.11.2017 - dodano CRC32 #define CRC8 255 #define CRC16 254 #define CRC32 253 #define N 1000 #define txpin 3 #define ledpin 13 void setup() { Serial.begin(9600); pinMode(txpin,OUTPUT); pinMode(ledpin,OUTPUT); } const unsigned char bit[]={1,2,4,8,16,32,64,128}; int getbit(char c,int i) { return((c&bit[i])==bit[i]); } void fm_send_char(char c) { int i; int state=0; unsigned long int s; digitalWrite(ledpin,HIGH); // start digitalWrite(txpin,HIGH); s=micros(); while(micros()-s<3*N); digitalWrite(ledpin,LOW); // spacja digitalWrite(txpin,LOW); s=micros(); while(micros()-s<100); for(i=0;i<8;i++) { if(getbit(c,i)) { digitalWrite(ledpin,LOW); digitalWrite(txpin,LOW); s=micros(); while(micros()-s>=1; if(sum) crc8^=0x8C; b>>=1; } } } fm_send_char(crc8); fm_send_char(crc8); } // CRC 16 bit CCITT // http://stackoverflow.com/questions/10564491/function-to-calculate-a-crc16-checksum void fm_send_string_crc16(char * str) { unsigned short int crc16=0xFFFF; int i; unsigned char x; fm_send_char(CRC16); fm_send_char(CRC16); fm_send_char(CRC16); for(i=0;i>8^c; x^=x>>4; crc16=(crc16<<8)^((unsigned short)(x<<12))^((unsigned short)(x<<5))^((unsigned short)x); } char *p=(char*)&crc16; fm_send_char(*p); p++; fm_send_char(*p); p--; fm_send_char(*p); p++; fm_send_char(*p); } // CRC 32 // http://www.cl.cam.ac.uk/research/srg/bluebook/21/crc/node6.html // Algorithm One void fm_send_string_crc32(char * str) { #define QUOTIENT 0x04c11db7 unsigned long int crc32=-1; // 4 bajty int i,j; fm_send_char(CRC32); fm_send_char(CRC32); fm_send_char(CRC32); for(i=0;i>7)^(crc32>>31)) crc32=(crc32<<1)^QUOTIENT; else crc32=(crc32<<1); c<<=1; } } crc32=~crc32; char *p=(char*)&crc32; fm_send_char(*p); Serial.print((unsigned char)*p); Serial.print(" "); p++; fm_send_char(*p); Serial.print((unsigned char)*p); Serial.print(" "); p++; fm_send_char(*p); Serial.print((unsigned char)*p); Serial.print(" "); p++; fm_send_char(*p); Serial.print((unsigned char)*p); Serial.println(" "); } unsigned long int nr=0; void loop() { for(int i=0;i<5;i++) { char str8[128]="CRC8"; sprintf(str8,"%s %ld %d\n",str8,nr,i); fm_send_string_crc8(str8); } fm_send_string_crc8(" \n"); delay(1000); for(int i=0;i<5;i++) { char str16[128]="CRC16"; sprintf(str16,"%s %ld %d\n",str16,nr,i); fm_send_string_crc16(str16); } fm_send_string_crc16(" \n"); delay(1000); for(int i=0;i<5;i++) { char str32[128]="CRC32"; sprintf(str32,"%s %ld %d\n",str32,nr,i); fm_send_string_crc32(str32); } fm_send_string_crc32(" \n"); delay(1000); nr++; }