howto/come_gestire_comunicazione_CAN_con_PUZZE.md
... ...
@@ -0,0 +1,2615 @@
1
+Quando si ha più di una **periferica PUZZLE** con cui comunicare in **CAN**, il modo per gestirle è di inlcudere nel **common.h** la libreria **puzzle.h**
2
+
3
+Nella libreria è presente anche la parte per la comunicazione in RS485.
4
+
5
+Nel common.h o comunque in un file .h incluso nel common:
6
+
7
+ // For multiperif:
8
+ // #define PUZZLE_PERIFS 2, 3, 4, ...
9
+ #ifndef PUZZLE_PERIFS
10
+ #define PUZZLE_PERIFS 1
11
+ #endif
12
+
13
+ //----------------------------------------------
14
+ #ifdef linux
15
+ #define PortaCOM COM2
16
+ #else
17
+ #define PortaCOM COM3
18
+ #endif
19
+
20
+
21
+ // Tipo di comunicazione
22
+ #define P_RS485 0
23
+ #define P_CAN 1
24
+
25
+ // Configurazione connettori X1, ... X8
26
+ #define EMPTY 0 // Empty connector
27
+ #define UA13144 1 // Analog input 0-20mA
28
+ #define UA13143 2 // Analog input 0-10V
29
+ #define UA23141 3 // Digital input PNP
30
+ #define UA13151 4 // Digital output PNP
31
+ #define UA13152 5 // Digital output NPN
32
+ #define UA13171 6 // PT100
33
+ #define UA13161 7 // Analog output (PWM)
34
+
35
+ // Questi vanno in xn_config[]
36
+ #define C_EMPTY 21
37
+ #define C_ADC 22
38
+ #define C_PWM 23
39
+ #define C_IN 24
40
+ #define C_OUT 25
41
+ #define C_PT100 26
42
+
43
+ #define DIM_RX 33
44
+ #define DIM_TX 41
45
+ #define DIM_CONFIG 8
46
+ #define START_TX 0x00
47
+
48
+ volatile char xn_config[] = { C_EMPTY, // X1
49
+ C_EMPTY, // X2
50
+ C_EMPTY, // X3
51
+ C_EMPTY, // X4
52
+ C_EMPTY, // X5
53
+ C_EMPTY, // X6
54
+ C_EMPTY, // X7
55
+ C_EMPTY};// X8
56
+ char msg_rx[DIM_RX];
57
+ char msg_tx[DIM_TX];
58
+
59
+ int puzzle_version=0; // FW version
60
+ int puzzle_com=0;
61
+
62
+ // Encoders
63
+ volatile long p_encoder1;
64
+ volatile long p_encoder2;
65
+
66
+ volatile char puzzle_reset=0; // reset request flag
67
+ volatile char puzzle_reset_perif[] = {0,0,0,0,0,0,0,0};
68
+ volatile char puzzle_update=0; // update request flag
69
+ int puzzle_disc_cnt = 0;
70
+ int puzzle_perif_on = 1; // diventa 0 se scollego la periferica
71
+ int prx_cnt=0;
72
+ int ptx_cnt=0;
73
+
74
+ volatile char config_on = 0;
75
+ volatile char serial_port_on = 0;
76
+ volatile int puzzle_status = 0;
77
+ volatile int p_dipswitch_status = 0; // dip switch status
78
+ volatile int p_ext1_on = 0; // EXP1 & EXP2 I/O & ENC1 on (1) off (0)
79
+ volatile int p_ext2_on = 0; // EXP3 to EXP8 I/O & ENC2 on (1) off (0)
80
+
81
+ void puzzle_reboot(void); // fai il reboot della/le periferica/che
82
+ void create_config(void);
83
+ void parse_rx(void);
84
+ void create_tx(void);
85
+ void rw_puzzle(void);
86
+ void puzzle_task(void);
87
+ void puzzle_start(void); // RS485
88
+ void puzzle_start_can(char, char); // CAN (EXP ON/OFF, ENCODER ON/OFF)
89
+ void puzzle_task_can(void);
90
+ void puzzle_task_can_rx(void);
91
+ float pt100_calc(int, int);
92
+
93
+ // bootloader
94
+ void puzzle_stop(void); // RS485 - bootloader
95
+ void puzzle_stop_can(void); // CAN
96
+
97
+
98
+ // ----------------------- RS485 -------------------------
99
+
100
+ #define CMD_CONFIG 1
101
+ #define CMD_DRIVE 2
102
+ #define CMD_OK 3
103
+ #define CMD_NO 4
104
+
105
+ // Comandi bootloader (da definire anche all'interno del bootloader)
106
+ #define CMD_BOOT_WU 5 // wake up del bootloader (rx)
107
+
108
+ void RXCom(COM *);
109
+ void parsing_test_pettine_com(void);
110
+ void timer_tx_rx_perif(void);
111
+ //----------------------------------------------
112
+ COM *Com=0;
113
+ volatile char flag_test_tx_com3=0;
114
+ // struttura unificata buffer messaggi
115
+ typedef struct COM_MESSAGE
116
+ {
117
+ char cmd; // comando
118
+ short para[100]; // operandi
119
+ }COM_MESSAGE;
120
+ volatile COM_MESSAGE txmess;
121
+ volatile COM_MESSAGE rxmess;
122
+ volatile int rxsize;
123
+ volatile U32 cnt_reply=0;
124
+ volatile char flag_comunica_con_perif=0;
125
+ //----------------------------------------------
126
+ typedef struct COM_TX_RX_MESSAGE_test
127
+ {
128
+ char cmd; // comando
129
+ U8 emb_msg[DIM_TX+1]; // messaggio incapsulato // bootloader
130
+ }COM_TX_RX_MESSAGE_test __attribute__((PACKET));
131
+
132
+
133
+
134
+ //----------------------------------------------
135
+ void tx_cmd_msg(U8 command)
136
+ {
137
+ COM_TX_RX_MESSAGE_test *tx_1=(COM_TX_RX_MESSAGE_test *)&txmess;
138
+ tx_1->cmd = command;
139
+
140
+ int i;
141
+ for (i=0; i<DIM_TX; i++) {
142
+ tx_1->emb_msg[i] = msg_tx[i];
143
+ }
144
+
145
+ bsave(Com,tx_1,sizeof(COM_TX_RX_MESSAGE_test));
146
+ ptx_cnt++;
147
+ }
148
+ //----------------------------------------------
149
+ void install_port(void)
150
+ {
151
+ com_close(Com);
152
+ com_disable(Com);
153
+ com_open(Com,115200);
154
+ protocol_mode(Com,1); // COMx IN MODO 1 (BLOAD/BSAVE)
155
+ onrx(Com,RXCom); // RXCom() = callback linked/called/executed when received a complete packet Syel mode 1
156
+ //onrx(Com,0);
157
+ Com->centr=0x01; // centr = who sends
158
+ Com->perif=0x02; // perif = who receives
159
+ com_enable(Com); // ABILITA LA COM
160
+ }
161
+ //----------------------------------------------
162
+ void RXCom(COM *Com)
163
+ {
164
+ prx_cnt++;
165
+ puzzle_disc_cnt = 0;
166
+ rxsize=bload(Com,&rxmess,sizeof(rxmess));
167
+ int i;
168
+
169
+ if(rxsize) {
170
+ COM_TX_RX_MESSAGE_test* rx1 = (COM_TX_RX_MESSAGE_test*)&rxmess;
171
+ for (i=0; i<DIM_RX; i++) {
172
+ msg_rx[i] = rx1->emb_msg[i];
173
+ }
174
+ parse_rx(); // parsizzo gli input
175
+ }
176
+ }
177
+ //----------------------------------------------
178
+ void timer_tx_rx_perif(void)
179
+ {
180
+ flag_comunica_con_perif=1;
181
+ }
182
+
183
+ void puzzle_reboot()
184
+ {
185
+ puzzle_reset = 1;
186
+ puzzle_reset_perif[0] = 1;
187
+ puzzle_reset_perif[1] = 1;
188
+ puzzle_reset_perif[2] = 1;
189
+ puzzle_reset_perif[3] = 1;
190
+ puzzle_reset_perif[4] = 1;
191
+ puzzle_reset_perif[5] = 1;
192
+ puzzle_reset_perif[6] = 1;
193
+ puzzle_reset_perif[7] = 1;
194
+ }
195
+
196
+
197
+ // INGRESSI E USCITE
198
+ volatile char p_i1 = 0;
199
+ volatile char p_i2 = 0;
200
+ volatile char p_i3 = 0;
201
+ volatile char p_i4 = 0;
202
+ volatile char p_i5 = 0;
203
+ volatile char p_i6 = 0;
204
+ volatile char p_i7 = 0;
205
+ volatile char p_i8 = 0;
206
+ volatile char p_i9 = 0;
207
+ volatile char p_i10 = 0;
208
+ volatile char p_i11 = 0;
209
+ volatile char p_i12 = 0;
210
+ volatile char p_i13 = 0;
211
+ volatile char p_i14 = 0;
212
+ volatile char p_i15 = 0;
213
+ volatile char p_i16 = 0;
214
+ volatile char p_i17 = 0;
215
+ volatile char p_i18 = 0;
216
+ volatile char p_i19 = 0;
217
+ volatile char p_i20 = 0;
218
+ volatile char p_i21 = 0;
219
+ volatile char p_i22 = 0;
220
+ volatile char p_i23 = 0;
221
+ volatile char p_i24 = 0;
222
+ volatile char p_i25 = 0;
223
+ volatile char p_i26 = 0;
224
+ volatile char p_i27 = 0;
225
+ volatile char p_i28 = 0;
226
+ volatile char p_i29 = 0;
227
+ volatile char p_i30 = 0;
228
+ volatile char p_i31 = 0;
229
+ volatile char p_i32 = 0;
230
+ volatile char p_i33 = 0;
231
+ volatile char p_i34 = 0;
232
+ volatile char p_i35 = 0;
233
+ volatile char p_i36 = 0;
234
+ volatile char p_i37 = 0;
235
+ volatile char p_i38 = 0;
236
+ volatile char p_i39 = 0;
237
+ volatile char p_i40 = 0;
238
+ volatile char p_i41 = 0;
239
+ volatile char p_i42 = 0;
240
+ volatile char p_i43 = 0;
241
+ volatile char p_i44 = 0;
242
+ volatile char p_i45 = 0;
243
+ volatile char p_i46 = 0;
244
+ volatile char p_i47 = 0;
245
+ volatile char p_i48 = 0;
246
+ volatile char p_i49 = 0;
247
+ volatile char p_i50 = 0;
248
+ volatile char p_i51 = 0;
249
+ volatile char p_i52 = 0;
250
+ volatile char p_i53 = 0;
251
+ volatile char p_i54 = 0;
252
+ volatile char p_i55 = 0;
253
+ volatile char p_i56 = 0;
254
+ volatile char p_i57 = 0;
255
+ volatile char p_i58 = 0;
256
+ volatile char p_i59 = 0;
257
+ volatile char p_i60 = 0;
258
+ volatile char p_i61 = 0;
259
+ volatile char p_i62 = 0;
260
+ volatile char p_i63 = 0;
261
+ volatile char p_i64 = 0;
262
+
263
+ volatile unsigned char *p__i__[] = {&p_i1, &p_i2, &p_i3, &p_i4, &p_i5,
264
+ &p_i6, &p_i7, &p_i8, &p_i9, &p_i10,
265
+ &p_i11, &p_i12, &p_i13, &p_i14, &p_i15,
266
+ &p_i16, &p_i17, &p_i18, &p_i19, &p_i20,
267
+ &p_i21, &p_i22, &p_i23, &p_i24, &p_i25,
268
+ &p_i26, &p_i27, &p_i28, &p_i29, &p_i30,
269
+ &p_i31, &p_i32, &p_i33, &p_i34, &p_i35,
270
+ &p_i36, &p_i37, &p_i38, &p_i39, &p_i40,
271
+ &p_i41, &p_i42, &p_i43, &p_i44, &p_i45,
272
+ &p_i46, &p_i47, &p_i48, &p_i49, &p_i50,
273
+ &p_i51, &p_i52, &p_i53, &p_i54, &p_i55,
274
+ &p_i56, &p_i57, &p_i58, &p_i59, &p_i60,
275
+ &p_i61, &p_i62, &p_i63, &p_i64};
276
+
277
+
278
+ volatile char p_o1 = 0;
279
+ volatile char p_o2 = 0;
280
+ volatile char p_o3 = 0;
281
+ volatile char p_o4 = 0;
282
+ volatile char p_o5 = 0;
283
+ volatile char p_o6 = 0;
284
+ volatile char p_o7 = 0;
285
+ volatile char p_o8 = 0;
286
+ volatile char p_o9 = 0;
287
+ volatile char p_o10 = 0;
288
+ volatile char p_o11 = 0;
289
+ volatile char p_o12 = 0;
290
+ volatile char p_o13 = 0;
291
+ volatile char p_o14 = 0;
292
+ volatile char p_o15 = 0;
293
+ volatile char p_o16 = 0;
294
+ volatile char p_o17 = 0;
295
+ volatile char p_o18 = 0;
296
+ volatile char p_o19 = 0;
297
+ volatile char p_o20 = 0;
298
+ volatile char p_o21 = 0;
299
+ volatile char p_o22 = 0;
300
+ volatile char p_o23 = 0;
301
+ volatile char p_o24 = 0;
302
+ volatile char p_o25 = 0;
303
+ volatile char p_o26 = 0;
304
+ volatile char p_o27 = 0;
305
+ volatile char p_o28 = 0;
306
+ volatile char p_o29 = 0;
307
+ volatile char p_o30 = 0;
308
+ volatile char p_o31 = 0;
309
+ volatile char p_o32 = 0;
310
+ volatile char p_o33 = 0;
311
+ volatile char p_o34 = 0;
312
+ volatile char p_o35 = 0;
313
+ volatile char p_o36 = 0;
314
+ volatile char p_o37 = 0;
315
+ volatile char p_o38 = 0;
316
+ volatile char p_o39 = 0;
317
+ volatile char p_o40 = 0;
318
+ volatile char p_o41 = 0;
319
+ volatile char p_o42 = 0;
320
+ volatile char p_o43 = 0;
321
+ volatile char p_o44 = 0;
322
+ volatile char p_o45 = 0;
323
+ volatile char p_o46 = 0;
324
+ volatile char p_o47 = 0;
325
+ volatile char p_o48 = 0;
326
+ volatile char p_o49 = 0;
327
+ volatile char p_o50 = 0;
328
+ volatile char p_o51 = 0;
329
+ volatile char p_o52 = 0;
330
+ volatile char p_o53 = 0;
331
+ volatile char p_o54 = 0;
332
+ volatile char p_o55 = 0;
333
+ volatile char p_o56 = 0;
334
+ volatile char p_o57 = 0;
335
+ volatile char p_o58 = 0;
336
+ volatile char p_o59 = 0;
337
+ volatile char p_o60 = 0;
338
+ volatile char p_o61 = 0;
339
+ volatile char p_o62 = 0;
340
+ volatile char p_o63 = 0;
341
+ volatile char p_o64 = 0;
342
+
343
+ volatile unsigned char *p__o__[] = {&p_o1, &p_o2, &p_o3, &p_o4, &p_o5,
344
+ &p_o6, &p_o7, &p_o8, &p_o9, &p_o10,
345
+ &p_o11, &p_o12, &p_o13, &p_o14, &p_o15,
346
+ &p_o16, &p_o17, &p_o18, &p_o19, &p_o20,
347
+ &p_o21, &p_o22, &p_o23, &p_o24, &p_o25,
348
+ &p_o26, &p_o27, &p_o28, &p_o29, &p_o30,
349
+ &p_o31, &p_o32, &p_o33, &p_o34, &p_o35,
350
+ &p_o36, &p_o37, &p_o38, &p_o39, &p_o40,
351
+ &p_o41, &p_o42, &p_o43, &p_o44, &p_o45,
352
+ &p_o46, &p_o47, &p_o48, &p_o49, &p_o50,
353
+ &p_o51, &p_o52, &p_o53, &p_o54, &p_o55,
354
+ &p_o56, &p_o57, &p_o58, &p_o59, &p_o60,
355
+ &p_o61, &p_o62, &p_o63, &p_o64};
356
+
357
+
358
+
359
+ // Valori 0-4095 degli input analogici
360
+ volatile int x1_anal;
361
+ volatile int x2_anal;
362
+ volatile int x3_anal;
363
+ volatile int x4_anal;
364
+ volatile int x5_anal;
365
+ volatile int x6_anal;
366
+ volatile int x7_anal;
367
+ volatile int x8_anal;
368
+ volatile int* __xn_anal__[] = {&x1_anal, &x2_anal, &x3_anal, &x4_anal, &x5_anal, &x6_anal, &x7_anal, &x8_anal};
369
+
370
+ // Valori a 16 bit delle PT100
371
+ volatile int x1_pt100_raw;
372
+ volatile int x2_pt100_raw;
373
+ volatile int x3_pt100_raw;
374
+ volatile int x4_pt100_raw;
375
+ volatile int x5_pt100_raw;
376
+ volatile int x6_pt100_raw;
377
+ volatile int x7_pt100_raw;
378
+ volatile int x8_pt100_raw;
379
+ volatile int* __xn_pt100_raw__[] = {&x1_pt100_raw, &x2_pt100_raw, &x3_pt100_raw, &x4_pt100_raw, &x5_pt100_raw, &x6_pt100_raw, &x7_pt100_raw, &x8_pt100_raw};
380
+
381
+ // Valori float in Celsius
382
+ float x1_pt100;
383
+ float x2_pt100;
384
+ float x3_pt100;
385
+ float x4_pt100;
386
+ float x5_pt100;
387
+ float x6_pt100;
388
+ float x7_pt100;
389
+ float x8_pt100;
390
+ volatile float* __xn_pt100__[] = {&x1_pt100, &x2_pt100, &x3_pt100, &x4_pt100, &x5_pt100, &x6_pt100, &x7_pt100, &x8_pt100};
391
+
392
+
393
+ // Ingressi digitali XN
394
+ volatile char x1_digin;
395
+ volatile char x2_digin;
396
+ volatile char x3_digin;
397
+ volatile char x4_digin;
398
+ volatile char x5_digin;
399
+ volatile char x6_digin;
400
+ volatile char x7_digin;
401
+ volatile char x8_digin;
402
+ volatile char *__xn_digin__[] = {&x1_digin, &x2_digin, &x3_digin, &x4_digin, &x5_digin, &x6_digin, &x7_digin, &x8_digin};
403
+
404
+ volatile char x1_i1;
405
+ volatile char x1_i2;
406
+ volatile char x2_i1;
407
+ volatile char x2_i2;
408
+ volatile char x3_i1;
409
+ volatile char x3_i2;
410
+ volatile char x4_i1;
411
+ volatile char x4_i2;
412
+ volatile char x5_i1;
413
+ volatile char x5_i2;
414
+ volatile char x6_i1;
415
+ volatile char x6_i2;
416
+ volatile char x7_i1;
417
+ volatile char x7_i2;
418
+ volatile char x8_i1;
419
+ volatile char x8_i2;
420
+
421
+ // Valori ricalcolati
422
+ volatile float xn_ua13141[8]; // UA 13141 - 0-3V3
423
+ volatile float xn_ua13142[8]; // UA 13142 - 0-5V
424
+ volatile float xn_ua13143[8]; // UA 13143 - 0-10V
425
+ volatile float xn_ua13144[8]; // UA 13144 - 0-20mA
426
+ // TODO:
427
+ volatile float xn_ua13145[8]; // UA 13145 - NTC 10K
428
+
429
+ // Uscite digitali XN
430
+ volatile char x1_o1;
431
+ volatile char x1_o2;
432
+ volatile char x2_o1;
433
+ volatile char x2_o2;
434
+ volatile char x3_o1;
435
+ volatile char x3_o2;
436
+ volatile char x4_o1;
437
+ volatile char x4_o2;
438
+ volatile char x5_o1;
439
+ volatile char x5_o2;
440
+ volatile char x6_o1;
441
+ volatile char x6_o2;
442
+ volatile char x7_o1;
443
+ volatile char x7_o2;
444
+ volatile char x8_o1;
445
+ volatile char x8_o2;
446
+ char *__xn_outs__[] = {&x1_o1, &x1_o2, &x2_o1, &x2_o2, &x3_o1, &x3_o2, &x4_o1, &x4_o2,
447
+ &x5_o1, &x5_o2, &x6_o1, &x6_o2, &x7_o1, &x7_o2, &x8_o1, &x8_o2};
448
+
449
+ // Uscite PWM
450
+ volatile U16 x1_pwm = 2048;
451
+ volatile U16 x2_pwm = 2048;
452
+ volatile U16 x3_pwm = 2048;
453
+ volatile U16 x4_pwm = 2048;
454
+ volatile U16 x5_pwm = 2048;
455
+ volatile U16 x6_pwm = 2048;
456
+ volatile U16 x7_pwm = 2048;
457
+ volatile U16 x8_pwm = 2048;
458
+
459
+ U16 *__xn_pwms__[] = {&x1_pwm, &x2_pwm, &x3_pwm, &x4_pwm, &x5_pwm, &x6_pwm, &x7_pwm, &x8_pwm};
460
+
461
+
462
+ #ifdef COLLAUDO
463
+ float p_volt2[8];
464
+ float p_ohm[8];
465
+ #endif
466
+
467
+ float pt100_current = 0.000926;
468
+
469
+ float pt100_calc(int raw, int n)
470
+ {
471
+ float volt2, ohm, ret;
472
+ int lraw;
473
+ // trasformo raw a 18 bit
474
+ lraw = (raw << 2);
475
+ volt2 = (float)lraw * (0.000015625 / 8);
476
+ //ohm = volt2 / 0.000926;
477
+ ohm = volt2 / pt100_current;
478
+ ret = -245.19 + ohm * (2.5293 + ohm * (-0.066046 + ohm * (0.0040422 + ohm * (-0.0000020697)))) / (1 + ohm * (-0.025422 + ohm * (0.0016883 + ohm * (-0.0000013601))));
479
+ #ifdef COLLAUDO
480
+ p_volt2[n] = volt2;
481
+ p_ohm[n] = ohm;
482
+ #endif
483
+ return ret;
484
+ }
485
+
486
+
487
+
488
+ void create_config()
489
+ {
490
+ msg_tx[0] = START_TX;
491
+ int i;
492
+ for (i=0; i<8; i++) {
493
+ msg_tx[i+1] = xn_config[i];
494
+ }
495
+ }
496
+
497
+ void parse_rx()
498
+ {
499
+ // dipswitch
500
+ p_dipswitch_status = (msg_rx[0] & 0x0F);
501
+ // versione firmware
502
+ puzzle_version = (msg_rx[0] & 0xF0) >> 4;
503
+
504
+ // Dal byte 1 al byte 16 ho le informazioni sugli XN
505
+ int i, j;
506
+ for (i=1; i<9; i++) {
507
+ j = 2*i-1;
508
+ *__xn_anal__[i-1] = (msg_rx[j] << 8) | (msg_rx[j+1] & 0xff); // Analog
509
+ *__xn_digin__[i-1] = (msg_rx[j+1] & 0x03); // Digital
510
+ *__xn_pt100_raw__[i-1] = (msg_rx[j] << 8) | (msg_rx[j+1] & 0xff); // PT100
511
+
512
+ // calcoli PT100
513
+ if ( xn_config[i-1] == C_PT100 ) *__xn_pt100__[i-1] = pt100_calc(*__xn_pt100_raw__[i-1], i-1);
514
+ }
515
+
516
+ #if 0
517
+ // Ricalcola tutti i valori in virgola mobile
518
+ for (i=0; i<8; i++) { // ciclo sugli XN
519
+ // 0-3V3
520
+ xn_ua13141[i] = 3.3*(*__xn_anal__[i])/4095.;
521
+ // 0-5V
522
+ xn_ua13142[i] = 5.*(*__xn_anal__[i])/4095.;
523
+ // 0-10V
524
+ xn_ua13143[i] = 10.*(*__xn_anal__[i])/4095.;
525
+ // 0-20mA
526
+ xn_ua13144[i] = 20.*(*__xn_anal__[i])/4095.;
527
+ // TODO: NTC 10K, PT100, ...
528
+ }
529
+ #endif
530
+ // Ricalcola gli ingressi digitali
531
+ x1_i1 = x1_digin & 0x01;
532
+ x1_i2 = (x1_digin & 0x02) >> 1;
533
+ x2_i1 = x2_digin & 0x01;
534
+ x2_i2 = (x2_digin & 0x02) >> 1;
535
+ x3_i1 = x3_digin & 0x01;
536
+ x3_i2 = (x3_digin & 0x02) >> 1;
537
+ x4_i1 = x4_digin & 0x01;
538
+ x4_i2 = (x4_digin & 0x02) >> 1;
539
+ x5_i1 = x5_digin & 0x01;
540
+ x5_i2 = (x5_digin & 0x02) >> 1;
541
+ x6_i1 = x6_digin & 0x01;
542
+ x6_i2 = (x6_digin & 0x02) >> 1;
543
+ x7_i1 = x7_digin & 0x01;
544
+ x7_i2 = (x7_digin & 0x02) >> 1;
545
+ x8_i1 = x8_digin & 0x01;
546
+ x8_i2 = (x8_digin & 0x02) >> 1;
547
+
548
+ // SPI IN
549
+
550
+ // Dal byte 17 al 24 ho le informazioni degli 8 moduli
551
+
552
+ for (i=17, j=0; i<25; i++, j+=8) { // ciclo sui byte
553
+ *p__i__[j] = (msg_rx[i] >> 7) & 0x01;
554
+ *p__i__[j+1] = (msg_rx[i] >> 6) & 0x01;
555
+ *p__i__[j+2] = (msg_rx[i] >> 5) & 0x01;
556
+ *p__i__[j+3] = (msg_rx[i] >> 4) & 0x01;
557
+ *p__i__[j+4] = (msg_rx[i] >> 3) & 0x01;
558
+ *p__i__[j+5] = (msg_rx[i] >> 2) & 0x01;
559
+ *p__i__[j+6] = (msg_rx[i] >> 1) & 0x01;
560
+ *p__i__[j+7] = (msg_rx[i] >> 0) & 0x01;
561
+ }
562
+
563
+ // ENCODERS
564
+
565
+ // Dal byte 25 al byte 32 ho le informazioni sulle due quote
566
+
567
+ p_encoder1 = ( (msg_rx[25] << 24) & 0xFF000000 ) |
568
+ ( (msg_rx[26] << 16) & 0xFF0000 ) |
569
+ ( (msg_rx[27] << 8) & 0xFF00 ) |
570
+ (msg_rx[28] & 0xFF);
571
+
572
+ p_encoder2 = ( (msg_rx[29] << 24) & 0xFF000000 ) |
573
+ ( (msg_rx[30] << 16) & 0xFF0000 ) |
574
+ ( (msg_rx[31] << 8) & 0xFF00 ) |
575
+ (msg_rx[32] & 0xFF);
576
+
577
+ /*
578
+ p_encoder2 = (msg_rx[29] << 24) |
579
+ (msg_rx[30] << 16) |
580
+ (msg_rx[31] << 8) |
581
+ (msg_rx[32]);
582
+ */
583
+ }
584
+
585
+ void create_tx()
586
+ {
587
+ msg_tx[0] = START_TX;
588
+
589
+ // Scrivi la configurazione
590
+ int i,j;
591
+ for (i=0; i<8; i++) {
592
+ msg_tx[i+1] = xn_config[i];
593
+ }
594
+ // X1
595
+ switch (xn_config[0]) {
596
+
597
+ case C_OUT: // Uscite digitali
598
+ msg_tx[9] = 0;
599
+ // msg_tx[10] = ((x1_o1 & 0x01) << 1) | (x1_o2 & 0x01); 04-12-2018
600
+ msg_tx[10] = ((x1_o2 & 0x01) << 1) | (x1_o1 & 0x01); // 04-12-2018
601
+ break;
602
+
603
+ case C_PWM: // Uscite PWM
604
+ msg_tx[9] = (x1_pwm & 0xFF00) >> 8;
605
+ msg_tx[10] = (x1_pwm & 0xFF);
606
+ break;
607
+
608
+ case C_EMPTY:
609
+ default:
610
+ msg_tx[9] = 0;
611
+ msg_tx[10] = 0;
612
+ break;
613
+ }
614
+ // X2
615
+ switch (xn_config[1]) {
616
+
617
+ case C_OUT: // Uscite digitali
618
+ msg_tx[11] = 0;
619
+ // msg_tx[12] = ((x2_o1 & 0x01) << 1) | (x2_o2 & 0x01); 04-12-2018
620
+ msg_tx[12] = ((x2_o2 & 0x01) << 1) | (x2_o1 & 0x01); // 04-12-2018
621
+ break;
622
+
623
+ case C_PWM: // Uscite PWM
624
+ msg_tx[11] = (x2_pwm & 0xFF00) >> 8;
625
+ msg_tx[12] = (x2_pwm & 0xFF);
626
+ break;
627
+
628
+ case C_EMPTY:
629
+ default:
630
+ msg_tx[11] = 0;
631
+ msg_tx[12] = 0;
632
+ break;
633
+ }
634
+ // X3
635
+ switch (xn_config[2]) {
636
+
637
+ case C_OUT: // Uscite digitali
638
+ msg_tx[13] = 0;
639
+ // msg_tx[14] = ((x3_o1 & 0x01) << 1) | (x3_o2 & 0x01); 04-12-2018
640
+ msg_tx[14] = ((x3_o2 & 0x01) << 1) | (x3_o1 & 0x01); // 04-12-2018
641
+ break;
642
+
643
+ case C_PWM: // Uscite PWM
644
+ msg_tx[13] = (x3_pwm & 0xFF00) >> 8;
645
+ msg_tx[14] = (x3_pwm & 0xFF);
646
+ break;
647
+
648
+ case C_EMPTY:
649
+ default:
650
+ msg_tx[13] = 0;
651
+ msg_tx[14] = 0;
652
+ break;
653
+ }
654
+ // X4
655
+ switch (xn_config[3]) {
656
+
657
+ case C_OUT: // Uscite digitali
658
+ msg_tx[15] = 0;
659
+ // msg_tx[16] = ((x4_o1 & 0x01) << 1) | (x4_o2 & 0x01); 04-12-2018
660
+ msg_tx[16] = ((x4_o2 & 0x01) << 1) | (x4_o1 & 0x01); // 04-12-2018
661
+ break;
662
+
663
+ case C_PWM: // Uscite PWM
664
+ msg_tx[15] = (x4_pwm & 0xFF00) >> 8;
665
+ msg_tx[16] = (x4_pwm & 0xFF);
666
+ break;
667
+
668
+ case C_EMPTY:
669
+ default:
670
+ msg_tx[15] = 0;
671
+ msg_tx[16] = 0;
672
+ break;
673
+ }
674
+ // X5
675
+ switch (xn_config[4]) {
676
+
677
+ case C_OUT: // Uscite digitali
678
+ msg_tx[17] = 0;
679
+ // msg_tx[18] = ((x5_o1 & 0x01) << 1) | (x5_o2 & 0x01); // 04-12-2018
680
+ msg_tx[18] = ((x5_o2 & 0x01) << 1) | (x5_o1 & 0x01); // 04-12-2018
681
+ break;
682
+
683
+ case C_PWM: // Uscite PWM
684
+ msg_tx[17] = (x5_pwm & 0xFF00) >> 8;
685
+ msg_tx[18] = (x5_pwm & 0xFF);
686
+ break;
687
+
688
+ case C_EMPTY:
689
+ default:
690
+ msg_tx[17] = 0;
691
+ msg_tx[18] = 0;
692
+ break;
693
+ }
694
+ // X6
695
+ switch (xn_config[5]) {
696
+
697
+ case C_OUT: // Uscite digitali
698
+ msg_tx[19] = 0;
699
+ // msg_tx[20] = ((x6_o1 & 0x01) << 1) | (x6_o2 & 0x01); // 04-12-2018
700
+ msg_tx[20] = ((x6_o2 & 0x01) << 1) | (x6_o1 & 0x01); // 04-12-2018
701
+ break;
702
+
703
+ case C_PWM: // Uscite PWM
704
+ msg_tx[19] = (x6_pwm & 0xFF00) >> 8;
705
+ msg_tx[20] = (x6_pwm & 0xFF);
706
+ break;
707
+
708
+ case C_EMPTY:
709
+ default:
710
+ msg_tx[19] = 0;
711
+ msg_tx[20] = 0;
712
+ break;
713
+ }
714
+ // X7
715
+ switch (xn_config[6]) {
716
+
717
+ case C_OUT: // Uscite digitali
718
+ msg_tx[21] = 0;
719
+ // msg_tx[22] = ((x7_o1 & 0x01) << 1) | (x7_o2 & 0x01); 04-12-2018
720
+ msg_tx[22] = ((x7_o2 & 0x01) << 1) | (x7_o1 & 0x01); // 04-12-2018
721
+ break;
722
+
723
+ case C_PWM: // Uscite PWM
724
+ msg_tx[21] = (x7_pwm & 0xFF00) >> 8;
725
+ msg_tx[22] = (x7_pwm & 0xFF);
726
+ break;
727
+
728
+ case C_EMPTY:
729
+ default:
730
+ msg_tx[21] = 0;
731
+ msg_tx[22] = 0;
732
+ break;
733
+ }
734
+ // X8
735
+ switch (xn_config[7]) {
736
+
737
+ case C_OUT: // Uscite digitali
738
+ msg_tx[23] = 0;
739
+ // msg_tx[24] = ((x8_o1 & 0x01) << 1) | (x8_o2 & 0x01); 04-12-2018
740
+ msg_tx[24] = ((x8_o2 & 0x01) << 1) | (x8_o1 & 0x01); // 04-12-2018
741
+ break;
742
+
743
+ case C_PWM: // Uscite PWM
744
+ msg_tx[23] = (x8_pwm & 0xFF00) >> 8;
745
+ msg_tx[24] = (x8_pwm & 0xFF);
746
+ break;
747
+
748
+ case C_EMPTY:
749
+ default:
750
+ msg_tx[23] = 0;
751
+ msg_tx[24] = 0;
752
+ break;
753
+ }
754
+
755
+ // SPI OUT
756
+ //int i,j;
757
+ for (i=25, j=0; i<33; i++, j+=8) {
758
+ msg_tx[i] = ( ((*p__o__[j]) & 0x01) << 7 |
759
+ ((*p__o__[j+1]) & 0x01) << 6 |
760
+ ((*p__o__[j+2]) & 0x01) << 5 |
761
+ ((*p__o__[j+3]) & 0x01) << 4 |
762
+ ((*p__o__[j+4]) & 0x01) << 3 |
763
+ ((*p__o__[j+5]) & 0x01) << 2 |
764
+ ((*p__o__[j+6]) & 0x01) << 1 |
765
+ ((*p__o__[j+7]) & 0x01) << 0 );
766
+ }
767
+
768
+ // Valutazione richiesta reset
769
+
770
+ if (puzzle_reset) {
771
+ puzzle_reset=0;
772
+ msg_tx[39] = 0xFF;
773
+ msg_tx[40] = 0xAA;
774
+ } else {
775
+ msg_tx[39] = 0;
776
+ msg_tx[40] = 0;
777
+ }
778
+
779
+ // FINE
780
+ //msg_tx[DIM_TX-1] = END_TX;
781
+ }
782
+
783
+ volatile char config_sent = 0;
784
+ volatile char trigger_tx = 0;
785
+
786
+ int puzzle_task_cnt=0;
787
+ void puzzle_task()
788
+ {
789
+ while(1) {
790
+ puzzle_task_cnt++;
791
+ create_tx();
792
+ tx_cmd_msg(CMD_DRIVE);
793
+ if (puzzle_disc_cnt < 200) {
794
+ puzzle_disc_cnt++;
795
+ puzzle_perif_on = 1;
796
+ } else {
797
+ puzzle_perif_on = 0;
798
+ }
799
+ every(20);
800
+ }
801
+ }
802
+
803
+ void puzzle_start()
804
+ {
805
+ puzzle_com = P_RS485;
806
+ Com = PortaCOM;
807
+ install_port();
808
+ serial_port_on = 1;
809
+ exec_task(puzzle_task, 0, 4);
810
+ }
811
+
812
+ void puzzle_stop()
813
+ {
814
+ //remove_timer(rw_puzzle);
815
+ remove_task(puzzle_task);
816
+ com_close(Com);
817
+ com_disable(Com);
818
+ }
819
+
820
+ //------------------ MULTI PERIF --------------------------------
821
+
822
+ // BUFFER UNIVERSALE (perif 50)
823
+ volatile char p50_xn_config[] = { C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY,
824
+ C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY};
825
+ volatile long p50_encoder1, p50_encoder2;
826
+ // EXP - INGRESSI E USCITE
827
+ volatile U32 p50_i_low, p50_i_high;
828
+ volatile U32 p50_o_low, p50_o_high;
829
+
830
+ // Input analogici
831
+ volatile int p50_x1_anal, p50_x2_anal, p50_x3_anal, p50_x4_anal, p50_x5_anal, p50_x6_anal, p50_x7_anal, p50_x8_anal;
832
+ volatile int* p50__xn_anal__[] = {&p50_x1_anal, &p50_x2_anal, &p50_x3_anal, &p50_x4_anal, &p50_x5_anal, &p50_x6_anal, &p50_x7_anal, &p50_x8_anal};
833
+
834
+ // PT100 RAW
835
+ volatile int p50_x1_pt100_raw, p50_x2_pt100_raw, p50_x3_pt100_raw, p50_x4_pt100_raw,
836
+ p50_x5_pt100_raw, p50_x6_pt100_raw, p50_x7_pt100_raw, p50_x8_pt100_raw;
837
+ volatile int* p50__xn_pt100_raw__[] = {&p50_x1_pt100_raw, &p50_x2_pt100_raw, &p50_x3_pt100_raw, &p50_x4_pt100_raw,
838
+ &p50_x5_pt100_raw, &p50_x6_pt100_raw, &p50_x7_pt100_raw, &p50_x8_pt100_raw};
839
+
840
+ // PT100 CELSIUS
841
+ float p50_x1_pt100, p50_x2_pt100, p50_x3_pt100, p50_x4_pt100, p50_x5_pt100, p50_x6_pt100, p50_x7_pt100, p50_x8_pt100;
842
+ volatile float* p50__xn_pt100__[] = {&p50_x1_pt100, &p50_x2_pt100, &p50_x3_pt100, &p50_x4_pt100, &p50_x5_pt100, &p50_x6_pt100, &p50_x7_pt100, &p50_x8_pt100};
843
+
844
+ // Ingressi digitali XN
845
+ volatile char p50_x1_digin, p50_x2_digin, p50_x3_digin, p50_x4_digin,
846
+ p50_x5_digin, p50_x6_digin, p50_x7_digin, p50_x8_digin;
847
+
848
+ volatile char p50_x1_i1, p50_x1_i2, p50_x2_i1, p50_x2_i2, p50_x3_i1, p50_x3_i2, p50_x4_i1, p50_x4_i2,
849
+ p50_x5_i1, p50_x5_i2, p50_x6_i1, p50_x6_i2, p50_x7_i1, p50_x7_i2, p50_x8_i1, p50_x8_i2;
850
+
851
+ // Uscite digitali XN
852
+ volatile char p50_x1_o1, p50_x1_o2, p50_x2_o1, p50_x2_o2, p50_x3_o1, p50_x3_o2, p50_x4_o1, p50_x4_o2,
853
+ p50_x5_o1, p50_x5_o2, p50_x6_o1, p50_x6_o2, p50_x7_o1, p50_x7_o2, p50_x8_o1, p50_x8_o2;
854
+
855
+ // Uscite PWM
856
+ volatile U16 p50_x1_pwm = 2048;
857
+ volatile U16 p50_x2_pwm = 2048;
858
+ volatile U16 p50_x3_pwm = 2048;
859
+ volatile U16 p50_x4_pwm = 2048;
860
+ volatile U16 p50_x5_pwm = 2048;
861
+ volatile U16 p50_x6_pwm = 2048;
862
+ volatile U16 p50_x7_pwm = 2048;
863
+ volatile U16 p50_x8_pwm = 2048;
864
+
865
+ U16 *p50__xn_pwms__[] = {&p50_x1_pwm, &p50_x2_pwm, &p50_x3_pwm, &p50_x4_pwm, &p50_x5_pwm, &p50_x6_pwm, &p50_x7_pwm, &p50_x8_pwm};
866
+
867
+
868
+
869
+
870
+ #if PUZZLE_PERIFS >= 2
871
+ volatile char p1_xn_config[] = { C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY,
872
+ C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY};
873
+ volatile long p1_encoder1, p1_encoder2;
874
+ // EXP - INGRESSI E USCITE
875
+ volatile char p1_i1, p1_i2, p1_i3, p1_i4, p1_i5, p1_i6, p1_i7, p1_i8, p1_i9, p1_i10, p1_i11,
876
+ p1_i12, p1_i13, p1_i14, p1_i15, p1_i16, p1_i17, p1_i18, p1_i19, p1_i20, p1_i21,
877
+ p1_i22, p1_i23, p1_i24, p1_i25, p1_i26, p1_i27, p1_i28, p1_i29, p1_i30, p1_i31,
878
+ p1_i32, p1_i33, p1_i34, p1_i35, p1_i36, p1_i37, p1_i38, p1_i39, p1_i40, p1_i41,
879
+ p1_i42, p1_i43, p1_i44, p1_i45, p1_i46, p1_i47, p1_i48, p1_i49, p1_i50, p1_i51,
880
+ p1_i52, p1_i53, p1_i54, p1_i55, p1_i56, p1_i57, p1_i58, p1_i59, p1_i60, p1_i61,
881
+ p1_i62, p1_i63, p1_i64;
882
+ volatile unsigned char *p1__i__[] = {&p1_i1, &p1_i2, &p1_i3, &p1_i4, &p1_i5,
883
+ &p1_i6, &p1_i7, &p1_i8, &p1_i9, &p1_i10,
884
+ &p1_i11, &p1_i12, &p1_i13, &p1_i14, &p1_i15,
885
+ &p1_i16, &p1_i17, &p1_i18, &p1_i19, &p1_i20,
886
+ &p1_i21, &p1_i22, &p1_i23, &p1_i24, &p1_i25,
887
+ &p1_i26, &p1_i27, &p1_i28, &p1_i29, &p1_i30,
888
+ &p1_i31, &p1_i32, &p1_i33, &p1_i34, &p1_i35,
889
+ &p1_i36, &p1_i37, &p1_i38, &p1_i39, &p1_i40,
890
+ &p1_i41, &p1_i42, &p1_i43, &p1_i44, &p1_i45,
891
+ &p1_i46, &p1_i47, &p1_i48, &p1_i49, &p1_i50,
892
+ &p1_i51, &p1_i52, &p1_i53, &p1_i54, &p1_i55,
893
+ &p1_i56, &p1_i57, &p1_i58, &p1_i59, &p1_i60,
894
+ &p1_i61, &p1_i62, &p1_i63, &p1_i64};
895
+ volatile char p1_o1, p1_o2, p1_o3, p1_o4, p1_o5, p1_o6, p1_o7, p1_o8, p1_o9, p1_o10,
896
+ p1_o11, p1_o12, p1_o13, p1_o14, p1_o15, p1_o16, p1_o17, p1_o18, p1_o19, p1_o20,
897
+ p1_o21, p1_o22, p1_o23, p1_o24, p1_o25, p1_o26, p1_o27, p1_o28, p1_o29, p1_o30,
898
+ p1_o31, p1_o32, p1_o33, p1_o34, p1_o35, p1_o36, p1_o37, p1_o38, p1_o39, p1_o40,
899
+ p1_o41, p1_o42, p1_o43, p1_o44, p1_o45, p1_o46, p1_o47, p1_o48, p1_o49, p1_o50,
900
+ p1_o51, p1_o52, p1_o53, p1_o54, p1_o55, p1_o56, p1_o57, p1_o58, p1_o59, p1_o60,
901
+ p1_o61, p1_o62, p1_o63, p1_o64;
902
+ volatile unsigned char *p1__o__[] = {&p1_o1, &p1_o2, &p1_o3, &p1_o4, &p1_o5,
903
+ &p1_o6, &p1_o7, &p1_o8, &p1_o9, &p1_o10,
904
+ &p1_o11, &p1_o12, &p1_o13, &p1_o14, &p1_o15,
905
+ &p1_o16, &p1_o17, &p1_o18, &p1_o19, &p1_o20,
906
+ &p1_o21, &p1_o22, &p1_o23, &p1_o24, &p1_o25,
907
+ &p1_o26, &p1_o27, &p1_o28, &p1_o29, &p1_o30,
908
+ &p1_o31, &p1_o32, &p1_o33, &p1_o34, &p1_o35,
909
+ &p1_o36, &p1_o37, &p1_o38, &p1_o39, &p1_o40,
910
+ &p1_o41, &p1_o42, &p1_o43, &p1_o44, &p1_o45,
911
+ &p1_o46, &p1_o47, &p1_o48, &p1_o49, &p1_o50,
912
+ &p1_o51, &p1_o52, &p1_o53, &p1_o54, &p1_o55,
913
+ &p1_o56, &p1_o57, &p1_o58, &p1_o59, &p1_o60,
914
+ &p1_o61, &p1_o62, &p1_o63, &p1_o64};
915
+ // Input analogici
916
+ volatile int p1_x1_anal, p1_x2_anal, p1_x3_anal, p1_x4_anal, p1_x5_anal, p1_x6_anal, p1_x7_anal, p1_x8_anal;
917
+ volatile int* p1__xn_anal__[] = {&p1_x1_anal, &p1_x2_anal, &p1_x3_anal, &p1_x4_anal, &p1_x5_anal, &p1_x6_anal, &p1_x7_anal, &p1_x8_anal};
918
+
919
+ // PT100 RAW
920
+ volatile int p1_x1_pt100_raw, p1_x2_pt100_raw, p1_x3_pt100_raw, p1_x4_pt100_raw,
921
+ p1_x5_pt100_raw, p1_x6_pt100_raw, p1_x7_pt100_raw, p1_x8_pt100_raw;
922
+ volatile int* p1__xn_pt100_raw__[] = {&p1_x1_pt100_raw, &p1_x2_pt100_raw, &p1_x3_pt100_raw, &p1_x4_pt100_raw,
923
+ &p1_x5_pt100_raw, &p1_x6_pt100_raw, &p1_x7_pt100_raw, &p1_x8_pt100_raw};
924
+
925
+ // PT100 CELSIUS
926
+ float p1_x1_pt100, p1_x2_pt100, p1_x3_pt100, p1_x4_pt100, p1_x5_pt100, p1_x6_pt100, p1_x7_pt100, p1_x8_pt100;
927
+ volatile float* p1__xn_pt100__[] = {&p1_x1_pt100, &p1_x2_pt100, &p1_x3_pt100, &p1_x4_pt100, &p1_x5_pt100, &p1_x6_pt100, &p1_x7_pt100, &p1_x8_pt100};
928
+
929
+
930
+ // Ingressi digitali XN
931
+ volatile char p1_x1_digin, p1_x2_digin, p1_x3_digin, p1_x4_digin,
932
+ p1_x5_digin, p1_x6_digin, p1_x7_digin, p1_x8_digin;
933
+ volatile char *p1__xn_digin__[] = {&p1_x1_digin, &p1_x2_digin, &p1_x3_digin, &p1_x4_digin,
934
+ &p1_x5_digin, &p1_x6_digin, &p1_x7_digin, &p1_x8_digin};
935
+
936
+ volatile char p1_x1_i1, p1_x1_i2, p1_x2_i1, p1_x2_i2, p1_x3_i1, p1_x3_i2, p1_x4_i1, p1_x4_i2,
937
+ p1_x5_i1, p1_x5_i2, p1_x6_i1, p1_x6_i2, p1_x7_i1, p1_x7_i2, p1_x8_i1, p1_x8_i2;
938
+
939
+ // Uscite digitali XN
940
+ volatile char p1_x1_o1, p1_x1_o2, p1_x2_o1, p1_x2_o2, p1_x3_o1, p1_x3_o2, p1_x4_o1, p1_x4_o2,
941
+ p1_x5_o1, p1_x5_o2, p1_x6_o1, p1_x6_o2, p1_x7_o1, p1_x7_o2, p1_x8_o1, p1_x8_o2;
942
+ char *p1__xn_outs__[] = {&p1_x1_o1, &p1_x1_o2, &p1_x2_o1, &p1_x2_o2, &p1_x3_o1, &p1_x3_o2, &p1_x4_o1, &p1_x4_o2,
943
+ &p1_x5_o1, &p1_x5_o2, &p1_x6_o1, &p1_x6_o2, &p1_x7_o1, &p1_x7_o2, &p1_x8_o1, &p1_x8_o2};
944
+
945
+ // Uscite PWM
946
+ volatile U16 p1_x1_pwm = 2048;
947
+ volatile U16 p1_x2_pwm = 2048;
948
+ volatile U16 p1_x3_pwm = 2048;
949
+ volatile U16 p1_x4_pwm = 2048;
950
+ volatile U16 p1_x5_pwm = 2048;
951
+ volatile U16 p1_x6_pwm = 2048;
952
+ volatile U16 p1_x7_pwm = 2048;
953
+ volatile U16 p1_x8_pwm = 2048;
954
+
955
+ U16 *p1__xn_pwms__[] = {&p1_x1_pwm, &p1_x2_pwm, &p1_x3_pwm, &p1_x4_pwm, &p1_x5_pwm, &p1_x6_pwm, &p1_x7_pwm, &p1_x8_pwm};
956
+ #endif
957
+
958
+ #if PUZZLE_PERIFS >= 3
959
+ volatile char p2_xn_config[] = { C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY,
960
+ C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY};
961
+ volatile long p2_encoder1, p2_encoder2;
962
+ // EXP - INGRESSI E USCITE
963
+ volatile char p2_i1, p2_i2, p2_i3, p2_i4, p2_i5, p2_i6, p2_i7, p2_i8, p2_i9, p2_i10, p2_i11,
964
+ p2_i12, p2_i13, p2_i14, p2_i15, p2_i16, p2_i17, p2_i18, p2_i19, p2_i20, p2_i21,
965
+ p2_i22, p2_i23, p2_i24, p2_i25, p2_i26, p2_i27, p2_i28, p2_i29, p2_i30, p2_i31,
966
+ p2_i32, p2_i33, p2_i34, p2_i35, p2_i36, p2_i37, p2_i38, p2_i39, p2_i40, p2_i41,
967
+ p2_i42, p2_i43, p2_i44, p2_i45, p2_i46, p2_i47, p2_i48, p2_i49, p2_i50, p2_i51,
968
+ p2_i52, p2_i53, p2_i54, p2_i55, p2_i56, p2_i57, p2_i58, p2_i59, p2_i60, p2_i61,
969
+ p2_i62, p2_i63, p2_i64;
970
+ volatile unsigned char *p2__i__[] = {&p2_i1, &p2_i2, &p2_i3, &p2_i4, &p2_i5,
971
+ &p2_i6, &p2_i7, &p2_i8, &p2_i9, &p2_i10,
972
+ &p2_i11, &p2_i12, &p2_i13, &p2_i14, &p2_i15,
973
+ &p2_i16, &p2_i17, &p2_i18, &p2_i19, &p2_i20,
974
+ &p2_i21, &p2_i22, &p2_i23, &p2_i24, &p2_i25,
975
+ &p2_i26, &p2_i27, &p2_i28, &p2_i29, &p2_i30,
976
+ &p2_i31, &p2_i32, &p2_i33, &p2_i34, &p2_i35,
977
+ &p2_i36, &p2_i37, &p2_i38, &p2_i39, &p2_i40,
978
+ &p2_i41, &p2_i42, &p2_i43, &p2_i44, &p2_i45,
979
+ &p2_i46, &p2_i47, &p2_i48, &p2_i49, &p2_i50,
980
+ &p2_i51, &p2_i52, &p2_i53, &p2_i54, &p2_i55,
981
+ &p2_i56, &p2_i57, &p2_i58, &p2_i59, &p2_i60,
982
+ &p2_i61, &p2_i62, &p2_i63, &p2_i64};
983
+ volatile char p2_o1, p2_o2, p2_o3, p2_o4, p2_o5, p2_o6, p2_o7, p2_o8, p2_o9, p2_o10,
984
+ p2_o11, p2_o12, p2_o13, p2_o14, p2_o15, p2_o16, p2_o17, p2_o18, p2_o19, p2_o20,
985
+ p2_o21, p2_o22, p2_o23, p2_o24, p2_o25, p2_o26, p2_o27, p2_o28, p2_o29, p2_o30,
986
+ p2_o31, p2_o32, p2_o33, p2_o34, p2_o35, p2_o36, p2_o37, p2_o38, p2_o39, p2_o40,
987
+ p2_o41, p2_o42, p2_o43, p2_o44, p2_o45, p2_o46, p2_o47, p2_o48, p2_o49, p2_o50,
988
+ p2_o51, p2_o52, p2_o53, p2_o54, p2_o55, p2_o56, p2_o57, p2_o58, p2_o59, p2_o60,
989
+ p2_o61, p2_o62, p2_o63, p2_o64;
990
+ volatile unsigned char *p2__o__[] = {&p2_o1, &p2_o2, &p2_o3, &p2_o4, &p2_o5,
991
+ &p2_o6, &p2_o7, &p2_o8, &p2_o9, &p2_o10,
992
+ &p2_o11, &p2_o12, &p2_o13, &p2_o14, &p2_o15,
993
+ &p2_o16, &p2_o17, &p2_o18, &p2_o19, &p2_o20,
994
+ &p2_o21, &p2_o22, &p2_o23, &p2_o24, &p2_o25,
995
+ &p2_o26, &p2_o27, &p2_o28, &p2_o29, &p2_o30,
996
+ &p2_o31, &p2_o32, &p2_o33, &p2_o34, &p2_o35,
997
+ &p2_o36, &p2_o37, &p2_o38, &p2_o39, &p2_o40,
998
+ &p2_o41, &p2_o42, &p2_o43, &p2_o44, &p2_o45,
999
+ &p2_o46, &p2_o47, &p2_o48, &p2_o49, &p2_o50,
1000
+ &p2_o51, &p2_o52, &p2_o53, &p2_o54, &p2_o55,
1001
+ &p2_o56, &p2_o57, &p2_o58, &p2_o59, &p2_o60,
1002
+ &p2_o61, &p2_o62, &p2_o63, &p2_o64};
1003
+ // Input analogici
1004
+ volatile int p2_x1_anal, p2_x2_anal, p2_x3_anal, p2_x4_anal, p2_x5_anal, p2_x6_anal, p2_x7_anal, p2_x8_anal;
1005
+ volatile int* p2__xn_anal__[] = {&p2_x1_anal, &p2_x2_anal, &p2_x3_anal, &p2_x4_anal, &p2_x5_anal, &p2_x6_anal, &p2_x7_anal, &p2_x8_anal};
1006
+
1007
+ // PT100 RAW
1008
+ volatile int p2_x1_pt100_raw, p2_x2_pt100_raw, p2_x3_pt100_raw, p2_x4_pt100_raw,
1009
+ p2_x5_pt100_raw, p2_x6_pt100_raw, p2_x7_pt100_raw, p2_x8_pt100_raw;
1010
+ volatile int* p2__xn_pt100_raw__[] = {&p2_x1_pt100_raw, &p2_x2_pt100_raw, &p2_x3_pt100_raw, &p2_x4_pt100_raw,
1011
+ &p2_x5_pt100_raw, &p2_x6_pt100_raw, &p2_x7_pt100_raw, &p2_x8_pt100_raw};
1012
+
1013
+ // PT100 CELSIUS
1014
+ float p2_x1_pt100, p2_x2_pt100, p2_x3_pt100, p2_x4_pt100, p2_x5_pt100, p2_x6_pt100, p2_x7_pt100, p2_x8_pt100;
1015
+ volatile float* p2__xn_pt100__[] = {&p2_x1_pt100, &p2_x2_pt100, &p2_x3_pt100, &p2_x4_pt100, &p2_x5_pt100, &p2_x6_pt100, &p2_x7_pt100, &p2_x8_pt100};
1016
+
1017
+
1018
+ // Ingressi digitali XN
1019
+ volatile char p2_x1_digin, p2_x2_digin, p2_x3_digin, p2_x4_digin,
1020
+ p2_x5_digin, p2_x6_digin, p2_x7_digin, p2_x8_digin;
1021
+ volatile char *p2__xn_digin__[] = {&p2_x1_digin, &p2_x2_digin, &p2_x3_digin, &p2_x4_digin,
1022
+ &p2_x5_digin, &p2_x6_digin, &p2_x7_digin, &p2_x8_digin};
1023
+
1024
+ volatile char p2_x1_i1, p2_x1_i2, p2_x2_i1, p2_x2_i2, p2_x3_i1, p2_x3_i2, p2_x4_i1, p2_x4_i2,
1025
+ p2_x5_i1, p2_x5_i2, p2_x6_i1, p2_x6_i2, p2_x7_i1, p2_x7_i2, p2_x8_i1, p2_x8_i2;
1026
+
1027
+ // Uscite digitali XN
1028
+ volatile char p2_x1_o1, p2_x1_o2, p2_x2_o1, p2_x2_o2, p2_x3_o1, p2_x3_o2, p2_x4_o1, p2_x4_o2,
1029
+ p2_x5_o1, p2_x5_o2, p2_x6_o1, p2_x6_o2, p2_x7_o1, p2_x7_o2, p2_x8_o1, p2_x8_o2;
1030
+ char *p2__xn_outs__[] = {&p2_x1_o1, &p2_x1_o2, &p2_x2_o1, &p2_x2_o2, &p2_x3_o1, &p2_x3_o2, &p2_x4_o1, &p2_x4_o2,
1031
+ &p2_x5_o1, &p2_x5_o2, &p2_x6_o1, &p2_x6_o2, &p2_x7_o1, &p2_x7_o2, &p2_x8_o1, &p2_x8_o2};
1032
+
1033
+ // Uscite PWM
1034
+ volatile U16 p2_x1_pwm = 2048;
1035
+ volatile U16 p2_x2_pwm = 2048;
1036
+ volatile U16 p2_x3_pwm = 2048;
1037
+ volatile U16 p2_x4_pwm = 2048;
1038
+ volatile U16 p2_x5_pwm = 2048;
1039
+ volatile U16 p2_x6_pwm = 2048;
1040
+ volatile U16 p2_x7_pwm = 2048;
1041
+ volatile U16 p2_x8_pwm = 2048;
1042
+
1043
+ U16 *p2__xn_pwms__[] = {&p2_x1_pwm, &p2_x2_pwm, &p2_x3_pwm, &p2_x4_pwm, &p2_x5_pwm, &p2_x6_pwm, &p2_x7_pwm, &p2_x8_pwm};
1044
+ #endif
1045
+
1046
+ #if PUZZLE_PERIFS >= 4
1047
+ volatile char p3_xn_config[] = { C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY,
1048
+ C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY};
1049
+ volatile long p3_encoder1, p3_encoder2;
1050
+ // EXP - INGRESSI E USCITE
1051
+ volatile char p3_i1, p3_i2, p3_i3, p3_i4, p3_i5, p3_i6, p3_i7, p3_i8, p3_i9, p3_i10, p3_i11,
1052
+ p3_i12, p3_i13, p3_i14, p3_i15, p3_i16, p3_i17, p3_i18, p3_i19, p3_i20, p3_i21,
1053
+ p3_i22, p3_i23, p3_i24, p3_i25, p3_i26, p3_i27, p3_i28, p3_i29, p3_i30, p3_i31,
1054
+ p3_i32, p3_i33, p3_i34, p3_i35, p3_i36, p3_i37, p3_i38, p3_i39, p3_i40, p3_i41,
1055
+ p3_i42, p3_i43, p3_i44, p3_i45, p3_i46, p3_i47, p3_i48, p3_i49, p3_i50, p3_i51,
1056
+ p3_i52, p3_i53, p3_i54, p3_i55, p3_i56, p3_i57, p3_i58, p3_i59, p3_i60, p3_i61,
1057
+ p3_i62, p3_i63, p3_i64;
1058
+ volatile unsigned char *p3__i__[] = {&p3_i1, &p3_i2, &p3_i3, &p3_i4, &p3_i5,
1059
+ &p3_i6, &p3_i7, &p3_i8, &p3_i9, &p3_i10,
1060
+ &p3_i11, &p3_i12, &p3_i13, &p3_i14, &p3_i15,
1061
+ &p3_i16, &p3_i17, &p3_i18, &p3_i19, &p3_i20,
1062
+ &p3_i21, &p3_i22, &p3_i23, &p3_i24, &p3_i25,
1063
+ &p3_i26, &p3_i27, &p3_i28, &p3_i29, &p3_i30,
1064
+ &p3_i31, &p3_i32, &p3_i33, &p3_i34, &p3_i35,
1065
+ &p3_i36, &p3_i37, &p3_i38, &p3_i39, &p3_i40,
1066
+ &p3_i41, &p3_i42, &p3_i43, &p3_i44, &p3_i45,
1067
+ &p3_i46, &p3_i47, &p3_i48, &p3_i49, &p3_i50,
1068
+ &p3_i51, &p3_i52, &p3_i53, &p3_i54, &p3_i55,
1069
+ &p3_i56, &p3_i57, &p3_i58, &p3_i59, &p3_i60,
1070
+ &p3_i61, &p3_i62, &p3_i63, &p3_i64};
1071
+ volatile char p3_o1, p3_o2, p3_o3, p3_o4, p3_o5, p3_o6, p3_o7, p3_o8, p3_o9, p3_o10,
1072
+ p3_o11, p3_o12, p3_o13, p3_o14, p3_o15, p3_o16, p3_o17, p3_o18, p3_o19, p3_o20,
1073
+ p3_o21, p3_o22, p3_o23, p3_o24, p3_o25, p3_o26, p3_o27, p3_o28, p3_o29, p3_o30,
1074
+ p3_o31, p3_o32, p3_o33, p3_o34, p3_o35, p3_o36, p3_o37, p3_o38, p3_o39, p3_o40,
1075
+ p3_o41, p3_o42, p3_o43, p3_o44, p3_o45, p3_o46, p3_o47, p3_o48, p3_o49, p3_o50,
1076
+ p3_o51, p3_o52, p3_o53, p3_o54, p3_o55, p3_o56, p3_o57, p3_o58, p3_o59, p3_o60,
1077
+ p3_o61, p3_o62, p3_o63, p3_o64;
1078
+ volatile unsigned char *p3__o__[] = {&p3_o1, &p3_o2, &p3_o3, &p3_o4, &p3_o5,
1079
+ &p3_o6, &p3_o7, &p3_o8, &p3_o9, &p3_o10,
1080
+ &p3_o11, &p3_o12, &p3_o13, &p3_o14, &p3_o15,
1081
+ &p3_o16, &p3_o17, &p3_o18, &p3_o19, &p3_o20,
1082
+ &p3_o21, &p3_o22, &p3_o23, &p3_o24, &p3_o25,
1083
+ &p3_o26, &p3_o27, &p3_o28, &p3_o29, &p3_o30,
1084
+ &p3_o31, &p3_o32, &p3_o33, &p3_o34, &p3_o35,
1085
+ &p3_o36, &p3_o37, &p3_o38, &p3_o39, &p3_o40,
1086
+ &p3_o41, &p3_o42, &p3_o43, &p3_o44, &p3_o45,
1087
+ &p3_o46, &p3_o47, &p3_o48, &p3_o49, &p3_o50,
1088
+ &p3_o51, &p3_o52, &p3_o53, &p3_o54, &p3_o55,
1089
+ &p3_o56, &p3_o57, &p3_o58, &p3_o59, &p3_o60,
1090
+ &p3_o61, &p3_o62, &p3_o63, &p3_o64};
1091
+ // Input analogici
1092
+ volatile int p3_x1_anal, p3_x2_anal, p3_x3_anal, p3_x4_anal, p3_x5_anal, p3_x6_anal, p3_x7_anal, p3_x8_anal;
1093
+ volatile int* p3__xn_anal__[] = {&p3_x1_anal, &p3_x2_anal, &p3_x3_anal, &p3_x4_anal, &p3_x5_anal, &p3_x6_anal, &p3_x7_anal, &p3_x8_anal};
1094
+
1095
+ // PT100 RAW
1096
+ volatile int p3_x1_pt100_raw, p3_x2_pt100_raw, p3_x3_pt100_raw, p3_x4_pt100_raw,
1097
+ p3_x5_pt100_raw, p3_x6_pt100_raw, p3_x7_pt100_raw, p3_x8_pt100_raw;
1098
+ volatile int* p3__xn_pt100_raw__[] = {&p3_x1_pt100_raw, &p3_x2_pt100_raw, &p3_x3_pt100_raw, &p3_x4_pt100_raw,
1099
+ &p3_x5_pt100_raw, &p3_x6_pt100_raw, &p3_x7_pt100_raw, &p3_x8_pt100_raw};
1100
+
1101
+ // PT100 CELSIUS
1102
+ float p3_x1_pt100, p3_x2_pt100, p3_x3_pt100, p3_x4_pt100, p3_x5_pt100, p3_x6_pt100, p3_x7_pt100, p3_x8_pt100;
1103
+ volatile float* p3__xn_pt100__[] = {&p3_x1_pt100, &p3_x2_pt100, &p3_x3_pt100, &p3_x4_pt100, &p3_x5_pt100, &p3_x6_pt100, &p3_x7_pt100, &p3_x8_pt100};
1104
+
1105
+
1106
+ // Ingressi digitali XN
1107
+ volatile char p3_x1_digin, p3_x2_digin, p3_x3_digin, p3_x4_digin,
1108
+ p3_x5_digin, p3_x6_digin, p3_x7_digin, p3_x8_digin;
1109
+ volatile char *p3__xn_digin__[] = {&p3_x1_digin, &p3_x2_digin, &p3_x3_digin, &p3_x4_digin,
1110
+ &p3_x5_digin, &p3_x6_digin, &p3_x7_digin, &p3_x8_digin};
1111
+
1112
+ volatile char p3_x1_i1, p3_x1_i2, p3_x2_i1, p3_x2_i2, p3_x3_i1, p3_x3_i2, p3_x4_i1, p3_x4_i2,
1113
+ p3_x5_i1, p3_x5_i2, p3_x6_i1, p3_x6_i2, p3_x7_i1, p3_x7_i2, p3_x8_i1, p3_x8_i2;
1114
+
1115
+ // Uscite digitali XN
1116
+ volatile char p3_x1_o1, p3_x1_o2, p3_x2_o1, p3_x2_o2, p3_x3_o1, p3_x3_o2, p3_x4_o1, p3_x4_o2,
1117
+ p3_x5_o1, p3_x5_o2, p3_x6_o1, p3_x6_o2, p3_x7_o1, p3_x7_o2, p3_x8_o1, p3_x8_o2;
1118
+ char *p3__xn_outs__[] = {&p3_x1_o1, &p3_x1_o2, &p3_x2_o1, &p3_x2_o2, &p3_x3_o1, &p3_x3_o2, &p3_x4_o1, &p3_x4_o2,
1119
+ &p3_x5_o1, &p3_x5_o2, &p3_x6_o1, &p3_x6_o2, &p3_x7_o1, &p3_x7_o2, &p3_x8_o1, &p3_x8_o2};
1120
+
1121
+ // Uscite PWM
1122
+ volatile U16 p3_x1_pwm = 2048;
1123
+ volatile U16 p3_x2_pwm = 2048;
1124
+ volatile U16 p3_x3_pwm = 2048;
1125
+ volatile U16 p3_x4_pwm = 2048;
1126
+ volatile U16 p3_x5_pwm = 2048;
1127
+ volatile U16 p3_x6_pwm = 2048;
1128
+ volatile U16 p3_x7_pwm = 2048;
1129
+ volatile U16 p3_x8_pwm = 2048;
1130
+
1131
+ U16 *p3__xn_pwms__[] = {&p3_x1_pwm, &p3_x2_pwm, &p3_x3_pwm, &p3_x4_pwm, &p3_x5_pwm, &p3_x6_pwm, &p3_x7_pwm, &p3_x8_pwm};
1132
+ #endif
1133
+
1134
+ #if PUZZLE_PERIFS >= 5
1135
+ volatile char p4_xn_config[] = { C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY,
1136
+ C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY};
1137
+ volatile long p4_encoder1, p4_encoder2;
1138
+ // EXP - INGRESSI E USCITE
1139
+ volatile char p4_i1, p4_i2, p4_i3, p4_i4, p4_i5, p4_i6, p4_i7, p4_i8, p4_i9, p4_i10, p4_i11,
1140
+ p4_i12, p4_i13, p4_i14, p4_i15, p4_i16, p4_i17, p4_i18, p4_i19, p4_i20, p4_i21,
1141
+ p4_i22, p4_i23, p4_i24, p4_i25, p4_i26, p4_i27, p4_i28, p4_i29, p4_i30, p4_i31,
1142
+ p4_i32, p4_i33, p4_i34, p4_i35, p4_i36, p4_i37, p4_i38, p4_i39, p4_i40, p4_i41,
1143
+ p4_i42, p4_i43, p4_i44, p4_i45, p4_i46, p4_i47, p4_i48, p4_i49, p4_i50, p4_i51,
1144
+ p4_i52, p4_i53, p4_i54, p4_i55, p4_i56, p4_i57, p4_i58, p4_i59, p4_i60, p4_i61,
1145
+ p4_i62, p4_i63, p4_i64;
1146
+ volatile unsigned char *p4__i__[] = {&p4_i1, &p4_i2, &p4_i3, &p4_i4, &p4_i5,
1147
+ &p4_i6, &p4_i7, &p4_i8, &p4_i9, &p4_i10,
1148
+ &p4_i11, &p4_i12, &p4_i13, &p4_i14, &p4_i15,
1149
+ &p4_i16, &p4_i17, &p4_i18, &p4_i19, &p4_i20,
1150
+ &p4_i21, &p4_i22, &p4_i23, &p4_i24, &p4_i25,
1151
+ &p4_i26, &p4_i27, &p4_i28, &p4_i29, &p4_i30,
1152
+ &p4_i31, &p4_i32, &p4_i33, &p4_i34, &p4_i35,
1153
+ &p4_i36, &p4_i37, &p4_i38, &p4_i39, &p4_i40,
1154
+ &p4_i41, &p4_i42, &p4_i43, &p4_i44, &p4_i45,
1155
+ &p4_i46, &p4_i47, &p4_i48, &p4_i49, &p4_i50,
1156
+ &p4_i51, &p4_i52, &p4_i53, &p4_i54, &p4_i55,
1157
+ &p4_i56, &p4_i57, &p4_i58, &p4_i59, &p4_i60,
1158
+ &p4_i61, &p4_i62, &p4_i63, &p4_i64};
1159
+ volatile char p4_o1, p4_o2, p4_o3, p4_o4, p4_o5, p4_o6, p4_o7, p4_o8, p4_o9, p4_o10,
1160
+ p4_o11, p4_o12, p4_o13, p4_o14, p4_o15, p4_o16, p4_o17, p4_o18, p4_o19, p4_o20,
1161
+ p4_o21, p4_o22, p4_o23, p4_o24, p4_o25, p4_o26, p4_o27, p4_o28, p4_o29, p4_o30,
1162
+ p4_o31, p4_o32, p4_o33, p4_o34, p4_o35, p4_o36, p4_o37, p4_o38, p4_o39, p4_o40,
1163
+ p4_o41, p4_o42, p4_o43, p4_o44, p4_o45, p4_o46, p4_o47, p4_o48, p4_o49, p4_o50,
1164
+ p4_o51, p4_o52, p4_o53, p4_o54, p4_o55, p4_o56, p4_o57, p4_o58, p4_o59, p4_o60,
1165
+ p4_o61, p4_o62, p4_o63, p4_o64;
1166
+ volatile unsigned char *p4__o__[] = {&p4_o1, &p4_o2, &p4_o3, &p4_o4, &p4_o5,
1167
+ &p4_o6, &p4_o7, &p4_o8, &p4_o9, &p4_o10,
1168
+ &p4_o11, &p4_o12, &p4_o13, &p4_o14, &p4_o15,
1169
+ &p4_o16, &p4_o17, &p4_o18, &p4_o19, &p4_o20,
1170
+ &p4_o21, &p4_o22, &p4_o23, &p4_o24, &p4_o25,
1171
+ &p4_o26, &p4_o27, &p4_o28, &p4_o29, &p4_o30,
1172
+ &p4_o31, &p4_o32, &p4_o33, &p4_o34, &p4_o35,
1173
+ &p4_o36, &p4_o37, &p4_o38, &p4_o39, &p4_o40,
1174
+ &p4_o41, &p4_o42, &p4_o43, &p4_o44, &p4_o45,
1175
+ &p4_o46, &p4_o47, &p4_o48, &p4_o49, &p4_o50,
1176
+ &p4_o51, &p4_o52, &p4_o53, &p4_o54, &p4_o55,
1177
+ &p4_o56, &p4_o57, &p4_o58, &p4_o59, &p4_o60,
1178
+ &p4_o61, &p4_o62, &p4_o63, &p4_o64};
1179
+ // Input analogici
1180
+ volatile int p4_x1_anal, p4_x2_anal, p4_x3_anal, p4_x4_anal, p4_x5_anal, p4_x6_anal, p4_x7_anal, p4_x8_anal;
1181
+ volatile int* p4__xn_anal__[] = {&p4_x1_anal, &p4_x2_anal, &p4_x3_anal, &p4_x4_anal, &p4_x5_anal, &p4_x6_anal, &p4_x7_anal, &p4_x8_anal};
1182
+
1183
+ // PT100 RAW
1184
+ volatile int p4_x1_pt100_raw, p4_x2_pt100_raw, p4_x3_pt100_raw, p4_x4_pt100_raw,
1185
+ p4_x5_pt100_raw, p4_x6_pt100_raw, p4_x7_pt100_raw, p4_x8_pt100_raw;
1186
+ volatile int* p4__xn_pt100_raw__[] = {&p4_x1_pt100_raw, &p4_x2_pt100_raw, &p4_x3_pt100_raw, &p4_x4_pt100_raw,
1187
+ &p4_x5_pt100_raw, &p4_x6_pt100_raw, &p4_x7_pt100_raw, &p4_x8_pt100_raw};
1188
+
1189
+ // PT100 CELSIUS
1190
+ float p4_x1_pt100, p4_x2_pt100, p4_x3_pt100, p4_x4_pt100, p4_x5_pt100, p4_x6_pt100, p4_x7_pt100, p4_x8_pt100;
1191
+ volatile float* p4__xn_pt100__[] = {&p4_x1_pt100, &p4_x2_pt100, &p4_x3_pt100, &p4_x4_pt100, &p4_x5_pt100, &p4_x6_pt100, &p4_x7_pt100, &p4_x8_pt100};
1192
+
1193
+
1194
+ // Ingressi digitali XN
1195
+ volatile char p4_x1_digin, p4_x2_digin, p4_x3_digin, p4_x4_digin,
1196
+ p4_x5_digin, p4_x6_digin, p4_x7_digin, p4_x8_digin;
1197
+ volatile char *p4__xn_digin__[] = {&p4_x1_digin, &p4_x2_digin, &p4_x3_digin, &p4_x4_digin,
1198
+ &p4_x5_digin, &p4_x6_digin, &p4_x7_digin, &p4_x8_digin};
1199
+
1200
+ volatile char p4_x1_i1, p4_x1_i2, p4_x2_i1, p4_x2_i2, p4_x3_i1, p4_x3_i2, p4_x4_i1, p4_x4_i2,
1201
+ p4_x5_i1, p4_x5_i2, p4_x6_i1, p4_x6_i2, p4_x7_i1, p4_x7_i2, p4_x8_i1, p4_x8_i2;
1202
+
1203
+ // Uscite digitali XN
1204
+ volatile char p4_x1_o1, p4_x1_o2, p4_x2_o1, p4_x2_o2, p4_x3_o1, p4_x3_o2, p4_x4_o1, p4_x4_o2,
1205
+ p4_x5_o1, p4_x5_o2, p4_x6_o1, p4_x6_o2, p4_x7_o1, p4_x7_o2, p4_x8_o1, p4_x8_o2;
1206
+ char *p4__xn_outs__[] = {&p4_x1_o1, &p4_x1_o2, &p4_x2_o1, &p4_x2_o2, &p4_x3_o1, &p4_x3_o2, &p4_x4_o1, &p4_x4_o2,
1207
+ &p4_x5_o1, &p4_x5_o2, &p4_x6_o1, &p4_x6_o2, &p4_x7_o1, &p4_x7_o2, &p4_x8_o1, &p4_x8_o2};
1208
+
1209
+ // Uscite PWM
1210
+ volatile U16 p4_x1_pwm = 2048;
1211
+ volatile U16 p4_x2_pwm = 2048;
1212
+ volatile U16 p4_x3_pwm = 2048;
1213
+ volatile U16 p4_x4_pwm = 2048;
1214
+ volatile U16 p4_x5_pwm = 2048;
1215
+ volatile U16 p4_x6_pwm = 2048;
1216
+ volatile U16 p4_x7_pwm = 2048;
1217
+ volatile U16 p4_x8_pwm = 2048;
1218
+
1219
+ U16 *p4__xn_pwms__[] = {&p4_x1_pwm, &p4_x2_pwm, &p4_x3_pwm, &p4_x4_pwm, &p4_x5_pwm, &p4_x6_pwm, &p4_x7_pwm, &p4_x8_pwm};
1220
+ #endif
1221
+
1222
+ #if PUZZLE_PERIFS >= 6
1223
+ volatile char p5_xn_config[] = { C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY,
1224
+ C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY};
1225
+ volatile long p5_encoder1, p5_encoder2;
1226
+ // EXP - INGRESSI E USCITE
1227
+ volatile char p5_i1, p5_i2, p5_i3, p5_i4, p5_i5, p5_i6, p5_i7, p5_i8, p5_i9, p5_i10, p5_i11,
1228
+ p5_i12, p5_i13, p5_i14, p5_i15, p5_i16, p5_i17, p5_i18, p5_i19, p5_i20, p5_i21,
1229
+ p5_i22, p5_i23, p5_i24, p5_i25, p5_i26, p5_i27, p5_i28, p5_i29, p5_i30, p5_i31,
1230
+ p5_i32, p5_i33, p5_i34, p5_i35, p5_i36, p5_i37, p5_i38, p5_i39, p5_i40, p5_i41,
1231
+ p5_i42, p5_i43, p5_i44, p5_i45, p5_i46, p5_i47, p5_i48, p5_i49, p5_i50, p5_i51,
1232
+ p5_i52, p5_i53, p5_i54, p5_i55, p5_i56, p5_i57, p5_i58, p5_i59, p5_i60, p5_i61,
1233
+ p5_i62, p5_i63, p5_i64;
1234
+ volatile unsigned char *p5__i__[] = {&p5_i1, &p5_i2, &p5_i3, &p5_i4, &p5_i5,
1235
+ &p5_i6, &p5_i7, &p5_i8, &p5_i9, &p5_i10,
1236
+ &p5_i11, &p5_i12, &p5_i13, &p5_i14, &p5_i15,
1237
+ &p5_i16, &p5_i17, &p5_i18, &p5_i19, &p5_i20,
1238
+ &p5_i21, &p5_i22, &p5_i23, &p5_i24, &p5_i25,
1239
+ &p5_i26, &p5_i27, &p5_i28, &p5_i29, &p5_i30,
1240
+ &p5_i31, &p5_i32, &p5_i33, &p5_i34, &p5_i35,
1241
+ &p5_i36, &p5_i37, &p5_i38, &p5_i39, &p5_i40,
1242
+ &p5_i41, &p5_i42, &p5_i43, &p5_i44, &p5_i45,
1243
+ &p5_i46, &p5_i47, &p5_i48, &p5_i49, &p5_i50,
1244
+ &p5_i51, &p5_i52, &p5_i53, &p5_i54, &p5_i55,
1245
+ &p5_i56, &p5_i57, &p5_i58, &p5_i59, &p5_i60,
1246
+ &p5_i61, &p5_i62, &p5_i63, &p5_i64};
1247
+ volatile char p5_o1, p5_o2, p5_o3, p5_o4, p5_o5, p5_o6, p5_o7, p5_o8, p5_o9, p5_o10,
1248
+ p5_o11, p5_o12, p5_o13, p5_o14, p5_o15, p5_o16, p5_o17, p5_o18, p5_o19, p5_o20,
1249
+ p5_o21, p5_o22, p5_o23, p5_o24, p5_o25, p5_o26, p5_o27, p5_o28, p5_o29, p5_o30,
1250
+ p5_o31, p5_o32, p5_o33, p5_o34, p5_o35, p5_o36, p5_o37, p5_o38, p5_o39, p5_o40,
1251
+ p5_o41, p5_o42, p5_o43, p5_o44, p5_o45, p5_o46, p5_o47, p5_o48, p5_o49, p5_o50,
1252
+ p5_o51, p5_o52, p5_o53, p5_o54, p5_o55, p5_o56, p5_o57, p5_o58, p5_o59, p5_o60,
1253
+ p5_o61, p5_o62, p5_o63, p5_o64;
1254
+ volatile unsigned char *p5__o__[] = {&p5_o1, &p5_o2, &p5_o3, &p5_o4, &p5_o5,
1255
+ &p5_o6, &p5_o7, &p5_o8, &p5_o9, &p5_o10,
1256
+ &p5_o11, &p5_o12, &p5_o13, &p5_o14, &p5_o15,
1257
+ &p5_o16, &p5_o17, &p5_o18, &p5_o19, &p5_o20,
1258
+ &p5_o21, &p5_o22, &p5_o23, &p5_o24, &p5_o25,
1259
+ &p5_o26, &p5_o27, &p5_o28, &p5_o29, &p5_o30,
1260
+ &p5_o31, &p5_o32, &p5_o33, &p5_o34, &p5_o35,
1261
+ &p5_o36, &p5_o37, &p5_o38, &p5_o39, &p5_o40,
1262
+ &p5_o41, &p5_o42, &p5_o43, &p5_o44, &p5_o45,
1263
+ &p5_o46, &p5_o47, &p5_o48, &p5_o49, &p5_o50,
1264
+ &p5_o51, &p5_o52, &p5_o53, &p5_o54, &p5_o55,
1265
+ &p5_o56, &p5_o57, &p5_o58, &p5_o59, &p5_o60,
1266
+ &p5_o61, &p5_o62, &p5_o63, &p5_o64};
1267
+ // Input analogici
1268
+ volatile int p5_x1_anal, p5_x2_anal, p5_x3_anal, p5_x4_anal, p5_x5_anal, p5_x6_anal, p5_x7_anal, p5_x8_anal;
1269
+ volatile int* p5__xn_anal__[] = {&p5_x1_anal, &p5_x2_anal, &p5_x3_anal, &p5_x4_anal, &p5_x5_anal, &p5_x6_anal, &p5_x7_anal, &p5_x8_anal};
1270
+
1271
+ // PT100 RAW
1272
+ volatile int p5_x1_pt100_raw, p5_x2_pt100_raw, p5_x3_pt100_raw, p5_x4_pt100_raw,
1273
+ p5_x5_pt100_raw, p5_x6_pt100_raw, p5_x7_pt100_raw, p5_x8_pt100_raw;
1274
+ volatile int* p5__xn_pt100_raw__[] = {&p5_x1_pt100_raw, &p5_x2_pt100_raw, &p5_x3_pt100_raw, &p5_x4_pt100_raw,
1275
+ &p5_x5_pt100_raw, &p5_x6_pt100_raw, &p5_x7_pt100_raw, &p5_x8_pt100_raw};
1276
+
1277
+ // PT100 CELSIUS
1278
+ float p5_x1_pt100, p5_x2_pt100, p5_x3_pt100, p5_x4_pt100, p5_x5_pt100, p5_x6_pt100, p5_x7_pt100, p5_x8_pt100;
1279
+ volatile float* p5__xn_pt100__[] = {&p5_x1_pt100, &p5_x2_pt100, &p5_x3_pt100, &p5_x4_pt100, &p5_x5_pt100, &p5_x6_pt100, &p5_x7_pt100, &p5_x8_pt100};
1280
+
1281
+
1282
+ // Ingressi digitali XN
1283
+ volatile char p5_x1_digin, p5_x2_digin, p5_x3_digin, p5_x4_digin,
1284
+ p5_x5_digin, p5_x6_digin, p5_x7_digin, p5_x8_digin;
1285
+ volatile char *p5__xn_digin__[] = {&p5_x1_digin, &p5_x2_digin, &p5_x3_digin, &p5_x4_digin,
1286
+ &p5_x5_digin, &p5_x6_digin, &p5_x7_digin, &p5_x8_digin};
1287
+
1288
+ volatile char p5_x1_i1, p5_x1_i2, p5_x2_i1, p5_x2_i2, p5_x3_i1, p5_x3_i2, p5_x4_i1, p5_x4_i2,
1289
+ p5_x5_i1, p5_x5_i2, p5_x6_i1, p5_x6_i2, p5_x7_i1, p5_x7_i2, p5_x8_i1, p5_x8_i2;
1290
+
1291
+ // Uscite digitali XN
1292
+ volatile char p5_x1_o1, p5_x1_o2, p5_x2_o1, p5_x2_o2, p5_x3_o1, p5_x3_o2, p5_x4_o1, p5_x4_o2,
1293
+ p5_x5_o1, p5_x5_o2, p5_x6_o1, p5_x6_o2, p5_x7_o1, p5_x7_o2, p5_x8_o1, p5_x8_o2;
1294
+ char *p5__xn_outs__[] = {&p5_x1_o1, &p5_x1_o2, &p5_x2_o1, &p5_x2_o2, &p5_x3_o1, &p5_x3_o2, &p5_x4_o1, &p5_x4_o2,
1295
+ &p5_x5_o1, &p5_x5_o2, &p5_x6_o1, &p5_x6_o2, &p5_x7_o1, &p5_x7_o2, &p5_x8_o1, &p5_x8_o2};
1296
+
1297
+ // Uscite PWM
1298
+ volatile U16 p5_x1_pwm = 2048;
1299
+ volatile U16 p5_x2_pwm = 2048;
1300
+ volatile U16 p5_x3_pwm = 2048;
1301
+ volatile U16 p5_x4_pwm = 2048;
1302
+ volatile U16 p5_x5_pwm = 2048;
1303
+ volatile U16 p5_x6_pwm = 2048;
1304
+ volatile U16 p5_x7_pwm = 2048;
1305
+ volatile U16 p5_x8_pwm = 2048;
1306
+
1307
+ U16 *p5__xn_pwms__[] = {&p5_x1_pwm, &p5_x2_pwm, &p5_x3_pwm, &p5_x4_pwm, &p5_x5_pwm, &p5_x6_pwm, &p5_x7_pwm, &p5_x8_pwm};
1308
+ #endif
1309
+
1310
+ #if PUZZLE_PERIFS >= 7
1311
+ volatile char p6_xn_config[] = { C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY,
1312
+ C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY};
1313
+ volatile long p6_encoder1, p6_encoder2;
1314
+ // EXP - INGRESSI E USCITE
1315
+ volatile char p6_i1, p6_i2, p6_i3, p6_i4, p6_i5, p6_i6, p6_i7, p6_i8, p6_i9, p6_i10, p6_i11,
1316
+ p6_i12, p6_i13, p6_i14, p6_i15, p6_i16, p6_i17, p6_i18, p6_i19, p6_i20, p6_i21,
1317
+ p6_i22, p6_i23, p6_i24, p6_i25, p6_i26, p6_i27, p6_i28, p6_i29, p6_i30, p6_i31,
1318
+ p6_i32, p6_i33, p6_i34, p6_i35, p6_i36, p6_i37, p6_i38, p6_i39, p6_i40, p6_i41,
1319
+ p6_i42, p6_i43, p6_i44, p6_i45, p6_i46, p6_i47, p6_i48, p6_i49, p6_i50, p6_i51,
1320
+ p6_i52, p6_i53, p6_i54, p6_i55, p6_i56, p6_i57, p6_i58, p6_i59, p6_i60, p6_i61,
1321
+ p6_i62, p6_i63, p6_i64;
1322
+ volatile unsigned char *p6__i__[] = {&p6_i1, &p6_i2, &p6_i3, &p6_i4, &p6_i5,
1323
+ &p6_i6, &p6_i7, &p6_i8, &p6_i9, &p6_i10,
1324
+ &p6_i11, &p6_i12, &p6_i13, &p6_i14, &p6_i15,
1325
+ &p6_i16, &p6_i17, &p6_i18, &p6_i19, &p6_i20,
1326
+ &p6_i21, &p6_i22, &p6_i23, &p6_i24, &p6_i25,
1327
+ &p6_i26, &p6_i27, &p6_i28, &p6_i29, &p6_i30,
1328
+ &p6_i31, &p6_i32, &p6_i33, &p6_i34, &p6_i35,
1329
+ &p6_i36, &p6_i37, &p6_i38, &p6_i39, &p6_i40,
1330
+ &p6_i41, &p6_i42, &p6_i43, &p6_i44, &p6_i45,
1331
+ &p6_i46, &p6_i47, &p6_i48, &p6_i49, &p6_i50,
1332
+ &p6_i51, &p6_i52, &p6_i53, &p6_i54, &p6_i55,
1333
+ &p6_i56, &p6_i57, &p6_i58, &p6_i59, &p6_i60,
1334
+ &p6_i61, &p6_i62, &p6_i63, &p6_i64};
1335
+ volatile char p6_o1, p6_o2, p6_o3, p6_o4, p6_o5, p6_o6, p6_o7, p6_o8, p6_o9, p6_o10,
1336
+ p6_o11, p6_o12, p6_o13, p6_o14, p6_o15, p6_o16, p6_o17, p6_o18, p6_o19, p6_o20,
1337
+ p6_o21, p6_o22, p6_o23, p6_o24, p6_o25, p6_o26, p6_o27, p6_o28, p6_o29, p6_o30,
1338
+ p6_o31, p6_o32, p6_o33, p6_o34, p6_o35, p6_o36, p6_o37, p6_o38, p6_o39, p6_o40,
1339
+ p6_o41, p6_o42, p6_o43, p6_o44, p6_o45, p6_o46, p6_o47, p6_o48, p6_o49, p6_o50,
1340
+ p6_o51, p6_o52, p6_o53, p6_o54, p6_o55, p6_o56, p6_o57, p6_o58, p6_o59, p6_o60,
1341
+ p6_o61, p6_o62, p6_o63, p6_o64;
1342
+ volatile unsigned char *p6__o__[] = {&p6_o1, &p6_o2, &p6_o3, &p6_o4, &p6_o5,
1343
+ &p6_o6, &p6_o7, &p6_o8, &p6_o9, &p6_o10,
1344
+ &p6_o11, &p6_o12, &p6_o13, &p6_o14, &p6_o15,
1345
+ &p6_o16, &p6_o17, &p6_o18, &p6_o19, &p6_o20,
1346
+ &p6_o21, &p6_o22, &p6_o23, &p6_o24, &p6_o25,
1347
+ &p6_o26, &p6_o27, &p6_o28, &p6_o29, &p6_o30,
1348
+ &p6_o31, &p6_o32, &p6_o33, &p6_o34, &p6_o35,
1349
+ &p6_o36, &p6_o37, &p6_o38, &p6_o39, &p6_o40,
1350
+ &p6_o41, &p6_o42, &p6_o43, &p6_o44, &p6_o45,
1351
+ &p6_o46, &p6_o47, &p6_o48, &p6_o49, &p6_o50,
1352
+ &p6_o51, &p6_o52, &p6_o53, &p6_o54, &p6_o55,
1353
+ &p6_o56, &p6_o57, &p6_o58, &p6_o59, &p6_o60,
1354
+ &p6_o61, &p6_o62, &p6_o63, &p6_o64};
1355
+ // Input analogici
1356
+ volatile int p6_x1_anal, p6_x2_anal, p6_x3_anal, p6_x4_anal, p6_x5_anal, p6_x6_anal, p6_x7_anal, p6_x8_anal;
1357
+ volatile int* p6__xn_anal__[] = {&p6_x1_anal, &p6_x2_anal, &p6_x3_anal, &p6_x4_anal, &p6_x5_anal, &p6_x6_anal, &p6_x7_anal, &p6_x8_anal};
1358
+
1359
+ // PT100 RAW
1360
+ volatile int p6_x1_pt100_raw, p6_x2_pt100_raw, p6_x3_pt100_raw, p6_x4_pt100_raw,
1361
+ p6_x5_pt100_raw, p6_x6_pt100_raw, p6_x7_pt100_raw, p6_x8_pt100_raw;
1362
+ volatile int* p6__xn_pt100_raw__[] = {&p6_x1_pt100_raw, &p6_x2_pt100_raw, &p6_x3_pt100_raw, &p6_x4_pt100_raw,
1363
+ &p6_x5_pt100_raw, &p6_x6_pt100_raw, &p6_x7_pt100_raw, &p6_x8_pt100_raw};
1364
+
1365
+ // PT100 CELSIUS
1366
+ float p6_x1_pt100, p6_x2_pt100, p6_x3_pt100, p6_x4_pt100, p6_x5_pt100, p6_x6_pt100, p6_x7_pt100, p6_x8_pt100;
1367
+ volatile float* p6__xn_pt100__[] = {&p6_x1_pt100, &p6_x2_pt100, &p6_x3_pt100, &p6_x4_pt100, &p6_x5_pt100, &p6_x6_pt100, &p6_x7_pt100, &p6_x8_pt100};
1368
+
1369
+
1370
+ // Ingressi digitali XN
1371
+ volatile char p6_x1_digin, p6_x2_digin, p6_x3_digin, p6_x4_digin,
1372
+ p6_x5_digin, p6_x6_digin, p6_x7_digin, p6_x8_digin;
1373
+ volatile char *p6__xn_digin__[] = {&p6_x1_digin, &p6_x2_digin, &p6_x3_digin, &p6_x4_digin,
1374
+ &p6_x5_digin, &p6_x6_digin, &p6_x7_digin, &p6_x8_digin};
1375
+
1376
+ volatile char p6_x1_i1, p6_x1_i2, p6_x2_i1, p6_x2_i2, p6_x3_i1, p6_x3_i2, p6_x4_i1, p6_x4_i2,
1377
+ p6_x5_i1, p6_x5_i2, p6_x6_i1, p6_x6_i2, p6_x7_i1, p6_x7_i2, p6_x8_i1, p6_x8_i2;
1378
+
1379
+ // Uscite digitali XN
1380
+ volatile char p6_x1_o1, p6_x1_o2, p6_x2_o1, p6_x2_o2, p6_x3_o1, p6_x3_o2, p6_x4_o1, p6_x4_o2,
1381
+ p6_x5_o1, p6_x5_o2, p6_x6_o1, p6_x6_o2, p6_x7_o1, p6_x7_o2, p6_x8_o1, p6_x8_o2;
1382
+ char *p6__xn_outs__[] = {&p6_x1_o1, &p6_x1_o2, &p6_x2_o1, &p6_x2_o2, &p6_x3_o1, &p6_x3_o2, &p6_x4_o1, &p6_x4_o2,
1383
+ &p6_x5_o1, &p6_x5_o2, &p6_x6_o1, &p6_x6_o2, &p6_x7_o1, &p6_x7_o2, &p6_x8_o1, &p6_x8_o2};
1384
+
1385
+ // Uscite PWM
1386
+ volatile U16 p6_x1_pwm = 2048;
1387
+ volatile U16 p6_x2_pwm = 2048;
1388
+ volatile U16 p6_x3_pwm = 2048;
1389
+ volatile U16 p6_x4_pwm = 2048;
1390
+ volatile U16 p6_x5_pwm = 2048;
1391
+ volatile U16 p6_x6_pwm = 2048;
1392
+ volatile U16 p6_x7_pwm = 2048;
1393
+ volatile U16 p6_x8_pwm = 2048;
1394
+
1395
+ U16 *p6__xn_pwms__[] = {&p6_x1_pwm, &p6_x2_pwm, &p6_x3_pwm, &p6_x4_pwm, &p6_x5_pwm, &p6_x6_pwm, &p6_x7_pwm, &p6_x8_pwm};
1396
+ #endif
1397
+
1398
+ #if PUZZLE_PERIFS >= 8
1399
+ volatile char p7_xn_config[] = { C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY,
1400
+ C_EMPTY, C_EMPTY, C_EMPTY, C_EMPTY};
1401
+ volatile long p7_encoder1, p7_encoder2;
1402
+ // EXP - INGRESSI E USCITE
1403
+ volatile char p7_i1, p7_i2, p7_i3, p7_i4, p7_i5, p7_i6, p7_i7, p7_i8, p7_i9, p7_i10, p7_i11,
1404
+ p7_i12, p7_i13, p7_i14, p7_i15, p7_i16, p7_i17, p7_i18, p7_i19, p7_i20, p7_i21,
1405
+ p7_i22, p7_i23, p7_i24, p7_i25, p7_i26, p7_i27, p7_i28, p7_i29, p7_i30, p7_i31,
1406
+ p7_i32, p7_i33, p7_i34, p7_i35, p7_i36, p7_i37, p7_i38, p7_i39, p7_i40, p7_i41,
1407
+ p7_i42, p7_i43, p7_i44, p7_i45, p7_i46, p7_i47, p7_i48, p7_i49, p7_i50, p7_i51,
1408
+ p7_i52, p7_i53, p7_i54, p7_i55, p7_i56, p7_i57, p7_i58, p7_i59, p7_i60, p7_i61,
1409
+ p7_i62, p7_i63, p7_i64;
1410
+ volatile unsigned char *p7__i__[] = {&p7_i1, &p7_i2, &p7_i3, &p7_i4, &p7_i5,
1411
+ &p7_i6, &p7_i7, &p7_i8, &p7_i9, &p7_i10,
1412
+ &p7_i11, &p7_i12, &p7_i13, &p7_i14, &p7_i15,
1413
+ &p7_i16, &p7_i17, &p7_i18, &p7_i19, &p7_i20,
1414
+ &p7_i21, &p7_i22, &p7_i23, &p7_i24, &p7_i25,
1415
+ &p7_i26, &p7_i27, &p7_i28, &p7_i29, &p7_i30,
1416
+ &p7_i31, &p7_i32, &p7_i33, &p7_i34, &p7_i35,
1417
+ &p7_i36, &p7_i37, &p7_i38, &p7_i39, &p7_i40,
1418
+ &p7_i41, &p7_i42, &p7_i43, &p7_i44, &p7_i45,
1419
+ &p7_i46, &p7_i47, &p7_i48, &p7_i49, &p7_i50,
1420
+ &p7_i51, &p7_i52, &p7_i53, &p7_i54, &p7_i55,
1421
+ &p7_i56, &p7_i57, &p7_i58, &p7_i59, &p7_i60,
1422
+ &p7_i61, &p7_i62, &p7_i63, &p7_i64};
1423
+ volatile char p7_o1, p7_o2, p7_o3, p7_o4, p7_o5, p7_o6, p7_o7, p7_o8, p7_o9, p7_o10,
1424
+ p7_o11, p7_o12, p7_o13, p7_o14, p7_o15, p7_o16, p7_o17, p7_o18, p7_o19, p7_o20,
1425
+ p7_o21, p7_o22, p7_o23, p7_o24, p7_o25, p7_o26, p7_o27, p7_o28, p7_o29, p7_o30,
1426
+ p7_o31, p7_o32, p7_o33, p7_o34, p7_o35, p7_o36, p7_o37, p7_o38, p7_o39, p7_o40,
1427
+ p7_o41, p7_o42, p7_o43, p7_o44, p7_o45, p7_o46, p7_o47, p7_o48, p7_o49, p7_o50,
1428
+ p7_o51, p7_o52, p7_o53, p7_o54, p7_o55, p7_o56, p7_o57, p7_o58, p7_o59, p7_o60,
1429
+ p7_o61, p7_o62, p7_o63, p7_o64;
1430
+ volatile unsigned char *p7__o__[] = {&p7_o1, &p7_o2, &p7_o3, &p7_o4, &p7_o5,
1431
+ &p7_o6, &p7_o7, &p7_o8, &p7_o9, &p7_o10,
1432
+ &p7_o11, &p7_o12, &p7_o13, &p7_o14, &p7_o15,
1433
+ &p7_o16, &p7_o17, &p7_o18, &p7_o19, &p7_o20,
1434
+ &p7_o21, &p7_o22, &p7_o23, &p7_o24, &p7_o25,
1435
+ &p7_o26, &p7_o27, &p7_o28, &p7_o29, &p7_o30,
1436
+ &p7_o31, &p7_o32, &p7_o33, &p7_o34, &p7_o35,
1437
+ &p7_o36, &p7_o37, &p7_o38, &p7_o39, &p7_o40,
1438
+ &p7_o41, &p7_o42, &p7_o43, &p7_o44, &p7_o45,
1439
+ &p7_o46, &p7_o47, &p7_o48, &p7_o49, &p7_o50,
1440
+ &p7_o51, &p7_o52, &p7_o53, &p7_o54, &p7_o55,
1441
+ &p7_o56, &p7_o57, &p7_o58, &p7_o59, &p7_o60,
1442
+ &p7_o61, &p7_o62, &p7_o63, &p7_o64};
1443
+ // Input analogici
1444
+ volatile int p7_x1_anal, p7_x2_anal, p7_x3_anal, p7_x4_anal, p7_x5_anal, p7_x6_anal, p7_x7_anal, p7_x8_anal;
1445
+ volatile int* p7__xn_anal__[] = {&p7_x1_anal, &p7_x2_anal, &p7_x3_anal, &p7_x4_anal, &p7_x5_anal, &p7_x6_anal, &p7_x7_anal, &p7_x8_anal};
1446
+
1447
+ // PT100 RAW
1448
+ volatile int p7_x1_pt100_raw, p7_x2_pt100_raw, p7_x3_pt100_raw, p7_x4_pt100_raw,
1449
+ p7_x5_pt100_raw, p7_x6_pt100_raw, p7_x7_pt100_raw, p7_x8_pt100_raw;
1450
+ volatile int* p7__xn_pt100_raw__[] = {&p7_x1_pt100_raw, &p7_x2_pt100_raw, &p7_x3_pt100_raw, &p7_x4_pt100_raw,
1451
+ &p7_x5_pt100_raw, &p7_x6_pt100_raw, &p7_x7_pt100_raw, &p7_x8_pt100_raw};
1452
+
1453
+ // PT100 CELSIUS
1454
+ float p7_x1_pt100, p7_x2_pt100, p7_x3_pt100, p7_x4_pt100, p7_x5_pt100, p7_x6_pt100, p7_x7_pt100, p7_x8_pt100;
1455
+ volatile float* p7__xn_pt100__[] = {&p7_x1_pt100, &p7_x2_pt100, &p7_x3_pt100, &p7_x4_pt100, &p7_x5_pt100, &p7_x6_pt100, &p7_x7_pt100, &p7_x8_pt100};
1456
+
1457
+
1458
+ // Ingressi digitali XN
1459
+ volatile char p7_x1_digin, p7_x2_digin, p7_x3_digin, p7_x4_digin,
1460
+ p7_x5_digin, p7_x6_digin, p7_x7_digin, p7_x8_digin;
1461
+ volatile char *p7__xn_digin__[] = {&p7_x1_digin, &p7_x2_digin, &p7_x3_digin, &p7_x4_digin,
1462
+ &p7_x5_digin, &p7_x6_digin, &p7_x7_digin, &p7_x8_digin};
1463
+
1464
+ volatile char p7_x1_i1, p7_x1_i2, p7_x2_i1, p7_x2_i2, p7_x3_i1, p7_x3_i2, p7_x4_i1, p7_x4_i2,
1465
+ p7_x5_i1, p7_x5_i2, p7_x6_i1, p7_x6_i2, p7_x7_i1, p7_x7_i2, p7_x8_i1, p7_x8_i2;
1466
+
1467
+ // Uscite digitali XN
1468
+ volatile char p7_x1_o1, p7_x1_o2, p7_x2_o1, p7_x2_o2, p7_x3_o1, p7_x3_o2, p7_x4_o1, p7_x4_o2,
1469
+ p7_x5_o1, p7_x5_o2, p7_x6_o1, p7_x6_o2, p7_x7_o1, p7_x7_o2, p7_x8_o1, p7_x8_o2;
1470
+ char *p7__xn_outs__[] = {&p7_x1_o1, &p7_x1_o2, &p7_x2_o1, &p7_x2_o2, &p7_x3_o1, &p7_x3_o2, &p7_x4_o1, &p7_x4_o2,
1471
+ &p7_x5_o1, &p7_x5_o2, &p7_x6_o1, &p7_x6_o2, &p7_x7_o1, &p7_x7_o2, &p7_x8_o1, &p7_x8_o2};
1472
+
1473
+ // Uscite PWM
1474
+ volatile U16 p7_x1_pwm = 2048;
1475
+ volatile U16 p7_x2_pwm = 2048;
1476
+ volatile U16 p7_x3_pwm = 2048;
1477
+ volatile U16 p7_x4_pwm = 2048;
1478
+ volatile U16 p7_x5_pwm = 2048;
1479
+ volatile U16 p7_x6_pwm = 2048;
1480
+ volatile U16 p7_x7_pwm = 2048;
1481
+ volatile U16 p7_x8_pwm = 2048;
1482
+
1483
+ U16 *p7__xn_pwms__[] = {&p7_x1_pwm, &p7_x2_pwm, &p7_x3_pwm, &p7_x4_pwm, &p7_x5_pwm, &p7_x6_pwm, &p7_x7_pwm, &p7_x8_pwm};
1484
+ #endif
1485
+
1486
+ //---------------------- CAN ------------------------------------
1487
+ int ntx_frame = 0;
1488
+ CANBASE_MSG CAN_TXBuf;
1489
+ CANBASE_MSG CAN_RXBuf;
1490
+
1491
+ int puzzle_can_cnt = 0;
1492
+ int puzzle_can_rx_cnt = 0;
1493
+ int puzzle_nperif = 0; // serve per ciclare sulle periferiche nel task di invio frame
1494
+
1495
+ void puzzle_prepare_perif(int); // nperif
1496
+ void puzzle_parse_perif(int); // nperif
1497
+
1498
+ void puzzle_send_frame(int, int); // nperif, nframe
1499
+ void puzzle_parse_frame(CANBASE_MSG);
1500
+
1501
+ void puzzle_prepare_perif(int nper)
1502
+ {
1503
+ int i;
1504
+
1505
+ switch (nper) {
1506
+ case 0: // PERIF 0
1507
+ // config
1508
+ for (i = 0; i < 8; i++) p50_xn_config[i] = xn_config[i];
1509
+ // dig outs
1510
+ p50_x1_o1 = x1_o1; p50_x1_o2 = x1_o2;
1511
+ p50_x2_o1 = x2_o1; p50_x2_o2 = x2_o2;
1512
+ p50_x3_o1 = x3_o1; p50_x3_o2 = x3_o2;
1513
+ p50_x4_o1 = x4_o1; p50_x4_o2 = x4_o2;
1514
+ p50_x5_o1 = x5_o1; p50_x5_o2 = x5_o2;
1515
+ p50_x6_o1 = x6_o1; p50_x6_o2 = x6_o2;
1516
+ p50_x7_o1 = x7_o1; p50_x7_o2 = x7_o2;
1517
+ p50_x8_o1 = x8_o1; p50_x8_o2 = x8_o2;
1518
+ // pwms
1519
+ p50_x1_pwm = x1_pwm;
1520
+ p50_x2_pwm = x2_pwm;
1521
+ p50_x3_pwm = x3_pwm;
1522
+ p50_x4_pwm = x4_pwm;
1523
+ p50_x5_pwm = x5_pwm;
1524
+ p50_x6_pwm = x6_pwm;
1525
+ p50_x7_pwm = x7_pwm;
1526
+ p50_x8_pwm = x8_pwm;
1527
+ // exp
1528
+ p50_o_low = 0;
1529
+ p50_o_high = 0;
1530
+ for (i = 0; i < 32; i++) p50_o_low |= ((*p__o__[i] & 1) << i);
1531
+ for (i = 0; i < 32; i++) p50_o_high |= ((*p__o__[i+32] & 1) << i);
1532
+ break;
1533
+ #if PUZZLE_PERIFS >= 2
1534
+ case 1: // PERIF 1
1535
+ // config
1536
+ for (i = 0; i < 8; i++) p50_xn_config[i] = p1_xn_config[i];
1537
+ // dig outs
1538
+ p50_x1_o1 = p1_x1_o1; p50_x1_o2 = p1_x1_o2;
1539
+ p50_x2_o1 = p1_x2_o1; p50_x2_o2 = p1_x2_o2;
1540
+ p50_x3_o1 = p1_x3_o1; p50_x3_o2 = p1_x3_o2;
1541
+ p50_x4_o1 = p1_x4_o1; p50_x4_o2 = p1_x4_o2;
1542
+ p50_x5_o1 = p1_x5_o1; p50_x5_o2 = p1_x5_o2;
1543
+ p50_x6_o1 = p1_x6_o1; p50_x6_o2 = p1_x6_o2;
1544
+ p50_x7_o1 = p1_x7_o1; p50_x7_o2 = p1_x7_o2;
1545
+ p50_x8_o1 = p1_x8_o1; p50_x8_o2 = p1_x8_o2;
1546
+ // pwms
1547
+ p50_x1_pwm = p1_x1_pwm;
1548
+ p50_x2_pwm = p1_x2_pwm;
1549
+ p50_x3_pwm = p1_x3_pwm;
1550
+ p50_x4_pwm = p1_x4_pwm;
1551
+ p50_x5_pwm = p1_x5_pwm;
1552
+ p50_x6_pwm = p1_x6_pwm;
1553
+ p50_x7_pwm = p1_x7_pwm;
1554
+ p50_x8_pwm = p1_x8_pwm;
1555
+ // exp
1556
+ p50_o_low = 0;
1557
+ p50_o_high = 0;
1558
+ for (i = 0; i < 32; i++) p50_o_low |= ((*p1__o__[i] & 1) << i);
1559
+ for (i = 0; i < 32; i++) p50_o_high |= ((*p1__o__[i+32] & 1) << i);
1560
+ break;
1561
+ #endif
1562
+ #if PUZZLE_PERIFS >= 3
1563
+ case 2: // PERIF 2
1564
+ // config
1565
+ for (i = 0; i < 8; i++) p50_xn_config[i] = p2_xn_config[i];
1566
+ // dig outs
1567
+ p50_x1_o1 = p2_x1_o1; p50_x1_o2 = p2_x1_o2;
1568
+ p50_x2_o1 = p2_x2_o1; p50_x2_o2 = p2_x2_o2;
1569
+ p50_x3_o1 = p2_x3_o1; p50_x3_o2 = p2_x3_o2;
1570
+ p50_x4_o1 = p2_x4_o1; p50_x4_o2 = p2_x4_o2;
1571
+ p50_x5_o1 = p2_x5_o1; p50_x5_o2 = p2_x5_o2;
1572
+ p50_x6_o1 = p2_x6_o1; p50_x6_o2 = p2_x6_o2;
1573
+ p50_x7_o1 = p2_x7_o1; p50_x7_o2 = p2_x7_o2;
1574
+ p50_x8_o1 = p2_x8_o1; p50_x8_o2 = p2_x8_o2;
1575
+ // pwms
1576
+ p50_x1_pwm = p2_x1_pwm;
1577
+ p50_x2_pwm = p2_x2_pwm;
1578
+ p50_x3_pwm = p2_x3_pwm;
1579
+ p50_x4_pwm = p2_x4_pwm;
1580
+ p50_x5_pwm = p2_x5_pwm;
1581
+ p50_x6_pwm = p2_x6_pwm;
1582
+ p50_x7_pwm = p2_x7_pwm;
1583
+ p50_x8_pwm = p2_x8_pwm;
1584
+ // exp
1585
+ p50_o_low = 0;
1586
+ p50_o_high = 0;
1587
+ for (i = 0; i < 32; i++) p50_o_low |= ((*p2__o__[i] & 1) << i);
1588
+ for (i = 0; i < 32; i++) p50_o_high |= ((*p2__o__[i+32] & 1) << i);
1589
+ break;
1590
+ #endif
1591
+ #if PUZZLE_PERIFS >= 4
1592
+ case 3: // PERIF 3
1593
+ // config
1594
+ for (i = 0; i < 8; i++) p50_xn_config[i] = p3_xn_config[i];
1595
+ // dig outs
1596
+ p50_x1_o1 = p3_x1_o1; p50_x1_o2 = p3_x1_o2;
1597
+ p50_x2_o1 = p3_x2_o1; p50_x2_o2 = p3_x2_o2;
1598
+ p50_x3_o1 = p3_x3_o1; p50_x3_o2 = p3_x3_o2;
1599
+ p50_x4_o1 = p3_x4_o1; p50_x4_o2 = p3_x4_o2;
1600
+ p50_x5_o1 = p3_x5_o1; p50_x5_o2 = p3_x5_o2;
1601
+ p50_x6_o1 = p3_x6_o1; p50_x6_o2 = p3_x6_o2;
1602
+ p50_x7_o1 = p3_x7_o1; p50_x7_o2 = p3_x7_o2;
1603
+ p50_x8_o1 = p3_x8_o1; p50_x8_o2 = p3_x8_o2;
1604
+ // pwms
1605
+ p50_x1_pwm = p3_x1_pwm;
1606
+ p50_x2_pwm = p3_x2_pwm;
1607
+ p50_x3_pwm = p3_x3_pwm;
1608
+ p50_x4_pwm = p3_x4_pwm;
1609
+ p50_x5_pwm = p3_x5_pwm;
1610
+ p50_x6_pwm = p3_x6_pwm;
1611
+ p50_x7_pwm = p3_x7_pwm;
1612
+ p50_x8_pwm = p3_x8_pwm;
1613
+ // exp
1614
+ p50_o_low = 0;
1615
+ p50_o_high = 0;
1616
+ for (i = 0; i < 32; i++) p50_o_low |= ((*p3__o__[i] & 1) << i);
1617
+ for (i = 0; i < 32; i++) p50_o_high |= ((*p3__o__[i+32] & 1) << i);
1618
+ break;
1619
+ #endif
1620
+ #if PUZZLE_PERIFS >= 5
1621
+ case 4: // PERIF 4
1622
+ // config
1623
+ for (i = 0; i < 8; i++) p50_xn_config[i] = p4_xn_config[i];
1624
+ // dig outs
1625
+ p50_x1_o1 = p4_x1_o1; p50_x1_o2 = p4_x1_o2;
1626
+ p50_x2_o1 = p4_x2_o1; p50_x2_o2 = p4_x2_o2;
1627
+ p50_x3_o1 = p4_x3_o1; p50_x3_o2 = p4_x3_o2;
1628
+ p50_x4_o1 = p4_x4_o1; p50_x4_o2 = p4_x4_o2;
1629
+ p50_x5_o1 = p4_x5_o1; p50_x5_o2 = p4_x5_o2;
1630
+ p50_x6_o1 = p4_x6_o1; p50_x6_o2 = p4_x6_o2;
1631
+ p50_x7_o1 = p4_x7_o1; p50_x7_o2 = p4_x7_o2;
1632
+ p50_x8_o1 = p4_x8_o1; p50_x8_o2 = p4_x8_o2;
1633
+ // pwms
1634
+ p50_x1_pwm = p4_x1_pwm;
1635
+ p50_x2_pwm = p4_x2_pwm;
1636
+ p50_x3_pwm = p4_x3_pwm;
1637
+ p50_x4_pwm = p4_x4_pwm;
1638
+ p50_x5_pwm = p4_x5_pwm;
1639
+ p50_x6_pwm = p4_x6_pwm;
1640
+ p50_x7_pwm = p4_x7_pwm;
1641
+ p50_x8_pwm = p4_x8_pwm;
1642
+ // exp
1643
+ p50_o_low = 0;
1644
+ p50_o_high = 0;
1645
+ for (i = 0; i < 32; i++) p50_o_low |= ((*p4__o__[i] & 1) << i);
1646
+ for (i = 0; i < 32; i++) p50_o_high |= ((*p4__o__[i+32] & 1) << i);
1647
+ break;
1648
+ #endif
1649
+ #if PUZZLE_PERIFS >= 6
1650
+ case 5: // PERIF 5
1651
+ // config
1652
+ for (i = 0; i < 8; i++) p50_xn_config[i] = p5_xn_config[i];
1653
+ // dig outs
1654
+ p50_x1_o1 = p5_x1_o1; p50_x1_o2 = p5_x1_o2;
1655
+ p50_x2_o1 = p5_x2_o1; p50_x2_o2 = p5_x2_o2;
1656
+ p50_x3_o1 = p5_x3_o1; p50_x3_o2 = p5_x3_o2;
1657
+ p50_x4_o1 = p5_x4_o1; p50_x4_o2 = p5_x4_o2;
1658
+ p50_x5_o1 = p5_x5_o1; p50_x5_o2 = p5_x5_o2;
1659
+ p50_x6_o1 = p5_x6_o1; p50_x6_o2 = p5_x6_o2;
1660
+ p50_x7_o1 = p5_x7_o1; p50_x7_o2 = p5_x7_o2;
1661
+ p50_x8_o1 = p5_x8_o1; p50_x8_o2 = p5_x8_o2;
1662
+ // pwms
1663
+ p50_x1_pwm = p5_x1_pwm;
1664
+ p50_x2_pwm = p5_x2_pwm;
1665
+ p50_x3_pwm = p5_x3_pwm;
1666
+ p50_x4_pwm = p5_x4_pwm;
1667
+ p50_x5_pwm = p5_x5_pwm;
1668
+ p50_x6_pwm = p5_x6_pwm;
1669
+ p50_x7_pwm = p5_x7_pwm;
1670
+ p50_x8_pwm = p5_x8_pwm;
1671
+ // exp
1672
+ p50_o_low = 0;
1673
+ p50_o_high = 0;
1674
+ for (i = 0; i < 32; i++) p50_o_low |= ((*p5__o__[i] & 1) << i);
1675
+ for (i = 0; i < 32; i++) p50_o_high |= ((*p5__o__[i+32] & 1) << i);
1676
+ break;
1677
+ #endif
1678
+ #if PUZZLE_PERIFS >= 7
1679
+ case 6: // PERIF 6
1680
+ // config
1681
+ for (i = 0; i < 8; i++) p50_xn_config[i] = p6_xn_config[i];
1682
+ // dig outs
1683
+ p50_x1_o1 = p6_x1_o1; p50_x1_o2 = p6_x1_o2;
1684
+ p50_x2_o1 = p6_x2_o1; p50_x2_o2 = p6_x2_o2;
1685
+ p50_x3_o1 = p6_x3_o1; p50_x3_o2 = p6_x3_o2;
1686
+ p50_x4_o1 = p6_x4_o1; p50_x4_o2 = p6_x4_o2;
1687
+ p50_x5_o1 = p6_x5_o1; p50_x5_o2 = p6_x5_o2;
1688
+ p50_x6_o1 = p6_x6_o1; p50_x6_o2 = p6_x6_o2;
1689
+ p50_x7_o1 = p6_x7_o1; p50_x7_o2 = p6_x7_o2;
1690
+ p50_x8_o1 = p6_x8_o1; p50_x8_o2 = p6_x8_o2;
1691
+ // pwms
1692
+ p50_x1_pwm = p6_x1_pwm;
1693
+ p50_x2_pwm = p6_x2_pwm;
1694
+ p50_x3_pwm = p6_x3_pwm;
1695
+ p50_x4_pwm = p6_x4_pwm;
1696
+ p50_x5_pwm = p6_x5_pwm;
1697
+ p50_x6_pwm = p6_x6_pwm;
1698
+ p50_x7_pwm = p6_x7_pwm;
1699
+ p50_x8_pwm = p6_x8_pwm;
1700
+ // exp
1701
+ p50_o_low = 0;
1702
+ p50_o_high = 0;
1703
+ for (i = 0; i < 32; i++) p50_o_low |= ((*p6__o__[i] & 1) << i);
1704
+ for (i = 0; i < 32; i++) p50_o_high |= ((*p6__o__[i+32] & 1) << i);
1705
+ break;
1706
+ #endif
1707
+ #if PUZZLE_PERIFS >= 8
1708
+ case 7: // PERIF 7
1709
+ // config
1710
+ for (i = 0; i < 8; i++) p50_xn_config[i] = p7_xn_config[i];
1711
+ // dig outs
1712
+ p50_x1_o1 = p7_x1_o1; p50_x1_o2 = p7_x1_o2;
1713
+ p50_x2_o1 = p7_x2_o1; p50_x2_o2 = p7_x2_o2;
1714
+ p50_x3_o1 = p7_x3_o1; p50_x3_o2 = p7_x3_o2;
1715
+ p50_x4_o1 = p7_x4_o1; p50_x4_o2 = p7_x4_o2;
1716
+ p50_x5_o1 = p7_x5_o1; p50_x5_o2 = p7_x5_o2;
1717
+ p50_x6_o1 = p7_x6_o1; p50_x6_o2 = p7_x6_o2;
1718
+ p50_x7_o1 = p7_x7_o1; p50_x7_o2 = p7_x7_o2;
1719
+ p50_x8_o1 = p7_x8_o1; p50_x8_o2 = p7_x8_o2;
1720
+ // pwms
1721
+ p50_x1_pwm = p7_x1_pwm;
1722
+ p50_x2_pwm = p7_x2_pwm;
1723
+ p50_x3_pwm = p7_x3_pwm;
1724
+ p50_x4_pwm = p7_x4_pwm;
1725
+ p50_x5_pwm = p7_x5_pwm;
1726
+ p50_x6_pwm = p7_x6_pwm;
1727
+ p50_x7_pwm = p7_x7_pwm;
1728
+ p50_x8_pwm = p7_x8_pwm;
1729
+ // exp
1730
+ p50_o_low = 0;
1731
+ p50_o_high = 0;
1732
+ for (i = 0; i < 32; i++) p50_o_low |= ((*p7__o__[i] & 1) << i);
1733
+ for (i = 0; i < 32; i++) p50_o_high |= ((*p7__o__[i+32] & 1) << i);
1734
+ break;
1735
+ #endif
1736
+ }
1737
+ }
1738
+
1739
+ void puzzle_parse_perif(int nper)
1740
+ {
1741
+ int i;
1742
+ switch (nper) {
1743
+ case 0:
1744
+ // dig in
1745
+ x1_i1 = p50_x1_i1; x1_i2 = p50_x1_i2;
1746
+ x2_i1 = p50_x2_i1; x2_i2 = p50_x2_i2;
1747
+ x3_i1 = p50_x3_i1; x3_i2 = p50_x3_i2;
1748
+ x4_i1 = p50_x4_i1; x4_i2 = p50_x4_i2;
1749
+ x5_i1 = p50_x5_i1; x5_i2 = p50_x5_i2;
1750
+ x6_i1 = p50_x6_i1; x6_i2 = p50_x6_i2;
1751
+ x7_i1 = p50_x7_i1; x7_i2 = p50_x7_i2;
1752
+ x8_i1 = p50_x8_i1; x8_i2 = p50_x8_i2;
1753
+
1754
+ for (i = 0; i < 8; i++) *(__xn_anal__[i]) = *(p50__xn_anal__[i]); // analog in
1755
+ for (i = 0; i < 8; i++) *(__xn_pt100_raw__[i]) = *(p50__xn_pt100_raw__[i]); // PT100 RAW
1756
+ for (i = 0; i < 8; i++) *(__xn_pt100__[i]) = *(p50__xn_pt100__[i]); // PT100 CELSIUS
1757
+ // EXP
1758
+ for (i = 0; i < 32; i++) *(p__i__[i]) = ((p50_i_low >> i) & 1);
1759
+ for (i = 0; i < 32; i++) *(p__i__[i+32]) = ((p50_i_high >> i) & 1);
1760
+ // ENC
1761
+ p_encoder1 = p50_encoder1;
1762
+ p_encoder2 = p50_encoder2;
1763
+ break;
1764
+ #if PUZZLE_PERIFS >= 2
1765
+ case 1:
1766
+ // dig in
1767
+ p1_x1_i1 = p50_x1_i1; p1_x1_i2 = p50_x1_i2;
1768
+ p1_x2_i1 = p50_x2_i1; p1_x2_i2 = p50_x2_i2;
1769
+ p1_x3_i1 = p50_x3_i1; p1_x3_i2 = p50_x3_i2;
1770
+ p1_x4_i1 = p50_x4_i1; p1_x4_i2 = p50_x4_i2;
1771
+ p1_x5_i1 = p50_x5_i1; p1_x5_i2 = p50_x5_i2;
1772
+ p1_x6_i1 = p50_x6_i1; p1_x6_i2 = p50_x6_i2;
1773
+ p1_x7_i1 = p50_x7_i1; p1_x7_i2 = p50_x7_i2;
1774
+ p1_x8_i1 = p50_x8_i1; p1_x8_i2 = p50_x8_i2;
1775
+
1776
+ for (i = 0; i < 8; i++) *(p1__xn_anal__[i]) = *(p50__xn_anal__[i]); // analog in
1777
+ for (i = 0; i < 8; i++) *(p1__xn_pt100_raw__[i]) = *(p50__xn_pt100_raw__[i]); // PT100 RAW
1778
+ for (i = 0; i < 8; i++) *(p1__xn_pt100__[i]) = *(p50__xn_pt100__[i]); // PT100 CELSIUS
1779
+ // EXP
1780
+ for (i = 0; i < 32; i++) *(p1__i__[i]) = ((p50_i_low >> i) & 1);
1781
+ for (i = 0; i < 32; i++) *(p1__i__[i+32]) = ((p50_i_high >> i) & 1);
1782
+ // ENC
1783
+ p1_encoder1 = p50_encoder1;
1784
+ p1_encoder2 = p50_encoder2;
1785
+ break;
1786
+ #endif
1787
+ #if PUZZLE_PERIFS >= 3
1788
+ case 2:
1789
+ // dig in
1790
+ p2_x1_i1 = p50_x1_i1; p2_x1_i2 = p50_x1_i2;
1791
+ p2_x2_i1 = p50_x2_i1; p2_x2_i2 = p50_x2_i2;
1792
+ p2_x3_i1 = p50_x3_i1; p2_x3_i2 = p50_x3_i2;
1793
+ p2_x4_i1 = p50_x4_i1; p2_x4_i2 = p50_x4_i2;
1794
+ p2_x5_i1 = p50_x5_i1; p2_x5_i2 = p50_x5_i2;
1795
+ p2_x6_i1 = p50_x6_i1; p2_x6_i2 = p50_x6_i2;
1796
+ p2_x7_i1 = p50_x7_i1; p2_x7_i2 = p50_x7_i2;
1797
+ p2_x8_i1 = p50_x8_i1; p2_x8_i2 = p50_x8_i2;
1798
+
1799
+ for (i = 0; i < 8; i++) *(p2__xn_anal__[i]) = *(p50__xn_anal__[i]); // analog in
1800
+ for (i = 0; i < 8; i++) *(p2__xn_pt100_raw__[i]) = *(p50__xn_pt100_raw__[i]); // PT100 RAW
1801
+ for (i = 0; i < 8; i++) *(p2__xn_pt100__[i]) = *(p50__xn_pt100__[i]); // PT100 CELSIUS
1802
+ // EXP
1803
+ for (i = 0; i < 32; i++) *(p2__i__[i]) = ((p50_i_low >> i) & 1);
1804
+ for (i = 0; i < 32; i++) *(p2__i__[i+32]) = ((p50_i_high >> i) & 1);
1805
+ // ENC
1806
+ p2_encoder1 = p50_encoder1;
1807
+ p2_encoder2 = p50_encoder2;
1808
+ break;
1809
+ #endif
1810
+ #if PUZZLE_PERIFS >= 4
1811
+ case 3:
1812
+ // dig in
1813
+ p3_x1_i1 = p50_x1_i1; p3_x1_i2 = p50_x1_i2;
1814
+ p3_x2_i1 = p50_x2_i1; p3_x2_i2 = p50_x2_i2;
1815
+ p3_x3_i1 = p50_x3_i1; p3_x3_i2 = p50_x3_i2;
1816
+ p3_x4_i1 = p50_x4_i1; p3_x4_i2 = p50_x4_i2;
1817
+ p3_x5_i1 = p50_x5_i1; p3_x5_i2 = p50_x5_i2;
1818
+ p3_x6_i1 = p50_x6_i1; p3_x6_i2 = p50_x6_i2;
1819
+ p3_x7_i1 = p50_x7_i1; p3_x7_i2 = p50_x7_i2;
1820
+ p3_x8_i1 = p50_x8_i1; p3_x8_i2 = p50_x8_i2;
1821
+
1822
+ for (i = 0; i < 8; i++) *(p3__xn_anal__[i]) = *(p50__xn_anal__[i]); // analog in
1823
+ for (i = 0; i < 8; i++) *(p3__xn_pt100_raw__[i]) = *(p50__xn_pt100_raw__[i]); // PT100 RAW
1824
+ for (i = 0; i < 8; i++) *(p3__xn_pt100__[i]) = *(p50__xn_pt100__[i]); // PT100 CELSIUS
1825
+ // EXP
1826
+ for (i = 0; i < 32; i++) *(p3__i__[i]) = ((p50_i_low >> i) & 1);
1827
+ for (i = 0; i < 32; i++) *(p3__i__[i+32]) = ((p50_i_high >> i) & 1);
1828
+ // ENC
1829
+ p3_encoder1 = p50_encoder1;
1830
+ p3_encoder2 = p50_encoder2;
1831
+ break;
1832
+ #endif
1833
+ #if PUZZLE_PERIFS >= 5
1834
+ case 4:
1835
+ // dig in
1836
+ p4_x1_i1 = p50_x1_i1; p4_x1_i2 = p50_x1_i2;
1837
+ p4_x2_i1 = p50_x2_i1; p4_x2_i2 = p50_x2_i2;
1838
+ p4_x3_i1 = p50_x3_i1; p4_x3_i2 = p50_x3_i2;
1839
+ p4_x4_i1 = p50_x4_i1; p4_x4_i2 = p50_x4_i2;
1840
+ p4_x5_i1 = p50_x5_i1; p4_x5_i2 = p50_x5_i2;
1841
+ p4_x6_i1 = p50_x6_i1; p4_x6_i2 = p50_x6_i2;
1842
+ p4_x7_i1 = p50_x7_i1; p4_x7_i2 = p50_x7_i2;
1843
+ p4_x8_i1 = p50_x8_i1; p4_x8_i2 = p50_x8_i2;
1844
+
1845
+ for (i = 0; i < 8; i++) *(p4__xn_anal__[i]) = *(p50__xn_anal__[i]); // analog in
1846
+ for (i = 0; i < 8; i++) *(p4__xn_pt100_raw__[i]) = *(p50__xn_pt100_raw__[i]); // PT100 RAW
1847
+ for (i = 0; i < 8; i++) *(p4__xn_pt100__[i]) = *(p50__xn_pt100__[i]); // PT100 CELSIUS
1848
+ // EXP
1849
+ for (i = 0; i < 32; i++) *(p4__i__[i]) = ((p50_i_low >> i) & 1);
1850
+ for (i = 0; i < 32; i++) *(p4__i__[i+32]) = ((p50_i_high >> i) & 1);
1851
+ // ENC
1852
+ p4_encoder1 = p50_encoder1;
1853
+ p4_encoder2 = p50_encoder2;
1854
+ break;
1855
+ #endif
1856
+ #if PUZZLE_PERIFS >= 6
1857
+ case 5:
1858
+ // dig in
1859
+ p5_x1_i1 = p50_x1_i1; p5_x1_i2 = p50_x1_i2;
1860
+ p5_x2_i1 = p50_x2_i1; p5_x2_i2 = p50_x2_i2;
1861
+ p5_x3_i1 = p50_x3_i1; p5_x3_i2 = p50_x3_i2;
1862
+ p5_x4_i1 = p50_x4_i1; p5_x4_i2 = p50_x4_i2;
1863
+ p5_x5_i1 = p50_x5_i1; p5_x5_i2 = p50_x5_i2;
1864
+ p5_x6_i1 = p50_x6_i1; p5_x6_i2 = p50_x6_i2;
1865
+ p5_x7_i1 = p50_x7_i1; p5_x7_i2 = p50_x7_i2;
1866
+ p5_x8_i1 = p50_x8_i1; p5_x8_i2 = p50_x8_i2;
1867
+
1868
+ for (i = 0; i < 8; i++) *(p5__xn_anal__[i]) = *(p50__xn_anal__[i]); // analog in
1869
+ for (i = 0; i < 8; i++) *(p5__xn_pt100_raw__[i]) = *(p50__xn_pt100_raw__[i]); // PT100 RAW
1870
+ for (i = 0; i < 8; i++) *(p5__xn_pt100__[i]) = *(p50__xn_pt100__[i]); // PT100 CELSIUS
1871
+ // EXP
1872
+ for (i = 0; i < 32; i++) *(p5__i__[i]) = ((p50_i_low >> i) & 1);
1873
+ for (i = 0; i < 32; i++) *(p5__i__[i+32]) = ((p50_i_high >> i) & 1);
1874
+ // ENC
1875
+ p5_encoder1 = p50_encoder1;
1876
+ p5_encoder2 = p50_encoder2;
1877
+ break;
1878
+ #endif
1879
+ #if PUZZLE_PERIFS >= 7
1880
+ case 6:
1881
+ // dig in
1882
+ p6_x1_i1 = p50_x1_i1; p6_x1_i2 = p50_x1_i2;
1883
+ p6_x2_i1 = p50_x2_i1; p6_x2_i2 = p50_x2_i2;
1884
+ p6_x3_i1 = p50_x3_i1; p6_x3_i2 = p50_x3_i2;
1885
+ p6_x4_i1 = p50_x4_i1; p6_x4_i2 = p50_x4_i2;
1886
+ p6_x5_i1 = p50_x5_i1; p6_x5_i2 = p50_x5_i2;
1887
+ p6_x6_i1 = p50_x6_i1; p6_x6_i2 = p50_x6_i2;
1888
+ p6_x7_i1 = p50_x7_i1; p6_x7_i2 = p50_x7_i2;
1889
+ p6_x8_i1 = p50_x8_i1; p6_x8_i2 = p50_x8_i2;
1890
+
1891
+ for (i = 0; i < 8; i++) *(p6__xn_anal__[i]) = *(p50__xn_anal__[i]); // analog in
1892
+ for (i = 0; i < 8; i++) *(p6__xn_pt100_raw__[i]) = *(p50__xn_pt100_raw__[i]); // PT100 RAW
1893
+ for (i = 0; i < 8; i++) *(p6__xn_pt100__[i]) = *(p50__xn_pt100__[i]); // PT100 CELSIUS
1894
+ // EXP
1895
+ for (i = 0; i < 32; i++) *(p6__i__[i]) = ((p50_i_low >> i) & 1);
1896
+ for (i = 0; i < 32; i++) *(p6__i__[i+32]) = ((p50_i_high >> i) & 1);
1897
+ // ENC
1898
+ p6_encoder1 = p50_encoder1;
1899
+ p6_encoder2 = p50_encoder2;
1900
+ break;
1901
+ #endif
1902
+ #if PUZZLE_PERIFS >= 8
1903
+ case 7:
1904
+ // dig in
1905
+ p7_x1_i1 = p50_x1_i1; p7_x1_i2 = p50_x1_i2;
1906
+ p7_x2_i1 = p50_x2_i1; p7_x2_i2 = p50_x2_i2;
1907
+ p7_x3_i1 = p50_x3_i1; p7_x3_i2 = p50_x3_i2;
1908
+ p7_x4_i1 = p50_x4_i1; p7_x4_i2 = p50_x4_i2;
1909
+ p7_x5_i1 = p50_x5_i1; p7_x5_i2 = p50_x5_i2;
1910
+ p7_x6_i1 = p50_x6_i1; p7_x6_i2 = p50_x6_i2;
1911
+ p7_x7_i1 = p50_x7_i1; p7_x7_i2 = p50_x7_i2;
1912
+ p7_x8_i1 = p50_x8_i1; p7_x8_i2 = p50_x8_i2;
1913
+
1914
+ for (i = 0; i < 8; i++) *(p7__xn_anal__[i]) = *(p50__xn_anal__[i]); // analog in
1915
+ for (i = 0; i < 8; i++) *(p7__xn_pt100_raw__[i]) = *(p50__xn_pt100_raw__[i]); // PT100 RAW
1916
+ for (i = 0; i < 8; i++) *(p7__xn_pt100__[i]) = *(p50__xn_pt100__[i]); // PT100 CELSIUS
1917
+ // EXP
1918
+ for (i = 0; i < 32; i++) *(p7__i__[i]) = ((p50_i_low >> i) & 1);
1919
+ for (i = 0; i < 32; i++) *(p7__i__[i+32]) = ((p50_i_high >> i) & 1);
1920
+ // ENC
1921
+ p7_encoder1 = p50_encoder1;
1922
+ p7_encoder2 = p50_encoder2;
1923
+ break;
1924
+ #endif
1925
+ }
1926
+ }
1927
+
1928
+ void puzzle_send_frame(int nper, int nframe)
1929
+ {
1930
+ U32 da, db, msgid;
1931
+ int i;
1932
+
1933
+ msgid = (nper & 0xFF) | ((nframe & 0xFF) << 8) | ((p_ext1_on & 0x01) << 16) | ((p_ext2_on & 0x01) << 17);
1934
+ // Reset request (bit-18 del msgid)
1935
+ /*
1936
+ if (puzzle_reset == 1) {
1937
+ puzzle_reset = 0;
1938
+ msgid |= (1 << 18);
1939
+ }
1940
+ */
1941
+ if (puzzle_reset_perif[nper] == 1) {
1942
+ puzzle_reset_perif[nper] = 0;
1943
+ msgid |= (1 << 18);
1944
+ }
1945
+ da = 0;
1946
+ db = 0;
1947
+
1948
+ // prepara periferica sul buffer della periferica 50
1949
+ puzzle_prepare_perif(nper);
1950
+
1951
+ switch (nframe) {
1952
+ case 0: // XN config
1953
+ // 6-bit per ogni slot, 2 moduli EXP
1954
+ da = ((p50_xn_config[5] & 0x03) << 30) |
1955
+ ((p50_xn_config[4] & 0x3F) << 24) |
1956
+ ((p50_xn_config[3] & 0x3F) << 18) |
1957
+ ((p50_xn_config[2] & 0x3F) << 12) |
1958
+ ((p50_xn_config[1] & 0x3F) << 6) |
1959
+ (p50_xn_config[0] & 0x3F);
1960
+ db |= ( (p50_o_low & 0xFFFF) << 16 ) |
1961
+ ((p50_xn_config[7] & 0x3F) << 10) |
1962
+ ((p50_xn_config[6] & 0x3F) << 4) |
1963
+ ((p50_xn_config[5] >> 2) & 0x0F);
1964
+ /*
1965
+ db = ((p_o1 & 0x01) << 16) | ((p_o2 & 0x01) << 17) | ((p_o3 & 0x01) << 18) |
1966
+ ((p_o4 & 0x01) << 19) | ((p_o5 & 0x01) << 20) | ((p_o6 & 0x01) << 21) |
1967
+ ((p_o7 & 0x01) << 22) | ((p_o8 & 0x01) << 23) |
1968
+ ((p_o9 & 0x01) << 24) | ((p_o10 & 0x01) << 25) | ((p_o11 & 0x01) << 26) |
1969
+ ((p_o12 & 0x01) << 27) | ((p_o13 & 0x01) << 28) | ((p_o14 & 0x01) << 29) |
1970
+ ((p_o15 & 0x01) << 30) | ((p_o16 & 0x01) << 31) |
1971
+
1972
+ ((xn_config[7] & 0x3F) << 10) |
1973
+ ((xn_config[6] & 0x3F) << 4) |
1974
+ (xn_config[5] & 0x0F);
1975
+ */
1976
+ break;
1977
+
1978
+ case 1: // X1... X4
1979
+ switch (p50_xn_config[0]) { // X1
1980
+ case C_OUT:
1981
+ da |= ((p50_x1_o2 & 0x01) << 1) | (p50_x1_o1 & 0x01);
1982
+ break;
1983
+
1984
+ case C_PWM:
1985
+ da |= (p50_x1_pwm & 0xFFFF);
1986
+ break;
1987
+
1988
+ case C_EMPTY:
1989
+ break;
1990
+ }
1991
+ switch (p50_xn_config[1]) { // X2
1992
+ case C_OUT:
1993
+ da |= ((p50_x2_o2 & 0x01) << 17) | ((p50_x2_o1 & 0x01) << 16);
1994
+ break;
1995
+
1996
+ case C_PWM:
1997
+ da |= ((p50_x2_pwm & 0xFFFF) << 16);
1998
+ break;
1999
+
2000
+ case C_EMPTY:
2001
+ break;
2002
+ }
2003
+ switch (p50_xn_config[2]) { // X3
2004
+ case C_OUT:
2005
+ db |= ((p50_x3_o2 & 0x01) << 1) | (p50_x3_o1 & 0x01);
2006
+ break;
2007
+
2008
+ case C_PWM:
2009
+ db |= (p50_x3_pwm & 0xFFFF);
2010
+ break;
2011
+
2012
+ case C_EMPTY:
2013
+ break;
2014
+ }
2015
+ switch (p50_xn_config[3]) { // X4
2016
+ case C_OUT:
2017
+ db |= ((p50_x4_o2 & 0x01) << 17) | ((p50_x4_o1 & 0x01) << 16);
2018
+ break;
2019
+
2020
+ case C_PWM:
2021
+ db |= ((p50_x4_pwm & 0xFFFF) << 16);
2022
+ break;
2023
+
2024
+ case C_EMPTY:
2025
+ break;
2026
+ }
2027
+ break;
2028
+
2029
+ case 2: // X5... X8
2030
+ switch (p50_xn_config[4]) { // X5
2031
+ case C_OUT:
2032
+ da |= ((p50_x5_o2 & 0x01) << 1) | (p50_x5_o1 & 0x01);
2033
+ break;
2034
+
2035
+ case C_PWM:
2036
+ da |= (p50_x5_pwm & 0xFFFF);
2037
+ break;
2038
+
2039
+ case C_EMPTY:
2040
+ break;
2041
+ }
2042
+ switch (p50_xn_config[5]) { // X6
2043
+ case C_OUT:
2044
+ da |= ((p50_x6_o2 & 0x01) << 17) | ((p50_x6_o1 & 0x01) << 16);
2045
+ break;
2046
+
2047
+ case C_PWM:
2048
+ da |= ((p50_x6_pwm & 0xFFFF) << 16);
2049
+ break;
2050
+
2051
+ case C_EMPTY:
2052
+ break;
2053
+ }
2054
+ switch (p50_xn_config[6]) { // X7
2055
+ case C_OUT:
2056
+ db |= ((p50_x7_o2 & 0x01) << 1) | (p50_x7_o1 & 0x01);
2057
+ break;
2058
+
2059
+ case C_PWM:
2060
+ db |= (p50_x7_pwm & 0xFFFF);
2061
+ break;
2062
+
2063
+ case C_EMPTY:
2064
+ break;
2065
+ }
2066
+ switch (p50_xn_config[7]) { // X8
2067
+ case C_OUT:
2068
+ db |= ((p50_x8_o2 & 0x01) << 17) | ((p50_x8_o1 & 0x01) << 16);
2069
+ break;
2070
+
2071
+ case C_PWM:
2072
+ db |= ((p50_x8_pwm & 0xFFFF) << 16);
2073
+ break;
2074
+
2075
+ case C_EMPTY:
2076
+ break;
2077
+ }
2078
+ break;
2079
+
2080
+ case 3: // EXP (opzionale)
2081
+ da = p50_o_low;
2082
+ db = p50_o_high;
2083
+ /*
2084
+ for (i = 0; i < 32; i++) da |= (*p__o__[i] & 0x01) << i;
2085
+ for (i = 32; i< 64; i++) db |= (*p__o__[i] & 0x01) << (i-32);
2086
+ */
2087
+ break;
2088
+ }
2089
+
2090
+ //CAN_TXBuf.Frame = 0x00080000;
2091
+ CAN_TXBuf.Frame = 0x80080000;
2092
+ CAN_TXBuf.MsgID = msgid;
2093
+ CAN_TXBuf.DatA = da;
2094
+ CAN_TXBuf.DatB = db;
2095
+ puzzle_can_cnt++;
2096
+ canbase_txmsg(&CAN_TXBuf);
2097
+ }
2098
+
2099
+ float PT100_X1_perif0, PT100_X2_perif0, PT100_X3_perif0, PT100_X4_perif0;
2100
+ float PT100_X5_perif0, PT100_X6_perif0, PT100_X7_perif0, PT100_X8_perif0;
2101
+ float PT100_X1_perif1, PT100_X2_perif1, PT100_X3_perif1, PT100_X4_perif1;
2102
+ float PT100_X5_perif1, PT100_X6_perif1, PT100_X7_perif1, PT100_X8_perif1;
2103
+ short int cnt_rx0, cnt_rx1, cnt_rx2, cnt_rx3;
2104
+
2105
+ void puzzle_parse_frame(CANBASE_MSG mcan_msg)
2106
+ {
2107
+ int i;
2108
+ U32 msgid = mcan_msg.MsgID;
2109
+ U32 da = mcan_msg.DatA;
2110
+ U32 db = mcan_msg.DatB;
2111
+ int nperif, nmess;
2112
+
2113
+ p_dipswitch_status = (msgid >> 20) & 0xF;
2114
+ puzzle_version = (msgid >> 16) & 0x0F;
2115
+ nmess = (msgid >> 8) & 0xFF;
2116
+ nperif = (msgid & 0xFF);
2117
+
2118
+ if(nperif == 0)
2119
+ {
2120
+ if(nmess == 0)
2121
+ {
2122
+ p50_x1_pt100 = pt100_calc((da & 0xFFFF), 0);
2123
+ PT100_X1_perif0 = p50_x1_pt100;
2124
+ ///
2125
+ p50_x2_pt100 = pt100_calc(((da & 0xFFFF0000) >> 16), 0);
2126
+ PT100_X2_perif0 = p50_x2_pt100;
2127
+ ///
2128
+ p50_x3_pt100 = pt100_calc((db & 0xFFFF), 0);
2129
+ PT100_X3_perif0 = p50_x3_pt100;
2130
+ ///
2131
+ p50_x4_pt100 = pt100_calc(((db & 0xFFFF0000) >> 16), 0);
2132
+ PT100_X4_perif0 = p50_x4_pt100;
2133
+ cnt_rx0++;
2134
+ }
2135
+ if(nmess == 1)
2136
+ {
2137
+ p50_x5_pt100 = pt100_calc((da & 0xFFFF), 0);
2138
+ PT100_X5_perif0 = p50_x5_pt100;
2139
+ ///
2140
+ p50_x6_pt100 = pt100_calc(((da & 0xFFFF0000) >> 16), 0);
2141
+ PT100_X6_perif0 = p50_x6_pt100;
2142
+ ///
2143
+ p50_x7_pt100 = pt100_calc((db & 0xFFFF), 0);
2144
+ PT100_X7_perif0 = p50_x7_pt100;
2145
+ ///
2146
+ p50_x8_pt100 = pt100_calc(((db & 0xFFFF0000) >> 16), 0);
2147
+ PT100_X8_perif0 = p50_x8_pt100;
2148
+ cnt_rx1++;
2149
+ }
2150
+ }
2151
+ else if(nperif == 1)
2152
+ {
2153
+ if(nmess == 0)
2154
+ {
2155
+ p50_x1_pt100 = pt100_calc((da & 0xFFFF), 0);
2156
+ PT100_X1_perif1 = p50_x1_pt100;
2157
+ ///
2158
+ p50_x2_pt100 = pt100_calc(((da & 0xFFFF0000) >> 16), 0);
2159
+ PT100_X2_perif1 = p50_x2_pt100;
2160
+ ///
2161
+ p50_x3_pt100 = pt100_calc((db & 0xFFFF), 0);
2162
+ PT100_X3_perif1 = p50_x3_pt100;
2163
+ ///
2164
+ p50_x4_pt100 = pt100_calc(((db & 0xFFFF0000) >> 16), 0);
2165
+ PT100_X4_perif1 = p50_x4_pt100;
2166
+ cnt_rx2++;
2167
+ }
2168
+ if(nmess == 1)
2169
+ {
2170
+ p50_x5_pt100 = pt100_calc((da & 0xFFFF), 0);
2171
+ PT100_X5_perif1 = p50_x5_pt100;
2172
+ ///
2173
+ p50_x6_pt100 = pt100_calc(((da & 0xFFFF0000) >> 16), 0);
2174
+ PT100_X6_perif1 = p50_x6_pt100;
2175
+ ///
2176
+ p50_x7_pt100 = pt100_calc((db & 0xFFFF), 0);
2177
+ PT100_X7_perif1 = p50_x7_pt100;
2178
+ ///
2179
+ p50_x8_pt100 = pt100_calc(((db & 0xFFFF0000) >> 16), 0);
2180
+ PT100_X8_perif1 = p50_x8_pt100;
2181
+ cnt_rx3++;
2182
+ }
2183
+ }
2184
+
2185
+ // Scrivi sulla periferica 50
2186
+ switch (nmess) {
2187
+ case 0: // X1... X4
2188
+ p50_x1_anal = (da & 0xFFFF);
2189
+ p50_x1_i1 = (da & 0x01);
2190
+ p50_x1_i2 = (da & 0x02) >> 1;
2191
+ p50_x1_pt100_raw = (da & 0xFFFF);
2192
+ p50_x1_pt100 = pt100_calc(x1_pt100_raw, 0);
2193
+
2194
+ p50_x2_anal = (da & 0xFFFF0000) >> 16;
2195
+ p50_x2_i1 = (da & 0x10000) >> 16;
2196
+ p50_x2_i2 = (da & 0x20000) >> 16;
2197
+ p50_x2_pt100_raw = (da & 0xFFFF0000) >> 16;
2198
+ p50_x2_pt100 = pt100_calc(x2_pt100_raw, 1);
2199
+
2200
+ p50_x3_anal = (db & 0xFFFF);
2201
+ p50_x3_i1 = (db & 0x1);
2202
+ p50_x3_i2 = (db & 0x2);
2203
+ p50_x3_pt100_raw = (db & 0xFFFF);
2204
+ p50_x3_pt100 = pt100_calc(x3_pt100_raw, 2);
2205
+
2206
+ p50_x4_anal = (db & 0xFFFF0000) >> 16;
2207
+ p50_x4_i1 = (db & 0x10000) >> 16;
2208
+ p50_x4_i2 = (db & 0x20000) >> 16;
2209
+ p50_x4_pt100_raw = (db & 0xFFFF0000) >> 16;
2210
+ p50_x4_pt100 = pt100_calc(x4_pt100_raw, 3);
2211
+ break;
2212
+
2213
+ case 1: // X5... X8
2214
+ p50_x5_anal = (da & 0xFFFF);
2215
+ p50_x5_i1 = (da & 0x01);
2216
+ p50_x5_i2 = (da & 0x02) >> 1;
2217
+ p50_x5_pt100_raw = (da & 0xFFFF);
2218
+ p50_x5_pt100 = pt100_calc(x5_pt100_raw, 4);
2219
+
2220
+ p50_x6_anal = (da & 0xFFFF0000) >> 16;
2221
+ p50_x6_i1 = (da & 0x10000) >> 16;
2222
+ p50_x6_i2 = (da & 0x20000) >> 16;
2223
+ p50_x6_pt100_raw = (da & 0xFFFF0000) >> 16;
2224
+ p50_x6_pt100 = pt100_calc(x6_pt100_raw, 5);
2225
+
2226
+ p50_x7_anal = (db & 0xFFFF);
2227
+ p50_x7_i1 = (db & 0x1);
2228
+ p50_x7_i2 = (db & 0x2);
2229
+ p50_x7_pt100_raw = (db & 0xFFFF);
2230
+ p50_x7_pt100 = pt100_calc(x7_pt100_raw, 6);
2231
+
2232
+ p50_x8_anal = (db & 0xFFFF0000) >> 16;
2233
+ p50_x8_i1 = (db & 0x10000) >> 16;
2234
+ p50_x8_i2 = (db & 0x20000) >> 16;
2235
+ p50_x8_pt100_raw = (db & 0xFFFF0000) >> 16;
2236
+ p50_x8_pt100 = pt100_calc(x8_pt100_raw, 7);
2237
+ break;
2238
+
2239
+ case 2: // EXP 1-4 + ENC1.
2240
+ p50_i_low = da;
2241
+ p50_encoder1 = db;
2242
+ break;
2243
+
2244
+ case 3: // EXP 5-8 + ENC2
2245
+ p50_i_high = da;
2246
+ p50_encoder2 = db;
2247
+ break;
2248
+
2249
+ default:
2250
+ break;
2251
+ }
2252
+
2253
+ if (nperif == 0)
2254
+ {
2255
+ if (nmess == 0)
2256
+ {
2257
+ x1_pt100 = p50_x1_pt100;
2258
+ x2_pt100 = p50_x2_pt100;
2259
+ x3_pt100 = p50_x3_pt100;
2260
+ x4_pt100 = p50_x4_pt100;
2261
+
2262
+ x1_i1 = p50_x1_i1;
2263
+ x1_i2 = p50_x1_i2;
2264
+ x2_i1 = p50_x2_i1;
2265
+ x2_i2 = p50_x2_i2;
2266
+ x3_i1 = p50_x3_i1;
2267
+ x3_i2 = p50_x3_i2;
2268
+ x4_i1 = p50_x4_i1;
2269
+ x4_i2 = p50_x4_i2;
2270
+ }
2271
+ else if (nmess == 1)
2272
+ {
2273
+ x5_pt100 = p50_x5_pt100;
2274
+ x6_pt100 = p50_x6_pt100;
2275
+ x7_pt100 = p50_x7_pt100;
2276
+ x8_pt100 = p50_x8_pt100;
2277
+
2278
+ x5_i1 = p50_x5_i1;
2279
+ x5_i2 = p50_x5_i2;
2280
+ x6_i1 = p50_x6_i1;
2281
+ x6_i2 = p50_x6_i2;
2282
+ x7_i1 = p50_x7_i1;
2283
+ x7_i2 = p50_x7_i2;
2284
+ x8_i1 = p50_x8_i1;
2285
+ x8_i2 = p50_x8_i2;
2286
+ }
2287
+ }
2288
+ else if (nperif == 1)
2289
+ {
2290
+ if (nmess == 0)
2291
+ {
2292
+ p1_x1_pt100 = p50_x1_pt100;
2293
+ p1_x2_pt100 = p50_x2_pt100;
2294
+ p1_x3_pt100 = p50_x3_pt100;
2295
+ p1_x4_pt100 = p50_x4_pt100;
2296
+
2297
+ p1_x1_i1 = p50_x1_i1;
2298
+ p1_x1_i2 = p50_x1_i2;
2299
+ p1_x2_i1 = p50_x2_i1;
2300
+ p1_x2_i2 = p50_x2_i2;
2301
+ p1_x3_i1 = p50_x3_i1;
2302
+ p1_x3_i2 = p50_x3_i2;
2303
+ p1_x4_i1 = p50_x4_i1;
2304
+ p1_x4_i2 = p50_x4_i2;
2305
+ }
2306
+ else if (nmess == 1)
2307
+ {
2308
+ p1_x5_pt100 = p50_x5_pt100;
2309
+ p1_x6_pt100 = p50_x6_pt100;
2310
+ p1_x7_pt100 = p50_x7_pt100;
2311
+ p1_x8_pt100 = p50_x8_pt100;
2312
+
2313
+ p1_x5_i1 = p50_x5_i1;
2314
+ p1_x5_i2 = p50_x5_i2;
2315
+ p1_x6_i1 = p50_x6_i1;
2316
+ p1_x6_i2 = p50_x6_i2;
2317
+ p1_x7_i1 = p50_x7_i1;
2318
+ p1_x7_i2 = p50_x7_i2;
2319
+ p1_x8_i1 = p50_x8_i1;
2320
+ p1_x8_i2 = p50_x8_i2;
2321
+ }
2322
+ }
2323
+ for (i = 0; i < 8; i++) *(__xn_pt100_raw__[i]) = *(p50__xn_pt100_raw__[i]); // PT100 RAW
2324
+ for (i = 0; i < 8; i++) *(__xn_pt100__[i]) = *(p50__xn_pt100__[i]); // PT100 CELSIUS
2325
+ // fai il parsing in base al numero di periferica
2326
+ //puzzle_parse_perif(nperif);
2327
+ }
2328
+ void puzzle_task_can_rx()
2329
+ {
2330
+ while (1) {
2331
+ if ( canbase_rxmsg(&CAN_RXBuf) ) {
2332
+ puzzle_parse_frame(CAN_RXBuf);
2333
+ puzzle_can_rx_cnt++;
2334
+ puzzle_disc_cnt = 0;
2335
+ }
2336
+ idle();
2337
+ }
2338
+ }
2339
+
2340
+ int puzzle_max = 0;
2341
+ void puzzle_task_can()
2342
+ {
2343
+ int nper = 0;
2344
+ puzzle_nperif = PUZZLE_PERIFS;
2345
+
2346
+ while (1) {
2347
+ //puzzle_can_cnt++;
2348
+ // ciclo sulle periferiche
2349
+ puzzle_send_frame(nper, ntx_frame);
2350
+ ntx_frame = (ntx_frame + 1) % 4;
2351
+ if ((ntx_frame == 3) && !p_ext2_on) { ntx_frame = 0; }
2352
+ // scatta alla periferica successiva
2353
+ if (ntx_frame == 0) nper = (nper + 1) % PUZZLE_PERIFS;
2354
+ if (puzzle_disc_cnt < 1000) {
2355
+ puzzle_disc_cnt++;
2356
+ puzzle_perif_on = 1;
2357
+ } else {
2358
+ puzzle_perif_on = 0;
2359
+ }
2360
+
2361
+ every(3);
2362
+ }
2363
+ }
2364
+
2365
+ void puzzle_start_can(char e1, char e2)
2366
+ {
2367
+ puzzle_com = P_CAN;
2368
+ p_ext1_on = e2;
2369
+ p_ext2_on = e1;
2370
+ #ifdef linux
2371
+ canbase_init(4, 670000);
2372
+ #else
2373
+ canbase_init(4, 0x0048c003);
2374
+ CAN_AFMR = 0x00000002L;
2375
+ CAN1IER = 0;
2376
+ CAN1MOD = 1;
2377
+ CAN1GSR = 0;
2378
+ CAN1BTR = 0x003CC004; // 670KHz
2379
+ CAN1IER = 1;
2380
+ CAN1MOD = 4;
2381
+ #endif
2382
+ exec_task(puzzle_task_can, 0, 4);
2383
+ exec_task(puzzle_task_can_rx, 0, 4);
2384
+ }
2385
+
2386
+ void puzzle_stop_can()
2387
+ {
2388
+ remove_task(puzzle_task_can);
2389
+ remove_task(puzzle_task_can_rx);
2390
+ }
2391
+
2392
+ //------------------- BOOTLOADER ------------------
2393
+ #define N_HIGH(x) (((x)>>8) & 0xFF)
2394
+ #define N_LOW(x) ((x) & 0xFF)
2395
+
2396
+ void install_fupdate(void);
2397
+ U8 byte_chsum(U8 b);
2398
+ U8 chsum(U8 *buf, int len);
2399
+ void RX_fupdate(COM *);
2400
+ void puzzle_fupdate(void);
2401
+ int pfile_nchunks(FILE *);
2402
+ int firmware_present(void);
2403
+
2404
+ int pboot_status=0;
2405
+ int pupdate_perc=0;
2406
+ int rxflag=0; // setto a 1 dall'interrupt di rx
2407
+ U8 prx_buf[10];
2408
+ U8 ptx_buf[36]; // byte 0: start, bytes 1-2: nprog, bytes 3-34: payload, byte 35: chsum
2409
+ int update_cnt=0;
2410
+ int num_pacchetti=0;
2411
+ int pnprog=0;
2412
+ FILE *pfile;
2413
+ U8 *pfhead; // puntatore alla porzione di heap che contiene il file
2414
+ int pfirmware_source=0; // 0: USB, 1: SD
2415
+
2416
+ void install_fupdate()
2417
+ {
2418
+ Com = PortaCOM;
2419
+ com_close(Com);
2420
+ com_disable(Com);
2421
+ com_open(Com,115200);
2422
+ protocol_mode(Com,1); // COMx IN MODO 1 (BLOAD/BSAVE)
2423
+ onrx(Com,RX_fupdate);
2424
+ Com->centr=0x01; // centr = who sends
2425
+ Com->perif=0x02; // perif = who receives
2426
+ com_enable(Com); // ABILITA LA COM
2427
+ }
2428
+
2429
+ void RX_fupdate(COM *Com)
2430
+ {
2431
+ rxflag=1;
2432
+ int rxsize=0;
2433
+ rxsize = bload(PortaCOM, prx_buf, 3);
2434
+ }
2435
+
2436
+ U8 byte_chsum(U8 b)
2437
+ {
2438
+ int i=0;
2439
+ U8 ret=0;
2440
+ for (i=0; i<8; i++) {
2441
+ ret += (b >> i) & 1;
2442
+ }
2443
+ return (U8)ret;
2444
+ }
2445
+
2446
+ U8 chsum(U8 *buf, int len)
2447
+ {
2448
+ // len must be <= 256
2449
+ if (len > 256) len=256;
2450
+ int i=0;
2451
+ U8 ret=0;
2452
+ for (i=0; i<len; i++) ret += byte_chsum(buf[i]);
2453
+ return (U8)ret;
2454
+ }
2455
+
2456
+ int pfile_nchunks(FILE *mfp)
2457
+ {
2458
+ // ritorna il numero di chunks da 32 bytes ciascuno del file
2459
+ int size, ret;
2460
+ fseek(mfp, 0, SEEK_END);
2461
+ size = ftell(mfp);
2462
+ fseek(mfp, 0, SEEK_SET);
2463
+ ret = size / 32;
2464
+ if ( (size%32) > 0 ) ret++;
2465
+ return ret;
2466
+ }
2467
+
2468
+ int firmware_present() // NB: vale solo per terminale Puzzle
2469
+ {
2470
+ /*
2471
+ int usb = 0;
2472
+ usb = usb_present();
2473
+ if ( !usb ) return 0;
2474
+ */
2475
+ char pfname[20];
2476
+ if (pfirmware_source == 0) sprintf(pfname, "D:\\FIRMWARE.BIN");
2477
+ else sprintf(pfname, "C:\\FIRMWARE.BIN");
2478
+ FILE *fwfp;
2479
+ //fwfp = fopen("D:\\FIRMWARE.BIN","r");
2480
+ fwfp = fopen(pfname,"r");
2481
+ if (fwfp) { fclose(fwfp); return 1; }
2482
+ else { fclose(fwfp); return 0; }
2483
+ }
2484
+
2485
+ void puzzle_fupdate()
2486
+ {
2487
+ while (1) {
2488
+ update_cnt++;
2489
+
2490
+ switch (pboot_status) {
2491
+
2492
+ case 0: // reset variabili
2493
+ num_pacchetti=0;
2494
+ pupdate_perc=0;
2495
+ pnprog=0;
2496
+ pboot_status=1;
2497
+ break;
2498
+
2499
+ case 1: // invio segnale di freezing del boot
2500
+ pnprog = 0;
2501
+ ptx_buf[0] = 0xFB;
2502
+ ptx_buf[1] = 0xC1;
2503
+ ptx_buf[2] = 0xBB;
2504
+ bsave(PortaCOM, ptx_buf, 3);
2505
+ rxflag=0;
2506
+ if ( num_pacchetti > 0 ) pboot_status=5;
2507
+ else pboot_status=3;
2508
+ break;
2509
+
2510
+ case 3: // preparo il file
2511
+
2512
+ if (pfirmware_source == 0) {
2513
+ pfile = fopen("D:\\FIRMWARE.BIN","r");
2514
+ } else {
2515
+ pfile = fopen("C:\\FIRMWARE.BIN","r");
2516
+ }
2517
+ if (pfile) {
2518
+ num_pacchetti = pfile_nchunks(pfile);
2519
+ pboot_status = 5;
2520
+ } else {
2521
+ pboot_status = 900;
2522
+ }
2523
+ break;
2524
+
2525
+ case 5: // attesa ricezione ACK
2526
+ if (rxflag==1) { rxflag=0; pboot_status=10; }
2527
+ else { pboot_status=1; }
2528
+ break;
2529
+
2530
+ case 10: // verifica ACK
2531
+ if (prx_buf[0]==0xC1 && prx_buf[1]==0xFB && prx_buf[2]==0xBB) pboot_status=15;
2532
+ else pboot_status=1;
2533
+ break;
2534
+
2535
+ case 15: // ACK ricevuto, calcolo e mando il numero di chunks
2536
+ ptx_buf[0] = 0xC1; // byte di controllo
2537
+ ptx_buf[1] = N_HIGH(num_pacchetti); // n pacchetti
2538
+ ptx_buf[2] = N_LOW(num_pacchetti); // n pacchetti
2539
+ ptx_buf[3] = chsum(&ptx_buf[1], 2); // checksum
2540
+ rxflag=0;
2541
+ bsave(PortaCOM, ptx_buf, 4);
2542
+ pboot_status=20;
2543
+ break;
2544
+
2545
+ case 20: // attesa ACK header
2546
+ if (rxflag==1) { rxflag=0; pboot_status=25; } // pacchetto ricevuto
2547
+ else pboot_status=15; // rimando il pacchetto
2548
+ break;
2549
+
2550
+ case 25: // verifica ACK, se OK vai avanti
2551
+ if (prx_buf[0]==0xC2 && prx_buf[1]==0xFB && prx_buf[2]==0xBB) pboot_status=28;
2552
+ else pboot_status=15; // rimando l'header
2553
+ break;
2554
+
2555
+ case 28: // leggo chunk dal file
2556
+ fread( (U8 *)(&ptx_buf[3]), 32, 1, pfile );
2557
+ pboot_status = 30;
2558
+ break;
2559
+
2560
+ case 30: // mando i pacchetti
2561
+ ptx_buf[0] = 0xB1; // start
2562
+ ptx_buf[1] = N_HIGH(pnprog);
2563
+ ptx_buf[2] = N_LOW(pnprog);
2564
+ ptx_buf[35] = chsum(&ptx_buf[3], 32); // checksum
2565
+ rxflag=0;
2566
+ bsave(PortaCOM, ptx_buf, 36);
2567
+ pboot_status = 35;
2568
+ break;
2569
+
2570
+ case 35: // attesa ACK pacchetto
2571
+ if (rxflag==1) { rxflag=0; pboot_status=40; }
2572
+ else pboot_status=30; // rimando il pacchetto
2573
+ break;
2574
+
2575
+ case 40: // verifica ACK
2576
+ if (prx_buf[0] == 0xC3 && prx_buf[1] == N_HIGH(pnprog) && prx_buf[2] == N_LOW(pnprog)) {
2577
+ // ACK ok, manda pacchetto successivo o vai alla fine se era l'ultimo
2578
+ pnprog++;
2579
+ pupdate_perc = (100*pnprog)/num_pacchetti;
2580
+ if (pnprog < num_pacchetti) { pboot_status = 28; break; } // pacchetto successivo
2581
+ else { pboot_status = 70; } // manda flag di fine trasmissione
2582
+ } else {
2583
+ pboot_status = 30; // rimando pacchetto pnprog
2584
+ }
2585
+ break;
2586
+
2587
+ case 70: // flag di fine trasmissione
2588
+ ptx_buf[0] = 0xC9;
2589
+ ptx_buf[1] = 0xFB;
2590
+ ptx_buf[2] = 0xBB;
2591
+ bsave(PortaCOM, ptx_buf, 3);
2592
+ pboot_status = 1000;
2593
+ break;
2594
+
2595
+ case 900: // file D:\\FIRMWARE.BIN non presente
2596
+ fclose(pfile); // prova
2597
+ break;
2598
+
2599
+ case 1000: // fine invio
2600
+ fclose(pfile);
2601
+ // riavvia il task puzzle, e resetta tutte le variabili del caso
2602
+ pboot_status = 0;
2603
+ if ( puzzle_com == P_RS485 ) puzzle_start();
2604
+ else puzzle_start_can(p_ext1_on, p_ext2_on);
2605
+ remove_task(puzzle_fupdate);
2606
+ break;
2607
+
2608
+ default:
2609
+ break;
2610
+ }
2611
+
2612
+ wait(20);
2613
+ }
2614
+ }
2615
+