5
5
J1850-PWM-Transceiver-Library
6
6
*/
7
7
8
- #include < Arduino.h>
9
- #include " avr/interrupt.h"
10
8
#include < PwmTransceiver.h>
11
9
10
+ volatile uint8_t _TX_PIN;
11
+ volatile uint8_t _RX_PIN;
12
+ volatile uint8_t _EN_PIN;
13
+ volatile uint8_t _MODE_PIN;
14
+ volatile uint32_t _BITRATE;
15
+ volatile uint32_t _BIT_TIME;
16
+ volatile uint32_t _HALF_BIT_TIME;
17
+ volatile uint32_t _ONE_THIRD_BIT_TIME;
18
+ volatile uint32_t _TWO_THIRD_BIT_TIME;
19
+ volatile bool _high_speed = false ;
20
+ volatile char _RX_BUFFER[BUFFER_SIZE];
21
+ volatile uint16_t _BUFFER_INDEX = 0 ;
22
+ volatile uint32_t _timeOut = 500 ; // uS
23
+ volatile unsigned long timeOldMicros;
24
+ volatile unsigned long timeOldMillis = 0 ;
25
+ volatile int _count = 7 ;
26
+ volatile char _rx_char = 0x00 ;
27
+ volatile bool _logic = true ; // 1: Direct; 0: Inverse
28
+
29
+ void isrPwmDecoder ()
30
+ {
31
+ if (digitalReadFast (_RX_PIN)==_logic)
32
+ {
33
+ timeOldMicros = micros ();
34
+ timeOldMillis = millis ();
35
+ }
36
+ else
37
+ {
38
+ bool bit = micros () > timeOldMicros + _HALF_BIT_TIME;
39
+ _rx_char ^= (-bit ^ _rx_char) & (1 << _count);
40
+ // Serial.print(bit);
41
+ if (_count > 0 ) _count--;
42
+ else {
43
+ _count = 7 ;
44
+ _RX_BUFFER[_BUFFER_INDEX] = _rx_char;
45
+ _BUFFER_INDEX++;
46
+ _rx_char = 0x00 ;
47
+ }
48
+ }
49
+ }
50
+
51
+ /*
52
+ void isrPwmDecoder()
53
+ {
54
+ timeOldMicros = micros();
55
+ while (digitalReadFast(_RX_PIN) == _logic);
56
+ bool bit = (micros() - timeOldMicros) > _HALF_BIT_TIME;
57
+ _rx_char ^= (-bit ^ _rx_char) & (1 << _count);
58
+ if (_count > 0) _count--;
59
+ else {
60
+ _count = 7;
61
+ _RX_BUFFER[_BUFFER_INDEX] = _rx_char;
62
+ _BUFFER_INDEX++;
63
+ _rx_char = 0x00;
64
+ }
65
+ timeOldMillis = millis();
66
+ }
67
+ */
12
68
PwmTransceiver::PwmTransceiver (uint8_t RX_PIN, uint8_t TX_PIN)
13
69
{
14
70
_RX_PIN = RX_PIN;
15
- pinMode (_RX_PIN, INPUT);
71
+ pinModeFast (_RX_PIN, INPUT);
16
72
_TX_PIN = TX_PIN;
17
- pinMode (_TX_PIN, OUTPUT);
73
+ pinModeFast (_TX_PIN, OUTPUT);
18
74
}
19
75
20
76
PwmTransceiver::PwmTransceiver (uint8_t RX_PIN, uint8_t TX_PIN, uint8_t MODE_PIN, uint8_t EN_PIN)
21
77
{
22
78
_RX_PIN = RX_PIN;
23
- pinMode (_RX_PIN, INPUT);
79
+ pinModeFast (_RX_PIN, INPUT);
24
80
_TX_PIN = TX_PIN;
25
- pinMode (_TX_PIN, OUTPUT);
81
+ pinModeFast (_TX_PIN, OUTPUT);
26
82
_MODE_PIN = MODE_PIN;
27
- pinMode (_MODE_PIN, OUTPUT);
83
+ pinModeFast (_MODE_PIN, OUTPUT);
28
84
_EN_PIN = EN_PIN;
29
- pinMode (_EN_PIN, OUTPUT);
85
+ pinModeFast (_EN_PIN, OUTPUT);
30
86
}
31
87
32
88
void PwmTransceiver::setRxPin (uint8_t RX_PIN)
33
89
{
34
90
_RX_PIN = RX_PIN;
35
- pinMode (_RX_PIN, INPUT);
91
+ pinModeFast (_RX_PIN, INPUT);
36
92
}
37
93
38
94
void PwmTransceiver::setTxPin (uint8_t TX_PIN)
39
95
{
40
96
_TX_PIN = TX_PIN;
41
- pinMode (_TX_PIN, OUTPUT);
97
+ pinModeFast (_TX_PIN, OUTPUT);
42
98
}
43
99
44
100
void PwmTransceiver::setEnablePin (uint8_t EN_PIN)
45
101
{
46
102
_EN_PIN = EN_PIN;
47
- pinMode (_EN_PIN, OUTPUT);
103
+ pinModeFast (_EN_PIN, OUTPUT);
48
104
}
49
105
50
106
void PwmTransceiver::setTxRxModePin (uint8_t MODE_PIN)
51
107
{
52
108
_MODE_PIN = MODE_PIN;
53
- pinMode (_MODE_PIN, OUTPUT);
109
+ pinModeFast (_MODE_PIN, OUTPUT);
54
110
}
55
111
56
112
void PwmTransceiver::setLogic (bool logic)
@@ -83,32 +139,32 @@ void PwmTransceiver::begin(uint32_t BITRATE)
83
139
_HALF_BIT_TIME = _BIT_TIME / 2 ;
84
140
_ONE_THIRD_BIT_TIME = _BIT_TIME / 3 ;
85
141
_TWO_THIRD_BIT_TIME = _BIT_TIME * 2 / 3 ;
86
- if (_logic) attachInterrupt ( digitalPinToInterrupt ( _RX_PIN) , isrPwmDecoder, RISING );
87
- else attachInterrupt ( digitalPinToInterrupt (_RX_PIN) , isrPwmDecoder, FALLING );
88
- flagDecoder = false ;
142
+ enableInterrupt ( _RX_PIN, isrPwmDecoder, CHANGE );
143
+ // if (_logic) enableInterrupt (_RX_PIN, isrPwmDecoder, RISING );
144
+ // else enableInterrupt(_RX_PIN, isrPwmDecoder, FALLING) ;
89
145
}
90
146
91
147
void PwmTransceiver::powerDown ()
92
148
{
93
- digitalWrite (_EN_PIN, LOW);
149
+ digitalWriteFast (_EN_PIN, LOW);
94
150
delay (15 );
95
151
}
96
152
97
153
void PwmTransceiver::powerUp ()
98
154
{
99
- digitalWrite (_EN_PIN, HIGH);
155
+ digitalWriteFast (_EN_PIN, HIGH);
100
156
delay (15 );
101
157
}
102
158
103
159
void PwmTransceiver::enableTxMode ()
104
160
{
105
- digitalWrite (_MODE_PIN, HIGH);
161
+ digitalWriteFast (_MODE_PIN, HIGH);
106
162
delayMicroseconds (500 );
107
163
}
108
164
109
165
void PwmTransceiver::enableRxMode ()
110
166
{
111
- digitalWrite (_MODE_PIN, LOW);
167
+ digitalWriteFast (_MODE_PIN, LOW);
112
168
delayMicroseconds (500 );
113
169
}
114
170
@@ -119,12 +175,12 @@ void PwmTransceiver::println(String str)
119
175
}
120
176
121
177
void PwmTransceiver::print (String str)
122
- {
178
+ {
123
179
uint16_t size = str.length () + 1 ;
124
180
char txt[size];
125
181
str.toCharArray (txt, size);
126
182
uint16_t i;
127
- for (i = 0 ; i < size; i++)
183
+ for (i = 0 ; i < size - 1 ; i++)
128
184
{
129
185
PwmTransceiver::print (txt[i]);
130
186
}
@@ -166,17 +222,17 @@ void PwmTransceiver::send(bool b)
166
222
if (b)
167
223
{
168
224
/* Send 66% HIGH, 33% LOW */
169
- digitalWrite (_TX_PIN, HIGH);
225
+ digitalWriteFast (_TX_PIN, HIGH);
170
226
delayMicroseconds (_TWO_THIRD_BIT_TIME);
171
- digitalWrite (_TX_PIN, LOW);
227
+ digitalWriteFast (_TX_PIN, LOW);
172
228
delayMicroseconds (_ONE_THIRD_BIT_TIME);
173
229
}
174
230
else
175
231
{
176
232
/* Send 33% HIGH, 66% LOW */
177
- digitalWrite (_TX_PIN, HIGH);
233
+ digitalWriteFast (_TX_PIN, HIGH);
178
234
delayMicroseconds (_ONE_THIRD_BIT_TIME);
179
- digitalWrite (_TX_PIN, LOW);
235
+ digitalWriteFast (_TX_PIN, LOW);
180
236
delayMicroseconds (_TWO_THIRD_BIT_TIME);
181
237
}
182
238
}
@@ -185,68 +241,22 @@ void PwmTransceiver::send(bool b)
185
241
if (b)
186
242
{
187
243
/* Send 66% HIGH, 33% LOW */
188
- digitalWrite (_TX_PIN, HIGH);
244
+ digitalWriteFast (_TX_PIN, HIGH);
189
245
delay (_TWO_THIRD_BIT_TIME);
190
- digitalWrite (_TX_PIN, LOW);
246
+ digitalWriteFast (_TX_PIN, LOW);
191
247
delay (_ONE_THIRD_BIT_TIME);
192
248
}
193
249
else
194
250
{
195
251
/* Send 33% HIGH, 66% LOW */
196
- digitalWrite (_TX_PIN, HIGH);
252
+ digitalWriteFast (_TX_PIN, HIGH);
197
253
delay (_ONE_THIRD_BIT_TIME);
198
- digitalWrite (_TX_PIN, LOW);
254
+ digitalWriteFast (_TX_PIN, LOW);
199
255
delay (_TWO_THIRD_BIT_TIME);
200
256
}
201
257
}
202
258
}
203
259
204
- static void PwmTransceiver::isrPwmDecoder ()
205
- {
206
- timeOld = millis ();
207
- flagDecoder = true ;
208
- }
209
-
210
- void PwmTransceiver::receive ()
211
- {
212
- if (flagDecoder)
213
- {
214
- flagDecoder = false ;
215
-
216
- if (_high_speed)
217
- {
218
- delayMicroseconds (_HALF_BIT_TIME);
219
- }
220
- else
221
- {
222
- delay (_HALF_BIT_TIME);
223
- }
224
-
225
- // https://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit
226
-
227
- if (_logic)
228
- {
229
- _rx_char ^= (-digitalRead (_RX_PIN) ^ _rx_char) & (1 << _count);
230
- }
231
- else
232
- {
233
- _rx_char ^= (-(!digitalRead (_RX_PIN)) ^ _rx_char) & (1 << _count);
234
- }
235
-
236
- if (_count > 0 )
237
- {
238
- _count--;
239
- }
240
- else
241
- {
242
- _count = 7 ;
243
- _RX_BUFFER[_BUFFER_INDEX] = _rx_char;
244
- _BUFFER_INDEX++;
245
- _rx_char = 0x00 ;
246
- }
247
- }
248
- }
249
-
250
260
bool PwmTransceiver::isReceiving ()
251
261
{
252
262
if (_BUFFER_INDEX > BUFFER_SIZE - 1 )
@@ -255,22 +265,19 @@ bool PwmTransceiver::isReceiving()
255
265
_BUFFER_INDEX = BUFFER_SIZE - 1 ;
256
266
return false ;
257
267
}
258
- // Check if millis has resetted
259
- if (millis () < timeOld) timeOld = millis ();
260
268
261
269
// Check the lost of synchronicity
262
- if (millis () > (timeOld + _timeOut))
270
+
271
+ if (millis () > timeOldMillis + _timeOut)
263
272
{
264
273
_rx_char = 0x00 ;
265
274
_count = 7 ;
266
275
return false ;
267
276
}
268
- else
269
- {
270
- return true ;
271
- }
277
+
278
+ return true ;
272
279
}
273
-
280
+
274
281
bool PwmTransceiver::available ()
275
282
{
276
283
return (_BUFFER_INDEX > 0 );
0 commit comments