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

Fork of PMRC4ch by Akifumi Takahashi

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PMRC16ch.cpp Source File

PMRC16ch.cpp

00001 
00002 #include "PMRC16ch.h"
00003 const uint32_t PMRC16ch::m_statearray[] = {
00004     ALLGROUND, CH1, CH2, CH3, CH4, CH5, CH6, CH7, CH8, CH9,
00005     CH10, CH11, CH12, CH13, CH14, CH15, CH16, ALLHiZ
00006 };
00007 //  A constractor whose arguments have all default value
00008 //  is a default constractor.
00009 PMRC16ch::PMRC16ch():
00010     m_num_ch(16),
00011     m_SCK(DigitalOut(p11)),
00012     m_CLR(DigitalOut(p12)),
00013     m_RCK(DigitalOut(p13)),
00014     m_SER(DigitalOut(p14)),
00015     m_OUT(DigitalIn(p10))
00016 {
00017     init();
00018 }
00019 PMRC16ch::PMRC16ch(
00020     uint8_t arg_num_ch
00021 ):
00022     m_num_ch(arg_num_ch),
00023     m_SCK(DigitalOut(p11)),
00024     m_CLR(DigitalOut(p12)),
00025     m_RCK(DigitalOut(p13)),
00026     m_SER(DigitalOut(p14)),
00027     m_OUT(DigitalIn(p10))
00028 {
00029     init();
00030 }
00031 
00032 
00033 PMRC16ch::PMRC16ch(
00034     uint8_t arg_num_ch,
00035     PinName arg_SCK,
00036     PinName arg_CLR,
00037     PinName arg_RCK,
00038     PinName arg_SER,
00039     PinName arg_OUT
00040 ):
00041     m_num_ch(arg_num_ch),
00042     m_SCK(DigitalOut(arg_SCK)),
00043     m_CLR(DigitalOut(arg_CLR)),
00044     m_RCK(DigitalOut(arg_RCK)),
00045     m_SER(DigitalOut(arg_SER)),
00046     m_OUT(DigitalIn(arg_OUT))
00047 {
00048     init();
00049 }
00050 //  ----------------------------------------------------------------------------
00051 void PMRC16ch::init()
00052 {
00053     m_CLR = 1;
00054     m_SCK = m_RCK = 0;
00055     allHiZ();
00056     m_PMRC_mode = TWIN_ELECTRODES;
00057     m_PMRC_POL = Cathodic;
00058 }
00059 
00060 void PMRC16ch::allGround()
00061 {
00062     if (m_PMRC_state == ALLGROUND) return;
00063     sweep();
00064     upload();
00065     m_PMRC_state = ALLGROUND;
00066     m_pos_stim = 0;
00067 }
00068 
00069 void PMRC16ch::allHiZ()
00070 {
00071     //reset shiftresister
00072     m_CLR = 0;
00073     update();
00074     //enable insertion data to SR
00075     m_CLR = 1;
00076     upload();
00077     m_PMRC_state = ALLHiZ;
00078     m_pos_stim = 0;
00079 }
00080 //  ----------------------------------------------------------------------------
00081 void PMRC16ch::setTwin(char arg_stim_ch, char arg_ref_ch)
00082 {
00083     m_PMRC_mode = TWIN_ELECTRODES;
00084     m_PMRC_state = m_statearray[arg_stim_ch] | (m_statearray[arg_ref_ch] >> 1);
00085     setBits(m_PMRC_state);
00086     upload();
00087     m_pos_stim = arg_stim_ch;
00088 }
00089 
00090 void PMRC16ch::setTrio(char arg_stim_ch, char arg_ref_ch1, char arg_ref_ch2)
00091 {
00092     m_PMRC_mode = TWIN_ELECTRODES;
00093     m_PMRC_state = m_statearray[arg_stim_ch] 
00094         | (m_statearray[arg_ref_ch1] >> 1)
00095         | (m_statearray[arg_ref_ch2] >> 1);
00096     setBits(m_PMRC_state);
00097     upload();
00098     m_pos_stim = arg_stim_ch;
00099 }
00100 
00101 void PMRC16ch::setOvsO(char arg_ch)
00102 {
00103     int8_t num_of_shift;
00104 
00105     num_of_shift = arg_ch - m_pos_stim;
00106     //  m_PMRC_mode == ONE_VS_THEOTHERS && m_pos_stim == 0
00107     //  => m_PMRC_state == ALLGROUND
00108     if( num_of_shift < 0 || m_pos_stim == 0 || m_PMRC_mode != ONE_VS_THEOTHERS) {
00109         sweep();
00110         setStimbits();
00111         num_of_shift = arg_ch - 1;
00112     }
00113     shiftby(num_of_shift);
00114     m_PMRC_mode = ONE_VS_THEOTHERS;
00115     m_PMRC_state = ALLGROUND | m_statearray[arg_ch];
00116 
00117     upload();
00118     m_pos_stim = arg_ch;
00119 }
00120 
00121 //  ----------------------------------------------------------------------------
00122 
00123 void PMRC16ch::sweep()
00124 {
00125     uint32_t num_shift;
00126 
00127     if(m_PMRC_mode != ONE_VS_THEOTHERS || m_PMRC_state == ALLHiZ) {
00128         num_shift = m_num_ch;
00129     } else if(m_PMRC_mode == ONE_VS_THEOTHERS) {
00130         num_shift = m_num_ch - (m_pos_stim - 1);
00131     }
00132     shiftby(num_shift);
00133 }
00134 
00135 void PMRC16ch::shiftby(int arg_num)
00136 {
00137     for(int i = 0; i < arg_num; i++) {
00138         //  insert 1 XOR Polarity
00139         m_SER = 1 ^ m_PMRC_POL;
00140         update();
00141         //  insert 0 XOR Polarity
00142         m_SER = 0 ^ m_PMRC_POL;
00143         update();
00144     }
00145 }
00146 
00147 void PMRC16ch::setStimbits()
00148 {
00149     //  insert 0 XOR Polarity
00150     m_SER = 0 ^ m_PMRC_POL;
00151     update();
00152     //  insert 1 XOR Polarity
00153     m_SER = 1 ^ m_PMRC_POL;
00154     update();
00155     m_PMRC_state = CH1;
00156 }
00157 
00158 void PMRC16ch::setBits(const uint32_t arg_bits)
00159 {
00160     /*  arg_bits: 0b xx xx xx xx ... xx xx xx
00161      *          ch1 <-                     ->ch[m_num_ch]
00162      */
00163      
00164     uint8_t tmp_bit[2];
00165     //reset shiftresister
00166     m_CLR = 0;
00167     update();
00168     //enable insertion data to SR
00169     m_CLR = 1;
00170     for(int i = 16 - m_num_ch; i < 16; i++) {
00171         tmp_bit[0] = 0b01 & (arg_bits >> (2 * i));
00172         tmp_bit[1] = 0b01 & (arg_bits >> (2 * i + 1));
00173         //  if the chan. is not HiZ meaning Hi or Lw
00174         if(tmp_bit[0] + tmp_bit[1] == 1) {
00175             m_SER = (tmp_bit[0] ^ m_PMRC_POL); //XOR Polarity
00176             update();
00177             m_SER = (tmp_bit[1] ^ m_PMRC_POL); //XOR Polarity
00178             update();
00179         } else {
00180             m_SER = (tmp_bit[0]);
00181             update();
00182             m_SER = (tmp_bit[1]);
00183             update();
00184         }
00185     }
00186 }
00187 //  ----------------------------------------------------------------------------
00188 void PMRC16ch::update()
00189 {
00190     //Shift-resister Clock update
00191     m_SCK = 1;
00192     m_SCK = 1;
00193     m_SCK = 0;
00194     m_SCK = 0;
00195 }
00196 void PMRC16ch::upload()
00197 {
00198     //FF Clock Update
00199     m_RCK = 1;
00200     m_RCK = 1;
00201     m_RCK = 0;
00202     m_RCK = 0;
00203 }