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
- Committer:
- aktk
- Date:
- 2018-06-28
- Revision:
- 20:26972de3cf90
- Parent:
- 18:049283936e3f
- Child:
- 21:fa067e2a30f2
File content as of revision 20:26972de3cf90:
#include "PMRC16ch.h" // A constractor whose arguments have all default value // is a default constractor. PMRC16ch::PMRC16ch(): m_num_ch(16), m_SCK(DigitalOut(p11)), m_CLR(DigitalOut(p12)), m_RCK(DigitalOut(p13)), m_SER(DigitalOut(p14)), m_OUT(DigitalIn(p10)) { init(); } PMRC16ch::PMRC16ch( uint8_t arg_num_ch, PinName arg_SCK, PinName arg_CLR, PinName arg_RCK, PinName arg_SER, PinName arg_OUT ): m_num_ch(arg_num_ch), m_SCK(DigitalOut(arg_SCK)), m_CLR(DigitalOut(arg_CLR)), m_RCK(DigitalOut(arg_RCK)), m_SER(DigitalOut(arg_SER)), m_OUT(DigitalIn(arg_OUT)) { init(); } void PMRC16ch::init() { m_CLR = 1; m_SCK = m_RCK = 0; //reset shiftresister m_CLR = 0; update(); //enable insertion data to SR m_CLR = 1; m_PMRC_state = ALLHiZ; m_PMRC_POL = Cathodic; } void PMRC16ch::allGround() { if (m_PMRC_state == ALLGROUND) return 1; sweep(); upload(); } void PMRC16ch::allHiZ() { //reset shiftresister m_CLR = 0; update(); //enable insertion data to SR m_CLR = 1; upload(); } void PMRC16ch::setCh(char arg_state, Polarity arg_POL) { m_PMRC_POL = arg_POL; int8_t num_of_shift = arg_state - static_cast<int8_t>(m_PMRC_state); if( num_of_shift < 0 ) sweep(); if( m_PMRC_state == ALLGROUND ) { setStimbits(); num_of_shift = static_cast<char>(arg_state - 1); } shiftby(num_of_shift); upload(); return static_cast<char>(m_PMRC_state = static_cast<State>(arg_state)); } void PMRC16ch::setBits(const uint32_t bits, int num_of_bits, Polarity arg_POL) { m_PMRC_POL = arg_POL; //reset shiftresister m_CLR = 0; update(); //enable insertion data to SR m_CLR = 1; for(int i = 0; i < num_of_bits; i++){ m_SER = (((bits >> i) & 0b0001) ^ m_PMRC_POL); //XOR Polarity update(); } upload(); } void PMRC16ch::sweep() { int num_of_shift = (16 + 1) - static_cast<int>(m_PMRC_state); shiftby(num_of_shift); m_PMRC_state = ALLGROUND; } void PMRC16ch::shiftby(int arg_num) { for(int i = 0; i < arg_num; i++) { // insert 1 XOR Polarity m_SER = 1 ^ m_PMRC_POL; update(); // insert 0 XOR Polarity m_SER = 0 ^ m_PMRC_POL; update(); } m_PMRC_state = static_cast<State>((static_cast<int>(m_PMRC_state) + arg_num) % (16 + 1)); } void PMRC16ch::setStimbits() { // insert 0 XOR Polarity m_SER = 0 ^ m_PMRC_POL; update(); // insert 1 XOR Polarity m_SER = 1 ^ m_PMRC_POL; update(); m_PMRC_state = CH1; } void PMRC16ch::update() { //Shift-resister Clock update m_SCK = 1; m_SCK = 1; m_SCK = 0; m_SCK = 0; } void PMRC16ch::upload() { //FF Clock Update m_RCK = 1; m_RCK = 1; m_RCK = 0; m_RCK = 0; }