# PIC mikrokontrolleri >  I2C

## 0xDEAD BEEF

Sveiki!
Sodien pielodeju LBA (5mm x 3mm ar kajam apaksa) mirekreni ar fenu un meginu nu ar to komunicet, bet nekas nesanak. Lieki piebilst, ka es ari nemaz nemaku!  :: 

Varbut varat ieteikt kadu veidu, ka diagnosticet, vai I2C iekarta darbojas vai ne?!
Re kur pic kods.
		IdleI2C(); //pagaidam, kamer bus ir brivs
		//001100X adrese. x = vdd. laikam 1. tatad 0x43 rakstit un 0x42 lasit.
		StartI2C();
		putcI2C(0x43);//acceleometra addrese + write
		IdleI2C();
		putcI2C(0x8D); //rakstam kaut kadu registru. Lasam REGB controlregistru
		IdleI2C();
		StartI2C();
		putcI2C(0x42); //acceleometrs - lasit
		IdleI2C();
		temp = getcI2C();
		NotAckI2C();
		StopI2C();
		TRISBbits.TRISB2 = 0;

Re kur no pdf, ka ir jasazinas
Sequence 3. The Master is receiving one byte of data from the Slave.
Master S SAD + W RA Sr SAD + R NACK P
Slave ACK ACK ACK DATA

Ceru, ka kads ir darbojies ar I2C.
Beefs
p.s. meginasu parlodet cepeskrasni citu cipu... ja nu sitas ir nosvilis cepinot ar feenu! :/

----------


## Vikings

1. I2C iekārta atbild ar ACK bitu, ja adrese ir pareiza un dati ir apstiprināti. Pārbaudi to.
2. Moš pamēģini ar vadiņiem pielodēties un pārbaudīt...

----------


## Epis

Ar oscilu esi skatījies kas nāk ārā no PICa ?? , ja signāli ir tieši tādi kā I2C čipa datasheetā un viņš neko neatbild tad nekas cits neatliek kā lodēt nākošo i2c, un to I2C clk frekvenci varēja laist kādu gribi, tākā ja tev ir švaks ocils (zem 1msps kā man) tad nolaid frekvenci lejā lai varēturedzēt tos signālus. 

vai arī uztaisīt īstu SMD krāsni kā es, kur visi procesi tiek stingri kontrollēti pēc lodēšanas profila   ::   ar +- novirzi kas ir normas robežās.

----------


## sharps

paskaties ar kaadu frekvenci komunicee I2C iekaarta 100KHz, 400kHz vai jaunais 1MHz. piem DS1307 mikrene tikai ar 100kHz. tas pirmais. taalaak skaties adresi I2C chipam. tad veel pieveers uzmaniibu ieksheejiem regjistriem vai nav kaads bits paredzeets taa iesleegshanai infas nolasiishanai un tad atsleegshnaia gaidiishanas rezhiimaa.
pats tagad chakareejos ar DS1307 RTC mikreni.

----------


## 0xDEAD BEEF

Piesledzu osciloskopu piet SDA un SCL linijam un Ext ieeju piesledzu pie pina, uz kuru devu signalu, kad sakas datu sutisana.
Tada veida izdevas verot, kas tur notiekas. Skiet, ka divus acceleometrus jau nosvilinaju lodesanas procesa. 3so lodeju atri iebazot un izvelkot ara no cepeskrasns (pirmo divus pamaitaju ar celtniecibas feenu. Kaut gan tureju digitalo termometru virs chipa visu laiku, tomer ticamibas moments ir zudis).

Pilniba nekas neizdevas ar HW i2c, tapec atri uzbliezu augsha pats savejo. Ar HW i2c bija tada problema, ka tiklidz devicem iesledz enable pinu, ta paris ms laika SDA paliek zems un iestajas stavokliks, kura nekas nenotiek (SDA low, SCL high). Ar sofware I2C (pastaisitu), ta nebija un izdevas atrast pareizo adresi.

Tagad problema ir tada, ka getcI2C iesprust un talak neiet. Proti - nosutu Addresi+W (0x30), ACK, nosutu registru (0x0D), nosutu Adresi+R (0x31), ACK , meginu sanemt ar getcI2C, bet viss iesprust un dati nenak.

Tagad meginasu majas uztaisit visu tik talu ar savu softwarisko pieeju, bet tas nemaz nav tik vienkarsi (esmu ieviesis funkcijas start, stop un bit).

Vispar jutos dzilji nelaimigs par to I2C un ari par to noladeto LBA packegju lodesanu. Laikam vajadzeja to darit ar lodesanas pastu, nevis apalvotiem celinjiem un kalifonija kaudzi.
Beefs

----------


## sharps

kaadu PICu tu lieto?
ar hardvarisko I2C proveeji?

----------


## 0xDEAD BEEF

Es lietoju 18f4455.

Kareiz jau ari ar hardwarisko ir problemas. Ar softwarisko es jutu control par to picu, kas kur un ka notiek un taa, bet ar hardwarisko krietni sarezgitak... :/ Toties ar softwarisko pasam viss jakode, un es to nevelos darit. Gribu palauties uz to, kas jau ir izdarits un izmantot interuptus.
Laikam vajadzes vairak pdf palasti. Pa sitajam dienam esmu pamatigi jau taja visa iebraucis!  ::

----------


## sharps

ar hardwari jaaskataas vai ir pareizi noinicializeets un vai pareizi darbojies ar MSSP regjistriem. es pashlaik gan ar PIC16F877A.
ja ar hardwarisko njemsies. mosh  varu paliidzeet ja kas neiet. varbuut kaada ideja radiisies. tag ar to MSSP ciinos.

