11************************** FIGURE 12 ******************************** Ii** ** I/** SERIAL PROGRA~gfING ROUTINE FOR THE PIC16C84 MICROCONTROLLER ** II** ** //** Analog Design Specialists ** 11** ** 11********************************************************************* //FUNCTION PROTOTYPE: int ser_picl6c84(int cmd, int data) /l cmd: LOAD_CONFIG -> part configuration bits I/ LOAD_DATA -> program data, write // READ_DATA -> program data, read // INC_ADDR -> increment to the next address (routine does not auto increment) // BEGIN_PROG -> program a previously loaded program code or data //' LOAD_DATA_DM -> load EEPROM data regesters (BEGIN_PROG must folow) // READ_DATA_DM -> read EEPROM data /l //data: 1) 14 bits of program data or // 2) 8 bits of EEPROM data (least significant 8 bits of int) II Additional progray,net commands (not part of PICI6C84 programming codes) // //~=~d: RESET -> provides 1 ms reset pulse to target system // PROGRAM_MODE -> initializes PIC16C84 for programming // RUN -> disconnects programmer from target system // //function returns:l) 14 or 8 bits read back data for read commands // 2) zero for write data // 3) PIC_PROG_EROR = -1 for programming function errors // 4) PROGMR_ERROR = -2 for programmer function errors iinclude #define LOAD_CONFIG 0 idefine LOAD_DATA 2 #define READ_DATA 4 ~define INC_ADDR 6 #define BEGIN_PROG 8 #define PARALLEL_MODE 10 //not used #define LOAD_DATA_DM 3 #define READ_DATA_DM 5 #define MAX_PIC_CMD 63 //division between pic and programmer commands #define RESET 64 //external reset command, not neded for prograr~ning #define PROGRAM_MODE 65 //initialize program mode #define RUN 66 //electrically disconnect programmer #define PIC_PROG_EROR -1 #define PROGMR_ERROR -2 #define PTR 0 //use device //parallel port bits // dO: data output to part to be programmed // dl: programming clock // d2: data dirrection, O= enabel t~i state bur -> send data to part // d3: Vpp control 1= turn on Vpp // d4: ~MCLR =0, 1 = reset device with MCLR line // d5: clock line tri state control, 0 = enable clock line int ser_picl6c84(int c=nd, int data) //custom interface for pic 16c84 { int i, s_cmd; if(cmd <=MAX_PIC_CMD) //all programming modes { biosprint(O,8,pTH); //set bits 001000, output mode, clock & data low OSOO589A-page 4 (C) 1994 Microchip Technology Inc. PC-Based Development Programmer for the PIC16C84 I s_cmd = cmd; //retain command 'cmd' for (i=O;i<6;i++) //output 6 bits of co__and { biosprint(O, (s_cmdaOxl) +2+8,PTR); //set bits 001010, clock hi biosprint(O, (s_cmd&Oxl) +8,PTR); //set bits 001000, clock low s_cmd >>=1; } if( (cmd ==INC_ADDR) 11 (cmd ==PA/~ALLEL_MODE) //com~and only, no data cycle return O; else if(cmd ==BEGIN_PROG) //program co__and only, no data cycle { delay(i0); //10 ms PIC programming time return O; } else if( (cmd ==LOAD_DATA)I1 (cmd ==LOAD_DATA_DM)1~ (cmd ==LOAD_CONFIG))//output 14 bits of I data for (i=200;i;i--) ; //delay between command & data biosprint(O,2+8,PTR); //set bits 001010, clock hi; leading bit biosprint(O, 8,PTR); / set bits 001000, clock low for (i=O;i<14;i++) / 14 data bits, isb first { biosprint(O,(data&Oxl) +2+8,PTR); / set bits 001010, clock hi biosprint(O,(dataaOxl) +8,PTR); / set bits 001000, clock low data >>=1; } biosprint(O,2+8,PTR); //set bits 001010, clock hi; trailing bit // ***************** Analog Design Specialists ****************** biosprint(O, 8,PTR); //set bits 001000, clock low return 0; } else if((c=nd ==READ_DATA)II(omd ==READ_DATA_DM))//read 14 bits from part, isb first { biosprint(O, 4+8,PTR); //set bits 001100, clock low, tri state data buffer for (i=200;i;i-) ; //delay between co~and a data biosprint(O,2+4+8,PTR); //set bits 001110, clock hi, leading bit biosprint(O, 4+8,PTR); //set bi~s 001100, clock low data =0; for (i=O;i<14;i++) //input 14 bits of data, Isb first { data >>=1; //shift data for next input bit biosprint(O,2+4+8,PTR); //set bits 001110, clock hi biosprint(O, 4+8,PTR); //set bits 001100, clock low if(!(biosprint{2,0,O)aOx40)) data += Ox2000; //use printer acknowledge line for input, data Isb first } biosprint(O,2+4+8,PTR); //set bits 001110, clock hi, trailing bit biosprint(O, 4+8,PTR); //set bits 001100, clock low return data; } else return PIC_PROG_EROR; //programmer error } else if(omd == RESET) //reset device biosprint(O,32+l6+4,PTR); //set bits 110100, MCLR = low (rese~ PIC16C84), progranTaer not conected 1994 Microchip Technology Inc. DSOO589A-page 5 A PC-Based Development Programmer for the PIC16C84 ~i delay(l); //Ims delay biosprint(O,32 +4,PTR); //set bits 100100, MCLR = high return O; else if(cmd ==PROGRAM_MODE) //enter program mode biosprint(O,32+l6+4,PTR); //set bits 110100, Vpp off, MCLR = low (reset PIC16C84) delay(i0); //10 ms, allow programming voltage to stabelize biosprint(O,8,PTR); //set bits 001000, Vpp on , MCLR = 13.5 volts, clock & data connected delay(i0); //10 ms, allow progra~mning voltage to stablize return O; } else if(cmd ==RUN) //disconects prograr~ner from device biosprint(O,32+4,PTR); //set bits 100100 return 0; } else return PROGMR_ERROR; //command error