



program electronique_pic_tuto_base_i2c_24c02_001a;
const
c24C02_W = $A2;
c24C02_R = $A3;
var
Values: byte;
procedure Init_Main;
begin
CMCON := $07; // turn off comparators
ADCON1 := ADCON1 or $0F; // turn off analog inputs
INTCON2.NOT_RBPU := 0;
TRISA := $00;
TRISB := $FF;
PORTA := $00;
PORTB := $00;
I2C1_Init(100000); // initialisation comm I2C
end;
function EEProm24C02_Read(iAdd: byte): byte;
begin
I2C1_Start; // signal START
I2C1_Wr(c24C02_W); // adresse composant I2C
I2C1_Wr(iAdd); // adresse mémoire
I2C1_Repeated_Start; // issue I2C signal repeated start
I2C1_Wr(c24C02_R); // send byte (device address + R)
Result := I2C1_Rd(0); // lecture valeur à l'adresse spécifiée
I2C1_Stop; // signal STOP
end;
procedure EEProm24C02_Write(iAdd, iVal: byte);
begin
I2C1_Start; // signal START
I2C1_Wr(c24C02_W); // adresse composant I2C
I2C1_Wr(iAdd); // adresse mémoire
I2C1_Wr(iVal); // valeur à ecrire à l'adresse spécifiée
I2C1_Stop; // signal STOP
end;
begin
Init_Main;
delay_ms(100);
while true do
begin
Values := PORTB; // lecture valeurs sur PORTB
EEProm24C02_Write($02, Values); // ecriture valeur PORTA dans mémoire
Delay_ms(100);
Values := EEProm24C02_Read($02); // lecture valeur dans mémoire
PortA := Values; // affectation valeur lue vers PORTA
Delay_ms(100);
end;
end.
program tuto_24c04_18F2420_Test_001;
const
c24C04_W = $A0;
c24C04_R = $A1;
var
c24C04B_W: byte;
c24C04B_R: byte;
Values: byte;
procedure Init_Main;
begin
CMCON := $07; // turn off comparators
ADCON1 := ADCON1 or $0F; // turn off analog inputs
INTCON2.NOT_RBPU := 0;
TRISA := $00;
TRISB := $FF;
PORTA := $00;
PORTB := $00;
I2C1_Init(100000); // initialisation comm I2C
end;
function EEProm24C04_Read(iBank, iAdd: byte): byte;
begin
c24C04B_W := c24C04_W;
c24C04B_W.1 := iBank; // iBank must be 0 or 1 !
c24C04B_R := c24C04_R;
c24C04B_R.1 := iBank; // iBank must be 0 or 1 !
I2C1_Start; // signal START
I2C1_Wr(c24C04B_W); // adresse composant I2C
I2C1_Wr(iAdd); // adresse mémoire
I2C1_Repeated_Start; // issue I2C signal repeated start
I2C1_Wr(c24C04B_R); // send byte (device address + R)
Result := I2C1_Rd(0); // lecture valeur à l'adresse spécifiée
I2C1_Stop; // signal STOP
end;
procedure EEProm24C04_Write(iBank, iAdd, iVal: byte);
begin
c24C04B_W := c24C04_W;
c24C04B_W.1 := iBank; // iBank must be 0 or 1 !
I2C1_Start; // signal START
I2C1_Wr(c24C04B_W); // adresse composant I2C
I2C1_Wr(iAdd); // adresse mémoire
I2C1_Wr(iVal); // valeur à ecrire à l'adresse spécifiée
I2C1_Stop; // signal STOP
end;
begin
Init_Main;
delay_ms(100);
portA := $0F;
delay_ms(200);
PortA := $00;
while true do
begin
Values := PORTB; // lecture valeurs sur PORTB
EEProm24C04_Write(0, $02, Values); // ecriture valeur PORTB dans mémoire
Delay_ms(100);
Values := EEProm24C04_Read(0, $02); // lecture valeur dans mémoire
PortA := Values; // affectation valeur lue vers PORTA
Delay_ms(500);
Values := PORTB xor $FF; // lecture valeurs inverses sur PORTB
EEProm24C04_Write(1, $02, Values); // ecriture valeur PORTB dans mémoire
Delay_ms(100);
Values := EEProm24C04_Read(1, $02); // lecture valeur dans mémoire
PortA := Values; // affectation valeur lue vers PORTA
Delay_ms(500);
end;
end.
program tuto_24c16_18F2420_Test_001;
const
// write address depend on bank to store data :
// $A0 for bank#0, $A2 for bank#1, $A4 for bank#2, $A6 for bank#3,
// $A8 for bank#4, $AA for bank#5, $AC for bank#6, $AE for bank#7,
// read address depend on bank from read data :
// $A1 for bank#0, $A3 for bank#1, $A5 for bank#2, $A7 for bank#3,
// $A9 for bank#4, $AB for bank#5, $AD for bank#6, $AF for bank#7,
// following constant are "base" addresses that can be latter incremented
c24C16_W = $A0;
c24C16_R = $A1;
var
i24C16B_W: byte; // can take any value between $A0 and $AE
i24C16B_R: byte; // can take any value between $A1 and $AF
Values: byte;
procedure Init_Main;
begin
CMCON := $07; // turn off comparators
ADCON1 := ADCON1 or $0F; // turn off analog inputs
INTCON2.NOT_RBPU := 0;
TRISA := $00;
TRISB := $FF;
PORTA := $00;
PORTB := $00;
I2C1_Init(100000); // initialisation comm I2C
end;
function EEProm24C16_Read(iBank, iAdd: byte): byte;
begin
i24C16B_W := c24C16_W; // "base" addr for write operation
i24C16B_R := c24C16_R; // "base" addr for read operation
// iBank must be comprised from 0 to 7 !
i24C16B_W.1 := iBank.0;
i24C16B_W.2 := iBank.1;
i24C16B_W.3 := iBank.2;
i24C16B_R.1 := iBank.0;
i24C16B_R.2 := iBank.1;
i24C16B_R.3 := iBank.2;
I2C1_Start; // signal START
I2C1_Wr(i24C16B_W); // adresse composant I2C
I2C1_Wr(iAdd); // adresse mémoire
I2C1_Repeated_Start; // issue I2C signal repeated start
I2C1_Wr(i24C16B_R); // send byte (device address + R)
Result := I2C1_Rd(0); // lecture valeur à l'adresse spécifiée
I2C1_Stop; // signal STOP
end;
procedure EEProm24C16_Write(iBank, iAdd, iVal: byte);
begin
i24C16B_W := c24C16_W; // "base" addr for write operation
// iBank must be comprised from 0 to 7 !
i24C16B_W.1 := iBank.0;
i24C16B_W.2 := iBank.1;
i24C16B_W.3 := iBank.2;
{
c24C16B_R := c24C16_R;
c24C16B_R.1 := iBank.0;
c24C16B_R.2 := iBank.1;
c24C16B_R.3 := iBank.2;
}
I2C1_Start; // signal START
I2C1_Wr(i24C16B_W); // adresse composant I2C
I2C1_Wr(iAdd); // adresse mémoire
I2C1_Wr(iVal); // valeur à ecrire à l'adresse spécifiée
I2C1_Stop; // signal STOP
end;
begin
Init_Main;
delay_ms(100);
portA := $0F;
delay_ms(200);
PortA := $00;
while true do
begin
// step #1 - write and read in bank #1
Values := PORTB and $0F; // lecture valeurs directes sur RB0..RB3
EEProm24C16_Write(0, $02, Values); // ecriture valeur RB0..RB3 dans mémoire
Delay_ms(100);
Values := EEProm24C16_Read(0, $02); // lecture valeur dans mémoire
PortA := Values; // affectation valeur lue vers RA0..RA3
Delay_ms(500);
// step #2 - write and read in bank #2
Values := PORTB xor $FF; // lecture valeurs inverses sur RB0..RB3
EEProm24C16_Write(1, $02, Values); // ecriture valeur RB0..RB3 dans mémoire
Delay_ms(100);
Values := EEProm24C16_Read(1, $02); // lecture valeur dans mémoire
PortA := Values; // affectation valeur lue vers RA0..RA3
Delay_ms(500);
// step #3 - write and read in bank #3
Values := PORTB SHR 4; // lecture valeurs directes sur RB4..RB7
EEProm24C16_Write(2, $02, Values); // ecriture valeur RB4..RB7 dans mémoire
Delay_ms(100);
Values := EEProm24C16_Read(2, $02); // lecture valeur dans mémoire
PortA := Values; // affectation valeur lue vers RA0..RA3
Delay_ms(500);
// step #4 - write and read in bank #4
Values := (PORTB SHR 4) xor $0F; // lecture valeurs inverses sur RB4..RB7
EEProm24C16_Write(3, $02, Values); // ecriture valeur RB4..RB7 dans mémoire
Delay_ms(100);
Values := EEProm24C16_Read(3, $02); // lecture valeur dans mémoire
PortA := Values; // affectation valeur lue vers RA0..RA3
Delay_ms(500);
Delay_ms(500); // allow simpler visual verification with LED
end;
end.