Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2018_261_50
Na tržišču obstaja več modulov ki se prodajajo pod imenom PCF8574 IO expansion board, 8-bit GPIO expander ali podobnim; vsi so narejeni z integriranim vezjem PCF8574 in vsi so iz komercialnih razlogov namenjeni uporabnikom Arduino ali Raspberry Pi platform. Moj cilj je pokazati kako jih enostavno lahko izkoristimo tudi mi, Bascomaši!
PCF8574 IO modul
Fotografija na sliki 20 kaže nekaj modulov takšne vrste, ki so si medsebojno zelo podobni in imajo isti namen. Edini, ki se malce razlikuje, je ta v levem spodnjem vogalu in njemu se bomo posvetili v naslednjem nadaljevanju. Tipična shema ostalih modulov je prikazana na desni polovici slike 20. To kar se na modulu nahaja, je narisano s črno barvo, ostale komponente dodajamo od zunaj.
Ta vsebina je samo za naročnike
Srce modula je integrirani 8-bitni I2C bus expander IC1, poleg njega se nahaja še nekaj komponent, ki nam olajšujejo njegovo naslavljanje. Naslov posameznega modula določa stanje naslovnih priključkov A2-A0, ki jih definiramo s kratkostičniki ali stikali na sami ploščici (shema na sliki 20 prikazuje izvedbo s stikali). Na modulih srečujemo dve integrirani vezji, PCF8574 ali PCF8574A; oba sta funkcionalno enaka, razlikujeta se samo po osnovnem I2C naslovu. Zato je skupno število modulov, ki jih lahko povežemo na isto I2C vodilo16: 8 tistih ki uporabljajo integrirano vezje PCF8574 + 8 baziranih na PCF8574A.
Vsak PCF8574/8574A ima 8 vhodno/izhodnih priključkov, P0-P7, ki so narejeni kot nesimetrični CMOS inverter: v stanju “0”, izhodni N-MOS tranzistor lahko potegne do 25 mA, dokler je v stanju “1” je izhodni tok P-MOS tranzistorja omejen na nekaj 100 µA. Prednost takšne konfiguracije je v tem, da vhodno/izhodnih priključkov ni potrebno konfigurirati, saj so sočasno tako vhodi kot izhodi.
Če želimo nek priključek uporabiti kot vhodni, ga je potrebno postaviti v stanje “1”. Če napravimo kratek stik tega priključka na maso, se bo njegovo logično stanje spremenilo v “0”, ko odpravimo kratek stik se bo vrnil na stanje “1”. Interna logika spremlja vsako spremembo stanja vhodnega priključka, ki je posledica zunanjih vplivov in jo signalizira mikrokontrolerju tako, da postavi INT izhod v stanje “0”. Interrupt se bo pobrisal (INT se bo vrnil v stanje “1”) takoj, ko bo mikrokontroler naslovil PCF8574/8574A čip.
Če želimo neki priključek uporabiti kot izhodnega, ga lahko postavimo v stanje “0” ali “1”. Kadar je postavljen v stanje “0”, je na njega možno neposredno povezati breme, ki ne porabi več od navedenih cca. 20 mA. Če ga postavimo v stanje “1”, je na njega možno povezati samo “šibko” breme, kot npr. vrata MOS tranzistorja ali vhod CMOS integriranega vezja.
Na desni polovici slike 20 je s primerom pokazano, kako priključke P0-P7 uporabljati kot izhodne (na njih so spojene LEDice D0-D7) in kot vhodne (na njih so spojena stikala ali tipke S0-S7). Te “pobarvane” komponente, LEDice in stikala se ne nahajajo na modulu pač pa so del našega vezja, v katerem je modul njegov sestavni del. Na shemi so na vsakem vhodno/izhodnem priključku vezane tudi LEDice in stikalo. Čeprav je tudi takšna rešitev možna, tega običajno ne delamo tako; shema bi samo morala simbolizirati, da so vsi U-I priključki enaki. V praksi in v naših primerih bomo posamezni priključek uporabljali bodisi kot vhodni ali kot izhodnega. Torej na priključek povežemo bodisi “modro” bodisi “rdečo” žico, ne obe!
Za komunikacijo z integriranimi vezji PCF8574/8574A so dovolj standardni Bascom-AVR I2C ukazi. Za pisanje lahko uporabimo naslednjo kodo:
I2cstart I2cwbyte &B0pcfaaa0 I2cwbyte Podatak I2cstop
Tukaj je:
- Podatak byte konstanta oziroma spremenljivka, katere vsebino želimo “postaviti” na priključke P7-P0,
- pcf je interni naslov PCF čipa (pcf = 100 če uporabljamo PCF8574, pcf = 111 če uporabljamo PCF8574A) oziroma
- aaa je eksterni naslov PCF8574/8574A čipa, določen s stanjem naslovnih priključkov A2-A0.
Če želimo prebrati stanje priključkov P7-P0, lahko to dosežemo z naslednjo kodo:
I2cstart I2cwbyte B0pcfaaa1 I2crbyte Podatak , Nack I2cstop
Podatak je byte spremenljivka, v katero se bo vpisalo stanje priključkov P7-P0, pcf in aaa imata isti pomen, kot prej. Opazili boste, da je zadnji bit pri naslavljanju sedaj “1”, kar signalizira PCF8574/8574A čipu, da je naslednji byte on potrebno poslati mikrokontrolerju.
Čemu sploh knjižnica, ko je komunikacija s PCF8574/8574A čipoma tako enostavna? Želel sam dodati novo dimenzijo in olajšati programiranje v primeru kadar imamo na istem vodilu večje število PCF8574/8574A čipov, kot tudi takrat, ko se na posameznem čipu nekateri priključki uporabljajo kot vhodni in drugi kot izhodni. Poglejmo kaj nam knjižnica prinaša!
Knjižnica PCF8574$SE.sub
Knjižnica PCF8574$SE.sub podpira mreže s samo enim do maksimalno 16 čipov (8 PCF8574 in 8 PCF8574A). Čipi so numerirani od 1 do 16, numeriranje se mora vrstiti po vrsti (če uporabljamo 3 čipe, morajo njihove številke biti 1, 2 in 3). Vsakemu čipu pridružene tri byte spremenljivke, ki vsebujejo naslov čipa (vključuje informacijo o uporabljenem čipu – PCF8574 ali PCF8574A – in stanju njegovih naslovnih priključkov), njegovo konfiguracijo (katere priključke želimo uporabiti kot izhode in katere kot vhode) in stanje njegovih vhodnih priključkov po zadnjem branju (ali po postavljanju začetnega stanja, če za tem nismo imeli niti enega branja). Stanje teh spremenljivk postavljajo in preverjajo ukazi iz knjižnice in ni predvideno da se do njih dostopa iz uporabniškega programa.
Pred uporabo moramo vsak PCF8574/8574A čip konfigurirati z ukazom Pcf8574$config. V tem postopku se redni številki čipa pridružuje naslov čipa in njegova konfiguracija (katere priključke bomo uporabljali kot vhodne in katere kot izhodne). Ta konfiguracija priključkov ni nujna zaradi integriranih vezij, pač pa zaradi koncepta same knjižnice. Če imamo v mreži samo en PCF8574/8574A, mu lahko takoj po konfiguraciji pošljemo podatke ali beremo stanja njegovih priključkov. Če imamo v mreži dva ali več čipov, moramo vse najprej konfigurirati, nato pa z ukazom Pcf8574$select izbrati čip s katerim želimo komunicirati. Nato mu lahko pošljemo poljubno številko Pcf8574$write_byte ali Pcf8574$read_byte ukaza. Write ukazi postavljajo stanja zgolj izhodnih priključkov, medtem ko bodo priključki, ki so konfigurirani kot vhodni, vedno postavljeni na stanje “1” ne glede na to, kako jih postavimo v write ukazu. Read ukaz bere stanja vseh priključkov tako vhodnih kot izhodnih. Dodatno, v read ukazu je vgrajeno preverjanje, če je od predhodnega branja (ali po postavljanju začetnega stanja, če je to prvo branje) nastala kakšna sprememba na vhodnih priključkih. Te spremembe se nanašajo na sledeče globalne spremenljivke, ki so z vključitvijo PCF8574$SE.sub knjižnice postale sestavni del vašega programa:
Dim Pcf8574$change As Byte
V stanje “1” so postavljeni biti pri katerih je na pridruženih vhodnih priključkih nastala sprememba stanja glede na predhodno branje; v stanju “0” so biti pridruženi vhodnim pinom, pri katerih ni bilo spremembe in tudi biti pridruženi vsem izhodnim priključkom.
Dim Pcf8574$change_01 As Byte
V stanje “1” so postavljeni biti pri katerih je na pridruženih vhodnih priključkih nastala sprememba stanja glede na predhodno branje, tako da je “0” postala “1”; v stanju “0” so biti pridruženi vhodnim priključkom, pri katerih ni bilo takšne spremembe in tudi biti pridruženi vsem izhodnim priključkom.
Dim Pcf8574$change_10 As Byte
V stanje “1” so postavljeni biti pri katerih je na pridruženih vhodnih priključkih nastala sprememba stanja glede na predhodno branje tako da je “1” postala “0”; v stanju “0” so biti pridruženi vhodnim priključkom, pri katerih ni bilo takšne spremembe in tudi biti pridruženi vsem izhodnim priključkom.
Programer z analizo teh sprememb enostavno ugotovi, na katerih vhodnih priključkih so nastale spremembe in kakšne.
Sledi opis ukazov iz knjižnice
Ukaz Pcf8574$config
Pcf8574$config par1, par2, par3
Parametri: | par1 | konstanta ali ime byte spremenljivke ki vsebuje redno številko modula, oziroma PCF8574/8574A čipa (1-16) |
par2 | izbor čipa (PCF8574 ali PCF8574A ) in njegov zunanji naslov (stanje naslovnih priključkov A2-A0);
par2 = 0-7: modul uporablja čip PCF8574, naslov čipa A2-A0 ustreza vrednosti parametra par2 par2 = 8-15: modul uporablja čip PCF8574A, naslov čipa A2-A0 ustreza vrednosti parametra par2 zmanjšani za 8 |
|
par3 | konfiguracija vhodno-izhodnih priključkov (0-255); vsakemu bitu parametra par3 je pridružen en priključek po sledečem pravilu:
stanje bita = “0”: pridruženi priključek je vhodni stanje bita = “1”: pridruženi priključek je izhodni |
|
Namen: | Pridružuje redni številki modula v programu naslov in konfiguracijske parametre dejanskega PCF8574/8574A na I2C mreži. | |
Opombe: | Vrednost parametra par1 ne sme biti večja od števila čipov v mreži, 16 je teoretični maksimum.
Stanja “0” in “1” za definiranje vhodnih in izhodnih priključkov so v skladu z Bascom_AVR ukazom Config Port. Interno programi iz knjižnice uporabljajo invertirano logiko: “0” ustreza izhodnemu, “1” pa vhodnemu priključku. Ukaz Pcf8574$config, poleg konfiguracije tudi izbira čip. |
Ukaz Pcf8574$select
Pcf8574$select par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko modula, oziroma PCF8574/8574A čipa (1-16) |
Namen: | Izbere navedeni modul/čip, nato postane dostopen s sledečima Pcf8574$write_byte in Pcf8574$read_byte ukazoma. | |
Opombe: | Vrednost parametra par1 ne sme biti večja od števila modulov/čipov v mreži, 16 je teoretični maksimum.
Sočasno je lahko izbran samo en modul/čip. |
Ukaz Pcf8574$write_byte
Pcf8574$write_byte par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje podatek, ki ga je potrebno vpisati na izhodne priključke izbranega PCF8574/8574A čipa (0-255) |
Namen: | Definira logična stanja izhodnih priključkov izbranega čipa. Stanja vhodnih priključkov se postavljajo na “1”, neodvisno od stanja pridruženih bitov parametra par1. |
Ukaz Pcf8574$read_byte
Pcf8574$read_byte par1
Parametri: | par1 | ime byte spremenljivke v katero se bo preneslo stanje vseh vhodno-izhodnih priključkov izbranega PCF8574/8574A čipa |
Namen: | Bere stanja vseh vhodno-izhodnih priključkov izbranega čipa in jih prenese v navedeno spremenljivko. Ažurira stanja globalnih spremenljivk Pcf8574$change, Pcf8574$change_01 in Pcf8574$change_10 v skladu z opisom v tekstu. |
Potem ko smo spoznali koncept in ukaze iz knjižnice PCF8574$SE.sub in način njihove uporabe, bomo prikazali to s pomočjo nekaj primerov. Primeri so pisani za vezje na sliki 21; uporabljena sta dva modula s PCF8574 čipoma, od katerih je prvi postavljen na naslov 7 (A2-A0 = 111), drugi pa na naslov 6 (A2-A0 = 110). Krmilno vezje z mikrokontrolerjem ATtiny4313 se nahaja v razvojnem sistemu MiniPin. Enako dobro bo služi tudi MegaPin ali nek drugi razvojni sistem podobnih možnosti. Tukaj bomo analizirali samo dele programa, ki se nanašajo na ukaze iz knjižnice; za popolno razumevanje dela je potrebno pogledati celotne programe.
Program PCF8574_1.bas
Namen prvega programa je, da preverimo vse ukaze iz knjižnice PCF8574$SE.sub, in tudi da ilustriramo način uporabe spremenljivk Pcf8574$change, Pcf8574$change_01 in Pcf8574$change_10. Na začetku programa definiramo koliko PCF8574/8574A čipov bomo uporabljali in zatem vključujemo knjižnico PCF8574$SE.sub:
Const Pcf8574_number = 2 $include "PCF8574$SE.sub"
Vrednost konfiguracijske konstante Pcf8574_number knjižnici določa koliko spomina je potrebno rezervirati za memoriranje konfiguracijskih in operativnih podatkov. Z vključitvijo knjižnice bodo vsi njeni ukazi postali dostopni, vendar pa bodo kot sestavni del programa postali samo tisti ukazi, ki se jih boste uporabljali. Opomba: knjižnica uporablja novi način definiranja podprograma (Config Submode = New), zato je to potrebno upoštevati če se v programu uporabljajo podprogrami iz nekaterih drugih knjižnic ali lastni podprogrami.
Definirati moramo še priključke za I2C komunikacijo,
Config Sda = Portd.4 Config Scl = Portd.5 Config I2cdelay = 5 I2cinit Waitms 10
nato sledi konfiguracija modula. Prvi modul uporablja PCF8574 čip, naslovni priključki so postavljeni na naslov 7 (A2-A0 = “111”). Na priključke P0-P3 so spojena stikala in zato jih bomo konfigurirali kot vhodne. Na priključke P3-P6 je spojena RGB LEDica s skupno anodo, medtem, ko je priključek P7 neizkoriščen; te štiri priključke bomo definirati kot izhode:
Pcf8574$config 1 , 7 , &B11110000
Po konfiguraciji lahko ta modul takoj uporabljamo, ni ga potrebno dodatno izbrati. Za preverbo bomo na RGB diodi “zavrteli” vse kombinacije osnovnih barv:
For I = &H7F To &H0F Step -16 Pcf8574$write_byte I Waitms 200 Next
Tukaj je I predhodno definirana byte spremenljivka. Po koncu preverjanja bomo ugasnili vse segmente RGB diode:
Pcf8574$write_byte &HFF
Drugi modul tudi uporablja PCF8574 čip, ima naslov 6 in vsi njegovi priključki so izhodni:
Pcf8574$config 2 , 6 , &B11111111
Če bi želeli preveriti, ali deluje dobro, lahko na njemu izvedemo “bežečo luč”:
Led7_0 = &B11111110 For I = 1 To 7 Pcf8574$write_byte Led7_0 Waitms 100 Rotate Led7_0 , Left Next
I in Led7_0 so predhodno definirane byte spremenljivke. Po animacij bomo ugasnili vse LEDice vezane na drugi modul:
Pcf8574$write_byte &B11111111
Zdaj bomo pokazali kako odčitati stanja vhodnih priključkov. Postavili si bomo naslednjo nalogo: s pritiskom na tipko S0 vklopimo modri, s pritiskom na S1 zeleni in s pritiskom na S2 rdeči segment RGB diode. Vklop posameznega segmenta ne sme vplivati na stanja ostalih segmentov. Vse segmente izklopimo s pritiskom na tipko S3. Uporabili bomo byte spremenljivke P7_0 in Rgb. Ker smo zadnjo animacijo v programu delali na modulu 2, bomo najprej morali izbrati modul 1:
Pcf8574$select 1
Nato vstopimo v neskončno zanko, na njenem začetku odčitamo stanje vhodnih priključkov prvega modula:
Do Pcf8574$read_byte P7_0
Stanja vseh priključkov PCF8574 čipa se nahajajo v spremenljivki P7_0. V tem primeru nas vsebina te spremenljivke sploh ne zanima, ampak bomo analizirali bite globalne spremenljivke Pcf8574$change_10 iz knjižnice. Spremenljivka nam sporoči, katera tipka je bila ravnokar pritisnjena. Npr., če je bila pritisnjena tipka S0, bo v spremenljivki postavljen bit 0 in to nam je signal da moramo vklopiti modri segment RGB diode:
slika_p1
Na isti način preverjamo ali sta bili pritisnjeni tipki S1 in S2 in če sta bili, vklopimo zeleni oziroma rdeči segment RGB diode:
slika_p2
Če je bila pritisnjena tipka S3, ugasnemo vse segmente:
slika_p3
Izraza “vklopimo” in “ugasnemo” segmente RGB diode pravzaprav nista resnična: edino, kar smo naredili, je brisanje ali postavljanje posameznih bitov spremenljivke Rgb. Če želimo zares vklopiti ali ugasniti segmente, je potrebno vrednost spremenljivke Rgb prenesti v PCF8574 čip, in to naredimo na koncu zanke:
slika_p4
Če želite, da se sprememba barve dogaja v trenutku spuščanja tipke, potem boste namesto bitov spremenljivke Pcf8574$change_10 testirali bite spremenljivke Pcf8574$change_01, npr.:
slika_p5
Prav tako če testirate bite spremenljivke Pcf8574$change, se bo sprememba barve dogajala bodisi ob pritisku ali spuščanju kot npr.:
slika_p6
Program PCF8574_2.bas
V programu PCF8574_1.bas se aktivnosti prvega in drugega modula nista preklapljali. Zdaj bomo pokazali primer, v katerem sočasno omogočamo bežečo svetlobo na modulu 2 in beremo tipke modula 1 in na podlagi tipk določamo barvo RGB diode na tem modulu. Če želimo ugotoviti, ali je katera od tipk bila pritisnjena, bomo preverili stanje INT izhoda prvega modula.
Najprej bomo definirali priključek s katerim mikrokontroler bere INT izhod PCF8574 čipa, v našem primeru je to PD6:
Pcf8574_int_pin Alias Pind.6 Config Pcf8574_int_pin = Input Portd.6 = 1
Priključku smo dodelili prikladno alternativno ime Pcf8574_int_pin. Nekateri moduli nimajo vgrajenega pull-up upora na INT priključku PCF8574 čipa, zato smo za vsak slučaj vključili pull-up znotraj mikrokontrolerja – brez njega branje INT izhoda ne bi bilo možno.
Definirati moramo še začetne vrednosti spremenljivk Led7_0 in Rgb
Led7_0 = &B11111110 'vključena D0 Rgb = &B11111111 'vse barve ugasnjene
in nato vstopimo v neskončno zanko, v kateri realiziramo bežečo svetlobo:
Do Pcf8574$select 2 Pcf8574$write_byte Led7_0 Waitms 500 Rotate Led7_0 , Left Loop
Program PCF8574_2.bas mora izmenično komunicirati z obema moduloma, zato je nujen Pcf8574$select 2 ukaz pred Pcf8574$write_byte ukazom. Nekam v zanko še moramo vpisati ukaz, s katerim beremo stanja vhodnih priključkov modula 1, sam modul 1 pa moramo pred njo tudi izbrati. Tukaj nam ukaz Waitms 500 povzroči probleme: kjer koli smo postavili ukaz branja, se nam lahko zgodi, da ne utegnemo registrirati krajšega pritiska na eno od tipk. Zato ga bomo zamenjali z zanko, v kateri tekom 500 ms vsake dve milisekunde preverjamo stanje INT priključka prvega modula:
For W = 1 To 250 Debounce Pcf8574_int_pin , 0 , Pcf8574_interrupt , Sub Waitms 2 Next
Če ni bilo spremembe niti na enem vhodnem priključku, se Debounce ne bo izvršil in zanka bo trajala okoli 500 ms. Če je INT priključek aktiven (= “0”), se bo izvršil pridruženi podprogram Pcf8574_interrupt. V njemu bomo na začetku izbrali modul 1 in nato prebrali stanje njegovih priključkov:
Pcf8574_interrupt: Pcf8574$select 1 Pcf8574$read_byte P7_0
Sledi analiza priključkov spremenljivke Pcf8574$change_10 (ali Pcf8574$change_01 ali Pcf8574$change_10), ki je enaka prvemu programu.
Debounce ukaz nepotrebno zadržuje izvrševanje programa približno 25 ms. Če se želite temu izogniti, lahko namesto njega uporabite “navadni” If:
If Pcf8574_int_pin = 0 Then Gosub Pcf8574_interrupt End If
Čeprav je zamenjava Debounce ukaza z If-om največkrat problematična, tukaj to funkcionira dobro, ker Pcf8574$read_byte ukaz briše postavljeni interrupt. Zato se bo prekinitvena rutina ob vsaki nastali spremembi stanja vhodnih priključkov izvršila samo enkrat.
Opomba: Ker PCF8574/8574A čipi aktivirajo INT priključek pri vsaki spremembi stanja vhodnih priključkov, se bo tako prekinitvena rutina v programu aktivirala tudi kadar pritisnemo in kadar spustimo neko tipko. Ni potrebno dodatno preverjanje, katera sprememba je povzročila prekinitev, ker boste to avtomatsko naredili med analizo bitov ustrezne spremenljivke (npr. Pcf8574$change_10, če vas zanima sprememba stanja vhodnega priključka “1” -> “0”). Za prekinitve, ki jih povzročajo druge vrste spremembe stanja vhodnih priključkov, se bo prekinitvena rutina izvrtela “v prazno”.
Program PCF8574_3.bas
Namesto preverjanja stanja nekega priključka z Debounce ali If ukazom lahko priključke mikrokontrolerja konfiguriramo tako, da pri spremembi stanja zaženejo prekinitvene rutine. Bascom-AVR elegantno podpira zunanje prekinitve INT0 in INT1, zato je pri ATtiny4313 mikrokontrolerju za ta namen najbolj praktično uporabiti priključke PD2 (INT0) ali PD3 (INT1). V našem primeru je Pcf8574_int_pin PD6, njemu je pridružena zunanja prekinitev PCINT17. PCINT interrupti so se pojavili pri novejših mikrokontrolerjih, zato podpora v Bascom-AVRu ni do konca “spolirana” – okoli konfiguracije PCINT prekinitve se moramo še malo sami potruditi. Na začetku programa bomo navedli, da pričakujemo zunanjo prekinitev preko Porta D, in to PCINT17; katere bite v registrih PCMSK2 in GMSK moramo postaviti, da bi omogočili to prekinitev, sem našel sam v tehnični dokumentaciji mikrokontrolerja:
On Pcintd Int_sub Set Pcmsk2.pcint17 Set Gimsk.pcie2
Ko smo omogočili prekinitve
Enable Interrupts
vsaka sprememba stanja Pcf8574_int_pin priključka bo povzročila izvršitev pridružene prekinitvene rutine, v našem primeru je to Int_sub. Nam so zanimivi samo trenutki v katerih se pojavi prekinitev (“1” -> “0”), in ne samo tisti, v katerih je prekinitev obdelana (“0” -> “1”); zato obdelavo prekinitve delamo samo če je Pcf8574_int_pin = 0:
Int_sub: Waitus 4 If Pcf8574_int_pin = 0 Then Gosub Pcf8574_interrupt End If Return
Podprogram za obdelavo je isti kot prej. Iz meni neznanega razloga je bilo nujno pri nekaterih modulih počakati par mikrosekundi od prekinitve do preverjanja vhodnega priključka; brez tega program ni delal dobro, od tod potrebujemo Waitus 4 ukaz. Če uporabljate prekinitveni mehanizem mikrokontrolerja, lahko v glavnem programu svobodno uporabljate wait ukaze – ni več skrbi, da se neka sprememba stanja INT priključka modula lahko “izgubi”. Potrebno pa je računati s tem, da se v prekinitveni rutini izbere modul 1, medtem ko v glavni zanki izvajamo animacijo na modulu 2. Če se dogodi prekinitev v kritičnem trenutku med prenosom podatkov na modul 2, bo to povzročilo neželene posledice – zato med komunikacijo z modulom 2 moramo začasno onemogočiti prekinitve:
Do Disable Interrupts Pcf8574$select 2 Pcf8574$write_byte Led7_0 Enable Interrupts Waitms 500 Rotate Led7_0 , Left Loop
Če imate v mreži več modulov z vhodnimi priključki, se njihovi INT izhodi smejo povezati paralelno. V tem primeru je program potrebno raziskati, kateri modul je sprožil prekinitev. Alternativno, če imate dovolj svobodnih priključkov mikrokontrolerja, INT izhod vsakega modula lahko povežete na posamezen priključek mikrokontrolerja; v tem primeru boste takoj vedeli kateri modul je sprožil prekinitev. Medtem, ko so moduli še bili na poti, sem ukaze iz knjižnice preveril na dveh “neodvisnih” PCF8574 čipih (slika 22); vse je delalo v skladu s pričakovanji, knjižnica PCF8574$SE.sub je opravila izpit!
Opomba: knjižnico PCF8574$SE.sub in vse navedene programe lahko brezplačno dobite v uredništvu revije Svet elektronike.Barduino (7)