This is a library to use HV507 boards as a switching circuitry which is a module used with an electrical stimulator made by kaji-lab.

Revision:
0:26eea8042420
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/KajiLabHV507B.cpp	Tue Nov 27 21:25:41 2018 +0000
@@ -0,0 +1,234 @@
+/**
+ *  \file   "KajiLabHV507B.cpp"
+ *  \Author Akifumi TAKAHASHI
+ */
+
+#include "KajiLabHV507B.h"
+
+HV507::HV507(const int arg_num_board):
+    m_DIOB(p14),    //  Pin to transfer Data input to HV507
+    m_BL(p13),      //  Pin to transfer signal -BL(Blaker)
+    m_POL(p12),     //  Pin to transfer signal POL
+    m_CLK(p11),     //  Pin to transfer signal Clock
+    m_LE(p10),      //  Pin to transfer signal -LE(Latch Enable)
+    m_num_pins(arg_num_board * HV507_NUM_PINS)
+{
+    init();
+}
+
+void HV507::DEBUG_ALLPIN_ON()
+{
+    m_DIOB  = 1;
+    m_BL    = 1;
+    m_POL   = 1;
+    m_CLK   = 1;
+    m_LE    = 1;
+}
+void HV507::DEBUG_ALLPIN_OFF()
+{
+    m_DIOB  = 0;
+    m_BL    = 0;
+    m_POL   = 0;
+    m_CLK   = 0;
+    m_LE    = 0;
+}
+
+//HV507 init
+void HV507::init()   // argument: the number of Hv507. #aktk150715
+{
+
+    //  First, Rapidly Temporarily Make All Outputs Off (Low)
+    m_POL = 1;  //  data in latches is reflected to the output as is (normal mode).
+    m_BL  = 0;  //  L == ALL OFF (ShiftReg not cahnges, HVouts be all Low, DATAout not changes)
+    m_LE  = 0;  //  Close the latches
+
+    m_DIOB = 0; //  input data = L
+    for(int pin = 0; pin < m_num_pins; pin++) putSRCLKahead();
+    m_pos_stim = 0;
+    
+    updateLatches();
+
+    m_BL = 1;
+}
+
+void HV507::shiftSRBits_by(int arg_num_shifting)
+{
+    //  Load S/R Mode ON
+    m_BL = 1;
+    m_LE = 0;
+
+    //  Fill 0 into ShitRegisters before supposing node to Shift 1 to the node.
+    m_DIOB = 0;
+    for(int itr = 0; itr < arg_num_shifting; itr++) putSRCLKahead();
+    
+    m_pos_stim += arg_num_shifting; 
+    if(m_pos_stim > m_num_pins) m_pos_stim = 0;
+}
+
+void HV507::setHtoSR()
+{
+    m_BL = 1;
+    m_LE = 0;
+    
+    m_DIOB = 1;
+    putSRCLKahead();
+    m_pos_stim = 1;
+}
+
+void HV507::setLtoSR()
+{
+    m_BL = 1;
+    m_LE = 0;
+    
+    m_DIOB = 0;
+    putSRCLKahead();
+    m_pos_stim >= m_num_pins? m_pos_stim = 0 : m_pos_stim++;
+    
+}
+
+void HV507::putSRCLKahead()
+{
+    m_CLK = 0;  //  Clock down(L)
+    m_CLK = 0;  //
+    //  Load a datum to the SR(s) when clock rising
+    m_CLK = 1;  //  Clock up(H)
+    m_CLK = 1;  //  (twice substitution is for mbed faster than HV507.
+}
+
+
+
+//  Fill out 0 into all ShiftRegs.
+void HV507::clearSR()
+{
+    if(m_pos_stim != 0) shiftSRBits_by(m_num_pins + 1 - m_pos_stim);
+}
+
+void HV507::setCh(const int arg_ch)
+{
+    if(arg_ch <= 0 || m_num_pins < arg_ch)
+        clearSR();
+    else {
+        if(arg_ch < m_pos_stim){
+            clearSR();
+            setHtoSR();
+            shiftSRBits_by(arg_ch - 1);
+        }
+        else
+            shiftSRBits_by(arg_ch - m_pos_stim);
+    }
+    updateLatches();
+}
+
+void HV507::updateLatches()
+{
+    //  Make data to be stored in Latches
+    //  Reflect the data in SR(s) to Latches
+    m_LE = 1;   
+    m_LE = 1;
+    //  Close latch and store the data in it
+    m_LE = 0;   
+    m_LE = 0;
+}
+
+
+/*--------------------------------------------------------
+    Example Main Functin For Simple Comunication
+----------------------------------------------------------*/
+/*
+DigitalOut dout(p14); //trigger signal for check
+Serial pc(USBTX, USBRX); // tx, rx
+AnalogIn volume(p15); //volume
+#define HV507_NUM 1
+#define ELECTRODE_NUM 61
+#define PC_MBED_STIM_PATTERN 0xFF
+#define PC_MBED_MEASURE_REQUEST 0xFE
+#define MBED_PC_MEASURE_RESULT 0xFF
+
+int main()
+{
+    int pin;
+    short PulseHeight, AD;
+    unsigned char stim_pattern[ELECTRODE_NUM]={0},uc;
+    unsigned char impedance[ELECTRODE_NUM]={0};
+
+    pc.baud(921600);
+    DAADinit();
+    hv507Init(1); //initialize one HV507
+
+    while (1) {
+        //pc.printf("%d\n", (int)PulseHeight);
+        if (pc.readable()) { //check serial buffer
+            uc=pc.getc();
+            if (uc == PC_MBED_STIM_PATTERN) {//if PC requires stimulation
+                for (pin=0; pin<ELECTRODE_NUM; pin++) {//read data
+                    stim_pattern[pin] =pc.getc();
+                    if(stim_pattern[pin]>100)stim_pattern[pin]=100; //limit
+                }
+                PulseHeight = (short) (volume*1024.0); //0-5mA
+                hv507FastScan(0);
+                for (pin=0; pin<ELECTRODE_NUM; pin++) {
+                    if(stim_pattern[pin]!=0) {
+                        if(pin!=0) {
+                            hv507FastScan(pin);
+                        }
+                        m_BL = 1;
+                        m_LE = 1;
+                        m_LE = 0;
+
+                        //Cathodic Stimulation
+                        //m_POL = 0;
+
+                        //50us stimulation
+                        AD = DAAD(PulseHeight); //0-5mA. Simultaneous DA and AD. 2.0us
+                        wait_us(stim_pattern[pin]); //0-100us
+                        AD = DAAD(0);
+                        m_BL = 0;
+                        wait_us(100-stim_pattern[pin]); //wait
+                    }
+                }
+                hv507Clear(HV507_NUM);    //cleaning
+                m_LE = 1;
+                m_LE = 0;
+                m_BL = 0;
+            }else if (uc == PC_MBED_MEASURE_REQUEST) {//if PC requires stimulation
+                PulseHeight = 100.0; //0.5mA
+                hv507FastScan(0);
+                //50us stimulation
+                m_BL = 1;
+                m_LE = 1;
+                m_LE = 0;
+                AD = DAAD(PulseHeight); //0-5mA. Simultaneous DA and AD. 2.0us
+                wait_us(30);
+                AD = DAAD(0);
+                m_BL = 0;
+                wait_us(70);
+                for (pin=0; pin<ELECTRODE_NUM; pin++) {
+                        if(pin!=0) {
+                            hv507FastScan(pin);
+                        }
+                        m_BL = 1;
+                        m_LE = 1;
+                        m_LE = 0;
+
+                        //50us stimulation
+                        AD = DAAD(PulseHeight); //0-5mA. Simultaneous DA and AD. 2.0us
+                        wait_us(30);
+                        AD = DAAD(0);
+                        impedance[pin]=AD>>3;
+                        if(impedance[pin]>200)impedance[pin]=200;
+                        m_BL = 0;
+                        wait_us(70);
+                }
+                hv507Clear(HV507_NUM);    //cleaning
+                m_LE = 1;
+                m_LE = 0;
+                m_BL = 0;
+                pc.putc(MBED_PC_MEASURE_RESULT);
+                for (pin=0; pin<ELECTRODE_NUM; pin++) {
+                    pc.putc(impedance[pin]);
+                }
+            }
+        }
+    }
+}
+*/