# RS232 / USB / Bezvadu komunikācija >  I2C

## marizo

Ir tāda mikroshēma* PCF8574* - I2C pārveidotājs uz 8bitu paralēlo I/O portu. Datu lapā figurē termins "quasi-bidirectional I/O" - gandrīz divvirzienu ieeja/izeja. Īsti nav skaidrs, ko tas nozīmē un kā tas darbojas. Diez vai būšu izdomājis kaut ko revolucionāri jaunu, bet *ir doma pie šīs mikroshēmas pieslēgt 4x4 taustiņu klaviatūru*, kurai kāreiz nepieciešami 8 I/O - 4 izejas un 4 ieejas. Ja tāda ideja ir īstenojama, tad kāda varētu būt shēma ("pull up"/"pull down" rezistori vai vēl kas cits) un kādus datus idejiski sūtīt/saņemt pa I2C? 
Vai būs tā, ka piemēram, nosūtu 10001111, nolasu 10001000 - nospiesta 1.rindas 1.kolonas poga? Sūtāmajā baitā 7.-4 bits norāda 7.izejā "1", pārējās spēcīgi uz "0", 3.-0. bits norāda, ka visas būs ieejas. Bet, lai tikai 3. bitu nolasītu kā 1, pie 3.-0. jāliek rezistori uz zemi, kas "neitralizētu" 100uA mikroshēmas iekšējo "pull-up", bet pie 7.-4. jāliek "pull-up" rezistori - līdzīgi kā atvērtā kolektora izejām?
Vai arī jāsūta 01111111, un varbūt izdodas nolasīt 01110111, kas arī nozīmētu, ka nospiesta 1.rindas 1.kolonas poga? Šādi varbūt varētu iztikt bez rezistoriem vispār!
Vai varbūt šādam mērķim ir paredzēta pavisam cita mikroshēma?

Varbūt arī šīs ir lietas, kuras būtu vērts pašam uzzināt un izpētīt kaut vai ar mēģinājumu metodi, bet nezinu, kad varēšu tikt pie tās mikrenes, bet rezultātu gribētos uzzināt ātrāk. 
Kā arī - reizēm ir lietderīgi visu problēmu censties apzināt un izklāstīt citiem saprotamā formā. Nereti tas noved pie pašas problēmas atrisināšanas.

Starp citu, par I2C. Ir divas lietas, kas ierobežo pieslēdzamo mikroshēmu skaitu - adreses un līnijas kapacitāte. Par adresēm pagaidām neuztraucos, bet kā ir ar to kapacitāti? Galīgi nestādos priekšā, cik daudz ir tie max 400 pF, kas rakstīti I2C specifikācijā. Vai tā iekārta varētu darboties arī, piemēram, 5m garā ekranētā 4dzīslu vadā?  ::

----------


## jeecha

Aatri uzmetot aci datasheetam iespeejams otrais ko tu rakstiiji straadaatu (bez nekaadiem pull-up, jo var izmantot ieksheejo 100uA pull-up ja izeju flipflopos ieraksta 1).

Ierakstam 0111 1111 (kolonnu ieejas tiek chipaa uzvilktas uz Vdd, visas rindu ieejas arii, iznjemot pirmo)
Nolasam 0111 xxxx (respektiivi pirmaas rindas pogas, 0 - nospiesta, 1 - nav nospiesta)
Ierakstam 1011 1111
Nolasam otro rindu utt utjp.

Par I2C liiniju garumiem - standartaa rakstiitie 400pF ir diezgan stiepjams jeedziens. Samazinot I2C pull-up pretestiibas (cik nu chipi abos galos speej pavilkt) un samazinot aatrumu var diezgan garas un ar daudziem chipiem kjeedes taisiit. Piemeeram man uz 400kbit (ar 2.7k pretestiibaam) mieriigi darbojas kjekars ar padsmit slave chipiem uz 3m garas liinijas (un peec mana apreekjina saskaitot visu mikrenju datasheetos rakstiitaas ieejas kapacitaates un aptuveno vada kapacitaati noteikti bija virs tiem 400pF). Un bez nekaada ekraana, parasts telefona viitais paaris, vieniigi SDA ir saviita ar VDD un SCL ar GND (nezinu vai tas pat bija vajadziigs, bet likaas sapraatiigi lai mazinaatu SDA un SCL savstarpeejo zvaniishanos).

Ja dotaa mikrene veel ir jaapasuuta, varbuut vienkaarshaak un aatraak ir to pashu uztaisiit uz kaada PIC (vai AVR, kas nu tuvaaks) kontroliera veelams ar hardware I2C slave atbalstu un kurus var nopirkt tepat uz vietas gan Elfaa gan Argusaa. Drusku daargaak sanaaks (it iipashi peerkot kontrolieri uz vietas), bet var veel kaadu "fiichu" viegli piekodeet klaat - kaadu LED paspiidinaat vai piikstuli papiikstinaat atbildee uz pogu spiedieniem...

----------


## marizo

Nē, tā mikrene ir nopērkama Latvijā gan Elfā, gan Argusā. Vienīgi cenas atšķirība.
Liekas, Vinci kaut kur rakstīja, ka Argus ir Elfa izplatītājs. Diez vai tas nozīmē, ka arī Argusā būs tādas cenas kā Elfā?
Argusā: PCF8574P REMOTE 8BIT I/O EXP. I2C Ls 1.85
Elfā: PCF8574P I2C to parallel 8-bit 1gab. Ls 5.73	
5,73/1,85=3,1x Tīri tā neko!
Bet nu uz Rīgu nebraucu un vienu mikreni pa pastu sūtīt negribas, sagaidīšu, kad vajadzēs vēl kaut ko.

