void main(void) { init(); // configure ports brkrst_init(); // enable break-detect pus=EEPROMread(ADDR); // read last powerup counter value pus++; // increase it EEPROMwrite(ADDR, pus); // write new value back to EEPROM while(1) { P2=pus; // blink current powerup counter msec(200); P2=0x00; msec(200); } }
//25AA020A emulator 256BYTE SPI EEPROM void SPIEEworker(void) { unsigned char token, instruction, fInst=0,addr=0,addressed =0,STATUS=0,fb=0,fb2=0,bf=0; unsigned char i,pageIndex=0,WREN=0,WIP=0,w=0; initSPI(); SSP2BUF = 0xFD; while (1) { while(PORTCbits.RC0 ==0) { if(SSP2STATbits.BF) // we received something :) { bf=1; if(fb==0) { token = SSP2BUF; instruction = token & SPIEEMASK; } fb=1; switch(instruction) { case SPI_READ: if(fInst) { if(addressed==0) { addr = SSP2BUF; addressed =1; SSP2BUF = eeBuf[addr++]; } else { SSP2BUF = eeBuf[addr++]; } } else { fInst=1; SSP2BUF = STATUS; } break; case SPI_WRITE: if(WREN) { if(fInst) { if(addressed) { if(STATUS > 11); else if(STATUS >7) { if(addr<0x80) { eeBuf[addr++]=SSP2BUF; STATUS|=1; //write in progress w++; } } else if(STATUS > 3) { if(addr<0xC0) { eeBuf[addr++]=SSP2BUF; STATUS|=1; //write in progress w++; } } else { eeBuf[addr++]=SSP2BUF; w++; STATUS|=1; //write in progress } } else { addr = SSP2BUF; addressed =1; } } else { fInst=1; } } SSP2BUF = STATUS; break; case SPI_WRDI: WREN=0; STATUS&=~(1<<1); break; case SPI_WREN: WREN =1; STATUS|=1<<1; SSP2BUF = STATUS; break; case SPI_RDSR: SSP2BUF = STATUS; break; case SPI_WRSR: if(fInst)STATUS = SSP2BUF; fInst=1; break; } } } if(bf) { addressed=0; if (token == SPI_WRITE) { WREN =0; STATUS&=0b11111100; } if(w>0) { for(i=addr-w;i<addr;i++)EEPROMwrite(i,eeBuf[i]); } w=0; fb=0; fInst=0; bf=0; } } }
void UARTworker(void) { unsigned char c,mode=0,addr=0,instruction=0,EEaddrF=0,EEaddr=0,adcc=0,helpC; initUART(); //write start message (menu) UARTwriteString(msgMenu[0]); UARTwrite('\n'); while(1) { if(RCIF) { RCIF=0; LED2ON; if(!(RCSTA&0b00000110)) { rhead++; rhead&=RINGBUFFMASK; ringbuff[rhead]=RCREG; } LED2OFF; c=UARTread(); UARTwrite(c); //c=UARTcharFromString(c); switch (mode) { case 0: mode=c-48; UARTwriteString(msgMenu[c-48]); if(mode==2)enablePWM(); else if(mode==3)enableDAC(); break; case 1://ADC switch(c) { case 'r'://single read UARTwriteString("\n\nADC value: "); helpC=getADC(adcc); UARTwriteDecimal(helpC); UARTwriteString(msgMenu[1]); break; case '1'://chanell one UARTwriteString("\n\nchannel 1 selected"); adcc=0; UARTwriteString(msgMenu[1]); break; case '2'://chanel two UARTwriteString("\n\nchannel 2 selected"); adcc=1; UARTwriteString(msgMenu[1]); break; case '3'://chanell three UARTwriteString("\n\nchannel 3 selected"); adcc=2; UARTwriteString(msgMenu[1]); break; case 't'://temp UARTwriteString("\n\nTemp sensor selected"); adcc=3; UARTwriteString(msgMenu[1]); break; case 'm'://back to start mode = 0; UARTwriteString(msgMenu[0]); break; default: break; } break; case 2://PWM if(instruction) { switch(instruction) { case 'p': //pwm period = c; setPeriod(UARTcharFromString(c)); UARTwriteString(msgMenu[2]); break; case 'd': setDuty(UARTcharFromString(c)); UARTwriteString(msgMenu[2]); //pwm period =c; break; case 'm': mode =0; //pwm off UARTwriteString(msgMenu[0]); break; default: break; } instruction = 0; } else { instruction = c; //loads the instruction if(instruction == 'p') { UARTwriteString("\n\nEnter the PWM Period: "); } else if(instruction == 'd') { UARTwriteString("\n\nEnter the PWM Duty Cycle: "); } else if(instruction == 'm') //if it's m goes back to the start menu... { mode =0; instruction =0; disablePWM(); UARTwriteString(msgMenu[0]); } } break; case 3://DAC if(instruction) { switch(instruction) { case 'v': //enter woltage setDAC(UARTcharFromString(c)); UARTwriteString(msgMenu[3]); break; case 'm': mode = 0; UARTwriteString(msgMenu[0]); break; default: break; } instruction =0; } else { instruction = c; //loads the instruction if(instruction == 'v') { UARTwriteString(msgDACsetV); } else if(instruction == 'm') //if it's m goes back to the start menu... { mode =0; instruction =0; disableDAC(); UARTwriteString(msgMenu[0]); } } break; case 4://MEM if(instruction) //if instruction has been sent previusly { if(EEaddrF) //instruction was sent previusly, check if address was sent { //address was sent if(instruction == 'w') //if instruction was W-writes recived character to EEProm[ADDR] { EEPROMwrite(EEaddr,UARTcharFromString(c)); UARTwriteString(msgMenu[4]); //write c to eeprom } else if (instruction == 'r') //if instruction was R-reads EEprom[addr] from eeprom { UARTwriteDecimal(EEPROMread(EEaddr)); UARTwriteString(msgMenu[4]); } else if (instruction == 'm') //if instruction was m --returns to start menu... { mode = 0; UARTwriteString(msgMenu[0]); } EEaddrF=0; //clears the addressing flag instruction =0; //clears the istruction flag } else { EEaddrF=1; //sets the address flage EEaddr=UARTcharFromString(c); if(instruction=='w')UARTwriteString(msgEEw); else if(instruction == 'r')UARTwriteString("\n\nHit any key to read from EEPROM.\n\n"); } } else { instruction = c; //loads the instruction if((instruction == 'w')||(instruction == 'r')) { UARTwriteString(msgEEaddr); } else if(instruction == 'm') //if it's m goes back to the start menu... { mode =0; instruction =0; UARTwriteString(msgMenu[0]); } } break; default: mode=0; UARTwriteString(msgMenu[0]); break; } } } }