[ sigi91 @ 17.12.2012. 15:14 ] @
Pozz svima

Evo posto sam lijen copy/paste cu problem samo sto sam na engleskom napisao..

First of all I must to say that I googled a lot to solve my issue, but in the end I couldn't solve it so I came here to ask help.

As in the title, the problem is that my uC PIC24FJ64GB002 hangs on I2C1_Write() instruction, waiting for ACK but the address IS correct and the same code using Soft_I2C_Write() WORKS.
I tried alternative I2C pins for I2C1, I tried also I2C2 and neither worked (wiring is double checked and it's ok).
I don't have any logic analyzer or oscilloscope to see what happens but I'll leave the code here and the entire basic-project so you can look at it.

It's pretty simple.

Citat:
// Software I2C connections
sbit Soft_I2C_Scl at RB8_bit;
sbit Soft_I2C_Sda at RB9_bit;
sbit Soft_I2C_Scl_Direction at TRISB8_bit;
sbit Soft_I2C_Sda_Direction at TRISB9_bit;
// End Software I2C connections

char j, txt[4];

void main() {
AD1PCFG = 0xFFFF;
LATB = 0;
TRISB = 0;

LATA = 0;
TRISA = 0;

PPS_mapping(15, _INPUT, _U1RX );
PPS_Mapping(14, _OUTPUT, _U1TX);
UART1_Init(19200);

UART1_Write_Text("\nStarting..");

I2C1_Init(100000);
I2C1_Start();
I2C1_Write(0b10010000); // address TMP75 + W
I2C1_Write(0x00); // config register <= read temperature
I2C1_Restart();
I2C1_Write(0b10010001); // address TMP75 + R
j = I2C1_Read(1); // Reading 1 byte then send N_Ack(1)
I2C1_Stop();
UART1_Write_Text("\nTemperature : ");
shorttostr(j, txt);
Uart1_Write_Text(txt);

/*UART1_Write_Text("\nStarting..");

Soft_I2C_Init(); // Initialize Soft I2C communication ~20kHz
Soft_I2C_Start();
Soft_I2C_Write(0b10010000); // address TMP75 + W
Soft_I2C_Write(0x00); // config register <= read temperature
Soft_I2C_Stop();
Soft_I2C_Start();
Soft_I2C_Write(0b10010001); // address TMP75 + R
j = Soft_I2C_Read(1); // Reading 1 byte then send N_Ack(1)
Soft_I2C_Stop();
UART1_Write_Text("\nTemperature : ");
shorttostr(j, txt);
Uart1_Write_Text(txt);*/


while(1);

}

Any idea where the bug is ?

Koristim MikroC pro i stvarno ne razumem zasto kod stane na I2C1_Write() ? Ceka vjerovatno ACK od strane TMP75, ali adresa TMP75 je tacna i radi sa emulacijom I2C (Soft_I2C_Write() ).
Postavio sam isto pitanje na forumu od kompajlera pa ako tamo rijesim objavit cu i ovdje rjesenje.

Pozz

RIJESENJE MikroC dsPIC: Pin komunikacije SDA treba podesiti kao ULAZ, a ne kao IZLAZ, prije I2Cx_Init() procedure.
Code:

TRISB.B9 = 1;




[Ovu poruku je menjao sigi91 dana 19.12.2012. u 13:32 GMT+1]
[ bogdan.kecman @ 17.12.2012. 15:30 ] @
kakve si pullup-e stavio ?
sta ti je slave?
da li si probao C30 umesto mikroC ?
to sto ti soft i2c radi, da li radi u smislu da "prodje" ili si siguran da si iskomunicirao sa i2c slave-om to sto si hteo?
[ sigi91 @ 17.12.2012. 15:49 ] @
Pull-up su od 4.7k, probao sam razne 1-10k ali sam ostavio 4.7k
Slave mi je temperaturni senzor, TMP75 od Texas Instruments.
Nisam probao u C30...ali probat cu cim nadjem malo vise vremena
Siguran sam da imam komunikaciju jer dobijem nazad tacne podatke od senzora..

Probao sam isto da promijenim brzinu komunikacije kad koristim I2C HW ali opet nista.
Uvjek stane na prvoj instrukciji I2C1_Write(), stavljao sam kod da mi isprinta na UART kako bi znao gdje je tacno greska i uvjek tu stane.

Meni ovo sve vise lici na BUG u biblioteci za I2C, jer pokusao sam isto da uspostavim komunikaciju sa PCF8574 (IO Expander I2C) i ista stvar.
Pokusao sam istu stvar sa drugim PIC-om 24FJ64GB002, misleci da je u ovog HW otisao ili nesto ne valja i opet nista..
Sve lepo radi npr sa 12LF1840, sa njim i HW, i SW sve ok (ali ipak koristi drugi kompajler Mikroc za PIC16 dok je gore Mikroc za dsPIC).

EDIT: Ver. kompajlera je 5.8.0 ( trenutno zadnja )

[Ovu poruku je menjao sigi91 dana 17.12.2012. u 22:28 GMT+1]
[ goran_68 @ 17.12.2012. 17:38 ] @
Moj je savet da lepo napišeš svoje funkcije i onda tačno znaš šta radiš. Skini neki microchip kompajler pa prilagodi za mikroc ako već hoćeš njega da koristiš. Zanimljivo je da sam imao sličan problem ali mi hard i2c nije radio u Proteusu dok je sw radio. Kada sam sve vezao u realan sistem radilo je i jedno i drugo.
[ ZAS011 @ 17.12.2012. 18:41 ] @
@sigi91: Da li ti "zakucava" na hardveru ili u simulatoru?
Ako "zakucava" u sumulatoru, džaba da dalje pišeš. Samo test na lepo opipljivom hardveru.
Po ovom pitanju sam k'o "klipnjača" (mašinac ). Razvoj samo na HARDVERSKOJ platformi koju možeš u potpunosti da kontrolišeš (PullUp/PullDown na portovima, ...).
Simulator(i) legalni/izlečeni imaju svoje bubice koje mogu da ti zagorčaju život.
Jedna od "razvojnih" platformi:



a druga mi je EasyPIC6
[ elektrostudio @ 17.12.2012. 18:50 ] @
Najverovatnije ne dobijes ACK od device-a, nesto ne vidim gde je definisano da li I2C modul radi kao MASTER ili SLAVE. Probaj instrumentom da mernes nozicu SDA nakon write instrukcije te ako je device odgovorio kako treba trebao bi imati logicku nulu. Takodje probaj odmah read I2C bez i jedne write instrukcije pre nje da vidis hoce li se i tu zakucati.
[ sigi91 @ 17.12.2012. 18:59 ] @
Nista ne radim u simulatoru ukoliko imam hardware uvek spreman.

Ovo mi je jedna od najdrazih "razvojnih" platformi, ko je zainteresovan nek potrazi "SettoreZero Orbit16" na Google-u.
Jednostavno stane na instrukciji I2Cx_Write(data), ono sto ja mislim da je jeste da ceka ACK od strane slave-a (TMP75) ali ne mogu to da provjerim sta se desava na zicama jer nemam ni osciloskop a ni "logic analyzer".

@goran_68
Pa deo koda u prvom postu je recimo funkcija za citanje temperature
Code:
I2C1_Start();
I2C1_Write(0b10010000); // address TMP75 + W
I2C1_Write(0x00); // config register <= read temperature
I2C1_Restart();
I2C1_Write(0b10010001); // address TMP75 + R
j = I2C1_Read(1); // Reading 1 byte then send N_Ack(1)
I2C1_Stop();


@elektrostudio

Koristeci MikroC librerije uvjek uC radi kao MASTER
[ goran_68 @ 17.12.2012. 19:05 ] @
Vidim ja kod ali ne vidim nigde šta stvarno radi to njihovo I2C1Start ili Write !!!
[ sigi91 @ 17.12.2012. 19:16 ] @
Pa to i jeste problem jer koliko znam te njihove librerije su "zatvorene"
Kad pokrenem debugger ovo je dio koda u .lst fajlu kad ide instrukcija "I2Cx_Write()
Citat:
_I2C1_Write:
0x0A82 0xFA0000 LNK #0
;__Lib_I2C_12_p24_p33.c,119 ::
;__Lib_I2C_12_p24_p33.c,120 ::
0x0A84 0xFB800A ZE W10, W0
0x0A86 0xB7A202 MOV WREG, I2C1TRN
;__Lib_I2C_12_p24_p33.c,121 ::
0x0A88 0xAEE208 BTSS I2C1STAT, #7
0x0A8A 0x370002 BRA L_I2C1_Write14
;__Lib_I2C_12_p24_p33.c,122 ::
0x0A8C 0x200010 MOV #1, W0
0x0A8E 0x370002 BRA L_end_I2C1_Write
L_I2C1_Write14:
;__Lib_I2C_12_p24_p33.c,124 ::
0x0A90 0x07FBFD RCALL __Lib_I2C_12_p24_p33_I2C1_Is_Finished
;__Lib_I2C_12_p24_p33.c,126 ::
0x0A92 0xEF2000 CLR W0
;__Lib_I2C_12_p24_p33.c,127 ::
L_end_I2C1_Write:
0x0A94 0xFA8000 ULNK
0x0A96 0x060000 RETURN
; end of _I2C1_Write
__Lib_I2C_12_p24_p33_I2C1_Is_Finished:
0x028C 0xFA0000 LNK #0
;__Lib_I2C_12_p24_p33.c,46 ::
;__Lib_I2C_12_p24_p33.c,47 ::
L___Lib_I2C_12_p24_p33_I2C1_Is_Finished0:
0x028E 0xAF2086 BTSC IFS1, #1
0x0290 0x370001 BRA L___Lib_I2C_12_p24_p33_I2C1_Is_Finished1
;__Lib_I2C_12_p24_p33.c,48 ::
0x0292 0x37FFFD BRA L___Lib_I2C_12_p24_p33_I2C1_Is_Finished0


I onda imam loop u dijelu
Citat:
L___Lib_I2C_12_p24_p33_I2C1_Is_Finished0:
0x028E 0xAF2086 BTSC IFS1, #1
0x0290 0x370001 BRA L___Lib_I2C_12_p24_p33_I2C1_Is_Finished1
;__Lib_I2C_12_p24_p33.c,48 ::
0x0292 0x37FFFD BRA L___Lib_I2C_12_p24_p33_I2C1_Is_Finished0
jer ceka "IFS1, #1", po datasheet-u je "Master I2C1 Event Interrupt Flag Status bit"
[ elektrostudio @ 17.12.2012. 19:20 ] @
Proveri da li su pinovi 5,6,7 od TMP75 vezani na masu. Probaj samo write adrese jer ces tako ostaviti da zadnji bit (ACK) bude moguce izmeriti i obicnim instrumentom kao logicku nulu. Takodje stavi instrument na AC podrucije i vidi da li se pojavi kakav cim na naponu SCL linije i i sto to i na SDA liniji
[ sigi91 @ 17.12.2012. 19:37 ] @
Pinovi su povezani na masu, sva tri i zato i jeste adresa 0b1001000 + R/!W
Proverio sam sa testerom na AC podrucju i imam cimanja na obe linije (SDA SCL) , znaci da byte tj "adresa" bude poslana korektno...samo je problem provjeriti ovaj ACK bit od strane Slave-a jer traje samo jedan SCL clock

EDIT: Dosla mi ideja da provjerim nesto, jer kako sam C/P ranije dio coda, on ceka Interrupt Flag "IFS1, #1 => Master I2C1 Event Interrupt Flag Status bit "
Moze ga dzaba cekati ako npr u funkciji I2Cx_init() ili I2Cx_Start() ne osposobi tj aktivira interrupt za I2Cx

EDIT2: Pokusao sam i prije poziva I2C_write() da manualno akiviram interrupt "IEC1.MI2C1IE = 1;" ali bez rezultata..
I u "disassembly mode" sam gledao kroz code i cisti je suicide.

Nastavit cu da koristim I2C u SW opciji i u medjuvremenu vidjet cu sa MikroElektronikom da rijesim ovo.

[Ovu poruku je menjao sigi91 dana 17.12.2012. u 21:19 GMT+1]
[ bogdan.kecman @ 17.12.2012. 21:03 ] @
mikroC jeste za neke stvari super dobar ali smaraju sa tim zatvorenim bibliotekama do beskonacnosti .. aj za 16F i nekako ali ja sam ih potpuno zabatalio, za 16F sam kupio picc a za ove jace koristim microchipov kompajler i glava me vise ne boli ..

e sad, kako sam ih zabatalio nisam ispratio ove nove verzije ali evo ga neki moj prastari kod

Code:

void write_DS1307(unsigned short address, unsigned short data)
{
   unsigned short status;
   I2C_Start();
   I2C_Wr(0xd0);
   I2C_Wr(address);
   I2C_Wr(data);
   I2C_Stop();
}
 
unsigned short read_DS1307(unsigned short address)
{
   unsigned short data;
   I2C_Start();
   I2C_Wr(0xd0);
   I2C_Wr(address);
   I2C_Repeated_Start();
   I2C_Wr(0xd1);
   data=I2C_Rd(0);
   while (!I2C_Is_Idle()) asm nop;
   I2C_Stop();
   return(data);
}
 
 
void main(){
...
  I2C_Init(100000); 
 ...


i ja vidim da tu read radim sa "I2C_Repeated_Start();" dok ti pokusavas citanje sa "I2C1_Restart();"

e sad, nisam skontao, na kom i2c_write ti stane? na prvom? "I2C1_Write(0b10010000); // address TMP75 + W" ili posle? ako ti stane na prvom, dodaj delay

Code:

I2C1_Init(100000);
delay_ms(100);
I2C1_Start();
//delay_ms(1); //ovde ne bi trebalo da treba delay al .. 
I2C1_Write(0b10010000); // address TMP75 + W


pa vidi dal ce onda da pravi opet isti problem
[ sigi91 @ 17.12.2012. 21:20 ] @
I2C_Repeated_Start(); u mikroC PIC je isto kao I2Cx_Restart(); u mikroC dsPIC...ne razumijem uopste ni zasto su to promijenili, isto kao
mikroC dsPIC < = = = > mikroC PIC
I2Cx_Write(); < = = > I2C_Wr();
I2Cx_Read(); < = = > I2C_Rd();


Stane na prvom I2C1_Write(0b10010000); // address TMP75 + W
A sto se tice I2Cx_Init(freq); ima u sebi vec delay od 100ms (nasao sam gledajuci kroz kod u disassembly mode-u) tako da nije potrebna pauza poslije init-a

EDIT: problem ostaje
[ bogdan.kecman @ 17.12.2012. 22:02 ] @
haha bas su nenormalni .. bar su dodali taj delay :D .. dodas jos jedan za svaki slucaj nece da fali :D...

no, imao sam ja sa njima mnogo problema jer im vecina *_init() funkcija ne valja, podrazumevaju super i to radi sa njihovm hw-om ali sa tvojim - jok :( posebno ako uzmes neki noviji cip :( .. elem, uradi njihov init a onda direkt inicijalizuj i2c tako sto upises sta treba u portove i onda probaj njihov write dal ce da radi kako treba, moguce da su nesto lose odradili oko inicijalizacije, ili ako te ne mrzi pusti kroz debager njihov init kod i pogledaj dal su uradili sve sto treba (vidi u datasheet-u kako se za taj pic inicijalizuje i2c) ... ili iskoristi momenat i predji na c30 :D
[ goran_68 @ 17.12.2012. 22:07 ] @
Ne znam što ne skineš Microchipov C30? Tamo imaš koliko znam otvorene biblioteke i primere. Ako ti baš igra samo mikroc a ti ih prepevaj i vozi. Baci pogled i na ova dva posta sa microchip foruma:

http://www.microchip.com/forums/m514051.aspx
http://www.microchip.com/forum...high=&m=668477&mpage=1
[ sigi91 @ 17.12.2012. 22:54 ] @
Citat:
bogdan.kecman:
haha bas su nenormalni .. bar su dodali taj delay :D .. dodas jos jedan za svaki slucaj nece da fali :D...

...uradi njihov init a onda direkt inicijalizuj i2c tako sto upises sta treba u portove i onda probaj njihov write dal ce da radi kako treba, moguce da su nesto lose odradili oko inicijalizacije, ili ako te ne mrzi pusti kroz debager njihov init kod i pogledaj dal su uradili sve sto treba (vidi u datasheet-u kako se za taj pic inicijalizuje i2c) ... ili iskoristi momenat i predji na c30 :D


Hah od viska pauze glava ne boli :D
A ne znam, malo je komplikovano baratati sa I2C-om i da pisem sve od 0-e, za mene je to gubljenje vremena...
Htjeo bi samo da znam u cemu je ovdje problem, da li je do biblioteke ili je mozda jos nesto falilo da se podesi prije inicijalizacije..
Ako nista, predat cu se i preci na C30, ma da mi je nekako tesko jer sam navikao na mikroC i nisam nikada imao posebnih problema kao ovaj sada npr.
[ bogdan.kecman @ 18.12.2012. 02:27 ] @
pazi, uradis prostu inicijalizaciju i2c-a iz C30 i vidis dal radi ili ne ....

a za rucno, mislio sam samo inicijalizaciju da uradis rucno, ne ceo i2c

elem, PIC24FJ64GB002 bi trebalo da ima isti silicon problem kao PIC24FJ64GA004 tako da pogledaj errata za njega, to ti je koliko vidim u lokalu DS80384B.PDF

Citat:

4. Module: I2CTM (Master Mode)
Under certain circumstances, a module operating in Master mode may Acknowledge its own command addressed to a slave device. This happens when the following occurs:
• 10-Bit Addressing mode is used (A10M = 1);
and
• the I2C master has the same two upper address bits (I2CADD<9:8>) as the addressed slave module.

In these cases, the master also Acknowledges the address command and generates an erroneous I2C slave interrupt, as well as the I2C master interrupt.

Work around
Several options are available:
• When using 10-Bit Addressing mode, make certain that the master and slave devices do not share the same 2 MSbs of their addresses.

If this cannot be avoided:
• Clear the A10M bit (I2CxCON<10> = 0) prior to performing a Master mode transmit.
• Read the ADD10 bit (I2CxSTAT<8>) to check for a full 10-bit match whenever a slave I2C interrupt occurs on the master module.



E sad, kako glupavom mikroC-u konfigurisati addressing mod nemam pojma (ja uglavnom koristim 7bitni mod), aj izdebagiraj taj init da vidimo sta mikroC uradi u i2c1_init(), moguce da ostavlja 10bitno adresiranje

I2C1BRG ti je za brzinu (ako teras to na 32MHz tu ti treba 0x9D ili ako si na 16MHz onda 0x4E)
I2C1CON ti je config registar (bit 10 A10M: 10-Bit Slave Addressing bit; 1 = I2CxADD is a 10-bit slave address; 0 = I2CxADD is a 7-bit slave address )

dakle ako mozes da ga switchnes u 7bitni rad izbegnuces taj bug ili ubodi odma posle inita

I2C1ADD = 0b0000001111110111;

tako sigurno izbegavas da su im adrese (top dva bita) iste + izbegavas drugi problem da upadnes u 0b1111xxx ili 0b0000xxx zamku sa druge strane

vidim po microchip forumu da je dosta 24f-ova opterecena ovim bagom na i2c-u mada ne kontam kako uspeva mikroC tako lako da ga nabode ja ga nikad nisam nabo a koristio sam dosta 24f seriju :(

nadam se da ce ti ovo pomoci ... inace, savetujem nabavku, pod hitno: http://www.seeedstudio.com/depot/-p-612.html?cPath=174 ili bar http://imall.iteadstudio.com/im120911002.html (obls sa seeed-a je 200MHz sa kompresijom i limitiranim ram-om, dok je mini logic sa itead-a kradeni salea logic koji ima lepsi software ali je samo 24MHz i zavisi od brzine kompa no nije limitiran svojom memorijom posto je nema) .. sa tim spravama se problem detektuje i debagira za par minuta meni su uvek na dohvat ruke (2 obls-a i jedan mini), tebi to iz italije nije nikakav problem da narucis a cene su simbolicne realno ... da sam na tvom mestu narcio bi odma oba :)

[ elektrostudio @ 18.12.2012. 08:27 ] @
Pogledao sam .lst i nije odradjen interupt handler, naime u interupt vector table nema parce koda za obradu vec su tamo sve 0 i ako i dodje do interupta id I2C Master-a vector je na 0036h gde su takodje 0... Proveri kako odraditi ovaj deo
[ goran_68 @ 18.12.2012. 09:01 ] @
Prekidni bit se testira i briše najverovatnije u samoj I2CWrite. Nema obrade u prekidnoj rutini. Tako rade microchip funkcije.
[ sigi91 @ 18.12.2012. 11:56 ] @
Siguran sam da incijalizacijom i koriscenjem C30 bi sve teklo glatko i bez problema...u to ne sumnjam

Sto se tice MikroC-a procitao sam u manualu za Mikroc dsPIC sledece:
Ovo se tice za I2Cx_Init()
Citat:
Configures and initializes the desired I²C module with default settings.
This function enables the I²C module by setting the I2CEN bit. The rest of the bits in I²C control register
remains unchanged. Default initialization (after reset) of I²C module is:
- continue operation in IDLE mode
- IPMI mode disabled
- 7-bit slave address
- slew rate control enabled
- general call address disabled
- software or receive clock stretching disabled

Znaci sto se tice 10 bit-nih adresa i bugova, ne ulazimo u takav slucaj.
EDIT: Vjerovatno ovdje u Init proceduri bi jos nesto trebao promijeniti ali nisam siguran jer ne razumijem neke osvnove poput sta je IPMI mode, slew rate i software or receive clock stretching.
Sad cu to da izucim..


Onda imamo sledece vezano za I2Cx_Write()
Citat:
Prototype unsigned I2Cx_Write(unsigned char data_);
Description Sends data byte via the I²C bus.
Parameters - data_: data to be sent
Returns - 0 if there were no errors.
- 1 if write collision was detected on the I²C bus.
Requires MCU with at least one I²C module.
Used I²C module must be initialized before using this function. See I2Cx_Init routine.
Also, START signal needs to be issued in order to use this function. See I2Cx_Start.
Example unsigned char data_;
unsigned error;
...
error = I2C1_Write(data_);
error = I2C1_Write(0xA3);
Notes I²C library routines require you to specify the module you want to use. To select the desired I²C
module, simply change the letter x in the routine prototype for a number from 1 to 3.
Number of I²C modules per MCU differs from chip to chip. Please, read the appropriate datasheet
before utilizing this library

E sad je problem sto ne mogu ni da znam sta je return od te procedure jer se unutra zablokira.

Sto se tice logic sniffer-a, o tome sam razmisljao vec dosta dugo vremena i nikako da se odlucim za neki da je eco-frendly jer mi ne treba nista profi...razmisljao sam o Bus Pirate v3 http://www.seeedstudio.com/dep...sembled-p-609.html?cPath=61_68 ali nikako da ga narucim...
[ goran_68 @ 18.12.2012. 12:16 ] @
Bogdan ti je gore naveo da ti PIC24 imaju problem sa I2C. Ja sam ti dao linkove ka nekim slicnim pitanjima na microchip forumu. Dakle, ima ljudi koji imaju isti ili slican problem kao ti. Koristi njihovo iskustvo.
I na kraju, za sve ovo tvoje izgubljeno vreme mogao si da uradis sledece:
1. Skines C30.
2. Nadjes source njihovih funkcija za I2C
3. Po uzoru na njihove funkcije (copy/paste) napises svoje funkcije koristeci mikroc.
4. Za sva vremena si otkacio zatvorene biblioteke od mikroelektronike (i moguce greske u njima) a nastavis da koristis njihov kompajler.
Za sve ovo ti ne treba vise od pola sata.
[ sigi91 @ 18.12.2012. 12:43 ] @
Citat:
goran_68: Bogdan ti je gore naveo da ti PIC24 imaju problem sa I2C. Ja sam ti dao linkove ka nekim slicnim pitanjima na microchip forumu. Dakle, ima ljudi koji imaju isti ili slican problem kao ti. Koristi njihovo iskustvo.
I na kraju, za sve ovo tvoje izgubljeno vreme mogao si da uradis sledece:
1. Skines C30.
2. Nadjes source njihovih funkcija za I2C
3. Po uzoru na njihove funkcije (copy/paste) napises svoje funkcije koristeci mikroc.
4. Za sva vremena si otkacio zatvorene biblioteke od mikroelektronike (i moguce greske u njima) a nastavis da koristis njihov kompajler.
Za sve ovo ti ne treba vise od pola sata.


Upravo ovo cu da uradim, samo da dodjem kuci...ali i dalje me muci to jer hocu da saznam sta je to u njihovoj biblioteci sto ne valja.
[ bogdan.kecman @ 18.12.2012. 13:04 ] @
pa vidi, sve vezano za i2c ti je tamo u init i odma posle toga on puca, dakle uzmes lepo i pogledas listing vidi se tacno sta radi njihov init, ako ti nije ocigledno baci ovde copy paste nije to veliko pa da gledamo svi zajedno :D ... verovatno neka konfiguracija (ako pogledas mcp biblioteke funkcije su drugacije, imas config koji trazi 2 16bitna parametra ako se dobro secam, mikroc uzima za parametar jedino brzinu) koju oni po default-u stavljaju koja se kosi sa tim bagom na tim nekim 24F cipovima ... ja ti rekoh da probas da "rekonfigurises" i2c rucno posle mikroc-ovog init-a cisto da probas dal ce to da resi problem, moguce da sa jednim/dva upisa u registar zaobidjes bag...

[ sigi91 @ 18.12.2012. 14:09 ] @
E ljudi znate sta, hvala vam puno svima u pokusaju da odgonetnemo u cemu je kvaka ali definitvo prelazim na C30 i ne znam koji $%&/ sam koristio MikroC, jer posto imam Pickit3 sad mogu da koristim otvorene biblioteke i da debugujem na hardware-u uzivo.
Ljut sam na sebe ali eto..da se nije desilo, ovo sto se desilo, i dalje bi kao patka ostao zakovan sa MikroC-om.
Ne kazem da je los kompajler ali brate posto imam Pickit3 zasto ne iskoristiti ga za real-time debugovanje, dok za MikroC nemam njihov odredjeni HW za debugovanje.
[ bogdan.kecman @ 18.12.2012. 15:05 ] @
ovo bi trebalo da radi sa XC16 (to je sad novo ime / zamena za C30)

Code:

/* 
 * File:   main.c
 * Author: arhimed
 *
 * Created on December 18, 2012, 2:33 PM
 */

#include <p24FJ64GB002.h>
#include <i2c.h>
#include <uart.h>

/*
 * 
 */
int main() {
    unsigned char i2cbyte;
    unsigned char SlaveAddress = 0x90;
    int i;

    AD1PCFGbits.PCFG = 0x1fff;
    LATBbits.LATB8   = 0;
    TRISBbits.TRISB8 = 0;
    // U2TX -> RP15(pin 26)
    RPOR7bits.RP15R = 5;
    TRISBbits.TRISB15 = 0;
    // U2RX -> RP14(pin25)
    RPINR19bits.U2RXR = 14;

    ConfigIntUART2(UART_RX_INT_DIS | UART_TX_INT_DIS);

    OpenUART2(UART_EN & UART_IDLE_CON & UART_IrDA_DISABLE & UART_MODE_FLOW & UART_UEN_00 & UART_DIS_WAKE & UART_DIS_LOOPBACK
            & UART_DIS_ABAUD & UART_UXRX_IDLE_ONE & UART_BRGH_FOUR & UART_NO_PAR_8BIT & UART_1STOPBIT,
            UART_INT_TX & UART_IrDA_POL_INV_ZERO & UART_SYNC_BREAK_DISABLED & UART_TX_ENABLE & UART_INT_RX_CHAR & UART_ADR_DETECT_DIS
            & UART_RX_OVERRUN_CLEAR, 416); 

    
    //Enable channel
    I2C1CONbits.SEN    =0; //not in start
    I2C1CONbits.RSEN   =0; //not in rs
    I2C1CONbits.PEN    =0; //not in stop
    I2C1CONbits.RCEN   =0; //not receiving now
    I2C1CONbits.ACKEN  =1; //init ack and send ackdt
    I2C1CONbits.ACKDT  =0; //ack with ack
    I2C1CONbits.STREN  =0; //no clock stretching
    I2C1CONbits.GCEN   =0; //disable general call
    I2C1CONbits.SMEN   =0; //smbus trsh disabled
    I2C1CONbits.DISSLW =0; //enable slew rate
    I2C1CONbits.A10M   =0; //7bit addressing
    I2C1CONbits.IPMIEN =0; //do not play smart
    I2C1CONbits.SCLREL =1; //release clock
    I2C1CONbits.I2CSIDL=0; //continue in idle mode
    I2C1CONbits.I2CEN  =0; //disable
    
    I2C1BRG = 0x9D;         // 100khz
    I2C1ADD = SlaveAddress; //Slave Address
    I2C1STATbits.ADD10 = 0; // 7-bit address
    
    IFS1bits.MI2C1IF  = 0;  // Clear Interrupt
    I2C1CONbits.I2CEN = 1;  // Enable I2C Mode

    i2cbyte = I2C1RCV; // read buffer to clear buffer full

    IdleI2C1(); //Wait to complete
    StartI2C1(); //Send the Start Bit
    IdleI2C1(); //Wait to complete

    MasterWriteI2C1((SlaveAddress) | 0);
    IdleI2C1(); 
    MasterWriteI2C1(0x00);
    IdleI2C1();
    RestartI2C1();
    MasterWriteI2C1((SlaveAddress) | 1);
    IdleI2C1();
    i2cbyte = MasterReadI2C1();
    NotAckI2C1();
    StopI2C1();
    IdleI2C1();

    for (i=0;i<100;i++) WriteUART2('\n');
    WriteUART2(0x00);
    WriteUART2(i2cbyte);
    WriteUART2(0x00);
    for (i=0;i<10;i++) WriteUART2('.');

    return (0);
}


a okacicu i hex pa probaj dal sljaka (ja nemam pri ruci nista da probam tako da je ovo malo napamet)
[ bogdan.kecman @ 18.12.2012. 15:08 ] @
javi dal radi :)

izgleda je dokumentacija za XC16 jos uvek malo stura, sve sa C30 radi ali u XC16 ima par novih stvari i biblioteke su sve nove + podrzavaju i stare tako da sam ja ovde malo copy paste tudjeg koda pa prepravio .. no trebalo bi da sljaka 1/1 (eventualno treba da promenis u vrhu pinout gde ti je seriski port)
[ sigi91 @ 18.12.2012. 15:28 ] @
Kod mi izgleda ok i trebalo bi sve ici bez problema, daj mi 10min i javit cu ti =)
[ bogdan.kecman @ 18.12.2012. 15:31 ] @
ma i meni kod deluje ok :D ne bi ga slao da ne deluje a dal radi to je vec .. :D
[ sigi91 @ 18.12.2012. 15:42 ] @
Sve je ok i prodje ali koliko vidim ne dobijem nazad podatak od slave-a, tj char i2cbyte ostane 0..
hmh daj mi vremena da provjerim sve ovo..
I da, promijenio sam I2C1BRG meni odgovarajuci, frekvencija protokola I2C
[ bogdan.kecman @ 18.12.2012. 15:44 ] @
jbg da sad imas neki logic analyzer to bi za 2min videli sta se desava ...
[ sigi91 @ 18.12.2012. 15:53 ] @
Citat:
bogdan.kecman: jbg da sad imas neki logic analyzer to bi za 2min videli sta se desava ...


Da ga imam ne bi se ni javljao na forum i vec bi resio u MikroC-u...ali onda ne bi presao na C30 :p
Sad cu ja polako otkriti sta je problem..hvala Bogu pa vremena imam
[ sigi91 @ 18.12.2012. 17:40 ] @
!!!!! :@
Ok, konacno sve lepo radi u C30..
Prvo kod nije hteo da radi sa TMP75 pa sam povezao uC sa (I/O I2C) expander-om i lepo napisao kod da u loop-u pali-gasi LED preko expandera.
I pazi sad, ne radi ! Kod je tehnicki ispravan...naljutilo me to i poceo sam zice da cupam da vracam itd i odjednom magicno proradi i program radi to sto treba, znaci I2C konacno radi kako treba...

Ali aj nek' mi neko objasni ako zna, zasto I2C proradi tek nakon sto se uzme SDA linija, otkaci se i onda opet vrati na mjesto dok je program u toku ?! Pull-up otpornike nisam dirao tj. vadio, samo SDA linija.

Pokusao sam istu stvar da napravim sa hex-om od MikroC ali njemu nema pomoci, nije hteo ni tako da proradi I2C.


EDIT: Pronasao sam sta je na kraju krajeva....pull-up su bili od 4.7k i radilo je tako "na vadjenje SDA linije", zamenio sam ih sa 10k i sada sve radi perfektno....uf, patnje :\
Po meni tu imaju vjerovatno ulogu i kapacitivni ulazi od I2C slave-a ali opet jedan je uredjaj,a ne njih 10-20...moram se o ovome isto informisati :\

EDIT2: I TMP75 radi bez problema tj. citanje podatka preko I2C sa C30, sad ostaje samo viditi sta je sa MikroC ali taj posao ostavljam MikroElektronici da rijese, meni je puna kapa svega vise :v

[Ovu poruku je menjao sigi91 dana 18.12.2012. u 19:41 GMT+1]
[ goran_68 @ 18.12.2012. 19:03 ] @
Na jednom od linkova koje sam ti pre dao lik je imao slican problem a resio ga je :) ovako:



The problem is I2C initialization.
Before enable the bus, low to high on SDA signal is necessary.


[Ovu poruku je menjao goran_68 dana 18.12.2012. u 22:05 GMT+1]
[ bogdan.kecman @ 19.12.2012. 01:29 ] @
Citat:
sigi91:
pull-up su bili od 4.7k i radilo je tako "na vadjenje SDA linije", zamenio sam ih sa 10k i sada sve radi perfektno....uf, patnje :\
Po meni tu imaju vjerovatno ulogu i kapacitivni ulazi od I2C slave-a ali opet jedan je uredjaj,a ne njih 10-20...moram se o ovome isto informisati :\


imas tamo u configu u onom primeru sto sam ja nacukao "I2C1CONbits.DISSLW =0; //enable slew rate" probaj sa 1 (disable slew rate) mozda radi sa manjim pullup-om .. ako te zanima da juris sta je.

ovo sa "low to high on SDA" je cest bug na picovima na razlicitom hw-u, tako se valjda isprazni neki hw interno na pinu da bi to radilo ok.. dodaj to za svaki slucaj
[ sigi91 @ 19.12.2012. 12:05 ] @
Ljudi da podijelim RIJESENJE za slucaj MikroC-a.
Napisao sam im da i oni pokusaju da uzmu isti PIC i ostvare komunikaciju putem I2C-a, dobio sam odgovor da trebam podesiti pinove koje zelim da koristim za komunikaciju kao INPUT a ne kao OUTPUT, prije I2Cx_Init() procedure.
Uradio sam slusajuci savet i sve radi bez problema.

Sad me interesuje zasto se dogadja takva stvar ?
Zar ne bi bilo logicno da, PIC kao MASTER, koristi te portove kao izlazne a ne kao ulazne ?

Editovat cu i prvi POST sa rijesenjem.

Edit: Ili preciznije, dosta je samo SDA pin promijeniti kao ulazni i posao je rijesen...

[Ovu poruku je menjao sigi91 dana 19.12.2012. u 13:28 GMT+1]
[ bogdan.kecman @ 19.12.2012. 17:04 ] @
hm, to je trebala da uradi njihova init procedura
[ ZAS011 @ 19.12.2012. 17:27 ] @
Eto jednog od silnih razloga zašto ne varim MikroE kompajlere. Em im BASIC liči na Pascal, em nisu u stanju da u softver koji podržava samo njihov programator, već 2+ godine ubace 12F617 (615 ima, sledeći 629 ), C (a i ostale) biblioteke zatvorene, ... Primeri za dodatni hardver koji prodaju KATASTROFA ...
[ sigi91 @ 19.12.2012. 18:09 ] @
Gledao sam instrukciju po instrukciju u .lst i tacno se moze vidjeti da nisu pinovi inicijalizovani uopste, dok npr u MikroC PIC ( 12/16/18 ) to se moze vidjeti kako budu inicijalizovani, i za SPI i za I2C.

A evo i razloga zasto, PIC24F koji koristim ima mogucnost PPS-a (Peripheral Pin Select) i odnosi se na par periferika kao sto su UART, SPI, PWM, Interrupts itd. ali nema I2C-a, jer je jedna od periferika kojima se pinovi ne mogu odrediti po zelji i njih su zaboravili da inicijalizisu u I2Cx_Init().
Kada koristimo npr. SPI, UART itd. pinovi budu inizijalizovani sa PPS bibliotekom i tu se uredno podese, dok za I2C to ne postoji kao sto sam ranije rekao jer I2C ima default pinove.

Misli se da je sve ok i kako super radi dok neko ne pocne da se zali.
Ali aj evo drago mi je da sam stekao ovo iskustvo i naucio vise stvari o kojima treba paziti

EDIT: Vjerovatno ima koji PIC24F da im se moze i I2C podesiti preko PPS ali u mom slucaju to nije.
[ bogdan.kecman @ 20.12.2012. 15:39 ] @
ako se ja dobro secam buspirate pic je neki 24f koji i i2c ima na pps-u