----------


## 0xDEAD BEEF

Nu vispar PZDC%#%#!  :: 

Riktigi cakarejos, liku visur, kur vien vareju to IdleI2C un tada gara... un galu gala... Palaizu.. nekas neiet. oscilografs rada high limenus. Buss neaktvis. Tad es izvelku no busa vienu osciloskopa vadu. Paris reizes paljurkaju un peksni ka ar burvju majienu komunikacijas sak darboties un dati suutas.

Nu pasakat man - kas tie par pigoriem?!?!?!

----------


## 0xDEAD BEEF

un labakais, ka ne kuru katru vadu, bet tiesi sda vadu un nevis viekarsi kaut kur, bet tiesi taja gala, kur vins iet ieksa breadboarda. nu mistika velns... :/

----------


## 0xDEAD BEEF

Nu ok~ meginasu aprakstit, ka viss notiek. Varbut kads no uber guru sapratis, ka pa stelli!
Pirmais noverojums, ka vajag, lai osciloskopa zondes ir uzliktas uz 1/10 nevis 1/1. Otrkart, kad palaiz shemu, tad SDA un SCL linijas neka nav (abas aughsa), kaut ari PIC kodam VAJADZEJA gjeneret pulksteni un datus un tricky part - es esmu piestiprinajis pie vadiniem zondes un ideja ir tada, ka vajag paljurkat ieksa/ara SDA vadinu, un tad notiek MAGIIJA, linijas PEKSNI paradas signals un komunikacija AIZIET!

BLJAAJJA... kas tas ir PAR sviestu???

----------


## sharps

tev uz SDA un SCL liinijaam ir pullup rezistori uzlikti? uz 100kHz komunikaacijas jaabuut 10k rezistori, bet pie 400kHz 1k rezistori.

----------


## 0xDEAD BEEF

Rezistori ir uzlikti. Linijas ir augsha. Vakar to visu reduceju lidz tam, ka nemaz nevajag ossciloskopu. Vajag vienkarsi ar open vadinu pabakstit SDA liniju, un tad peksni viena momenta sak darboties. Nedarbosanas ir ta, ka SDA un SCL linijas NEKAS nenotiek. Visu laiku high.
Nesaprotu...

----------


## karloslv

Ja Tev ir kārtīgi pull-up rezistori un barošana, nekāda vaļēju vadiņu bakstīšana nevar radīt pietiekamus impulsus, ja vien Tu nedzīvo tieši zem lokatora. Tā ka pārbaudi vien shēmu.

----------


## sharps

tik pat labi var pirktiem drusku gar PICa kaajaas pabraukaat un tas buus. bet shitaa risks ar dzirksteli nosvilinaat ieejas. mosh baroshanas pusee pie PICa un pie I2C mikrenes iemet pa keramiskajam kondikjim. pa tiesho pie mikrenju kaajaam. dazhreiz paliidz. bet dazhreiz veel 10uF elektroliitus vajag piemest.
iespeejams ka PIC cloks gljukaini straadaa. man ir bijusi liidziiga situaacija. iipashi ja 20MHz cloks pie PICa.

----------


## Epis

Tas man atgādina kā es pirmo PIC programmēju lai spīdinātu LED diodi, bīj tāpat kā tev pieliekot pirkstu pie PIC korpusa pēkšņi sāka strādāt attālinot nekas nestrādā, velns viņ zin kas pa vainu, var teikt ka PICs strādāja kā capacitatīvā poga  :: , vēlk ar atmeli arī gļuki bīja, izeja ir tikai viena kamēr nepieliksi kārtīgu 5V virs 200ma (man uz SMD krāsns plates stāv 5V 500ma DC-DC)  ar kādu 300uF kodiķi  un izmantosi kārtīgu barošanas bloku  tikmēr nekas normāli nestrādās, + var arī lodējumos būt kāda klūda, tākā ir tā ka ja nav PCB tad visas problēmas ir vados un sīgā lodējumā. 

Rekā ir ar to Fēna metodi, labi ka es neticēju visiem gudrajiem padomiem un iztaisīju SMD Krāsni vēl nēsu neko sadedzinājis  :: 

varbūt ka čips nemaz nav sadedzis bet sabojājies no pārāk ātras karšanas (ja karst ar ātrumu kas lielāks par 3C/s tad var visu samaitāt!) un atdzist var ar 6C/s tākā nav tā lodešana tik vienkārša.

----------


## 0xDEAD BEEF

Nu pastasti ludzu smalkak? Saproti - PICam ir kods, kursh mirkskhjina lampinu. Lampina mirkshjinjas, bet SDA un SCL linijas klusum (bet vajadzeja but start, stop un datiem). Tad es pacibinu ar vadinu SDA liniju un peksni paradas signals. Znacit PIC griezas, bet kaut kur citur gluks.

Kaa tas ir, ka clock varetu nestradat?  Ideja jau ari tada, ka vins no nestradajosas fazes iesledzas stradajosa. Pretesitbas ir 10kohm un velk uz auksu, ja reiz sda un scl ir +5v.
Nesaprotu...

----------


## sharps

