Changes for page Front I/O
Last modified by Kevin Wiki on 2024/07/07 22:48
From version
7.4
edited by Kevin Wiki
on 2024/07/05 10:16
on 2024/07/05 10:16
Change comment:
There is no comment for this version
To version
8.7
edited by Kevin Wiki
on 2024/07/07 22:21
on 2024/07/07 22:21
Change comment:
There is no comment for this version
Summary
Details
- Page properties
-
- Content
-
... ... @@ -216,13 +216,249 @@ 216 216 * fan LED (red & green) 217 217 * temperature LED (red & green) 218 218 * compute LED (unknown) 219 +* lock switch 219 219 220 -Each side is driven by each their PCA9554 shift register. The registers represent the following LEDs: (Note that Lock LED is only present for the LEFT side)221 +Each sides bank of LEDs are driven by each their PCA9554 shift register. The registers represent the following LEDs: (Note that Lock LED is only present for the LEFT side) 221 221 223 +(% border="1" %) 222 222 |=(% scope="row" %)Register|1|2|3|4|5|6|7 223 223 |=Device|Power LED Green|Power LED Red|Fan LED Green|Fan LED Red|Temperature LED Green|Temperature LED Red|Lock LED 224 224 225 225 To control each LED we shift either a 0 to turn off or 1 to turn on. Since each device shares a single red/green LED (power LED green & power LED red) setting both to 1 at the same time will always leave it red. That is when power LED green and power LED red are both enabled, red always takes precedence. 228 + 229 +Use following script to power LEDs one at a time: 230 + 231 +{{code language="c++"}} 232 +#include <PCA9554.h> // Load the PCA9554 Library 233 + 234 +PCA9554 ioCon1(0x24); // Create an object at this address 235 + 236 +uint8_t mapIO = 0b10000000; 237 + 238 +void shiftL() { 239 + mapIO = (mapIO << 1) | ((mapIO & 0x80) >> 7); 240 +} 241 + 242 +void write() { 243 + Serial.println("writing to PCA9554 device"); 244 + 245 + for (int i = 0; i < 8; ++i) { 246 + ioCon1.digitalWrite(i, (mapIO & (1 << i)) ? 0 : 1); 247 + } 248 +} 249 + 250 +void setup() 251 +{ 252 + Serial.begin(9600); 253 + Serial.println("Setup"); 254 + 255 + ioCon1.portMode(ALLOUTPUT); 256 +} 257 + 258 +void loop() 259 +{ 260 + write(); 261 + shiftL(); 262 + 263 + delay(500); 264 +} 265 +{{/code}} 266 + 267 + 268 +Controlling middle IO strip 269 + 270 +0 = 0000 271 +1 (green) = 0001 272 +2 = 0010 273 +1 + 2 = 0011 274 +3 = 0100 275 + 276 + 277 +There are 4 words, each containing 7 data bits. They do not 278 + 279 + 280 += Controlling center LED columns = 281 + 282 +There are a total of 4 banks of addressable LED's 12 each of the total 48. 283 + 284 + 285 +|**Address Range (Binary)**|**Address Range (hex)**|**Size**|**Description** 286 +|0-7|00-07|1 byte|Ethernet indicator and LEDs bank-1 287 +|8-15|08-0F|1 byte|LEDs bank-2 288 +|16-23|10-17|1 byte|LEDs bank-3 289 +|24-31|18-1F|1 byte|LEDs bank-4 290 + 291 +[[attach:Address Ranges-Table 1.csv||target="_blank"]] 292 + 293 +|=**Address Banks**|=**LEDs Controlled**|=**Count**|=**Address Range (hex)**|=**Description** 294 +|=**Bank-1**|1 2 4 6 8 10 12|7|00-07|LED 1 ethernet indicator, even bottom half 295 +|=**Bank-2**|3 5 7 9 11 13|6|08-0F|Odd LED top half 296 +|=**Bank-3**|14 16 18 20 22 23 24|7|10-17|Even LED bottom half 297 +|=**Bank-4**|15 17 19 21|4|18-1F|Odd LED top half 298 + 299 +[[attach:LEDs per bank-Table 1.csv||target="_blank"]] 300 + 301 + 302 +|=Register Banks|=LEDs|=Count 303 +|=Bank 1|1 2 4 6 8 10 12|7 304 +|=Bank 2|3 5 7 9 11 13|6 305 +|=Bank 3|14 16 18 20 22 23 24|7 306 +|=Bank 4|15 17 19 21|4 307 + 308 +Script for writing all permutations to display: 309 + 310 +{{code language="c++"}} 311 +#include "Wire.h" // enable I2C bus 312 + 313 +byte saa1064 = 0x3B; // define the I2C bus address for our SAA1064 (pin 1 to GND) **** 314 + 315 +void setup() 316 +{ 317 + Wire.begin(); // start up I2C bus 318 +} 319 + 320 +void write(int value) { 321 + Wire.beginTransmission(saa1064); 322 + Wire.write(1); 323 + 324 + Wire.write(value); 325 + Wire.write(value); 326 + Wire.write(value); 327 + Wire.write(value); 328 + 329 + Wire.endTransmission(); 330 +} 331 + 332 +void loop() { 333 + for (int value = 0; value < 127; value++) { 334 + write(value); 335 + delay(300); 336 + } 337 +} 338 +{{/code}} 339 + 340 +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. 341 + 342 +{{code language="c++"}} 343 +#include "Wire.h" // enable I2C bus 344 + 345 +#define TCAADDR 0x70 346 +byte saa1064 = 0x3B; // define the I2C bus address for our SAA1064 347 + 348 +byte bank1; 349 +byte bank2; 350 +byte bank3; 351 +byte bank4; 352 + 353 +byte activityLED = 0b00000001; 354 +byte leds[23][4] = { 355 + {0b00000010, 0b00000000, 0b00000000, 0b00000000}, // 1 356 + {0b00000000, 0b00000010, 0b00000000, 0b00000000}, // 2 357 + {0b00000100, 0b00000000, 0b00000000, 0b00000000}, // 3 358 + {0b00000000, 0b00000100, 0b00000000, 0b00000000}, // 4 359 + {0b00001000, 0b00000000, 0b00000000, 0b00000000}, // 5 360 + {0b00000000, 0b00001000, 0b00000000, 0b00000000}, // 6 361 + {0b00010000, 0b00000000, 0b00000000, 0b00000000}, // 7 362 + {0b00000000, 0b00010000, 0b00000000, 0b00000000}, // 8 363 + {0b00100000, 0b00000000, 0b00000000, 0b00000000}, // 9 364 + {0b00000000, 0b00100000, 0b00000000, 0b00000000}, // 10 365 + {0b01000000, 0b00000000, 0b00000000, 0b00000000}, // 11 366 + {0b00000000, 0b01000000, 0b00000000, 0b00000000}, // 12 367 + {0b00000000, 0b00000000, 0b00000001, 0b00000000}, // 13 368 + {0b00000000, 0b00000000, 0b00000000, 0b00000001}, // 14 369 + {0b00000000, 0b00000000, 0b00000010, 0b00000000}, // 15 370 + {0b00000000, 0b00000000, 0b00000000, 0b00000010}, // 16 371 + {0b00000000, 0b00000000, 0b00000100, 0b00000000}, // 17 372 + {0b00000000, 0b00000000, 0b00000000, 0b00000100}, // 18 373 + {0b00000000, 0b00000000, 0b00001000, 0b00000000}, // 19 374 + {0b00000000, 0b00000000, 0b00000000, 0b00001000}, // 20 375 + {0b00000000, 0b00000000, 0b00010000, 0b00000000}, // 21 376 + {0b00000000, 0b00000000, 0b00100000, 0b00000000}, // 22 377 + {0b00000000, 0b00000000, 0b01000000, 0b00000000} // 23 378 +}; 379 + 380 +void setup() 381 +{ 382 + Serial.begin(9600); 383 + Wire.begin(); // start up I2C bus 384 + 385 + Serial.println("setting up ports"); 386 +} 387 + 388 +void tcaselect(uint8_t i) { 389 + if (i > 7) return; 390 + 391 + Wire.beginTransmission(TCAADDR); 392 + Wire.write(1 << i); 393 + Wire.endTransmission(); 394 +} 395 + 396 +void selectLeft() { tcaselect(2); } 397 +void selectRight() { tcaselect(1); } 398 + 399 +void write() { 400 + Wire.beginTransmission(saa1064); 401 + Wire.write(1); 402 + 403 + Wire.write(bank1); 404 + Wire.write(bank2); 405 + Wire.write(bank3); 406 + Wire.write(bank4); 407 + 408 + Wire.endTransmission(); 409 +} 410 + 411 +void resetBanks() { 412 + bank1 = 0; 413 + bank2 = 0; 414 + bank3 = 0; 415 + bank4 = 0; 416 +} 417 + 418 +void displayNumber(int number) { 419 + bank1 = leds[number - 1][0]; 420 + bank2 = leds[number - 1][1]; 421 + bank3 = leds[number - 1][2]; 422 + bank4 = leds[number - 1][3]; 423 +} 424 + 425 +void displayUpToNumber(int number) { 426 + for (int i = 0; i < number; i++) { 427 + bank1 = bank1 | leds[i][0]; 428 + bank2 = bank2 | leds[i][1]; 429 + bank3 = bank3 | leds[i][2]; 430 + bank4 = bank4 | leds[i][3]; 431 + } 432 +} 433 + 434 +void computeEthernetActivity() { 435 + bank1 = bank1 | activityLED; 436 +} 437 + 438 +void loop() { 439 + resetBanks(); 440 + delay(10); 441 + 442 + displayUpToNumber(15); 443 + computeEthernetActivity(); 444 + 445 + selectLeft(); 446 + write(); 447 + delay(2); 448 + 449 + selectRight(); 450 + write(); 451 + delay(1000); 452 +} 453 +{{/code}} 454 + 455 + 456 += Missing pieces, TODO = 457 + 458 +* how to control compute LED in top IO row 459 +* control warning button LED 460 + 461 + 226 226 ))) 227 227 228 228
- 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 +