Library to use my Photo MOS Relays Circuit having 16 or less channels.
Fork of PMRC4ch by
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 }
Generated on Tue Jul 12 2022 23:51:41 by 1.7.2