skaties varbuut esi nodefineejis kaadu kaaju kaa inputu un pieskaroties vinjai proga aiziet taalaak. vai arii iesleedzis paatraukumu uz I2C no aarienes un piekjerot ar pirktu liimenji nomidzinaas un kaut kas saak straadaat. iespeejams ka taa jaabuut, bet varbuut I2C chips gljukains. te var tikai mineet.
meegjini sasleegt vairaakus LEDus pie PICa un pie katra programmas notikuma iesleegt konkreetu LEDu un shaadaa veidaa iztaustiit kur ir nepatikshanas.
varbuut vari nofocheet plati kaa izskataas? varbuut kaut kas ne taa ar I2C liinijas garumu?

cloks vienkaarshi var nepalaisties vai arii teiksim ir aizpeldeejusi taa frekvence un apreekjinaatie taimingi prieksh I2C vairs neder, bet viss paareejais shkjiet straadaajam. ar parastu oscili to cloku buus gruuti paarbaudiit, jo to iespaido oscilja shupa vada kapacitaate. tikpat labi arii ar pirkstu pieskaroties frekvence pamainaas un luuk peekshnji kaut kas straadaa.

----------


## Epis

patiešām beef nofoķē plati un parādi kas tev tur ir salodēts.

----------


## 0xDEAD BEEF

salodets? lol! Tas ir breadboards ar pretestibam no plusa uz sda un scl piniem un vadiem no piniem uz acceleometru!  ::  Nekas nav lodets!  ::

----------


## Epis

Tad uzlodē to visu uz parastās caurumainās maketplates un redzēsi ka viss strādā.

----------


## sharps

skaidrs  :: 
epi uz maketnieces buus veel lielaaki cunduri  ::

----------


## 0xDEAD BEEF

Tas tacu butu stulbi kaut ko lodet uz plates, ja tas nav parbaudits uz breadboarda? Vai tad tiesi prieks tam breadboardi nav paredzeti? Ko tad - katram projektinjam jasalode visas komponentes uz maketplates? Nu man labak patik doma, ka tev ir cupa breadboard komponensu, un tad, kad viss ir parbaudit uz breadboarda, tad lode ar smd detalam uz profesionalas plates.

Anyway - vai ir kadas idejas vai ieteikumi manas problemas sakara?
Beefs

----------


## Vikings

A klausies, moš barošana gļuko? Pieliec pie paša akselerometra keramikas kondensatoru ar 1uF kapacitāti lai vismaz šitas variants atkrīt.

Varbūt pamēģini uzkodēt softisku I2C tas taķs nav īpaši sarežģīti un savu kodu nosimulējot varēsi būt pārliecināts, ka teorētiski viss OK...

----------


## 0xDEAD BEEF

Tur jau tā fiška, ka ar softisko viss ir čiki piki! Bet man jau gribas kā krutāk un ar interuptiem!  :: 
Beefs

----------


## abergs

Pašam ar I2C nav nācies ņemties un pašreiz ar laiku tā knapāk.Vienīgais varu ieteikt tos pašus visiem 
zināmos neta resursus:
http://forum.microchip.com/tt.aspx?forumid=10
http://o.webring.com/hub?ring=picmicro
http://www.microchip.su/index.php
http://www.microchip.ru/phorum/list.php?f=2
http://www.edaboard.com/forum76.html
http://electronix.ru/forum/index.php...&showforum=135
http://www.piclist.com/
 ::

----------


## Epis

Nu tad moš tas tavs breadboards ir nolietojies un līdz ar to kontakti tādi pašvaki ja jau pieskaroties viss strādā tad tā arī sanāk pieskaroties tu vadu iespied dziļāk un uztaisās labāks kontakts un tad arī sāk strādāt  :: 

vārdsakot vai nu kontaktos vaina, vaibarošanā cits nekas nevar būt jo PICs un citas mikrenes gļukus tāpatvien netaisa.

----------


## sharps

BEEF ir kaadi jaunumi ar tavu hardwarisko I2C?
Es te ar saveejo 16F877A ciinos. START un STOP bitus vienu aiz otra padzenaaju bez datiem iet kaa smeereets. tikko meegjinu Datus un ACK taa uzreiz pakaraas. Mosh pameegjini tu ar Tikai START un STOP bitu uzgjenereet, tad ar oscili paveerot kas notiek.

----------


## 0xDEAD BEEF

Klau sharp... tu tacu lieto softwarisko? vai ari hardwarisko? man ari ir ta bijs, ka uzkaras, bet es izmantoju hardwarisko un uzkaras ieks write vai read, jo tur ir cikls uz BF empty uzlikts, bet tas NEKAD nepiepildas, ja nedarbojas CLOCK signals.

----------


## sharps

es hardwarisko lietoju. nu luuk es to pashu BF noteikshanu lietoju. kameer BF=1 tikmeer SSPBUF ir pilns. tikko tas buferis iztukshojaas taa BF=0. tuuliit es shito paarbaudiishu vai taa ir.

----------


## sharps

jaa taa arii ir kameer SSPBUF ir pilns tikmeer BF=1. kad SSPBUF iztukshojies taa BF=0, bet programma tik un taa uzkaraas. liidz STOP bitam neaiziet. paliek pie ACK gaidiishanas jeb programmaa pie shitaas daljas (vai ACK?):


```
	BANKSEL	BANK1

		BTFSC	SSPSTAT,	BF						;vai BUF tuksh?
	GOTO	$-1
	BANKSEL	BANK0


		BTFSS	PIR1,	SSPIF						; vai ACK ?
	GOTO $-1
```

 uzvedaas taa it kaa no DS1307 nesanjemtu ACK

----------


## 0xDEAD BEEF

