Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:c7df736f11c4, committed 2016-02-23
- Comitter:
- IC_Blood
- Date:
- Tue Feb 23 02:06:15 2016 +0000
- Commit message:
- Commit_1
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CRC16.cpp Tue Feb 23 02:06:15 2016 +0000
@@ -0,0 +1,49 @@
+#include "CRC16.h"
+CRC16::CRC16()
+{
+ unsigned short crc16table[256] = {
+ 0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,
+ 0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022,
+ 0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072,
+ 0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041,
+ 0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2,
+ 0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1,
+ 0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,
+ 0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,
+ 0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192,
+ 0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1,
+ 0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1,
+ 0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2,
+ 0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151,
+ 0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,
+ 0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,
+ 0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101,
+ 0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312,
+ 0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321,
+ 0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371,
+ 0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342,
+ 0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,
+ 0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,
+ 0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2,
+ 0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381,
+ 0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291,
+ 0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2,
+ 0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2,
+ 0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,
+ 0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,
+ 0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261,
+ 0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231,
+ 0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202};
+ }
+ CRC16::~CRC16()
+ {}
+unsigned short CRC16::calculateCRC16(char input[], int lenght)
+{
+ unsigned short CRC16 = 0;
+ for(int i = 0; i < lenght; i++)
+ {
+ unsigned short tableValue = crc16table[((CRC16>>8)^*(char *)input++)&SHIFTER];
+ CRC16=(CRC16<<8)^tableValue;
+ }
+ return CRC16;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CRC16.h Tue Feb 23 02:06:15 2016 +0000
@@ -0,0 +1,17 @@
+#ifndef CRC16_H
+#define CRC16_H
+
+
+
+class CRC16
+{
+ private:
+ unsigned short crc16table[256];
+ const unsigned int SHIFTER = 0x00FF;
+
+ public:
+ unsigned short calculateCRC16(char input[], int lenght);
+ CRC16();
+ ~CRC16();
+};
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Feb 23 02:06:15 2016 +0000
@@ -0,0 +1,317 @@
+#include "main.h"
+
+int main()
+{
+ tclock = 1;
+ pos = 0;
+
+ state = INIT_STATE;
+ m_crc = new CRC16();
+ messageReady = false;
+
+
+ pc.printf("\n");
+ pc.printf("\n");
+ pc.printf("\n");
+ pc.printf("\n");
+ pc.printf("\n");
+ pc.printf("\n");
+ pc.printf("\n");
+ pc.printf("\n");
+
+ bitset<200> testMEF (string("0101010101111110000000000010000001000001010011000100110001001111001001001101011001111110"));
+
+ for (int i = 87; i >= 0; i--)
+ {
+ analyze_state(testMEF[i]);
+ }
+
+ if(messageReady)
+ {
+ for (int i = 0; i < LENGTH_CHARGE_UTILE_BYTE; i++)
+ pc.printf("%c",c_chargeUtile[i]);
+ }
+ //toEncodeTest = bitset<696>(string("00011101010011"));
+
+ //pc.printf("Test");
+
+ //timer2_init();
+
+ while(1)
+ {
+ }
+}
+
+void timer2_init(void)
+{
+ LPC_SC->PCLKSEL1 |=1<<12; //pclk = cclk timer2
+ LPC_SC->PCONP |=1<<22; //timer2 power on
+ LPC_TIM2->MR0 = 9600000; //100 msec
+ LPC_TIM2->MCR = 3; //interrupt and reset control
+ //3 = Interrupt & reset timer2 on match
+ //1 = Interrupt only, no reset of timer0
+ LPC_TIM2->EMR =2<<4; //EMC0 = 10 (Toogle)
+ NVIC_EnableIRQ(TIMER2_IRQn); //enable timer2 interrupt
+ LPC_TIM2->TCR = 1; //enable Timer2
+}
+
+void timer3_init(void)
+{
+ LPC_SC->PCLKSEL1 |=1<<12; //pclk = cclk timer2
+ LPC_SC->PCONP |=1<<22; //timer2 power on
+ LPC_TIM2->MR0 = 9600000; //100 msec
+ LPC_TIM2->MCR = 3; //interrupt and reset control
+ //3 = Interrupt & reset timer2 on match
+ //1 = Interrupt only, no reset of timer0
+ LPC_TIM2->EMR =2<<4; //EMC0 = 10 (Toogle)
+ NVIC_EnableIRQ(TIMER2_IRQn); //enable timer2 interrupt
+ LPC_TIM2->TCR = 1; //enable Timer2
+}
+
+
+bool analyze_state(bool bit)
+{
+ switch(state)
+ {
+ case INIT_STATE:
+
+ pc.printf("INIT_STATE\t");
+
+ if (bit == 0)
+ {
+ state = PREAMBULE;
+ nextBit = 1;
+ cntState = 0;
+ }
+
+ break;
+
+ case PREAMBULE:
+
+ pc.printf("PREAMBULE\t");
+ if (bit == nextBit && cntState < 6)
+ {
+ nextBit = !nextBit;
+ cntState++;
+ }
+ else if (bit == nextBit && cntState == 6)
+ {
+ state = START;
+ cntState = 0;
+ nextBit = 0;
+ }
+ else
+ {
+ state = INIT_STATE;
+ }
+
+ break;
+
+ case START:
+
+ pc.printf("START\t");
+
+ if(cntState == 0 && bit == nextBit)
+ {
+ nextBit = 1;
+ cntState++;
+ }
+ else if (cntState < 6 && bit == nextBit)
+ {
+ cntState++;
+ }
+ else if (cntState == 6 && bit == nextBit)
+ {
+ nextBit = 0;
+ cntState++;
+ }
+ else if (cntState == 7 && bit == nextBit)
+ {
+ state = ENTETE;
+ cntState = 0;
+ nextBit = 0;
+ }
+ else
+ {
+ state = INIT_STATE;
+ }
+
+ break;
+
+ case ENTETE:
+
+ if(cntState < 7 && nextBit == 0)
+ {
+ pc.printf("TEST1: %i \t", cntState);
+ cntState++;
+
+ }
+ else if (cntState == 7 && nextBit == 0)
+ {
+ pc.printf("TEST2: %i \t", cntState);
+ nextBit = 1;
+ }
+ else if (nextBit == 1 && cntState > 0)
+ {
+ pc.printf("TEST3: %i \t", cntState);
+ buffer.set(cntState, bit);
+ cntState--;
+ }
+ else if (nextBit == 1 && cntState == 0)
+ {
+ buffer.set(cntState, bit);
+ state = CHARGE_UTILE;
+ LENGTH_CHARGE_UTILE_BIT = (int)(buffer.to_ulong());
+
+ cntState = LENGTH_CHARGE_UTILE_BIT - 1;
+ }
+ else
+ {
+ state = INIT_STATE;
+ }
+
+ break;
+
+ case CHARGE_UTILE:
+
+ pc.printf("CHARGE UTILE\t");
+
+ if (cntState > 0)
+ {
+ chargeUtile.set(cntState, bit);
+ cntState--;
+ }
+ else if (cntState == 0)
+ {
+ chargeUtile.set(cntState, bit);
+ cntState = 0;
+ state = CONTROLE;
+ nextBit = 0;
+ }
+ else
+ {
+ state = INIT_STATE;
+ }
+
+ break;
+
+ case CONTROLE:
+
+ if(nextBit == 0)
+ {
+ LENGTH_CHARGE_UTILE_BYTE = LENGTH_CHARGE_UTILE_BIT / 8;
+
+ for (int i = 0; i < LENGTH_CHARGE_UTILE_BIT; i++)
+ {
+ pc.printf("%i", (chargeUtile[i] & 0x1));
+ if (i % 8 == 0)
+ c_chargeUtile[i / 8] = (chargeUtile[i] << 7) | (chargeUtile[i + 1] << 6) | (chargeUtile[i + 2] << 5) | (chargeUtile[i + 3] << 4) | (chargeUtile[i + 4] << 3) | (chargeUtile[i + 5] << 2) | (chargeUtile[i + 6] << 1) | (chargeUtile[i + 7] << 0);
+ }
+
+ CRC_Calculated = m_crc->calculateCRC16(c_chargeUtile, LENGTH_CHARGE_UTILE_BYTE);
+
+ pc.printf("CRC Calculated: %hu\t", CRC_Calculated);
+
+ nextBit = 1;
+ cntState = 14;
+ buffer.reset();
+ buffer.set(15, bit);
+ }
+ else if (nextBit == 1 && cntState > 0)
+ {
+ buffer.set(cntState, bit);
+ cntState--;
+ }
+ else if (nextBit == 1 && cntState == 0)
+ {
+ buffer.set(cntState, bit);
+ CRC_Received = (unsigned short)buffer.to_ulong();
+
+ pc.printf("CRC Received: %hu\t", CRC_Received);
+
+ if (CRC_Received != CRC_Calculated)
+ {
+ state = END;
+ nextBit = 0;
+ cntState = 0;
+ }
+ else
+ {
+ state = INIT_STATE;
+ }
+ }
+ else
+ {
+ state = INIT_STATE;
+ }
+
+ break;
+
+ case END:
+
+ if (nextBit == 0 && nextBit == bit && cntState == 0)
+ {
+ nextBit = 1;
+ cntState++;
+ }
+ else if (nextBit == 1 && nextBit == bit && cntState < 6)
+ {
+ cntState++;
+ }
+ else if (nextBit == 1 && nextBit == bit && cntState == 6)
+ {
+ nextBit = 0;
+ cntState++;
+ }
+ else if (nextBit == 0 && nextBit == bit && cntState == 7)
+ {
+ messageReady = true;
+ state = INIT_STATE;
+ }
+ else
+ {
+ state = INIT_STATE;
+ messageReady = false;
+ }
+
+ break;
+ }
+
+ return 1;
+}
+
+extern "C" void TIMER2_IRQHandler (void)
+{
+ if ((LPC_TIM2->IR & 0x01) == 0x01) // if MR0 interrupt, proceed
+ {
+ LPC_TIM2->IR |= 1 << 0; // Clear MR0 interrupt flag
+
+ tclock = !tclock;
+
+ if (pos < 14)
+ {
+ LPC_TIM2->EMR = (toEncodeTest[pos] == tclock);
+ pc.printf("%i", (toEncodeTest[pos] == tclock));
+ if (tclock)
+ pos++;
+ }
+ }
+}
+
+extern "C" void TIMER3_IRQHandler (void)
+{
+ if ((LPC_TIM3->IR & 0x01) == 0x01) // if MR0 interrupt, proceed
+ {
+ LPC_TIM3->IR |= 1 << 0; // Clear MR0 interrupt flag
+
+ tclock = !tclock;
+
+ if (pos < 14)
+ {
+ LPC_TIM2->EMR = (toEncodeTest[pos] == tclock);
+ pc.printf("%i", (toEncodeTest[pos] == tclock));
+ if (tclock)
+ pos++;
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h Tue Feb 23 02:06:15 2016 +0000
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "mbed.h"
+#include "CRC16.h"
+#include <iostream> // std::cout
+#include <string> // std::string
+#include <bitset> // std::bitset
+
+DigitalOut data(p26); //Data
+
+enum states
+{
+ INIT_STATE = 0,
+ PREAMBULE = 1,
+ START = 2,
+ ENTETE = 3,
+ CHARGE_UTILE = 4,
+ CONTROLE = 5,
+ END = 6
+};
+
+int state;
+int cntState;
+bool nextBit;
+bitset<16> buffer;
+bitset<640> chargeUtile;
+int LENGTH_CHARGE_UTILE_BIT;
+int LENGTH_CHARGE_UTILE_BYTE;
+char c_chargeUtile[80];
+unsigned short CRC_Calculated;
+unsigned short CRC_Received;
+bool messageReady;
+CRC16 *m_crc;
+
+Serial pc(USBTX, USBRX);
+
+bool tclock;
+bitset<696> toEncodeTest;
+int pos;
+
+void timer2_init(void);
+int manchester_encode(bitset<696> toEncode);
+int manchester_decode();
+extern "C" void TIMER2_IRQHandler (void);
+bool analyze_state(bool bit);
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Feb 23 02:06:15 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/252557024ec3 \ No newline at end of file