You are on page 1of 5

#include <xc.

h>
#define _XTAL_FREQ 16000000
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF
#define CLOCK RB0
#define DATA RB1
#define MCLR RB2
int f=0;
void LoadConfiguration(char data[1]){
int k=0;
DATA=0;

for (int i=0;i<6 ;i++){//6 puta


CLOCK=1;
__delay_us(7);
CLOCK=0;
}

__delay_us(2);

DATA=0;
CLOCK=1;
__delay_us(5);
CLOCK=0;
__delay_us(5);
for (int i=0; i<14; i++){//14 puta
CLOCK=1;

if (data[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;

k++;
}

DATA=0;
CLOCK=1;
__delay_us(5);
CLOCK=0;
__delay_us(5);

}
void LoadDataForProgramMemory(char data1[1]){
int k=0;
char cmd[10]="010000";//LSB set as first
for (int i=0; i<6; i++){//14 puta
CLOCK=1;
if (cmd[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;
k++;
}
k=0;
__delay_us(2);

DATA=0;
CLOCK=1;
__delay_us(5);
CLOCK=0;
__delay_us(5);
for (int i=0; i<14; i++){//14 puta
CLOCK=1;

if (data1[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;

k++;
}

DATA=0;
CLOCK=1;
__delay_us(5);
CLOCK=0;
__delay_us(5);

}
void ChipErase(){

DATA=1;

for (int i=0;i<6 ;i++){//6 puta


CLOCK=1;
__delay_us(7);
CLOCK=0;
}
__delay_us(40);
DATA=0;
__delay_ms(40);//datasheet min 4ms

}
void IncrementAddress(){
int k=0;
char cmd[10]="011000";//LSB set as first
for (int i=0; i<6; i++){//14 puta
CLOCK=1;
if (cmd[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;
k++;
}
k=0;
__delay_us(1);
DATA=0;
}
void BeginEraseProgrammingCycle(){

int k=0;
char cmd[10]="000100";//LSB set as first
for (int i=0; i<6; i++){//14 puta
CLOCK=1;
if (cmd[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;
k++;
}
k=0;
__delay_us(1);
DATA=0;
__delay_ms(40);//treba bit najmanje 4ms

}
void BeginProgrammingOnlyCycle(){

int k=0;
char cmd[10]="000110";//LSB set as first
for (int i=0; i<6; i++){//14 puta
CLOCK=1;
if (cmd[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;
k++;
}
k=0;
__delay_us(1);
DATA=0;
__delay_ms(10);//treba bit najmanje 1ms

}
void BulkEraseProgramMemory(){

int k=0;
char cmd[10]="100100";//LSB set as first
for (int i=0; i<6; i++){//14 puta
CLOCK=1;
if (cmd[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;
k++;
}
k=0;
__delay_us(1);
DATA=0;
__delay_ms(10);//internaly timed?

}
void BulkEraseDataMemory(){

int k=0;
char cmd[10]="110100";//LSB set as first
for (int i=0; i<6; i++){//14 puta
CLOCK=1;
if (cmd[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;
k++;
}
k=0;
__delay_us(1);
DATA=0;
__delay_ms(10);//internaly timed?

}
void LoadDataForDataMemory(char data1[1]){
int k=0;
char cmd[10]="110000";//LSB set as first
for (int i=0; i<6; i++){//14 puta
CLOCK=1;
if (cmd[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;
k++;
}
k=0;

__delay_us(2);

DATA=0;
CLOCK=1;
__delay_us(5);
CLOCK=0;
__delay_us(5);
for (int i=0; i<14; i++){//14 puta
CLOCK=1;

if (data1[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;

k++;
}

DATA=0;
CLOCK=1;
__delay_us(5);
CLOCK=0;
__delay_us(5);

}
void EndProgramming(){
int k=0;
char cmd[10]="111010";//LSB set as first
for (int i=0; i<6; i++){//14 puta
CLOCK=1;
if (cmd[k]=='1'){DATA=1;}else DATA=0;
__delay_us(1);
CLOCK=0;
k++;
}
k=0;
__delay_us(1);
DATA=0;
}
void EnterProgrammingMode(){
DATA=0;
CLOCK=0;
__delay_us(10);
MCLR=1;

}
void ExitProgrammingMode(){
DATA=0;
CLOCK=0;
MCLR=0;

}
void main(void) {
TRISB=0;
PORTB=0;

__delay_ms(2000);
RB3=1;
EnterProgrammingMode();
ChipErase();
LoadDataForProgramMemory("11111110000000");
BeginProgrammingOnlyCycle();
EndProgramming();
IncrementAddress();
IncrementAddress();
IncrementAddress();
LoadDataForProgramMemory("11111110000000");
BeginProgrammingOnlyCycle();
EndProgramming();
ExitProgrammingMode();

START:
__delay_ms(1000);
RB3=0;
__delay_ms(10000);

__delay_ms(10000);
__delay_ms(10000);
__delay_ms(10000);
__delay_ms(10000);
__delay_ms(10000);
goto START;
}

You might also like