Pic18 I2C programozás


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 *****