Adatlap (Angol és pdf): itt
I2C leírás (Angol és pdf): itt
Baudsebesség számolása és beállítása (Angol és htm): Itt
Pic24-ről de jó: itt
LM75A-ról a honlapon: itt
 
 
 
; Működőképes példaprogram:
foprogram:    
    goto config_I2C1_SSP   ;  TB3159 alapjan    
    
config_I2C1_SSP_:   
    
   nop 
    goto config_I2C1 ;    
   
config_I2C1_:   
   
   ; goto $  ;   
   
   goto hofokolvasas_lm75a_i2c1 ;   
;hofokolvasas_im75a_i2c1:    
    
   nop
   
   goto $
;-------------------------------------------------------------
config_I2C1_SSP:  ;  TB3159 alapjan
  ; RC3 (18. lab) <--> SCL    
  ; RC4 (23. lab) <--> SDA
    
; Letiltjuk globalisan a megszakitasokat    
    banksel INTCON0
    BCF     INTCON0,GIE ; letiltjuk globálisan a megszakításokat   
    
; A labalat (RC3 es RC4) digitalissnak konfiguraljuk
    banksel ANSELC ;
    bcf ANSELC,ANSELC3 ;
    bcf ANSELC,ANSELC4 ;   
    
; Letiltjuk globalisan a megszakitasokat    
    banksel INTCON0
    bcf     INTCON0,GIE ; letiltjuk globálisan a megszakításokat       
    
; PPS UNLOCK szekvencia
    banksel PPSLOCK ;
    movlw 0x55 ; 
    movf PPSLOCK ;
    movlw 0xAA ; 
    movf PPSLOCK ;
    bcf PPSLOCK,PPSLOCKED ;
    
; Engedélyezzuk globalisan a megszakitasokat    
    banksel INTCON0
    bsf     INTCON0,GIE ; engedélyezzük globálisan a megszakításokat       
    
; Az RC4 labat az I2C1 modul SDA (adat) portjahoz rendeljuk     
    movlw 0x22 ;
    banksel RC4PPS ;
    movwf RC4PPS
     
    movlw 0x14 ; 
    banksel I2C1SDAPPS ;
    movwf I2C1SDAPPS ;
 
; Az RC3 labat az I2C1 modul SCL (szinkronjel) portjahoz rendeljuk
    movlw 0x21 ;
    banksel RC3PPS ;
    movwf RC3PPS
    movlw 0x13 ;
    banksel I2C1SCLPPS ;
    movwf I2C1SCLPPS ;    
; Letiltjuk globálisan a megszakításokat       
    bcf     INTCON0,GIE ; letiltjuk globálisan a megszakításokat     
    
; PPS LOCK szekvencia
    banksel PPSLOCK ;
    movlw 0x55 ; 
    movf PPSLOCK ;
    movlw 0xAA ; 
    movf PPSLOCK ;
    bsf PPSLOCK,PPSLOCKED ;    
    
; Engedélyezzuk globálisan a megszakításokat     
    bsf     INTCON0,GIE ; engedélyezzuk globálisan a megszakításokat     
    
; A ket labat nyitott collektoros kimenette konfiguraljuak
    banksel ODCONC ;
    bsf ODCONC,ODCC3 ;
    bsf ODCONC,ODCC4 ;    
    
; Beallitjuk az I2C szinteket   
    banksel RC3I2C
    bsf RC3I2C,TH0 ;
    bsf RC3I2C,TH1 ;
    bsf RC4I2C,TH0 ;  
    bsf RC4I2C,TH1 
    