Runājot par tām quasi-bidirectional ieejām/izejām:
Datu lapā kaut kur izlasīju, ka tās, ierakstot "1", uz brīdi tiek stipri pieslēgtas +5V, lai veidotu asāku fronti. Tad domāju, lai nekādā taustiņu kombinācijā ne uz brīdi neveidotos īsa ķēde, vajag salikt visiem 8 rindu un kolonu izvadiem virknē rezistorus ap 330 Om (ir krājumos). Nu un tad izvadu 01111111, nolasu 01110111 vai citu kodu.
Vispār man patika arī tā ideja par mikrokontrollera izmantošanu un kādas diodes pielikšanu, bet tas varbūt lai paliek versijai 2.  ::  Gribas šo ideju izmēģināt un tad jau redzēs.

----------


## marizo

Beidzot uztaisīju to 4x4 klaviatūru ar I2C interfeisu. Darbojas labi. Kamēr eksperimentēju, sarakstīju 2 pogu nolasīšanas apakšprogrammas: viena atgriež 16 bitus, kur katrs bits ir viena klaviatūras poga, bet otra - 1 baitu (1..16), ja nospiesta tikai 1 poga, vai 0, ja nav nospiesta neviena vai vairākas pogas. Vienīgi neizmēģināju nolasīšanu uz pārtraukuma signāla no PCF8574(A).
[attachment=7:1uys7aiy]4x4klava1.jpg[/attachment:1uys7aiy]
[attachment=6:1uys7aiy]4x4klava2.jpg[/attachment:1uys7aiy]
[attachment=5:1uys7aiy]4x4klava3.jpg[/attachment:1uys7aiy]
Ienācās vēl dažas testu platītes I2C interfeisam- DS2482 (I2C<->1-wire) un PCA9533 (I2C 4-bit LED dimmer). Nu tā pirmā mikroshēma stipri vienkāršo DS18B20 termometra nolasīšanu, bet otra der kādām smukumlietām - gaismas diožu apgaismojumam vai tml.
[attachment=4:1uys7aiy]1wire1.jpg[/attachment:1uys7aiy]
[attachment=3:1uys7aiy]1wire2.jpg[/attachment:1uys7aiy]
[attachment=2:1uys7aiy]LEDdimmer1.jpg[/attachment:1uys7aiy]
[attachment=1:1uys7aiy]LEDdimmer2.jpg[/attachment:1uys7aiy]

Īsti gan netieku galā ar I2C mikroshēmu īpatnību - dīvaini uzvedas pēc SPI lietošanas, laikam tādēļ, ka tiek izmantota kopēja datu līnija SDA/SDA. To atklāju, kad pieslēdzu 7-segmentu indikatoru platīti ar 74HC595 mikroshēmām, kur datus iesūtu caur SPI pēc TMR0 pārtraukuma, un termometra lasīšanas caur I2C pamatprogrammā(I2C lietošanas laikā izslēdzu pārtraukumus, bet tas negatīvi iespaido dinamisko indikāciju). Dīvainība izpaužas kā nepareizi nolasīti dati pirmajā I2C ierakstīšanas/nolasīšanas reizē, tādēļ nākas datus nolasīt atkārtoti un izmantot tikai otrajā reizē nolasītos termometra rādījumus.
[attachment=0:1uys7aiy]SPI ind.jpg[/attachment:1uys7aiy]

----------


## Delfins

Interesanti, man ar drīz nāksies spēlēties ar atmegu un pārs termosensoriem uz vienas I2C līnijas  :: 
Kopēja shēma ir ? kā tad viss ir savienots  PIC+I2C periferijas !?

----------


## marizo

Kopējās shēmas kā tādas nav. Ir tikai PIC16F877A maketplate, pie kuras pēc vajadzības tad tiek kaut kas piekarināts. Šajā gadījumā I2C perifērijas tika pieslēgtas standartslēgumā (pie PORTC attiecīgajiem izvadiem) un 7-segmentu displejs kā SPI (Serial Peripheral Interface iekārta) pie tā paša PORTC, izmantojot kopēju datu izvadu. Sanāk, ka katru reizi nākas norādīt pa jaunu I2C konfigurācijas bitus, jo SPI tie ir savādāki.
Kā jau rakstīju, man pārmaiņus lietojot SPI un I2C parādījās kaut kādi gļuki, kad no I2C netika pareizi nolasīti dati. Vēl netieku gudrs, kamdēļ tā - vai I2C uzskata, ka ir Start vai Stop stāvoklis, vai kaut kas ar laika intervāliem. Itkā pirms I2C lietošanas izslēdzu dinamiskās indikācijas pārtraukumu, bet tas nepalīdz, vienīgi 7-segmentu indikatori noraustās, jo DS18B20 termometra nolasīšanai vajag laiku, ko var uz aci pamanīt.

DS2482-100 ir speciāla mikrene, kas paredzēta 1-wire devaisu pieslēgšanai pie I2C porta. Par pāris termosensoriem runājot - neesmu mēģinājis lietot vairāk kā 1 DS18B20 paralēli, kaut gan pēc aprakstiem tas ir iespējams, jo katram termometram ir individuāls ROM kods, pēc kura tas tiek atpazīts.
Protams, vai ir jēga likt to DS2482, jo 1-wire lietošanu var uzkodēt arī softiski.

Lietojot klaviatūru, I2C-1w, LED dimmer un DS1307 pulksteni pārmaiņus nekādas problēmas nav.

----------


## Janis1279

To Delfins
Ja krievu valoda ir bum bum, droši "skaties"  pēc visai plašas informācijas klāsta uz kazus.ru elektronikas forumu.
Kāds no iespējamajiem piemēriem :
http://kazus.ru/forum/topics/15080.html

----------


## Janis1279

marizo   Plates izskatās ļoti labi, Skaisti maketi !

----------

