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.

Manchester.h

Committer:
hudakz
Date:
2017-05-17
Revision:
1:11292d238e50
Parent:
0:d5c75b0e5708
Child:
2:de778df5892c

File content as of revision 1:11292d238e50:

/*
 ******************************************************************************
 * @file    Manchester.h
 * @author  Zoltan Hudak
 * @version 
 * @date    16-May-2017
 * @brief   Manchester code for mbed
 ******************************************************************************
 * @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 = 1200    /* 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 [us]
    uint32_t    _maxPulseWidth; // maximum pulse width [us]
    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