Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
