; PROGRAMMER FOR AT89C2051 ; CONSTANTS /*ARG0 SET 0 ACHK SET 255 AINT SET 254 AWRI SET 253 AVER SET 252 AERA SET 251 AXTL SET 250 ALIM SET 128*/ ; CONSTANTS FOR DEBUGGING ARG0 SET '0' ACHK SET 'C' AINT SET 'I' AWRI SET 'W' AVER SET 'V' AERA SET 'E' AXTL SET 'X' ALIM SET 10 ; PIN CONNECTIONS XBAR EQU P1.7 XTAL EQU P3.5 PROG EQU P3.4 RST0 EQU p3.3 EN EQU P3.2 ; ////////////////////////////////////////////// ; RESET VECTOR ORG 0000H JMP START ; ////////////////////////////////////////////// ; MAIN ORG 0050H START: ; PUT PORTS IN INPUT MODE, RST AND XTAL AT GROUND MOV P1, #0FFH MOV P3, #0FFH CLR XTAL CLR EN CLR EA ; INTIALIZE SERIAL PORT MOV TMOD, #20H ; TIMER1, MODE2 MOV TH1, #0FDH ; BAUD RATE 9600 MOV TL1, TH1 ; HEHE MOV SCON, #50H ; 8-N-1 SETB TR1 MAINLOOP: CALL GETCHAR ; READ IN A COMMAND CODE FROM PC MOV A, #ALIM CLR C SUBB A, R0 ; CODES ARE ALWAYS > ALIM JNC MAINLOOP CJNE R0, #ACHK, INIT ; CODE ACHK,0: PC IS CHECKING FOR THE PROGRAMMER CALL GETCHAR CJNE R0, #ARG0, MAINLOOP MOV R0, #ACHK ; SEND BACK CONFIRMATION CALL PUTCHAR MOV R0, #ARG0 CALL PUTCHAR JMP MAINLOOP INIT: CJNE R0, #AINT, WRITE CALL GETCHAR CJNE R0, #ARG0, TURNOFF ; INITIALIZING THE COUNTER USING RST PIN SETB RST0 ; BRING DOWN RST TO 0V CLR EN ; PUT OUT CODE FOR READ SETB XBAR SETB PROG CLR XTAL CALL DELAY1 CLR RST0 ; BRING RST TO 5V JMP INIT_END TURNOFF: ; TURN OFF RST SETB RST0 ; BRING DOWN RST TO 0V CLR EN ; PUT OUT CODE FOR READ SETB XBAR SETB PROG CLR XTAL INIT_END: MOV R0, #AINT ; SEND BACK CONFIRMATION CALL PUTCHAR MOV R0, #ARG0 CALL PUTCHAR JMP MAINLOOP WRITE: CJNE R0, #AWRI, VERIFY ; WRITE THE GIVEN BYTE TO FLASH CALL GETCHAR ; R0 HAS THE BYTE TO BE WRITTEN SETB EN ; PUT OUT CODE FOR WRITE SETB XBAR SETB PROG CLR XTAL CLR RST0 ; BRING UP RST TO 12V ; PUT OUT THE DATA TO THE PORT AS WELL AS THE SIGNAL XBAR CALL REVERSE ; REVERSES BITS IN R0 INTO ACC RRC A SETB P3.7 JC YES_CARRY CLR P3.7 YES_CARRY: SETB ACC.7 ; MUST WRITE ACC INSTEAD OF A MOV P1, A ; PULSE PROG CALL DELAYSHORT2 CLR PROG NOP NOP NOP NOP SETB PROG CALL DELAY1 ; WAIT FOR AROUND 2ms SINCE WE ARE NOT POLLING RDY CALL DELAY1 ; DATABAR VERIFICATION CLR EN ; PUT OUT CODE FOR READ MOV P1, #0FFH; SETB P3.7 MOV A, P1 RL A SETB ACC.0 JNB P3.7, FIXDATA CLR ACC.0 FIXDATA: SETB XTAL ; PULSE XTAL MOV R0, A CLR XTAL CALL REVERSE MOV R0, #AWRI ; SEND BACK CONFIRMATION CALL PUTCHAR MOV R0, A ; WITH THE BYTE READ IN CALL PUTCHAR JMP MAINLOOP VERIFY: CJNE R0, #AVER, ERASE ; VERIFY FLASH MEMORY CONTENTS CALL GETCHAR CJNE R0, #ARG0, CONT ; SIGNATURE BITS ARE NOT SUPPORTED, SO YOU GET 4,3,2,1 MOV R0, #04H LOOP0: CALL PUTCHAR DJNZ R0, LOOP0 JMP MAINLOOP CONT: ; BEGIN VERIFICATION MOV A, #10 CLR C SUBB A, R0 ; PLEASE ASK FOR LESS THAN 16K JC NEARMAINLOOP SETB RST0 ; SET RST TO 0V CLR EN ; PUT OUT CODE FOR READ SETB XBAR SETB PROG CLR XTAL CALL DELAYSHORT CLR RST0 ; BRING RST TO 5V CALL DELAY1 MOV R1, 00H MOV R0, #AVER CALL PUTCHAR LOOP1: MOV R2, #04H LOOP2: MOV R3, #00H LOOP3: MOV P1, #0FFH SETB P3.7 MOV P1, #0FFH ; PUT PORT IN INPUT MODE SETB P3.7 MOV A, P1 RL A SETB ACC.0 JB P3.7, FIXDATA2 CLR ACC.0 FIXDATA2: MOV R0, A SETB XTAL CALL REVERSE CLR XTAL MOV R0, A CALL PUTCHAR DJNZ R3, LOOP3 DJNZ R2, LOOP2 DJNZ R1, LOOP1 NEARMAINLOOP: JMP MAINLOOP ERASE: CJNE R0, #AERA, PULSECK CALL GETCHAR CJNE R0, #ARG0, NEARMAINLOOP CLR EN ; PUT OUT CODE FOR ERASE CLR XBAR ; ALSO SETS RST=12V CLR XTAL CLR RST0 MOV R1, #20H LONGDELAYERASE1: CALL DELAY1 DJNZ R1, LONGDELAYERASE1 CLR PROG MOV R1, #15H LONGDELAYERASE2: CALL DELAY1 DJNZ R1, LONGDELAYERASE2 SETB PROG MOV R1, #15H LONGDELAYERASE3: CALL DELAY1 DJNZ R1, LONGDELAYERASE3 CLR EN ; PUT OUT CODE FOR READ SETB XBAR ; ASLO SETS RST=5V CLR XTAL CALL DELAY1 SETB RST0 ; ALSO CUT OFF RST TO 0V MOV R0, #AERA ; SEND BACK CONFIRMATION CALL PUTCHAR MOV R0, #ARG0 CALL PUTCHAR JMP MAINLOOP PULSECK: CJNE R0, #AXTL, NEARMAINLOOP CALL GETCHAR CJNE R0, #ARG0, NEARMAINLOOP CLR XTAL NOP NOP NOP SETB XTAL NOP NOP NOP CLR XTAL MOV R0, #AXTL ; SEND BACK CONFIRMATION CALL PUTCHAR MOV R0, #ARG0 CALL PUTCHAR JMP MAINLOOP ; ////////////////////////////////////////////// ; GETCHAR SUBROUTINE IN: OUT:R0 GETCHAR: JNB RI, GETCHAR CLR RI MOV R0, SBUF RET ; ////////////////////////////////////////////// ; PUTCHAR SUBROUTINE IN:R0 OUT: PUTCHAR: MOV SBUF, R0 PR_LOOP: JNB TI, PR_LOOP CLR TI RET ; ////////////////////////////////////////////// ; DELAY ROUTINE ~1ms DELAY1: PUSH 01H PUSH 02H MOV R2, #02H DELAY1LOOP1: MOV R1, #00H DELAY1LOOP2: DJNZ R1, DELAY1LOOP2 DJNZ R2, DELAY1LOOP1 POP 02H POP 01H RET ; ////////////////////////////////////////////// ; DELAY ROUTINE 500us DELAYSHORT: PUSH 01H MOV R1, #00H DELAYSHORTLOOP: DJNZ R1, DELAYSHORTLOOP POP 01H RET ; ////////////////////////////////////////////// ; DELAY ROUTINE ~50us DELAYSHORT2: PUSH 01H MOV R1, #18H DELAYSHORTLOOP2: DJNZ R1, DELAYSHORTLOOP2 POP 01H RET ; ////////////////////////////////////////////// ; REVERSES A BYTE IN:R0 OUT:ACC REVERSE: PUSH 01H MOV R1, #08H LOOP: XCH A, R0 RLC A XCH A, R0 RRC A DJNZ R1, LOOP POP 01H RET ; ////////////////////////////////////////////// END