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