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

Fork of PMRC4ch by Akifumi Takahashi

Committer:
aktk
Date:
Tue Jun 26 13:14:16 2018 +0000
Revision:
19:1112aeb5cddd
Parent:
18:049283936e3f
Child:
20:26972de3cf90
modified the value of States CH? expressing them by binary

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 15:56703876e914 1 #ifndef PMRC_16CHANNEL_H
aktk 15:56703876e914 2 #define PMRC_16CHANNEL_H
aktk 15:56703876e914 3 /**
aktk 15:56703876e914 4 * PMRC16ch.h
aktk 15:56703876e914 5 * ----------------------------------------
aktk 15:56703876e914 6 * - A Program with which to control
aktk 15:56703876e914 7 * Photo MOS Relay Circuit
aktk 15:56703876e914 8 * for 16 channels Electric Stimulation.
aktk 15:56703876e914 9 * which ES circuit made by Ph.D. Kajimoto.
aktk 15:56703876e914 10 * Photo Couplers are controlled by Shift-
aktk 15:56703876e914 11 * Resisters. So this lib serves sift-
aktk 15:56703876e914 12 * resister's utility.
aktk 15:56703876e914 13 * ----------------------------------------
aktk 15:56703876e914 14 * 32 Photo MOS Relay IN
aktk 15:56703876e914 15 * 16 channel OUT
aktk 15:56703876e914 16 * +--i o----+----i o--+
aktk 15:56703876e914 17 * | [PMR01-1] | [PMR01-2] |
aktk 15:56703876e914 18 * | (ch1(B)out) |
aktk 15:56703876e914 19 * | |
aktk 15:56703876e914 20 * +--i o----+----i o--+
aktk 15:56703876e914 21 * | [PMR02-1] | [PMR02-2] |
aktk 15:56703876e914 22 * | (ch2(R)out) |
aktk 15:56703876e914 23 * | |
aktk 15:56703876e914 24 * . . .
aktk 15:56703876e914 25 * . . .
aktk 15:56703876e914 26 * . . .
aktk 15:56703876e914 27 * Vpp GND
aktk 15:56703876e914 28 * ----------------------------------------
aktk 15:56703876e914 29 * Shit-Resister
aktk 15:56703876e914 30 * nOE is connected to GND
aktk 15:56703876e914 31 * in
aktk 15:56703876e914 32 * ->[PMR01-1]->[PMR01-2]->[PMR02-1]->[PMR02-2]
aktk 15:56703876e914 33 * ->[PMR03-1]->[PMR03-2]->[PMR04-1]->[PMR04-2]
aktk 15:56703876e914 34 * ->[PMR05-1]->[PMR05-2]->[PMR06-1]->[PMR06-2]
aktk 15:56703876e914 35 * ->[PMR07-1]->[PMR07-2]->[PMR08-1]->[PMR08-2]
aktk 15:56703876e914 36 * ->[PMR09-1]->[PMR09-2]->[PMR10-1]->[PMR10-2]
aktk 15:56703876e914 37 * ->[PMR11-1]->[PMR11-2]->[PMR12-1]->[PMR12-2]
aktk 15:56703876e914 38 * ->[PMR13-1]->[PMR13-2]->[PMR14-1]->[PMR14-2]
aktk 15:56703876e914 39 * ->[PMR15-1]->[PMR15-2]->[PMR16-1]->[PMR16-2]
aktk 15:56703876e914 40 * ->out
aktk 15:56703876e914 41 * ----------------------------------------
aktk 15:56703876e914 42 * Log
aktk 15:56703876e914 43 * ver.1 2016/dec/11-
aktk 15:56703876e914 44 * ch.16 VER.
aktk 15:56703876e914 45 * ver.16.1 2018/jun/01-
aktk 15:56703876e914 46 */
aktk 15:56703876e914 47 #include "mbed.h"
aktk 15:56703876e914 48 class PMRC16ch
aktk 15:56703876e914 49 {
aktk 15:56703876e914 50 public:
aktk 15:56703876e914 51 //
aktk 15:56703876e914 52 // Constructor
aktk 15:56703876e914 53 //
aktk 15:56703876e914 54 PMRC16ch();
aktk 15:56703876e914 55 PMRC16ch(
aktk 15:56703876e914 56 uint8_t arg_num_ch,
aktk 15:56703876e914 57 PinName arg_SCK,
aktk 15:56703876e914 58 PinName arg_CLR,
aktk 15:56703876e914 59 PinName arg_RCK,
aktk 15:56703876e914 60 PinName arg_SER,
aktk 15:56703876e914 61 PinName arg_OUT
aktk 19:1112aeb5cddd 62 );
aktk 15:56703876e914 63
aktk 15:56703876e914 64 // Const.
aktk 19:1112aeb5cddd 65 enum State {
aktk 19:1112aeb5cddd 66 ALLGROUND = 0,
aktk 19:1112aeb5cddd 67 CH1 = 0b/*1V*/1000/**/0000/**/0000/**/0000/**/0000/**/0000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 68 CH2 = 0b/*1V*/0010/**/0000/**/0000/**/0000/**/0000/**/0000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 69 CH3 = 0b/*1V*/0000/**/1000/**/0000/**/0000/**/0000/**/0000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 70 CH4 = 0b/*1V*/0000/**/0010/**/0000/**/0000/**/0000/**/0000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 71 CH5 = 0b/*1V*/0000/**/0000/**/1000/**/0000/**/0000/**/0000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 72 CH6 = 0b/*1V*/0000/**/0000/**/0010/**/0000/**/0000/**/0000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 73 CH7 = 0b/*1V*/0000/**/0000/**/0000/**/1000/**/0000/**/0000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 74 CH8 = 0b/*1V*/0000/**/0000/**/0000/**/0010/**/0000/**/0000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 75 CH9 = 0b/*1V*/0000/**/0000/**/0000/**/0000/**/1000/**/0000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 76 CH10= 0b/*1V*/0000/**/0000/**/0000/**/0000/**/0010/**/0000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 77 CH11= 0b/*1V*/0000/**/0000/**/0000/**/0000/**/0000/**/1000/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 78 CH12= 0b/*1V*/0000/**/0000/**/0000/**/0000/**/0000/**/0010/**/0000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 79 CH13= 0b/*1V*/0000/**/0000/**/0000/**/0000/**/0000/**/0000/**/1000/**/0000/*16G*/,
aktk 19:1112aeb5cddd 80 CH14= 0b/*1V*/0000/**/0000/**/0000/**/0000/**/0000/**/0000/**/0010/**/0000/*16G*/,
aktk 19:1112aeb5cddd 81 CH15= 0b/*1V*/0000/**/0000/**/0000/**/0000/**/0000/**/0000/**/0000/**/1000/*16G*/,
aktk 19:1112aeb5cddd 82 CH16= 0b/*1V*/0000/**/0000/**/0000/**/0000/**/0000/**/0000/**/0000/**/0010/*16G*/,
aktk 19:1112aeb5cddd 83 ALLHiZ = 9999
aktk 19:1112aeb5cddd 84 };
aktk 15:56703876e914 85 enum Polarity {Anodic = 0, Cathodic = 1};
aktk 15:56703876e914 86 //
aktk 15:56703876e914 87 // Function to set channel
aktk 15:56703876e914 88 //
aktk 17:08a68860396b 89 char allGround();
aktk 15:56703876e914 90 char setCh(State ch, Polarity cp = Cathodic);
aktk 15:56703876e914 91 char setCh(char ch, Polarity cp = Cathodic);
aktk 15:56703876e914 92 void allHiZ();
aktk 15:56703876e914 93 void setBits(uint32_t bits, int num_of_bits, Polarity cp = Cathodic);
aktk 15:56703876e914 94 //
aktk 15:56703876e914 95 // Function to get prameter
aktk 15:56703876e914 96 //
aktk 15:56703876e914 97 char getState();//inline definition
aktk 15:56703876e914 98 bool getPol(); //inline definition
aktk 15:56703876e914 99
aktk 15:56703876e914 100 private:
aktk 15:56703876e914 101 //
aktk 15:56703876e914 102 // Sig var to controll PRM circuit
aktk 15:56703876e914 103 //
aktk 19:1112aeb5cddd 104 uint8_t m_num_ch; // The number of channels to use
aktk 15:56703876e914 105 DigitalOut m_SCK; // Shift-resister's clock
aktk 15:56703876e914 106 DigitalOut m_CLR; // To use when you want to clear shift-resister
aktk 15:56703876e914 107 DigitalOut m_RCK; // FF's clock
aktk 15:56703876e914 108 DigitalOut m_SER; // Serial input to shift data in a shift-resister
aktk 15:56703876e914 109 DigitalIn m_OUT; // Output data overflowed from shift-resister
aktk 15:56703876e914 110 // Initialization
aktk 15:56703876e914 111 void init();
aktk 15:56703876e914 112 //
aktk 15:56703876e914 113 // Function to set channel
aktk 15:56703876e914 114 //
aktk 15:56703876e914 115 // shift the bits arbitary times
aktk 15:56703876e914 116 void shiftby(int times);
aktk 15:56703876e914 117 // this is the function with which to rapidly set it all-off
aktk 15:56703876e914 118 void sweep();
aktk 15:56703876e914 119 // set the simulation bits of 01
aktk 15:56703876e914 120 void setStimbits();
aktk 15:56703876e914 121 //update the clock of shift-resister
aktk 15:56703876e914 122 void update();
aktk 15:56703876e914 123 // output the data by uploading them to FF Resitors
aktk 15:56703876e914 124 void upload();
aktk 15:56703876e914 125 //
aktk 15:56703876e914 126 // Var for store state
aktk 15:56703876e914 127 //
aktk 15:56703876e914 128 State m_PMRC_state;
aktk 15:56703876e914 129 Polarity m_PMRC_POL;
aktk 15:56703876e914 130 };
aktk 15:56703876e914 131 inline char PMRC16ch::getState()
aktk 15:56703876e914 132 {
aktk 15:56703876e914 133 return static_cast<char>(m_PMRC_state);
aktk 15:56703876e914 134 }
aktk 15:56703876e914 135 inline bool PMRC16ch::getPol()
aktk 15:56703876e914 136 {
aktk 15:56703876e914 137 //return false if cathodic
aktk 15:56703876e914 138 //return true if anodic
aktk 15:56703876e914 139 return static_cast<bool>(m_PMRC_POL);
aktk 15:56703876e914 140 }
aktk 15:56703876e914 141 #endif