LOL!  ::  Tas ir tas pats kods, kas man ir ieks C, tikai ASMa. Fiska tada, ka pec pdf pec nolasitiem 8 bitiem BF butu japaliek par 1 (tipa viens baits sanemts) un taja mirkli cikls izbeidzas un tev ir iespeja bf atkal uzlikt uz 0 izdarot lasisanu no SPBUF, BET akjigakais jautajums ir - ka vispar ir ispejams nenolasit 8 bitus, ja pulksteni nosaka master. Proti - pat ja slave ir atrubijies vai vispar nav shema - nebutu japastav tadai situacijai, kad kods noblokjejas, jo pulksteni gjenere masters. OK - ir viena vieniga iespeja - Slave uztaisa pull down clockam, lai aizturetu datu sutisanu uz aliku, kamer slave veica aprekinus. Tec vajag notestet, kads ir SCL linijas stavoklis tad, kad tavs kods ieciklejas. Ja SCL ir zems, tad tas ir aizturets. Pamegini izraut Slave no shemas, jo Slave ir vienigais, kam ir tiesibas turet SCL low. ja tad neaiziet, tad tev ir lidzigs gluks ka man!
Ceru, ka atradisi risinajumu!  :: 
Beefs

----------


## Vikings

SCL slave nav tiesības turēt zemu. Slave drīkst ietekmēt tikai SDA līniju. Un arī tikai lai padotu ACK vai atbildētu ar datiem.
Klau, atcerējos, ka reiz vienā forumā arī bija problēma ar iebūvēto I2C un problēmas pamatā izrādījās nepareizi pull-up rezistori. Pārbaudiet vai tie tiešām atbilst pdfā rakstītajam.

----------


## sharps

par puul-up rezistoriem es paeksperimenteeju. saakumaa bija 10k un ar oscili peetot fronte bija diegan tuva eksponentei. saaku samazinaat liidz apstaajos pie 1k un rezultaataa smuks taisnstuuriitis.

----------


## 0xDEAD BEEF

Viking - tu kludies! Slave IR tiesibas turet zemu SCL, lai aizturetu datu sanemsanu. Tas ari ir rakstits PDFa, ja kas!  :: 
Sharp - smuki taisnsutri ar 1kohm ir forsi, bet vai tas atrisinaja problemu?

Beefs

----------


## sharps

pagaidaam gan tas probleemu neatrisinaaja. bet tas veelaak var atsaukties uz datu korektu sanjemshanu/nosuutiishanu.
man STARTu gjeneree, bet datus ne. STOP beigaas ar tiek nogjenereets.

----------


## 0xDEAD BEEF

