| ??? 04/17/08 12:51 Modified: 04/17/08 13:05 Read: times |
#153606 - Re: this is why it\'s always better Responding to: ???'s previous message |
Here under is my test programm to test the erase block function.
It begin with a baudrate detect. After the 'U' char is reiceived, block 0 is erased and then a 'm' is sent back to RS232. When the flash is not blank and SP has 4Eh, the erase function won't return. But when initialising SP to 20h, all is working. The erase function also return if the flash is allready erased. SP is set to 4Eh, because 31 variables are declared from RAM address 30h. The complier (Keil) was calculating it. I've included the asm code generated by compiler since C and asm are mixed.
80: ?C_STARTUP: LJMP STARTUP1
C:0x0000 020007 LJMP STARTUP1(C:0007)
20: JMP 0x7000
21: ; #pragma endasm
22: ;
23: ; }
24: ; SOURCE LINE # 7
C:0x0003 027000 LJMP BOOT(C:7000)
25: RET
C:0x0006 22 RET
139: MOV SP,#?STACK-1
C:0x0007 75814E MOV SP(0x81),#0x4E
140: LJMP ?C_START
C:0x000A 02000D LJMP main(C:000D)
5: main()
C:0x000D 80F4 SJMP asmBoot(C:0003)
120: ORL AUXR1,#ENBOOT ; enable boot
121:
122:
123: ; Détecte et configure le baudrate
124: ; La mesure utilise T2 qui à une horloge de fosc/2
125: Detect:
C:0x7000 43A220 ORL AUXR1(0xA2),#0x20
126: MOV TMOD,#0x02
C:0x7003 758902 MOV TMOD(0x89),#0x02
127: MOV T2CON,#0x30
C:0x7006 75C830 MOV T2CON(0xC8),#0x30
128: CLR A
C:0x7009 E4 CLR A
129: MOV TH2,A
C:0x700A F5CD MOV TH2(0xCD),A
130: MOV TL2,A
C:0x700C F5CC MOV TL2(0xCC),A
131: JNB RXD,$
C:0x700E 30B0FD JNB RXD(0xB0.0),C:700E
132: JB RXD,$
C:0x7011 20B0FD JB RXD(0xB0.0),C:7011
133: SETB TR2
C:0x7014 D2CA SETB TR2(0xC8.2)
134: JNB RXD,$
C:0x7016 30B0FD JNB RXD(0xB0.0),C:7016
135: CLR TR2
136: ; Charge le Timer avec 65536 - tm/16
C:0x7019 C2CA CLR TR2(0xC8.2)
137: MOV A,TL2
C:0x701B E5CC MOV A,TL2(0xCC)
138: SWAP A
139: ; Arrondi au demi; le carry contient l'incrément si un arrondi supérieur est nécessaire
C:0x701D C4 SWAP A
140: RLC A ; Mémorise l'arrondi
C:0x701E 33 RLC A
141: RR A
C:0x701F 03 RR A
142: ANL A,#0x0F
C:0x7020 540F ANL A,#0x0F
143: MOV R0,A
C:0x7022 F8 MOV R0,A
144: MOV A,TH2
C:0x7023 E5CD MOV A,TH2(0xCD)
145: SWAP A
C:0x7025 C4 SWAP A
146: ANL A,#0xF0
C:0x7026 54F0 ANL A,#B(0xF0)
147: ORL A,R0
C:0x7028 48 ORL A,R0
148: ADDC A,#0 ; Ajoute le carry
C:0x7029 3400 ADDC A,#0x00
149: MOV R0,A
C:0x702B F8 MOV R0,A
150: MOV A,TH2
C:0x702C E5CD MOV A,TH2(0xCD)
151: SWAP A
C:0x702E C4 SWAP A
152: ANL A,#0x0F
C:0x702F 540F ANL A,#0x0F
153: ADDC A,#0 ; Ajoute le report de l'addition précédente
C:0x7031 3400 ADDC A,#0x00
154: MOV R1,A
155: ; compl. à 2
C:0x7033 F9 MOV R1,A
156: CLR C
C:0x7034 C3 CLR C
157: CLR A
C:0x7035 E4 CLR A
158: SUBB A,R0
C:0x7036 98 SUBB A,R0
159: MOV TL2,A
C:0x7037 F5CC MOV TL2(0xCC),A
160: MOV RCAP2L,A
C:0x7039 F5CA MOV RCAP2L(0xCA),A
161: CLR A
C:0x703B E4 CLR A
162: SUBB A,R1
C:0x703C 99 SUBB A,R1
163: MOV TH2,A
C:0x703D F5CD MOV TH2(0xCD),A
164: MOV RCAP2H,A
C:0x703F F5CB MOV RCAP2H(0xCB),A
165: SETB TR2
C:0x7041 D2CA SETB TR2(0xC8.2)
166: MOV SCON,#0x52
167:
168: Wait_Uchar:
169: ; Attend le 1er caractère
C:0x7043 759852 MOV SCON(0x98),#0x52
170: JNB RI,$
C:0x7046 3098FD JNB RI(0x98.0),WAIT_UCHAR(C:7046)
171: CLR RI
C:0x7049 C298 CLR RI(0x98.0)
172: MOV A,SBUF
173: ; Dans la valeur recue, les 2 LSB n'on pas été pris car on les a déjà utilisé pour la detection du baudrate
C:0x704B E599 MOV A,SBUF(0x99)
174: CLR C
C:0x704D C3 CLR C
175: RLC A
C:0x704E 33 RLC A
176: SETB C
C:0x704F D3 SETB C
177: RLC A
178: ; Renvoie le caractère
C:0x7050 33 RLC A
179: JNB TI,$
C:0x7051 3099FD JNB TI(0x98.1),C:7051
180: CLR TI
C:0x7054 C299 CLR TI(0x98.1)
181: MOV SBUF,A
182:
183: ; Check to see if uppercase "U"
C:0x7056 F599 MOV SBUF(0x99),A
184: CJNE A,#'U',Not_U1 ; Check to see if uppercase "U"
C:0x7058 B45502 CJNE A,#0x55,NOT_U1(C:705D)
185: JMP Intel_Hex
186: Not_U1:
187: ; On teste encore un caractère car avec des débits élevés, on manque partiellement le premier
C:0x705B 801A SJMP INTEL_HEX(C:7077)
188: JNB RI,$
C:0x705D 3098FD JNB RI(0x98.0),NOT_U1(C:705D)
189: CLR RI
C:0x7060 C298 CLR RI(0x98.0)
190: MOV A,SBUF
191: ; Renvoie le caractère
C:0x7062 E599 MOV A,SBUF(0x99)
192: JNB TI,$
C:0x7064 3099FD JNB TI(0x98.1),C:7064
193: CLR TI
C:0x7067 C299 CLR TI(0x98.1)
194: MOV SBUF,A
C:0x7069 F599 MOV SBUF(0x99),A
195: CJNE A,#'U',Not_U ; Check to see if uppercase "U"
C:0x706B B45502 CJNE A,#0x55,NOT_U(C:7070)
196: JMP Intel_Hex
197: Not_U:
198: ; Dans ce cas on recommence la détection
C:0x706E 8007 SJMP INTEL_HEX(C:7077)
199: MOV SCON,#0
C:0x7070 759800 MOV SCON(0x98),#0x00
200: CLR TR2
C:0x7073 C2CA CLR TR2(0xC8.2)
201: JMP Detect
202:
203:
204: ;***** Intel Hex File Load routine *****
205: ;This routine loads an Intel Hex formatted file into
206: ;the buffer memory. The hex file is received as a series
207: ;of ASCII characters on the serial input line of the
208: ;serial port. A record type of 00H is considered to be
209: ;a data field. Any other type of record is considered
210: ;to be an End-of-File marker. This routine also calculates
211: ;the checksum on the field as it is received and compares
212: ;this calculated checksum with the checksum field received
213: ;in the record.
214: Intel_Hex:
C:0x7075 808C SJMP DETECT(C:7003)
215: ORL AUXR1,#20h ; ENBOOT bit determines whether the BOOTROM is enabled
C:0x7077 43A220 ORL AUXR1(0xA2),#0x20
216: MOV R0,#11 ; R0 = osc freq (integer)
C:0x707A 780B MOV R0,#0x0B
217: MOV R1,#01h
C:0x707C 7901 MOV R1,#0x01
218: MOV DPH,#0 ;block code, block 0, 0k to 8k, 00H
C:0x707E 758300 MOV DPH(0x83),#0x00
219: MOV DPL,#0
C:0x7081 758200 MOV DPL(0x82),#0x00
220: LCALL 0FFF0h
221:
C:0x7084 12FFF0 LCALL C:FFF0
222: MOV A,#'m'
C:0x7087 746D MOV A,#0x6D
223: call CO
C:0x7089 118D ACALL CO(C:708D)
224: jmp $
225:
226:
227: ;***** console output routine *****
228: ;Outputs character in the ACC to
229: ;the serial output line.
230: CO:
C:0x708B 80FE SJMP C:708B
231: JNB TI,$
C:0x708D 3099FD JNB TI(0x98.1),CO(C:708D)
232: CLR TI
C:0x7090 C299 CLR TI(0x98.1)
233: MOV SBUF,A
C:0x7092 F599 MOV SBUF(0x99),A
234: RET
235:
236: ;***** console input routine *****
237: ;Waits until character has been received
238: ;and then returns char in ACC.
239: CI:
C:0x7094 22 RET
240: JNB RI,$
C:0x7095 3098FD JNB RI(0x98.0),CI(C:7095)
241: CLR RI
C:0x7098 C298 CLR RI(0x98.0)
242: MOV A,SBUF
C:0x709A E599 MOV A,SBUF(0x99)
243: RET
C:0x709C 22 RET
|
| Topic | Author | Date |
| IAP for P89C51RC2FA | 01/01/70 00:00 | |
| Do you have disabled interrupts? | 01/01/70 00:00 | |
| Re: Do you have disabled interrupts? | 01/01/70 00:00 | |
| can you live with 'programming' as is and REprogra | 01/01/70 00:00 | |
| IAP for P89C51RC2FA | 01/01/70 00:00 | |
| constant? | 01/01/70 00:00 | |
| Re: constant? | 01/01/70 00:00 | |
| this is why it's always better... | 01/01/70 00:00 | |
| Re: this is why it\'s always better | 01/01/70 00:00 | |
| Hummm.... | 01/01/70 00:00 | |
| RE: quick erase | 01/01/70 00:00 | |
| can you please try an experiment | 01/01/70 00:00 | |
Re: can you please try an experiment | 01/01/70 00:00 | |
| what exactly are the symptoms? | 01/01/70 00:00 | |
| Re: what exactly are the symptoms? | 01/01/70 00:00 |



