Professional Documents
Culture Documents
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;
__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;
}
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;
}