Vai tu pagaidi, kamer izpildas start signals, pirms sac sutit datus?
es izmantoju while(sspcon1.sen); putcI2C(...

----------


## sharps

tas man notiekaas shitaa



```
;START
	BANKSEL	BANK1
		BSF	SSPCON2,	SEN
	BANKSEL	BANK0
		BTFSC	PIR2,	BCLIF						;I2C shinas konflikts
	GOTO	I2C_END1
		BTFSS	PIR1,	SSPIF						; vai nosutits
	GOTO $-3
		BCF		PIR1,	SSPIF
```

  peec tam es buferii ielaadeeju adresi, bet nekas nenotiek. meegjinaaju pat laiku skaitiit. bet nekaa.

----------


## 0xDEAD BEEF

Tu gaidi uz interuptu, un tad uzskati, ka dati ir sanemti. Es izmantoju parbaudi uz SEN, jo pdf ir rakstits, ka lai saktu start, vajag sen uzlikt uz viens. Ir rakstits, ka tad, kad start ir nosutis, to notira uz 0. Iesaku pirms Start notirit to interupt bitu. Vispar nezinu, kapec tu mokies ar asmu!  :: 
Tev ir osciloskops. Ko tev rada, kad taisi start un stop? Intervali ir pareizi? Kas notiek ar SDA un SCL linijam, kad megini sutit datus? Abas ir augsa vai leja vai ka?
beefs

----------


## sharps

peec pdf SEN notiiraas hardwariski.
peec oscilja man iznaak taa. saakumaa SDA un SCL ir augsti. ieraktot SEN=1 SDA nokriit un peec zinaama laika arii SCL nokriit uz 0. visu sho laiku tiek testeets vai nav busa koliizijas START izpildes laikaa. tikko meegjinu suutiit datus, t.i. ierakstu beferii, tad SDA un SCL vispaar nereagjee. meegjinu pat ietureet laiku, bet vienalga bez izmainjaam. cik saprotu vinjam automaatiski buutu jaapacelj cloks. tas notiek tikai tad ja es peec START kondicijas "varmaaciigi" ierakstu SSPADD baudrates ciparu. tad SCL paceljaas.
kaadeelj ASMS? nu katram jau sirdij kas tuvaaks. ir redzeets ka profesionaalji mokaas ar C un nevar izmociit to ko var ar ASMu.

----------


## 0xDEAD BEEF

Tu saki, ka ja pec katras komandas raksta baudrate registra, tad pulkstenis darbojas un dati sutas? Kada stavokli tev ir SDA un SCL linijas, tad, kad programa ieciklejas? abas augsa?
Kaut kur tikla lasiju, ka vajag pirms i2c harwares iedarbinasanas abus (scl un sda) pinus uztaisit pa output piniem, abos ierakstits 0 (lat porta) un tad abus uztaisit pa input (tris). Pamegini sito prikolu. Moska sanaks.
Beefs

----------


## sharps

peec START vinjas paliek lejaa un taa liidz STOPam. pie STOP kaa pirmaa paceljaas SCL un peec laika paceljaas SDA.
tos TRIS jau agraak proveeju pamainiit. bet nekas no taa nemainaas.
jaa kad ierakstu baudrati tad peec START SCL paceljaas, bet datus tik un taa nesuuta. tas SCL paliek augshaa liidz pat STOPam

----------


## 0xDEAD BEEF

Ka SCL var palikt augsa lidz pat stopa, ja stop nekad nepienak. TB. tev tas cikls izgriezas un dati aizsutas ar SCL visu laiku augsha?

----------


## sharps

Tieshi tie dati negrib suutiities. peec STARTa es ielaadeeju buferii SSPBUF I2C ieriices adresi. peec apraksta spriezhot peec taa vajadzeetu automaatiski ielaadeeties tam baudrates skaitlim, lai taimeris saaktu skaitiities un paceltu vai nolaistu to SCL kaaju. bet tas nenotiek. testeeju BF bitu SSPSTAT regjistraa taada sajuuta ka tas visu laiku buutu nulle un dati nebuutu ielaadeeti (uz oscilja nekaadas pakas neaiziet), bet tam peec ielaades ir jaapaceljaas uz 1. meegjinaaju gaidiit kaadu laicinju un tad ja nekas nenotiek tad eju uz STOP kondiiciju (abas liinjas augshaa un izjeas poziicijaa). tad saakam ciklu no jauna.
taatad tanii vietaa kur baudratei vajadzeeja automaatiski ielaadeeties, bet vinja neielaadeejas, es vinju vardarbiigi (nu ne gluzhi tai BRG) bet SSPADD. un tad peec START uzreiz paceljaas tas SCL. taalaak nekas nenotiek. tas SCL 1 liimenii nogulj liidz pat tam STOP bita.
veelaak safocheeshu un iemetiishu oscilja bildes kaa tas izskataas abos gadiijumos.

----------


## 0xDEAD BEEF

hmm... a kurs taimeris ir atbildigs par i2c, vai tas ir atsevisks un nejaucas ar parastajiem taimeriem? Tu pirms sutisanas notiri interupta flagu?

----------


## sharps

tas taimeris bija domaats kaa BRG - baudrates gjenerators. kas arii peec savas buutiibas ir taimeris. tam BRG iztukshojoties jaanotiek automaatiskai ielaadei no SSPADD. jaa INT flagus notiiru. bet vispaar kaut kaads murgs ar shito visu iznaak. softwaariskais I2C straadaa taa kaa nemetaas.  ::  kur tas gljuks fig vinju zin  :: 

varbuut papeeti AN735, bet tas ir uz PIC16F873. kaut ko mosh pamani taadu?

----------


## 0xDEAD BEEF

Nu es jau ari saku, ka tur nav kam nestradat. Protams, ka softiskais strada, jo tu pats kontrole pinus, bet taja hardwariskaja natura kaut kads gluks, ka vins nemaz nestarte to generatoru un vel visadi brinumi notiek. ZINI! Ieliec to start - send - stop cikla un pamegini taka es ar atvienotu vadinu pabakstit SDA liniju. Moska tev ari magija sakas!  :: 
beefs

----------


## Vikings

> Viking - tu kludies! Slave IR tiesibas turet zemu SCL, lai aizturetu datu sanemsanu. Tas ari ir rakstits PDFa, ja kas! 
> Beefs


 Hmm, njā, tas ir kaut kas jauns. Papētīšu pdfu, lai pats uz tāda gļuka neuzdurtos.

Starp citu, lauziens visā kārtīgi iedziļināties, bet varbūt šitas dokuments var palīdzēt?

----------


## sharps

mjaa pashivereejos. pabakstiiju ar vadeli. nu tik aizgaaja tie impulsi  :: 
bet tas notiek tad ja es starp I2C send ciklu atkaartoshanos (...STOP time next I2C START...)  mazu laiku ieveeroju. tikko beidzoties STOPam ielieku kaadas 100usec taimingu taa nekas nemainaas ar to bakstiishanu. man ir ljoti liela aizdoma ka tieshi programmaa konfiguraacijas regjistros nav pareizaas konfiguraacijas vai arii kaut kas cits tiek dariits nepareizi. tu INTERRUPTus lieto vai arii dari visu suutiishanu main programmaa?

----------


## 0xDEAD BEEF

Es visu daru main programa. Doma bija vispirms dabut darbojoshos kodu main programa un tad ar interuptiem bakstities (pec ieksejas parliecibas, ka ar interuptiem ir sarezgitak).

Tatad tev ari magija notiek, ja... nu blj%# veciit!  ::  Prieks par to!  ::  Atrisini problemu un pastasti man risinajumu!  ::   ::   :: 

Tu pameginaji pirms i2c inicializacijas uzlikt tos pinus par out piniem, ierakstits LAT 0nules un uzlikt TRIS atpakal uz input? Nepalidzeja? Kas vel nak prata...hmmm... nevaru NEKO iedomaties. Varbut ir vel kads hardware, kas shaaree funkcionalitati ar tiem piniem? Kas vel varetu but par prikolu? return from sleep? Ka tas tiek darits?

----------


## sharps

returno no sleep tikai interrupts manupraat. kaa jau teicu ieliec lielaaku taimingu starp atsevishkjiem I2C suutiishanas notikumiem un tad parausti to vadinju. man vismaz nekas vairs nemainaas uz oscilja. viss paliek pa vecam.
pie PIC16F87XA baudrates gjeneratora apraksta ir dota smuka bildiite (figure 9-17) BRG block diagram. kaadeelj tur pie SSPADD un pie Reload Control modulja paraadaas SSPM3:SSPM0 biti. ko vinji ar tiem iisti vada. inicializaacijaa es tos iestaadu kaa 1000, t.i. MASTER rezhiims ar CLK=Fosc/(4*(SSPAD+1)). tur veel noraadiits ka no Reload Control klucha iziet reload signaals. tas ir tas kas paarlaadee to BRG.

http://ww1.microchip.com/downloads/e...Doc/39582b.pdf shiten 97 lpp

ar tiem TRISiem nepaliidzeeja.

----------


## 0xDEAD BEEF

Ciki piki 0xDEAD BEEF scoores again!  :: 

ADCON1 registru nokonfigure, lai sda un scl NAV analogie pini VAI ari uzliec, ka PORTB digital inputs on reset konfiguracijas bitu!

edit: pec tam vel bija gluks, ka dati parstaja iet un negaja ar pieslegtam osciloskopa zondem, bet pietika vien nomainit uz 1k rezistoriem un aizgaja svilpodams! TB - bija situacija, ka pulksteni genere, bet iesprust uz sanemsanas (bf), bet tas notika tapec, ka ta kapacitate vai whatever sacakareja lietu un pics nespeja noteikt pulksteni pareizi un tapec uzkatija, ka pulkstena signals nav derigs.

Beefs

----------


## 0xDEAD BEEF

Nee... isti svilpodams neiet... Paris reizes sanem datus, bet tad vissdazadakajos veidos viss dazadakajas vietas iesprust. O_o
Kaut kas vel nav pilniba noslipets.
Beefs

----------


## sharps

man SDA un SCL liinijaam ar PORTB nav nekaada sakara, kaa arii ar analogajaam ieejaam arii nee. man shiis liinijas seezh uz PORTC.

----------


## 0xDEAD BEEF

Klau sharp - vai ir kads progres? Nenak nekas prata, kas man varetu but par vainu, ka pec neilga laika i2c apstajas? (piemeram clock generators strada, bet netiek pari while(!bf)
Beefs

----------


## sharps

kaadas paaris dienas biju licis mieraa to I2C. padarbojos ar citaam programmas daljaam. buus jaapiekjeraas klaat. pagaidaam gan nekas spiidosh nav ienaacis praataa. man tam BF tiek paari.

----------


## 0xDEAD BEEF

Ja tiek pari BF, tad jau dati sutas, ne? Kur tev ir problema?

----------


## sharps

ierakstot buferii datus suutiishanai BF buutu jaaiestaadaas kaa 1, bet man visu laiku ir 0. taatad nekaada suutiishana pat nesaakas.

----------


## 0xDEAD BEEF

A tu pārbaudi pirms sūtīšanas, ka visi statusa registri ir ar pareizām vērtībām un ka nav overflowi un start biti un stop ir pareizi uzlikušies?

----------


## 0xDEAD BEEF

Bla vairs nevaru izturet to jasanos.... :/
Fiska tada, ka datus sanem un viss darbojas diezgan eleganti, bet nekonsistenti - t.i. paris 1000 reizes datus izdodas sanemt un tad viss sacakarejas. Es parakstiju uz paravumiem un tas ari nepalidzeja. ienkarsi viena mirkli modulis parstaj darboties. Zuuud ticamibas moments.
5Ls par pareizo atbildi vai risinajumu!  ::  te kods -



```
#include <p18cxxx.h>
#include "delays.h"
#include "i2c.h"

#pragma udata
void InterruptHandlerHigh (void);
void reset(void);

char I2CTask = 0;
char xout_h,xout_l,yout_h,yout_l;
char gotone;

char a,b,c;
char idle;

#define ACC1W 0x30
#define ACC1R 0x31
#define XOUT_H 0x00

/** P R I V A T E  P R O T O T Y P E S ***************************************/
#pragma code
void main(void)
{
	char temp;
	char led;
	ADCON1 = 0x19;
  TRISB  &= 0x00;  
TRISB |= 0x03; //vajag pirmos divus pinus ieejas prieks I2C. Naksies lampinas karinat citur
  PORTB = 3;
Delay100TCYx(1); //bisku pagaidam  

  OpenI2C(MASTER, SLEW_ON);
 // SSPADD = 109; //i2c atrums 
  SSPADD = 0x18;
  	INTCON = 0; //izsledzam interuptus
	PIE1bits.SSPIE = 1; //iesledzam ssp interuptus
	IPR1bits.SSPIP = 1; //ssp interupti high priority
	RCONbits.IPEN = 1;            //enable priority levels
	INTCONbits.GIEH = 1; //enable interupts
	//reset();
	StopI2C(); //sakam visu procesu ar STOP. Jacer, ka tas izraisis paravumu
	while(1)
	{
		if(SSPCON1bits.WCOL || SSPCON1bits.SSPOV/* || !SSPSTATbits.CKE*/)
		{
			I2CTask = 0x00;
			SSPCON1bits.SSPOV = 0;
			SSPCON1bits.WCOL = 0;
			//SSPSTATbits.CKE = 1;
			temp = SSPBUF;
			while ( SSPCON2bits.PEN );  //pagaidam, ja gadijuma jau notiek stop, lai pasi neizraisitu koliziju			
			StopI2C();
		}
		
		Delay1KTCYx(1);
		if(gotone) led++;
		gotone = 0;
		if(!led) LATB ^= 0x08;
	}
	    }//end while
}//end main

void reset()
{
	IdleI2C();
	StartI2C();while(SSPCON2bits.SEN);
	putcI2C(0x30);
	if(SSPCON2bits.ACKSTAT)
		return;
	putcI2C(0x06);
	if(SSPCON2bits.ACKSTAT)
		return;
	putcI2C(0xCA);
	StopI2C();	while ( SSPCON2bits.PEN );  
}

//----------------------------------------------------------------------------
// High priority interrupt vector

#pragma code InterruptVectorHigh = 0x08
void
InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh //jump to interrupt routine
  _endasm
}

//----------------------------------------------------------------------------
// High priority interrupt routine

#pragma code
#pragma interrupt InterruptHandlerHigh

void
InterruptHandlerHigh ()
{
	char rbuf;
	if(PIR1bits.SSPIF)
	{
		a = SSPSTAT;
		b = SSPCON1;
		c = SSPCON2;
		idle = ( SSPCON2 & 0x1F ) | ( SSPSTATbits.R_W );
//		if(idle)
//			return;
//		SSPSTATbits.CKE = 1;
		if(SSPSTATbits.BF)
			rbuf = SSPBUF;
		PIR1bits.SSPIF = 0;
		switch(I2CTask)
		{
			case 0:
				StartI2C();
				break;
			case 1: //sutam I2C akseleometra addresi
				SSPBUF = ACC1W;
				break;
			case 2:
				if(SSPCON2bits.ACKSTAT)
					I2CTask = 0xff; //tas nozime problemu. Jataisa restart
				else
					SSPBUF = XOUT_H;
				break;
			case 3: //butu jasanem ACK no acceleometra, kas nozime, ka varam sutit read addresi
				if(SSPCON2bits.ACKSTAT)
					I2CTask = 0xff;
				else
					RestartI2C();
				break;
			case 4:
				SSPBUF = ACC1R; //Sr ir nosutits. Sutam komandu lasit
				break;
			case 5:
				if(SSPCON2bits.ACKSTAT)
					I2CTask = 0xff;
				else
					SSPCON2bits.RCEN = 1; //sakam sanemt datus
				break;
			case 6: //liekam i2c sanem
				xout_h = rbuf; //dati veiksmigi sanemti
				AckI2C(); // vairak datus mums nevajag
				break;
			case 7:
				SSPCON2bits.RCEN = 1;
				break;
			case 8:
				xout_l = rbuf; //dati veiksmigi sanemti
				AckI2C(); // vairak datus mums nevajag
				break;
			case 9:
				SSPCON2bits.RCEN = 1;
				break;
			case 10:
				yout_h = rbuf; //dati veiksmigi sanemti
				AckI2C(); // vairak datus mums nevajag
				break;
			case 11:
				SSPCON2bits.RCEN = 1;
				break;
			case 12:
				yout_l = rbuf; //dati veiksmigi sanemti
				NotAckI2C(); // vairak datus mums nevajag
				break;
			case 13: //izpildijies nack
				gotone = 1;
				I2CTask = 0xff; //Stop kondicija
				break;
			default:;
		}
		/*if(((I2CTask == 5) || (I2CTask = 11) || (I2CTask == 9) || (I2CTask == 7)) && !SSPCON2bits.RCEN)
			I2CTask = 0xff;*/
		if(I2CTask == 0xff)
		{
			StopI2C();
		}
		I2CTask++; //palielinam par 1. pie ff griezisies uz rinki
	}
}
/** EOF main.c ***************************************************************/
```

----------


## 0xDEAD BEEF

Forsi! Viss aizgaja. Biju slikti salodejis shemu. Gruti tas LGA detalas pielodet. Bet vienalga bus japarok dzilak, lai saprastu, kapec tad tas proces apstajas un ka viss efektivak nokert sadu situaciju.

BTW - es kaut kur tikla lasiju, ka 16f piciem ir problemas ar clock stretchingu master rezima.
Beefs

----------


## sharps

Sveicināta tauta!
Pacelšu vēlreiz veco tēmu ar DS1307. Savā laikā tika palaista gan shēmiņa gan programmiņa uz harwarisko I2C iekšs PIC16F877A. Tagad pēc pieciem gadiem parādījās vajadzība shēmiņu no jauna uzbūvēt. Tad nu te sākās brīnumi. Lietoju to pašu programmiņu tikai uzlodēju citu plati un piepirku pāris DS1307tos un pāris kvarcus. Iešuvu PICaa veco softu, bet diemžēl pulkstenis netikšķ. Sāku revidēt programmu, lai saprastu kurā vietā tad apstājās. Nonācu pie secinājuma ka pati shēmiņa netikšķ. Googles tante izmeta visdažadākos problēmu risinājumus, sākot ar kvarca piemeklēšanu un tā apaisti ar 8-22pF kondīzeru apsaisti beidzot ar datasheetā aprakstīto PCB pareizu trasēšanu. Uzdūros arī tam ka dažs labs ir nopircis DS1307 un attiecīgā sērija netikšķ, bet citā vietā pirktie un citas sērijas čipi tikšķ. Tad ņēmos ekesperimentēt. Pārlodēju platīti, kvarca korpusu uz barošanas GND uzmetu. Kaut kādā brīdī jau likās ka tomēr varu nolasīt jo sekunžu reģistrā beidzot uzrādījās ilgi gaidītais cipars 80 un pārējos reģistros pa nullēm. Sapriecājos nu sāku dzīt datus iekša un mēģināju palaist pulksteni no jauna un atkal nekā. Apstājas vienā un tajā pašā programmas vietā pie DS1307 adreses uzdošanas un ACK gaidīšanas no tās.
Tā nu maļos ar šito un nekādā jēgā. Šodien vēl provēšu uzmest kvarcus ar 12,5pF tā kā teikts datasheetā.

Varbūt kāds ir ar ko līdzīgu saskāries un kāds ir bijis risinājums? Daudzviet forumos kā krievu, tā angliski rakstošos saka, ka DS1307 ir visai kaprīza. Nu kaut kā negribas ticēt, jo savā laikā man to izdevās atdzīvināt visai viegli.

----------


## marizo

Hmm, es kaut kad arī te vienu DS1307 palaidu, viss gāja uz pirmo. Ja atmiņa neviļ, lasīju, ka to pulksteni vispār varēja bez kvarca palaist ar ārēju takts impulsu - ar domu kā impulsu skaitītājs. :/ Ar I2C tam nekāda sakara, jo I2C komunikāciju jau nosaka Master - dod takti. Tā ka nevajadzētu būt problēmām pie "DS1307 adreses uzdošanas un ACK gaidīšanas no tās"

----------


## sharps

Marizo daļeji jau no tava piemēra toreiz vadījos. Par I2C skaidrs, ka tas pie vainas nebūs. Iekšs forumiem jau tiek minētas iespējamās problēmas ar kvarciem, kad varot gadīties, ka tie pēc parametriem ir jāpiemeklē. Ja jau man DS1307 neatsaucās, bet iepriekš ar citu kvarcu un citu mikreni atsaucās, tad visdrīzākais ka problēma ir kvarcā.

Vakar kā salodēju jaunu plati, tā uz pirmo piegājienu nolasīja stundas:minūtes:sekundes sekojoši 00:00:80. Tas nozīmē ka pulkstenis nav palaists. Mēģinot pārstartēt programmu it kā viss likās stabili nolasjās korekti. Kā sāku rakstīt iekša kaut ko, tā viss nojūdzās un vairs pat neko nolasīt nevaru un pie pirmaa slave ack ieciklējās.

----------


## marizo

Nu jā, toreiz nebija man tādu problēmu, tādēļ arī neesmu neko lasījis par kvarca piemeklēšanu.
Dīvaini, ka DS vairs nelasās un pie ack ieciklējas. Nedomāju, ka kvarcs var tā ietekmēt.
Nu vēl 2 fiksās idejas:
1) varbūt kāda DS "parametru izkliede", dzeltenās detaļas vai kas tml - jams netiek līdzi 100kHz takts frekvencei
2) pilnīgi jāatslēdz kvarca barošana un datu līnijas no +5V, varbūt arī no baterijas.   -DS pēc tam tik un tā nelasās? Tad tak visdrīzāk defektīva DS1307

