// Podprogramy pro praci s expanderem MCP23017 pro prepinani vice cidel //================================================ //---------------------------------------------- // prepnuti napajeni na zadane cidlo 0 az 7 // Kladne napajeni je z portu B, zaporne z portu A // ostatni cidla budou vypnuta (vystupy expanderu prepnute na INPUT) void expa_switch(byte cislo) { #ifndef omezeni_funkci_5 if ((pocet_cidel_svetla > 1) and (digitalRead(pin_EXT_ZAP) == LOW)) // do bocniho konektoru je neco pripojene (muze to byt ale i GPS, nebo jen pridavna EEPROM) { if (EXPA_test() == true) // test, jestli se i2c adrese expanderu vubec neco hlasi { EXPA_write(0x00 , 255); // IODIR_A na vstup EXPA_write(0x0C , 0); // GPPUA vypnout vsechny Pull-Upy EXPA_write(0x01 , 255); // IODIR_B na vstup EXPA_write(0x0D , 0); // GPPUB vypnout vsechny Pull-Upy if (cislo < 8) // pro cisla 0 az 7 se prepinaji napajeci piny, pro cislo 8 nebo vic zustavaji vsechny napajeci piny vypnute { // pak zvoleny pin na poru A prepnout na '0' a stejny pin na portu B prepnout na '1' byte pomprom = ~(1 << cislo); // prevod cisla na nulovy bit (0=bit0, 1=bit1, 5=bit5 ....) ostatni bity zustavaji v '1' EXPA_write(0x00 , pomprom); // zvoleny bit IODIR_A na vystup EXPA_write(0x01 , pomprom); // zvoleny bit IODIR_B na vystup EXPA_write(0x12 , 0); // vsechny bity v GPIO_A na '0' (ve skutecnosti se ale nastavi jen ten jeden bit, ktery je vystupni) EXPA_write(0x13 , 255); // vsechny bity v GPIO_B na '1' (ve skutecnosti se ale nastavi jen ten jeden bit, ktery je vystupni) } } } #else cislo++; // tato radka je uplne na nic, jen zrusi varovani kompilatoru o nepouzite promenne 'cislo' pri omezenych funkcich 5 #endif } //---------------------------------------------- //---------------------------------------------- // zapis do expanderu MCP23017 prs I2C komunikaci void EXPA_write(byte registr, byte data) { delay(5); Wire.beginTransmission(I2C_ADDR_EXPA); // zacatek komunikace s expanderem Wire.write(registr); // cislo registru delay(5); Wire.write(data); // zapis hodnoty byte err = Wire.endTransmission(); // konec komunikace if (err > 0) chyba(1); } //---------------------------------------------- //---------------------------------------------- // test prevzaty z I2C skeneru, jestli se na I2C adrese expanderu vubec neco hlasi boolean EXPA_test(void) { Wire.beginTransmission (I2C_ADDR_EXPA); if (Wire.endTransmission () == 0) return true; else return false; }