Library to use my Photo MOS Relays Circuit having 16 or less channels.

Fork of PMRC4ch by Akifumi Takahashi

PMRC16ch.h

Committer:
aktk
Date:
2018-06-28
Revision:
20:26972de3cf90
Parent:
19:1112aeb5cddd
Child:
21:fa067e2a30f2

File content as of revision 20:26972de3cf90:

#ifndef PMRC_16CHANNEL_H
#define PMRC_16CHANNEL_H
/**
 *  PMRC16ch.h
 *  ----------------------------------------
 *  -  A Program with which to control
 *  Photo MOS Relay Circuit
 *  for 16 channels Electric Stimulation.
 *  which ES circuit made by Ph.D. Kajimoto.
 *  Photo Couplers are controlled by Shift-
 *  Resisters. So this lib serves sift-
 *  resister's utility.
 *  ----------------------------------------
 *  32 Photo MOS Relay IN
 *  16 channel OUT
 *   +--i      o----+----i      o--+
 *   |  [PMR01-1]   |    [PMR01-2] |
 *   |         (ch1(B)out)         |
 *   |                             |
 *   +--i      o----+----i      o--+
 *   |  [PMR02-1]   |    [PMR02-2] |
 *   |         (ch2(R)out)         |
 *   |                             |
 *   .              .              .
 *   .              .              .
 *   .              .              .
 *  Vpp                           GND
 *  ----------------------------------------
 *  Shit-Resister
 *  nOE is connected to GND
 *  in
 *  ->[PMR01-1]->[PMR01-2]->[PMR02-1]->[PMR02-2]
 *  ->[PMR03-1]->[PMR03-2]->[PMR04-1]->[PMR04-2]
 *  ->[PMR05-1]->[PMR05-2]->[PMR06-1]->[PMR06-2]
 *  ->[PMR07-1]->[PMR07-2]->[PMR08-1]->[PMR08-2]
 *  ->[PMR09-1]->[PMR09-2]->[PMR10-1]->[PMR10-2]
 *  ->[PMR11-1]->[PMR11-2]->[PMR12-1]->[PMR12-2]
 *  ->[PMR13-1]->[PMR13-2]->[PMR14-1]->[PMR14-2]
 *  ->[PMR15-1]->[PMR15-2]->[PMR16-1]->[PMR16-2]
 *  ->out
 *  ----------------------------------------
 *  Log
 *  ver.1   2016/dec/11-
 *  ch.16 VER.
 *  ver.16.1   2018/jun/01-
 */
#include "mbed.h"
class PMRC16ch
{
public:
    //
    //  Constructor
    //
    PMRC16ch();
    PMRC16ch(
        uint8_t arg_num_ch,
        PinName arg_SCK,
        PinName arg_CLR,
        PinName arg_RCK,
        PinName arg_SER,
        PinName arg_OUT
    );

    //  Const.
    enum State {
        ALLGROUND = 0,
        CH1 = /*1V*/0b10000000/**/00000000/**/00000000/**/00000000/*16G*/,
        CH2 = /*1V*/0b00100000/**/00000000/**/00000000/**/00000000/*16G*/,
        CH3 = /*1V*/0b00001000/**/00000000/**/00000000/**/00000000/*16G*/,
        CH4 = /*1V*/0b00000010/**/00000000/**/00000000/**/00000000/*16G*/,
        CH5 = /*1V*/0b00000000/**/10000000/**/00000000/**/00000000/*16G*/,
        CH6 = /*1V*/0b00000000/**/00100000/**/00000000/**/00000000/*16G*/,
        CH7 = /*1V*/0b00000000/**/00001000/**/00000000/**/00000000/*16G*/,
        CH8 = /*1V*/0b00000000/**/00000010/**/00000000/**/00000000/*16G*/,
        CH9 = /*1V*/0b00000000/**/00000000/**/10000000/**/00000000/*16G*/,
        CH10= /*1V*/0b00000000/**/00000000/**/00100000/**/00000000/*16G*/,
        CH11= /*1V*/0b00000000/**/00000000/**/00001000/**/00000000/*16G*/,
        CH12= /*1V*/0b00000000/**/00000000/**/00000010/**/00000000/*16G*/,
        CH13= /*1V*/0b00000000/**/00000000/**/00000000/**/10000000/*16G*/,
        CH14= /*1V*/0b00000000/**/00000000/**/00000000/**/00100000/*16G*/,
        CH15= /*1V*/0b00000000/**/00000000/**/00000000/**/00001000/*16G*/,
        CH16= /*1V*/0b00000000/**/00000000/**/00000000/**/00000010/*16G*/,
        ALLHiZ = 9999
    };
    enum Polarity {Anodic = 0, Cathodic = 1};
    //
    //  Function to set channel
    //
    void allGround();
    void allHiZ();
    void setCh(char ch, Polarity cp = Cathodic);
    void setBits(uint32_t bits, int num_of_bits, Polarity cp = Cathodic);
    //
    //  Function to get prameter
    //
    uint32_t getState();//inline definition
    bool getPol();  //inline definition

private:
    //
    //  Sig var to controll PRM circuit
    //
    uint8_t m_num_ch;   //  The number of channels to use
    DigitalOut m_SCK;   //  Shift-resister's clock
    DigitalOut m_CLR;   //  To use when you want to clear shift-resister
    DigitalOut m_RCK;   //  FF's clock
    DigitalOut m_SER;   //  Serial input to shift data in a shift-resister
    DigitalIn  m_OUT;   //  Output data overflowed from shift-resister
    //  Initialization
    void init();
    //
    //  Function to set channel
    //
    //  shift the bits arbitary times
    void shiftby(int times);
    //  this is the function with which to rapidly set it all-off
    void sweep();
    //  set the simulation bits of 01
    void setStimbits();
    //update the clock of shift-resister
    void update();
    //  output the data by uploading them to FF Resitors
    void upload();
    //
    // Var for store state
    //
    uint32_t m_PMRC_state;
    Polarity m_PMRC_POL;
};
inline uint32_t PMRC16ch::getState()
{
    return static_cast<uint32_t>(m_PMRC_state);
}
inline bool PMRC16ch::getPol()
{
    //return false if cathodic
    //return true  if anodic
    return static_cast<bool>(m_PMRC_POL);
}
#endif