----------


## sharps

Varbūt arī ir kāds ķīnietis. Dabūju citus čipus ne no šīs partijas - tas pats. Kvarci gan man visi no vienas partijas. Rīt dabūšu beidzot citus kvarcus un tad jau paprovēšu, ja nē, tad paprovēšu uz microchipa DS1307 nosacītā līdzinieka padzenāt. Tik tur drusku programma jāpamaina.

----------


## JDat

Vai nevar pamēģināt no ārpuses iebarot ~ 32 Khz signālu. Teiksim pa fikso uz vēl viena AVR/PIc uztaisīt pliku ģeneratoru un iebarot clocku uz attiecīgu DS1307 kāju. Nav īsti korekti, bet testēšanai var derēt. Kas aatiecas uz pirkšanu. ja vajag mazāk pa 5 mikrenēm, tad varbūt pirkt no kataloga? Nu dārgāk būs, bet tajā pat laikā nosacītā garantija ka nebūs viltojums.

----------


## JDat

Izskatās ka var no ārējā ģeneratora iedot impulsus.
http://datasheets.maximintegrated.com/en/ds/DS1307.pdf
Un tad vēl viena nianse. iedūras lasot par X1 ieejas kāju. Kvarcam jābūt paredzētam ~ar logošanu 12 pF. Kas zin. Varbūt tur tā problēma. Redzēs kas tev sanāks, kad atceļos citi kvarci...

