PicoLC Arduino Library
Arduino library for PicoLC hardware
Loading...
Searching...
No Matches
PicoLC.cpp
1#include "PicoLCClass.h"
2#include "internal/PicoLCPins.h"
3#include "PicoLCInput.h"
4#include "PicoLCTimer.h"
5
6#include <Arduino.h>
7#include <SPI.h>
8
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
30
31#define MCP_WRITE 0x40
32#define MCP_READ 0x41
33
34#define SPI_SETTINGS SPISettings(10000000, MSBFIRST, SPI_MODE0)
35
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);
40 SPI1.transfer(reg);
41 SPI1.transfer(value);
42 SPI1.endTransaction();
43 digitalWrite( picolc::pins::SPI1_CS, HIGH);
44}
45static uint8_t mcpRead(uint8_t reg) {
46 digitalWrite( picolc::pins::SPI1_CS, LOW);
47 SPI1.beginTransaction(SPI_SETTINGS);
48 SPI1.transfer(MCP_READ);
49 SPI1.transfer(reg);
50 uint8_t value = SPI1.transfer(0x00);
51 SPI1.endTransaction();
52 digitalWrite( picolc::pins::SPI1_CS, HIGH);
53 return value;
54}
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);
59 SPI1.transfer(reg);
60 SPI1.transfer((value >> 8) & 0xFF);
61 SPI1.transfer(value & 0xFF);
62 SPI1.endTransaction();
63 digitalWrite( picolc::pins::SPI1_CS, HIGH);
64}
65static uint16_t mcpRead16(uint8_t reg) {
66 digitalWrite( picolc::pins::SPI1_CS, LOW);
67 SPI1.beginTransaction(SPI_SETTINGS);
68 SPI1.transfer(MCP_READ);
69 SPI1.transfer(reg);
70 uint16_t value = (SPI1.transfer(0x00) << 8);
71 value |= SPI1.transfer(0x00);
72 SPI1.endTransaction();
73 digitalWrite( picolc::pins::SPI1_CS, HIGH);
74 return value;
75}
76
78 Y0(), Y1(), Y2(), Y3(),
79 X0(*this), X1(*this), X2(*this), X3(*this),
80 P0(0), P1(2),
81 StatusLED(), CommLED(), FaultLED(),
82 RunStopButton(*this),UserButton(*this), BootButton(*this) {
83}
84
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);
92
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);
98
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);
103
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);
110 SPI1.begin();
111 delay(1);
112
113 mcpWrite16(MCPREG_IODIRA, 0xFF80 );
114 mcpWrite16(MCPREG_GPPUA, 0xFFFF );
115 mcpWrite16(MCPREG_IPOLA, 0xFFFF );
116
117 analogWriteFreq(1000);
118 analogWriteRange(1000);
119}
120
122 _currentMillis = millis();
123 _cycles++;
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);
129
130 uint16_t outEnables = 0;
131 uint16_t outDirs = 0;
132 uint16_t out = 0;
133 out = Y0.update(_currentMillis);
134 outEnables |= (out & 0x01) << picolc::pins::Y0_EN;
135 outDirs |= (((out & 0x02) >> 1) << (picolc::pins::Y0_DIRbit));
136
137 out = Y1.update(_currentMillis);
138 outEnables |= (out & 0x01) << picolc::pins::Y1_EN;
139 outDirs |= (((out & 0x02) >> 1) << (picolc::pins::Y1_DIRbit));
140
141 out = Y2.update(_currentMillis);
142 outEnables |= (out & 0x01) << picolc::pins::Y2_EN;
143 outDirs |= (((out & 0x02) >> 1) << (picolc::pins::Y2_DIRbit));
144
145 out = Y3.update(_currentMillis);
146 outEnables |= (out & 0x01) << picolc::pins::Y3_EN;
147 outDirs |= (((out & 0x02) >> 1) << (picolc::pins::Y3_DIRbit));
148
149 out = StatusLED.update(_currentMillis);
150 outDirs |= (out & 0x01) << picolc::pins::ScanLEDbit;
151
152 out = CommLED.update(_currentMillis);
153 outDirs |= (out & 0x01) << picolc::pins::LED_485bit;
154
155 out = FaultLED.update(_currentMillis);
156 outDirs |= (out & 0x01) << picolc::pins::FaultLEDbit;
157
158 //outDirs >>= 8;
159 mcpWrite16(MCPREG_GPIOA, outDirs);
160
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);
165
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);
169}
170
171uint32_t PicoLC::currentMillis() const {
172 return _currentMillis;
173}
174
175uint32_t PicoLC::cycles() const {
176 return _cycles;
177}
178
180
181}
182
186
188 return false;
189}
190
192 return false;
193}
194
198
200 return 0.0F;
201}
float supplyVoltage() const
Measures the PicoLC supply voltage.
Definition PicoLC.cpp:199
PicoLCOutput Y0
Hardware outputs Y0 through Y3.
Definition PicoLCClass.h:42
uint32_t cycles() const
Returns the number of completed update cycles.
Definition PicoLC.cpp:175
void resetOutputDriver()
Resets the hardware output driver.
Definition PicoLC.cpp:195
PicoLCInput X0
Hardware inputs X0 through X3.
Definition PicoLCClass.h:45
void update()
Advances PicoLC by one application scan.
Definition PicoLC.cpp:121
bool outputFault() const
Reports the current output-driver fault indication.
Definition PicoLC.cpp:191
void disableOutputs()
Disables all physical output-driver channels.
Definition PicoLC.cpp:183
PicoLCButton RunStopButton
Board-defined control buttons.
Definition PicoLCClass.h:54
uint32_t currentMillis() const
Returns the timestamp captured for the current scan.
Definition PicoLC.cpp:171
PicoLCLED StatusLED
Board indicator LEDs.
Definition PicoLCClass.h:51
void enableOutputs()
Enables physical output-driver operation.
Definition PicoLC.cpp:179
PicoLC()
Constructs the PicoLC interface and its child hardware objects.
Definition PicoLC.cpp:77
bool outputsEnabled() const
Reports whether physical outputs are globally enabled.
Definition PicoLC.cpp:187
void begin()
Initializes PicoLC hardware and child objects.
Definition PicoLC.cpp:85
PicoLCPair P0
Paired-output controllers for Y0/Y1 and Y2/Y3.
Definition PicoLCClass.h:48