Manchester code (phase encoding) library.

Dependents:   Manchester_Transmitter Manchester_Receiver

Manchester code (phase encoding) library

It implements Manchester code according to both IEEE 802.3 and G.E. Thomas' conventions.

  • A '0' is expressed by a high-to-low transition, a '1' by low-to-high transition in the IEEE 802.3 convention. The reverse is true in the G.E. Thomas' convention.
  • The transitions which signify '0' or '1' occur at the midpoint of a period.
  • Transitions at the start of a period are overhead and don't signify data.
  • Least significant bit is sent first
  • There are synchronization pulses (the number can be set) at the begin of transmission

    Select a convention to be used by commenting or uncommenting the line below in the Manchester.h header file.

Manchester.h

#define G_E_THOMAS 1

The IEEE 802.3 convention is used by default.

A Manchester encoded message (using G.E. Thomas' convention), with one sync pulse in the preamble, carrying four bytes:

/media/uploads/hudakz/manchester01.png

ACKNOWLEDGEMENT: The code in this library was based on this article published by Robert Guastella.

Import programManchester_Transmitter

Manchester transmitter demo.


Import programManchester_Receiver

Manchester receiver demo.

NOTE: To perform a simple test (without radio modules) connect the txPin on transmitter board to the rxPin on the receiver board and make sure that grounds are also connected one another.

Revision:
0:d5c75b0e5708
Child:
1:11292d238e50
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Manchester.h	Wed May 17 07:52:15 2017 +0000
@@ -0,0 +1,81 @@
+/*
+ ******************************************************************************
+ * @file    Manchester.h
+ * @author  Zoltan Hudak
+ * @version 
+ * @date    16-May-2017
+ * @brief   Manchester code for ARMmbed
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2017 Zoltan Hudak <hudakz@outlook.com>
+ *
+ * All rights reserved.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+ 
+#ifndef MANCHESTER_H
+#define MANCHESTER_H
+
+#include "mbed.h"
+#include "ManchesterMsg.h"
+
+class   Manchester
+{
+    enum State
+    {
+        IDLE,
+        SYNCH_START,
+        SYNCH_NEXT,
+        SYNCH_END,
+        SETUP,
+        TRANSITION,
+        COMPLETE,
+        LISTEN,
+        DECODE,
+        ERROR
+    };
+    
+public:
+    Manchester
+    (
+        PinName txPin,          /* transmitter pin name */
+        PinName rxPin,          /* receiver pin name */
+        uint32_t speed = 1500   /* speed in bits per second */, 
+        uint8_t tol = 20        /* pulse width tolerance (+/-) in % */ 
+    );
+    ~Manchester(void) { };
+    void    transmit(ManchesterMsg& msg);
+    bool    receive(ManchesterMsg& msg);
+    
+private:
+    DigitalOut  _tx;            // transmitter line
+    InterruptIn _rx;            // receiver line
+    Ticker      _txTicker;      // transmitter ticker
+    Timeout     _rxTimeout;     // receiver timeout
+    uint32_t    _midBitTime;    // mid-bit time [us]
+    uint32_t    _minPulseWidth; // minimum pulse width
+    uint32_t    _maxPulseWidth; // maximum pulse width
+    State       _state;         // state
+    char*       _data;          // data array
+    uint8_t     _len;           // data length in bytes
+    uint8_t     _maxLen;        // maximum length
+    
+    void        transmission(void);
+    void        reception(void);
+    void        rxTimeout(void);
+};
+#endif // MANCHESTER_H
+