----------


## sharps

jDat es tieši arī pasūtīju kvarcus ar 12,5pF kapacitāti. Redzēs, kas no tā sanāks. Pēc tam jau skatīšos tālāk.

----------


## JDat

Ātrāk pielikt taisnstūri no ģeneratora lai sprastu mistēriju... :-/

----------


## DanillaD

Ja jau tāds čakars ar to DS1307, kapēc neizmantot MCP79410, viss tas pats tikai vel eeproms ir un lētāks.

----------


## sharps

Laikam arī tā darīšu ar to ģeneratoru.
MCP79410 jau pāris gab pasūtīju pagājušo nedēļu. Identisks viņš gluži nav. Tur dati mazlie citādāki jāsūta, piemēram adrese 11010000 vietā ir jāsūta 11011110.

----------


## DanillaD

Datu sūtīšana ir sīkums, galvenais lai strādātu paša mikroshēma. Es ar pašlaik mokos ar to DS1307. Domaju nomainīšu.

----------


## sharps

Kā sokās ar I2C?

----------


## sharps

Pirms kāda laiciņa  tiku izmocījis to I2C komunikācijas problēmu starp DS1307 un PIC16F877A. Respektīvi gļuks bija vienā sīkumā/

S|11010000|a|00000000|a|Sr|11010001|a|Dati|A|Dati|A|...|Dati|NA|P

Sūtot START (S) bitu programma ieciklējas. Uzliku pēc START (S) bita palielu delay time viss tiek nolasīts perfekti.
Kāds ar šādu gļuku ir saskāries?

----------

