Changes for page Front I/O

Last modified by Kevin Wiki on 2024/07/07 22:48

From version 8.2
edited by Kevin Wiki
on 2024/07/05 14:00
Change comment: There is no comment for this version
To version 8.8
edited by Kevin Wiki
on 2024/07/07 22:44
Change comment: There is no comment for this version

Summary

Details

Page properties
Content
... ... @@ -2,6 +2,10 @@
2 2  (((
3 3  (% class="col-xs-12 col-sm-8" %)
4 4  (((
5 += Code =
6 +
7 +Arduino project with utils and script for driving all LEDs, buttons and MLB front I/O headers for driving Xserve front I/O devices: [[https:~~/~~/github.com/KevinMidboe/xserve-io>>https://github.com/KevinMidboe/xserve-io/]].
8 +
5 5  = Pinout =
6 6  
7 7  There is a single cable that controls four parts, each half side of I/O LED and center column of blue LEDs.
... ... @@ -277,7 +277,211 @@
277 277  There are 4 words, each containing 7 data bits. They do not
278 278  
279 279  
284 += Controlling center LED columns =
285 +
286 +There are a total of 4 banks of addressable LED's 12 each of the total 48.
287 +
288 +
289 +|**Address Range (Binary)**|**Address Range (hex)**|**Size**|**Description**
290 +|0-7|00-07|1 byte|Ethernet indicator and LEDs bank-1
291 +|8-15|08-0F|1 byte|LEDs bank-2
292 +|16-23|10-17|1 byte|LEDs bank-3
293 +|24-31|18-1F|1 byte|LEDs bank-4
294 +
295 +[[attach:Address Ranges-Table 1.csv||target="_blank"]]
296 +
297 +|=**Address Banks**|=**LEDs Controlled**|=**Count**|=**Address Range (hex)**|=**Description**
298 +|=**Bank-1**|1 2 4 6 8 10 12|7|00-07|LED 1 ethernet indicator, even bottom half
299 +|=**Bank-2**|3 5 7 9 11 13|6|08-0F|Odd LED top half
300 +|=**Bank-3**|14 16 18 20 22 23 24|7|10-17|Even LED bottom half
301 +|=**Bank-4**|15 17 19 21|4|18-1F|Odd LED top half
302 +
303 +[[attach:LEDs per bank-Table 1.csv||target="_blank"]]
304 +
305 +
306 +| | |(% colspan="8" %)**bits (1 byte per register)**
307 +|**Controls device**|**Register**|**7**|**6**|**5**|**4**|**3**|**2**|**1**|**0**
308 +|**Ethernet LED**|Register 1|0|0|0|0|0|0|0|1
309 +|**LED 1**|Register 1|0|0|0|0|0|0|1|0
310 +|**LED 2**|Register 2|0|0|0|0|0|0|1|0
311 +|**LED 3**|Register 1|0|0|0|0|0|1|0|0
312 +|**LED 4**|Register 2|0|0|0|0|0|1|0|0
313 +|**LED 5**|Register 1|0|0|0|0|1|0|0|0
314 +|**LED 6**|Register 2|0|0|0|0|1|0|0|0
315 +|**LED 7**|Register 1|0|0|0|1|0|0|0|0
316 +|**LED 8**|Register 2|0|0|0|1|0|0|0|0
317 +|**LED 9**|Register 1|0|0|1|0|0|0|0|0
318 +|**LED 10**|Register 2|0|0|1|0|0|0|0|0
319 +|**LED 11**|Register 1|0|1|0|0|0|0|0|0
320 +|**LED 12**|Register 2|0|1|0|0|0|0|0|0
321 +|**LED 13**|Register 3|0|0|0|0|0|0|0|1
322 +|**LED 14**|Register 4|0|0|0|0|0|0|0|1
323 +|**LED 15**|Register 3|0|0|0|0|0|0|1|0
324 +|**LED 16**|Register 4|0|0|0|0|0|0|1|0
325 +|**LED 17**|Register 3|0|0|0|0|0|1|0|0
326 +|**LED 18**|Register 4|0|0|0|0|0|1|0|0
327 +|**LED 19**|Register 3|0|0|0|0|1|0|0|0
328 +|**LED 20**|Register 4|0|0|0|0|1|0|0|0
329 +|**LED 21**|Register 3|0|0|0|1|0|0|0|0
330 +|**LED 22**|Register 3|0|0|1|0|0|0|0|0
331 +|**LED 23**|Register 3|0|1|0|0|0|0|0|0
332 +
333 +
334 +
335 +Script for writing all permutations to display:
336 +
337 +{{code language="c++"}}
338 +#include "Wire.h" // enable I2C bus
339 +
340 +byte saa1064 = 0x3B; // define the I2C bus address for our SAA1064 (pin 1 to GND) ****
341 +
342 +void setup()
343 +{
344 + Wire.begin(); // start up I2C bus
345 +}
346 +
347 +void write(int value) {
348 + Wire.beginTransmission(saa1064);
349 + Wire.write(1);
350 +
351 + Wire.write(value);
352 + Wire.write(value);
353 + Wire.write(value);
354 + Wire.write(value);
355 +
356 + Wire.endTransmission();
357 +}
358 +
359 +void loop() {
360 + for (int value = 0; value < 127; value++) {
361 + write(value);
362 + delay(300);
363 + }
364 +}
365 +{{/code}}
366 +
367 +Since LED positions don't map sequentially with LED number we can't address them in 10-base form, but we can define each LED in binary and use OR operator to display LEDs we want.
368 +
369 +{{code language="c++"}}
370 +#include "Wire.h" // enable I2C bus
371 +
372 +#define TCAADDR 0x70
373 +byte saa1064 = 0x3B; // define the I2C bus address for our SAA1064
374 +
375 +byte bank1;
376 +byte bank2;
377 +byte bank3;
378 +byte bank4;
379 +
380 +byte activityLED = 0b00000001;
381 +byte leds[23][4] = {
382 + {0b00000010, 0b00000000, 0b00000000, 0b00000000}, // 1
383 + {0b00000000, 0b00000010, 0b00000000, 0b00000000}, // 2
384 + {0b00000100, 0b00000000, 0b00000000, 0b00000000}, // 3
385 + {0b00000000, 0b00000100, 0b00000000, 0b00000000}, // 4
386 + {0b00001000, 0b00000000, 0b00000000, 0b00000000}, // 5
387 + {0b00000000, 0b00001000, 0b00000000, 0b00000000}, // 6
388 + {0b00010000, 0b00000000, 0b00000000, 0b00000000}, // 7
389 + {0b00000000, 0b00010000, 0b00000000, 0b00000000}, // 8
390 + {0b00100000, 0b00000000, 0b00000000, 0b00000000}, // 9
391 + {0b00000000, 0b00100000, 0b00000000, 0b00000000}, // 10
392 + {0b01000000, 0b00000000, 0b00000000, 0b00000000}, // 11
393 + {0b00000000, 0b01000000, 0b00000000, 0b00000000}, // 12
394 + {0b00000000, 0b00000000, 0b00000001, 0b00000000}, // 13
395 + {0b00000000, 0b00000000, 0b00000000, 0b00000001}, // 14
396 + {0b00000000, 0b00000000, 0b00000010, 0b00000000}, // 15
397 + {0b00000000, 0b00000000, 0b00000000, 0b00000010}, // 16
398 + {0b00000000, 0b00000000, 0b00000100, 0b00000000}, // 17
399 + {0b00000000, 0b00000000, 0b00000000, 0b00000100}, // 18
400 + {0b00000000, 0b00000000, 0b00001000, 0b00000000}, // 19
401 + {0b00000000, 0b00000000, 0b00000000, 0b00001000}, // 20
402 + {0b00000000, 0b00000000, 0b00010000, 0b00000000}, // 21
403 + {0b00000000, 0b00000000, 0b00100000, 0b00000000}, // 22
404 + {0b00000000, 0b00000000, 0b01000000, 0b00000000} // 23
405 +};
406 +
407 +void setup()
408 +{
409 + Serial.begin(9600);
410 + Wire.begin(); // start up I2C bus
411 +
412 + Serial.println("setting up ports");
413 +}
414 +
415 +void tcaselect(uint8_t i) {
416 + if (i > 7) return;
280 280  
418 + Wire.beginTransmission(TCAADDR);
419 + Wire.write(1 << i);
420 + Wire.endTransmission();
421 +}
422 +
423 +void selectLeft() { tcaselect(2); }
424 +void selectRight() { tcaselect(1); }
425 +
426 +void write() {
427 + Wire.beginTransmission(saa1064);
428 + Wire.write(1);
429 +
430 + Wire.write(bank1);
431 + Wire.write(bank2);
432 + Wire.write(bank3);
433 + Wire.write(bank4);
434 +
435 + Wire.endTransmission();
436 +}
437 +
438 +void resetBanks() {
439 + bank1 = 0;
440 + bank2 = 0;
441 + bank3 = 0;
442 + bank4 = 0;
443 +}
444 +
445 +void displayNumber(int number) {
446 + bank1 = leds[number - 1][0];
447 + bank2 = leds[number - 1][1];
448 + bank3 = leds[number - 1][2];
449 + bank4 = leds[number - 1][3];
450 +}
451 +
452 +void displayUpToNumber(int number) {
453 + for (int i = 0; i < number; i++) {
454 + bank1 = bank1 | leds[i][0];
455 + bank2 = bank2 | leds[i][1];
456 + bank3 = bank3 | leds[i][2];
457 + bank4 = bank4 | leds[i][3];
458 + }
459 +}
460 +
461 +void computeEthernetActivity() {
462 + bank1 = bank1 | activityLED;
463 +}
464 +
465 +void loop() {
466 + resetBanks();
467 + delay(10);
468 +
469 + displayUpToNumber(15);
470 + computeEthernetActivity();
471 +
472 + selectLeft();
473 + write();
474 + delay(2);
475 +
476 + selectRight();
477 + write();
478 + delay(1000);
479 +}
480 +{{/code}}
481 +
482 +
483 += Missing pieces, TODO =
484 +
485 +* how to control compute LED in top IO row
486 +* control warning button LED
487 +
488 +
281 281  )))
282 282  
283 283  
Address Ranges-Table 1.csv
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.kevin
Size
... ... @@ -1,0 +1,1 @@
1 +209 bytes
Content
... ... @@ -1,0 +1,6 @@
1 +Address Range (Binary);Address Range (hex);Size;Description
2 +0-7;00-07;1 byte;Ethernet indicator and LEDs bank-1
3 +8-15;08-0F;1 byte;LEDs bank-2
4 +16-23;10-17;1 byte;LEDs bank-3
5 +24-31;18-1F;1 byte;LEDs bank-4
6 +
LEDs per bank-Table 1.csv
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.kevin
Size
... ... @@ -1,0 +1,1 @@
1 +294 bytes
Content
... ... @@ -1,0 +1,6 @@
1 +Address Banks;LEDs Controlled;Count;Address Range (hex);Description
2 +Bank-1;1 2 4 6 8 10 12;7;00-07;LED 1 ethernet indicator, even bottom half
3 +Bank-2;3 5 7 9 11 13;6;08-0F;Odd LED top half
4 +Bank-3;14 16 18 20 22 23 24;7;10-17;Even LED bottom half
5 +Bank-4;15 17 19 21;4;18-1F;Odd LED top half
6 +