; Kimenette konfiguraljuk a ket labat
    banksel TRISC ;
    bcf TRISC,TRISC3 ;
    bcf TRISC,TRISC4 ;    
    
    movlw b'01100001' ; x101xx01 Kat.:271. old
    banksel RC3I2C
    movwf RC3I2C ; { a labak I2C specifikussa tetele
    movwf RC4I2C ;   es felhuro ellenallasok bekapcsolasa (SDA es SCL) 
    
    
    
    
    
    goto config_I2C1_SSP_  
    
;-----------------------------------------------------------------------    
config_I2C1:    
    
;              I2C1 MESTER MOD INICIALIZALASA (7 bites cimzeses mester):     
    
;  ne legyenek megszakitasok az I2C-nel    
    banksel I2C1PIE ;
    clrf I2C1PIE ;
    
; 4-es uzemmos beallitas (mester 7 bites cimzessel)   
    banksel I2C1CON0 ;
    movlw 0x04 ;  Katalogus 577. oldal (<3:0=100 uzemmester mód)
    movwf I2C1CON0 ; Megj.: a 3 bites MODE beallitasavala tobbi bit torlodik
    
; I2C orajel megadasa ( MFINTOSC 500 KHz b'xxxx0011'= 3 )    
    banksel I2C1CLK ;
    movlw 0x3 ; Katalogus 581. old.    
    movwf I2C1CLK  ;
    
; ACK for every valid byte (ACKDT = 0)
; NACKs to end a Read (ACKCNT = 1)
    movlw 0x80  ; 
    movwf I2C1CON1 ;    
    
; Auto-count disabled (ACNT = 0)
; General Call disabled (GCEN = 0)
; Fast mode enabled 
; (FME = 1; SCL = I2CCLK/4)
; ADB1 address buffer used (ADB = 0)
; SDA Hold time of 300 ns (SDAHT = 0)
; Bus free time of 16 I2C Clock pulses
; (BFRET = 1)
    movlw  0x21    
    movwf I2C1CON2 ; 0x21;    
    bcf I2C1CON2,FME ;Va: Atallitottam lassu üzemmodra
  ;  bsf I2C1CON2,FME ;Vb: Atallitottam gyors üzemmodra
; Enable I2C module
    bsf I2C1CON0,EN ;  Engedelyezzuk (elinditjuk) az I2C1 modult  
      
; Ezzel kesz a konfiguralas, kerdes, hogy a felhuzo ellenallasokat is kellene-e???    
   ; Felhuzo ellenellesok a config_I2C_SSP-ben vannak beallitva   
   ;  movlw b'01010001' ;       
   ; movwf RC3I2C ; [ felhuzo ellenallasok es
   ; movwf RC4I2C ;   I2C kompatibilissa tetel  ]    
    
    goto config_I2C1_
          
    ;--------------------------------------------------------------------------  
hofokolvasas_lm75a_i2c1:  ; I2C1-et hasznalva  
; WREG-be olvassuk be amihez 5 byte adatforgalom kell: 
;  LM75A cimzes + R/!W(W) --> IM75A POINTER regiszterrel regisztervalasztas -->  
;--> LM75A cimzes + R/!W(R) --> LM45A hofokadata a Hofok_H es Hofok_L-be (2byte)
;      
; I2C1ADB1 -be a szolga cimet és az R/!W bitet    
; I2C1CNT -be hany byte forgalom a START es STOP kozott (4 ebben az esetben)    
  ;  goto $ ;
; Szolga cimet az <1:7> biteken, az R/!W-t pedig a <0> biten kell megadni
; Cim: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x    
    
 ; goto $
    nop ;
    
    movlw  b'00000000'   ;
    banksel I2C1ADB1 ;    
    movwf I2C1ADB1 ; <7:1> szolga cime es <0>=R/!W ; eredeti
       
; Megadni, hogy hány bajtot kommunikalunk a START es STOP jel kozott  
    banksel I2C1CNT ;
    movlw 0x1 ; 
    movwf I2C1CNT ;
    
; Megadni a mesternek, hogy adja ki a START jelet (ez nem ekll, mert automatikus)
  ;  bcf I2C1CON0,S  ; 0 ha irni akaroka a szolgaba
    
    
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x    
    movlw  b'10010000'   ;
    banksel I2C1ADB1 ;    
    movwf I2C1ADB1 ; <7:1> szolga cime es <0>=R/!W      
  
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan 
    banksel I2C1CNT ;
    movlw 0x1 ;
    movwf I2C1CNT ;    
    
 ;   bsf I2C1CON0,S ; olvasni akarok a szolgaból      
    
; Adat: LM75 pointer beallitasa, hogy aztan a homerseklet adatokat adja meg <1:0>    
  ;  movlw b'00000000' ; T: homersekletadat=000; a nagyobb helyierteki bitek = 0
    movlw b'00000010' ; homerseklethiszterezis=010; a nagyobb helyierteki bitek = 0
 ;   movlw b'11001100'  ; T: csak tesztelesre, hogy lehet-e laatni szkoppal
 
 
 ; mester START  Kat.: 577.old.    
   ; banksel I2C1CON0 ; { STARTR jelet kiadatjuk es
   ; bsf I2C1CON0,S ;     ezzel elindul a beallitott kommunikacio }
    
    
    
 
    banksel I2C1TXB ; 
    movwf I2C1TXB ;    
    
    
  ; mester START  Kat.: 577.old.    
    banksel I2C1CON0 ; { STARTR jelet kiadatjuk es
    bsf I2C1CON0,S ;     ezzel elindul a beallitott kommunikacio }   
    
    
    
  
; Varunk, hogy kimenjenek a betoltottek
    banksel I2C1STAT1
    btfss I2C1STAT1,TXBE ; Ha nulla, akkor tovabb
    goto $-2
       
    goto $
  
    ; ADATBEKERES  ..........................................    
    
    
; Elkuldjuk a cimet, R/!W-t es az adatot ???    
   ; goto $  ; megnezzuk, hogy kiurult-e a tarolo ( I2C1TXB )    
   nop  
        
    movlw  b'10010001'   ;
    banksel I2C1ADB1 ;    
    movwf I2C1ADB1 ; <7:1> szolga cime es <0>=R/!W      
    
    movlw 2 ;
    banksel I2C1CNT ; 
    movwf I2C1CNT  ; 2 bytot fogunk kérni a szolgatol
    
; mester START  Kat.: 577.old.    
    banksel I2C1CON0 ; { STARTR jelet kiadatjuk es
    bsf I2C1CON0,S ;     ezzel elindul a beallitott kommunikacio }
    
    banksel I2C1STAT1  
    btfss I2C1STAT1,RXBF ; Ha nulla, akkor tovabb
    goto $-2    
    banksel I2C1RXB 
    movf I2C1RXB,w ; 
    banksel Adat_H ;
    movwf Adat_H ;
    
    banksel I2C1STAT1  
    btfss I2C1STAT1,RXBF ; Ha nulla, akkor tovabb
    goto $-2    
    banksel I2C1RXB 
    movf I2C1RXB,w ; 
    banksel Adat_L ;
    movwf Adat_L ;
    nop
    
       
     goto $
    goto config_I2C1 ;
    goto $
    
    
    goto hofokolvasas_lm75a_i2c1     
    
    
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Az alábbi kódok nem működnek:
A PIC18F45K42 mikrokontrolletnél az I2C mester mód beállítása (asm): 
; 7bit Master Mode (MODE = 4)
    movlw 0x04' ;     I2C1CON0 = 0x04;
    movwf I2C1CON0 ; vagy I2C2CON0
; I2C Clock = MFINTOSC (500kHz) orajelforras hozzarendeles a modulhoz
    movlw 0x03 ; 
    movwf I2C1CLK  ; vagy I2C2CLK,  -> I2CxCLK = 0x03;
; ACK for every valid byte (ACKDT = 0)
; NACKs to end a Read (ACKCNT = 1)
    movlw 0x80 ;     
    movwf I2C1CON1  ;  vagy I2C2CON1,  -> I2CxCON1 = 0x80;
; Auto-count disabled (ACNT = 0)
; General Call disabled (GCEN = 0)
; Fast mode enabled
; (FME = 1; SCL = I2CCLK/4)
; ADB1 address buffer used (ADB = 0)
; SDA Hold time of 300 ns (SDAHT = 0)
; Bus free time of 16 I2C Clock pulses
; (BFRET = 1)
    movlw 0x21  ; 
    movwf I2C1CON2   ;  vagy I2C2CON2, -> I2C1CON2 = 0x21;
; Enable I2C module
   bsf I2C1CON0,EN  ;  vagy I2C2CON0,EN, ->  I2C1CON0,EN = 1
 
 
Pic18F45K42 mikrokontroller kommunikációja az LM75A hőmérsékletmérő és beavatkozó IC-vel
 

; 1. lepes: A PIC18F45K42 mikrokontrolletnél az I2C mester mód beállítása (asm) ami fentebb már meg van írva
 
; 2. lepes: A TM75A POINTER regiszterebe irjuk be, hogy majd melyik további regisztert szandekozuk hasznalni:
; 2. 1. lehetőség: A TM75A POINTER regiszterebe irjuk be, hogy majd melyik további regisztert szandekozuk hasznalni. Jelen esetben nézzük meg, hogy mit tartalmaz  a TM75A CONFIG regisztere?
; asm kódok magyarazatokkal:
; megcímezzük a szolgát és megadjuk a <7> biten, hogy irni akarunk bele, vagyis adatkuldest akarunk megvalositani
    movlw b'00001001' ;  1001= eszkoz tipuscim <3-0> , amit mi a labakon allitunk be a TM75A-n 000= eszkozcim <4-6>,  0= Irni akarunk a POINTER regiszterbe
    movwf I2C1ADB1 ; vagy  I2C2AB1; hisz kerrő van a PIC18F45K42-ben
;Megadjuk, hogy hany bajtot kuldunk es fogadunk egy menetben, vagyis a START es STOP jelek kozt. 
;   1. bajt: megcimezzuk a TM75A eszkozt jelezve, hogy ezzel adatot kuldunk (cimadat).
;   2. bajt: elkuldjuk a TM75A POINTER regiszternek az adatot, ami ennek megfeleloen kivalasztja a kovetkezo TM75A regisztert. Ez  <P2:P0>, b'001' -> CONFIG regiszter  
;   3. bajt: Ujbol elkuldjuk az eszkoz cimet az utolso biten jelezve, hogy adatot kerunk, vagyis olvasunk.  b'10001001'
;   4. bajt: Ez a TM75A altal kuldott adat, amit a mester fogad es peldaul feldolgoz illetve kiertekel.
    movlw 4 ; 4 bajt adatkapcsolatot szandekozunk letesiteni
    banksel  I2C1CNT
    movwf  I2C1CNT ; vagy I2C2CNT, hisz ketto van belole
; 1. adatmozgas (cim is adatnak szamit)
; Elkuldjuk 3 bajtot es fogadjuk az egy bajtot:
    movlw b'00001001' ;
    banksel  I2C1ADB1
    movwf I2C1ADB1 ;  vagy  I2C2ADB1. Alkuldjuk a TM75A cimet es, hogy irni akarunk
    btfsc I2C1STAT1,TXBE  ; atlep ha 0. varunk, mig el megy az adat.
    goto $-2 ; ha nem 0, visszalep vizsgalni
         ; elment az adat, jöget a kuvetkezo
; 2. adatmozgas (cim is adatnak szamit)
    movlw  b'00000001' ;  TM75A STATUS regiszternek jelezzuk, hogy kapcsolja CONFIG regisztert. Persze azt is jelezzuk, hogy adatot kuldunk nem pedig kerunk.
    banksel  I2C1ADB1
    movwf I2C1ADB1 ;  vagy  I2C2ADB1. Alkuldjuk a TM75A -nak
    btfsc I2C1STAT1,TXBE  ; atlep ha 0. varunk, mig el megy az adat.
    goto $-2 ; ha nem 0, visszalep vizsgalni
         ; elment az adat, jöget a kuvetkezo
; 3. adatmozgas (cim is adatnak szamit)
; Elkuldjuk 3 bajtot es fogadjuk az egy bajtot:
    movlw b'10001001' ;
    banksel  I2C1ADB1
    movwf I2C1ADB1 ;  vagy  I2C2ADB1. Alkuldjuk a TM75A cimet es, hogyadatot kerunk a mar kijelolt CONFIG regiszterbol
    btfsc I2C1STAT1,TXBE  ; atlep ha 0. varunk, mig el megy az adat.
    goto $-2 ; ha nem 0, visszalep vizsgalni
         ; elment az adat, jöget a kuvetkezo
; 4. adatmozgas (cim is adatnak szamit)
    btfsc I2C1STAT1,RXBF ; atlep ha 0. varunk, mig el megy az adat.
    goto $-2 ; ha nem 0, visszalep vizsgalni
         ; elment az adat, jöget a kuvetkezo
    movff I2C1RXB,WREG ;  
 
// Write operation (R/!W bit = 0)
I2C1ADB1 = (EE_SLAVE_ADDRESS<<1)|0;
totalByteLength = EE_ADDR_BYTE_LENGTH
+DATA_BYTE_LENGTH;
I2C1CNT = totalByteLength;
for(i = 0; i < totalByteLength; i++){
 // Write to TXB starts communication
 I2C1TXB = *dataBlock;
 dataBlock++;
 // Wait until TXB is empty
 while(!I2C1STAT1bits.TXBE);
}
// Write operation (W/R bit = 0)
I2C1ADB1 = (EE_SLAVE_ADDRESS<<1)|0;
totalByteLength = EE_ADDR_BYTE_LENGTH
+DATA_BYTE_LENGTH;
I2C1CNT = totalByteLength;
for(i = 0; i < totalByteLength; i++){
 // Write to TXB starts communication
 I2C1TXB = *dataBlock;
 dataBlock++;
 // Wait until TXB is empty
 while(!I2C1STAT1bits.TXBE);
}
 
 
	
		
			| I2C MASTER MODE INITIALIZATION I2C mester üzemmód beállítása 7 bites címzéssel
 | 
		
			| ; 7bit Master Mode (MODE = 4) movlw 0x04' ;     I2C1CON0 = 0x04;
 movwf I2C1CON0 ; vagy I2C2CON0
 
 ; I2C Clock = MFINTOSC (500kHz) orajelforras hozzarendeles a modulhoz
 movlw 0x03 ;
 movwf I2C1CLK  ; vagy I2C2CLK,  -> I2CxCLK = 0x03;
 
 ; ACK for every valid byte (ACKDT = 0)
 ; NACKs to end a Read (ACKCNT = 1)
 movlw 0x80 ;
 movwf I2C1CON1  ;  vagy I2C2CON1,  -> I2CxCON1 = 0x80;
 
 ; Auto-count disabled (ACNT = 0)
 ; General Call disabled (GCEN = 0)
 ; Fast mode enabled
 ; (FME = 1; SCL = I2CCLK/4)
 ; ADB1 address buffer used (ADB = 0)
 ; SDA Hold time of 300 ns (SDAHT = 0)
 ; Bus free time of 16 I2C Clock pulses
 ; (BFRET = 1)
 movlw 0x21  ;
 movwf I2C1CON2   ;  vagy I2C2CON2, -> I2C1CON2 = 0x21;
 
 ; Enable I2C module
 bsf I2C1CON0,EN  ;  vagy I2C2CON0,EN, ->  I2C1CON0,EN = 1
 | 
		
			| ; Adat és órajel lábak konfigurálása bemenetnek:  RD0- SDA (adat láb) és RDI - SCL (órajel láb)
 
 
 | 
	
 
	
		
			| I2C SLAVE MODE INITIALIZATION I2C szolga üzemmód beállítása 7 bites címzéssel
 | 
		
			| ; 7bit Slave Mode (MODE = 0) movlw 0x00 ;
 movwf I2C1CON0  ;  vagy I2C2CON0, -> I2CxCON0 = 0x00
 
 ; Slave Address Match
 movlw 0x98 ;
 movwf  I2C1ADR0 ; vagy I2C2ADR0, ->  I2CxADR0 = 0x98
 
 movlw 0x98 ;
 movwf  I2C1ADR1 ; vagy I2C2ADR1, -> I2CxADR1 = 0x98;
 
 movlw 0x98 ;
 movwf  I2C1ADR2 ; vagy I2C2ADR2, -> I2CxADR2 = 0x98;
 
 movlw 0x98 ;
 movwf  I2C1ADR3 ; vagy I2C2ADR3, -> I2CxADR3 = 0x98;
 
 
 ; ACK for every valid byte (ACKDT = 0)
 ; ACK at the end of a Read (ACKCNT = 0)
 ; Clock stretching enabled (CSTRDIS = 0)  ??? nem találtam ilyat
 movlw  0x00 ;
 movwf I2C1CON1 ; vagy   I2C2CON1, ->  I2CxCON1 = 0x00;
 
 ; Auto-count disabled (ACNT = 0)
 ; General Call disabled (GCEN = 0)
 ; Fast mode enabled (FME = 1)
 ; ADB0 address buffer used (ADB = 0)
 ; SDA Hold time of 30 ns (SDAHT = 2)
 ; Bus free time of 8 I2C Clock pulses
 ; (BFRET = 1)
 movlw 0x28
 movwf I2C1CON2; vagy  I2C2CON2 ->  I2CxCON2 = 0x28;
 
 // Clear all I2C flags
 PIR3bits.I2C1F = 0;
 I2C1PIR = 0x00;
 // Enable Global and I2C interrupts
 INTCON0bits.IPEN = 1;
 INTCON0bits.GIEH = 1;
 PIE3bits.I2C1IE = 1;
 PIE3bits.I2C1IP = 1;
 // Enable local interrupt on ACK Sequence
 I2C1PIE = 0x40;
 // Enable I2C module
 I2C1CON0bits.EN = 1;
 | 
		
			| ; Adat és órajel lábak konfigurálása bemenetnek:  RD0- SDA (adat láb) és RDI - SCL (órajel láb)
 
 
 | 
	
 
	
		
			| I2C SLAVE INTERRUPT SERVICE Szolga adatfogadása megszakítás alkalmazásával 7 bites címzésben
 | 
		
			| void interrupt I2CSLAVE_ISR (void){ if (PIR3bits.I2C1IF){
 // Clear the I2C interrupt flag
 PIR3bits.I2C1IF = 0;
 // ACK Sequence Interrupt Detected
 if (I2C1PIRbits.ACKTIF){
 // Clear the interrupt flag
 I2C1PIRbits.ACKTIF = 0;
 
 // For Slave Read/Master Write
 if (!I2C1STAT0bits.R){
 // Data Byte Received
 if (I2C1STAT0bits.D){
 // Read from RXB
 *readBlock = I2C1RXB;
 readBlock++;
 }
 }
 // For Slave Write/Master Read
 else {
 // Write to TXB
 I2C1TXB = *dataBlock;
 dataBlock++;
 }
 // Release SCL
 I2C1CON0bits.CSTR = 0;
 }
 }else {
 // Other Interrupts…
 }
 }
 | 
		
			| ; Adat és órajel lábak konfigurálása bemenetnek:  RD0- SDA (adat láb) és RDI - SCL (órajel láb)
 
 
 | 
	
 
 
 
Egy példaprogram: http://www.microchip.com/forums/m1022522.aspx
/*/I want to upgrade my application from PIC18F26K22 to PIC18F26k42 but I've two problems with I2C:
* It doesn't work at all (no output, with oscilloscope I see a fixed +3V, from pull-up resistors)
* No interrupt driven code in MCC
I'm using XC8 1.44 and MCC 3.36 (latest). All configuration code from MCC.
*/
// Inside pin configuration
 
bool state = (unsigned char)GIE;
 GIE = 0;
 PPSLOCK = 0x55;
 PPSLOCK = 0xAA;
 PPSLOCKbits.PPSLOCKED = 0x00; // unlock PPS
 
I2C2SDAPPSbits.I2C2SDAPPS = 0x0A; //RB2->I2C2:SDA2;
 I2C2SCLPPSbits.I2C2SCLPPS = 0x09; //RB1->I2C2:SCL2;
 RB1PPS = 0x23; //RB1->I2C2:SCL2;
 RB2PPS = 0x24; //RB2->I2C2:SDA2;
 
PPSLOCK = 0x55;
 PPSLOCK = 0xAA;
 PPSLOCKbits.PPSLOCKED = 0x01; // lock PPS
 
GIE = state;
 
 
 
// Inside I2C2 auto-generated code
 
void I2C2_Initialize(void)
{
 if(!I2C2CON0bits.EN || lastError != I2C2_GOOD)
 {
 lastError = I2C2_GOOD;
 // TXU 0; CSD Clock Stretching enabled; ACKT 0; RXO 0; ACKDT Acknowledge; ACKSTAT ACK received; ACKCNT Acknowledge; 
 I2C2CON1 = 0x00;
 // ABD enabled; GCEN disabled; ACNT disabled; SDAHT 300 ns hold time; BFRET 8 I2C Clock pulses; FME disabled; 
 I2C2CON2 = 0x00;
 // CLK Fosc/4; 
 I2C2CLK = 0x00;
 // CSTR Enable clocking; S Cleared by hardware after Start; MODE 7-bit address; EN enabled; RSEN disabled; 
 I2C2CON0 = 0x84;
 I2C2PIR = 0;// ;Clear all the error flags
 I2C2ERR = 0;
 }
}
 
 
 
void i2c2_write1ByteRegister(uint8_t address, uint8_t reg, uint8_t data)
{
 I2C2_Initialize();
 I2C2ADB1= (uint8_t)(address<<1);
 I2C2CNT=2;
 I2C2CON0bits.S=1;
 sendByte(reg);
 sendByte(data);
 wait4Stop();
}
 
 
 
// My code
 
 
 
 
 
i2c2_write1ByteRegister(LM75A_ADDR, LM75A_CONF, LM75_NORMAL);
 
// i2c2_getLastError() return time-out
 
Példaprogram magyarázattal
Az I2C modul portokhoz, illetve lábakhoz rendelése (PPS konfigurálás):
Előbb C nyelven:
 // Configure the pins as digital
 ANSELCbits.ANSELC3 = 0;
 ANSELCbits.ANSELC4 = 0;
    
 // PPS Unlock Sequence
 PPSLOCK = 0x55;
 PPSLOCK = 0xAA;
 PPSLOCKbits.PPSLOCKED = 0x00;
    
 // Set RC4 for SDA
 RC4PPS = 0x22;
 I2C1SDAPPS = 0x14;
    
 // Set RC3 for SCL
 RC3PPS = 0x21;
 I2C1SCLPPS = 0x13;
    
 // PPS Lock Sequence
 PPSLOCK = 0x55;
 PPSLOCK = 0xAA;
 PPSLOCKbits.PPSLOCKED = 0x01;    
    
 // Configure the pins as Open-drain
 ODCONCbits.ODCC3 = 1;
 ODCONCbits.ODCC4 = 1;    
    
 // Set the I2C levels
 RC3I2Cbits.TH = 1;
 RC4I2Cbits.TH = 1;
    
 // Configure the pins as Outputs
 TRISCbits.TRISC3 = 0;
 TRISCbits.TRISC4 = 0;    
Assembly nyelven:
    
; FELADAT: 
; RC3-hoz rendelem az SCL -t
; RC4-hez rendelem az SDA -t    
   ;  ----------------------- 
; Digitalis I/O legyen az RE3 es RE4 ic lab  
     bcf ANSELC,ANSELC3  ; ne legyen az RE3 IC lab analog bemenet
     bcf ANSELC,ANSELC4  ; ne legyen az RE4 IC lab analog bemenet  
; ...................................................................      
    
; RC3-at az SCL-hez rendelem    
    banksel RC3PPS
    movlw h'21' ; 6 bites adat
    movwf RC3PPS
    
    banksel I2C1SCLPPS
    movlw h'13' ; 5 bites adat
    movwf I2C1SCLPPS
    
; RC4-et az SDA-hoz rendelem    
    banksel RC4PPS
    movlw h'22' ; 6 bites adat
    movwf RC4PPS
    
    banksel I2C1SDAPPS
    movlw h'14' ; 5 bites adat
    movwf I2C1SDAPPS    
;---------------------------------------
    
; PPS LOCK szekvencia megirasa, hogy ne lehessen innentol a labakat hozzarendelni   
    
    ; Disable interrupts:
    BCF     INTCON0,GIE ; letiltjuk globálisan a megszakításokat
; Bank to PPSLOCK register
    BANKSEL PPSLOCK
  ;  MOVLB   PPSLOCK
    MOVLW   h'55'
; Required sequence, next 4 instructions
    MOVWF   PPSLOCK
    MOVLW   h'AA'
    MOVWF   PPSLOCK
; Set PPSLOCKED bit to disable writes
; Only a BSF instruction will work
    BSF     PPSLOCK,0
; Enable Interrupts
    BSF     INTCON0,GIE  ; újból engedélyezzük glábálisan a megszakításokat
;----------------------------------------------------------------------    
    
; Nyitott kollektorossa kell tenni az SCL es SDA kimeneteket        
    bsf ODCONC,3 ;  RCA3
    bsf ODCONC,4 ;  RCA4
;-------------------------------------------------------------
     
; // Be kell állítani az I2C szintet     
    bsf RC3I2C,0 ; TH bit csak nem ismeri a fordító
    bsf RC4I2C,0 ; TH bit, csak nem ismeri a fordító
;-------------------------------------------------------------    
  
; A be/ki meneteket kimenette kell beallitani. Gondolom a szolgánál meg bemenetté!  
    
    bcf TRISC,3 ;
    bcf TRISC,4 ;
;------------------------------------------------------------    
    
; ***** EZZEL VEGE A PPS BEALLITASOKNAK *****