1#include "PicoLCClass.h" 2#include "internal/PicoLCPins.h" 3#include "PicoLCInput.h" 4#include "PicoLCTimer.h" 9#define MCPREG_IODIRA 0x00 10#define MCPREG_IODIRB 0x01 11#define MCPREG_IPOLA 0x02 12#define MCPREG_IPOLB 0x03 13#define MCPREG_GPINTENA 0x04 14#define MCPREG_GPINTENB 0x05 15#define MCPREG_DEFVALA 0x06 16#define MCPREG_DEFVALB 0x07 17#define MCPREG_INTCONA 0x08 18#define MCPREG_INTCONB 0x09 19#define MCPREG_IOCON 0x0A 20#define MCPREG_GPPUA 0x0C 21#define MCPREG_GPPUB 0x0D 22#define MCPREG_INTFA 0x0E 23#define MCPREG_INTFB 0x0F 24#define MCPREG_INTCAPA 0x10 25#define MCPREG_INTCAPB 0x11 26#define MCPREG_GPIOA 0x12 27#define MCPREG_GPIOB 0x13 28#define MCPREG_OLATA 0x14 29#define MCPREG_OLATB 0x15 34#define SPI_SETTINGS SPISettings(10000000, MSBFIRST, SPI_MODE0) 36static void mcpWrite(uint8_t reg, uint8_t value) {
37 digitalWrite( picolc::pins::SPI1_CS, LOW);
38 SPI1.beginTransaction(SPI_SETTINGS);
39 SPI1.transfer(MCP_WRITE);
42 SPI1.endTransaction();
43 digitalWrite( picolc::pins::SPI1_CS, HIGH);
45static uint8_t mcpRead(uint8_t reg) {
46 digitalWrite( picolc::pins::SPI1_CS, LOW);
47 SPI1.beginTransaction(SPI_SETTINGS);
48 SPI1.transfer(MCP_READ);
50 uint8_t value = SPI1.transfer(0x00);
51 SPI1.endTransaction();
52 digitalWrite( picolc::pins::SPI1_CS, HIGH);
55static void mcpWrite16(uint8_t reg, uint16_t value) {
56 digitalWrite( picolc::pins::SPI1_CS, LOW);
57 SPI1.beginTransaction(SPI_SETTINGS);
58 SPI1.transfer(MCP_WRITE);
60 SPI1.transfer((value >> 8) & 0xFF);
61 SPI1.transfer(value & 0xFF);
62 SPI1.endTransaction();
63 digitalWrite( picolc::pins::SPI1_CS, HIGH);
65static uint16_t mcpRead16(uint8_t reg) {
66 digitalWrite( picolc::pins::SPI1_CS, LOW);
67 SPI1.beginTransaction(SPI_SETTINGS);
68 SPI1.transfer(MCP_READ);
70 uint16_t value = (SPI1.transfer(0x00) << 8);
71 value |= SPI1.transfer(0x00);
72 SPI1.endTransaction();
73 digitalWrite( picolc::pins::SPI1_CS, HIGH);
78 Y0(), Y1(), Y2(), Y3(),
79 X0(*this), X1(*this), X2(*this), X3(*this),
86 pinMode( picolc::pins::CommTX, OUTPUT);
87 pinMode( picolc::pins::CommRX, INPUT);
88 pinMode( picolc::pins::CommDE, OUTPUT);
89 pinMode( picolc::pins::CommRE, OUTPUT);
90 digitalWrite( picolc::pins::CommDE, LOW);
91 digitalWrite( picolc::pins::CommRE, HIGH);
93 pinMode( picolc::pins::OutputEnable, OUTPUT);
94 digitalWrite( picolc::pins::OutputEnable, LOW);
95 pinMode( picolc::pins::OutputFault, INPUT);
96 pinMode( picolc::pins::BoardReset, OUTPUT);
97 digitalWrite( picolc::pins::BoardReset, HIGH);
99 pinMode( picolc::pins::Y0_EN, OUTPUT);
100 pinMode( picolc::pins::Y1_EN, OUTPUT);
101 pinMode( picolc::pins::Y2_EN, OUTPUT);
102 pinMode( picolc::pins::Y3_EN, OUTPUT);
104 pinMode( picolc::pins::SPI1_CS, OUTPUT);
105 digitalWrite( picolc::pins::SPI1_CS, HIGH);
106 SPI1.setTX(picolc::pins::SPI1_MOSI);
107 SPI1.setRX(picolc::pins::SPI1_MISO);
108 SPI1.setSCK(picolc::pins::SPI1_SCK);
109 SPI1.setCS(picolc::pins::SPI1_CS);
113 mcpWrite16(MCPREG_IODIRA, 0xFF80 );
114 mcpWrite16(MCPREG_GPPUA, 0xFFFF );
115 mcpWrite16(MCPREG_IPOLA, 0xFFFF );
117 analogWriteFreq(1000);
118 analogWriteRange(1000);
122 _currentMillis = millis();
124 uint16_t inval = mcpRead16(MCPREG_GPIOA);
125 X0.update(_currentMillis, (inval >> picolc::pins::X0bit) & 0x01);
126 X1.update(_currentMillis, (inval >> picolc::pins::X1bit) & 0x01);
127 X2.update(_currentMillis, (inval >> picolc::pins::X2bit) & 0x01);
128 X3.update(_currentMillis, (inval >> picolc::pins::X3bit) & 0x01);
130 uint16_t outEnables = 0;
131 uint16_t outDirs = 0;
133 out =
Y0.update(_currentMillis);
134 outEnables |= (out & 0x01) << picolc::pins::Y0_EN;
135 outDirs |= (((out & 0x02) >> 1) << (picolc::pins::Y0_DIRbit));
137 out = Y1.update(_currentMillis);
138 outEnables |= (out & 0x01) << picolc::pins::Y1_EN;
139 outDirs |= (((out & 0x02) >> 1) << (picolc::pins::Y1_DIRbit));
141 out = Y2.update(_currentMillis);
142 outEnables |= (out & 0x01) << picolc::pins::Y2_EN;
143 outDirs |= (((out & 0x02) >> 1) << (picolc::pins::Y2_DIRbit));
145 out = Y3.update(_currentMillis);
146 outEnables |= (out & 0x01) << picolc::pins::Y3_EN;
147 outDirs |= (((out & 0x02) >> 1) << (picolc::pins::Y3_DIRbit));
150 outDirs |= (out & 0x01) << picolc::pins::ScanLEDbit;
152 out = CommLED.update(_currentMillis);
153 outDirs |= (out & 0x01) << picolc::pins::LED_485bit;
155 out = FaultLED.update(_currentMillis);
156 outDirs |= (out & 0x01) << picolc::pins::FaultLEDbit;
159 mcpWrite16(MCPREG_GPIOA, outDirs);
161 digitalWrite(picolc::pins::Y0_EN, (outEnables >> picolc::pins::Y0_EN) & 0x01);
162 digitalWrite(picolc::pins::Y1_EN, (outEnables >> picolc::pins::Y1_EN) & 0x01);
163 digitalWrite(picolc::pins::Y2_EN, (outEnables >> picolc::pins::Y2_EN) & 0x01);
164 digitalWrite(picolc::pins::Y3_EN, (outEnables >> picolc::pins::Y3_EN) & 0x01);
166 RunStopButton.update(_currentMillis, (inval >> picolc::pins::RunStopBtnbit) & 0x01);
167 UserButton.update(_currentMillis, (inval >> picolc::pins::UserBtnbit) & 0x01);
168 BootButton.update(_currentMillis, BOOTSEL ? 1 : 0);
172 return _currentMillis;
float supplyVoltage() const
Measures the PicoLC supply voltage.
PicoLCOutput Y0
Hardware outputs Y0 through Y3.
uint32_t cycles() const
Returns the number of completed update cycles.
void resetOutputDriver()
Resets the hardware output driver.
PicoLCInput X0
Hardware inputs X0 through X3.
void update()
Advances PicoLC by one application scan.
bool outputFault() const
Reports the current output-driver fault indication.
void disableOutputs()
Disables all physical output-driver channels.
PicoLCButton RunStopButton
Board-defined control buttons.
uint32_t currentMillis() const
Returns the timestamp captured for the current scan.
PicoLCLED StatusLED
Board indicator LEDs.
void enableOutputs()
Enables physical output-driver operation.
PicoLC()
Constructs the PicoLC interface and its child hardware objects.
bool outputsEnabled() const
Reports whether physical outputs are globally enabled.
void begin()
Initializes PicoLC hardware and child objects.
PicoLCPair P0
Paired-output controllers for Y0/Y1 and Y2/Y3.