??? 10/13/06 10:32 Read: times |
#126377 - ehm.... Responding to: ???'s previous message |
Arvind Shrivastava said:
org 2010h Why??? '51 starts executing program after reset from 0000h, doesnt' it? Arvind Shrivastava said:
FIRMWARE_BIT equ 010h ;flag for checking whether the program is ; exceuting for the forst time or not ; 0 for first time executing I thought you want to keep this flag in non-volatile memory = FLASH, won't you? Then, you need to choose a space for it so that it won't get into conflict with the software. I wouldn't put it at 0010h, as the interrupt vectors are there, so if you want to use them in the future it would interfere. It does not matter if you put it below 2000h or above 2000h; the whole APPLICATION FLASH (Block 0) is treated by the IAP in the same way. Of course, if stored in FLASH, you cannot simply test it by jb/jnb instruction. You need to fetch it from the code memory (=FLASH) using MOVC into accumulator, and THEN test it in accumulator. Also, you can chose the default value of the flag simply by putting it in the source as data. Then it would get burned together with the rest of code, to be prepared for the first time usage. I would suggest you to have the default ("intact") value = 00h and store it in the same page than the password (say, at address 327Fh - I assume the password will be less than 128 bytes long); so that if you erase the flash page to reprogram the password, the flag gets automatically complemented. So if we assume you will do it as I described above, store the flag at position 327Fh and the password from 3200h; you will include into source code the following to get the initial value of the flag: ORG 327f FIRMWARE_FLAG: db 0 and the startup algorithm would be the following:
This is the general picture; I will comment on the rest of your code but that's only to point out some of your errors. However, I'd recommend you to restart from scratch based on my description above. Arvind Shrivastava said:
mov r4, #080h ; LSB of 3200h mov r5, #0c0h ; MSB of 3200h OK so you intend to store the password in 3200h, so why do you use c080h? Your comments should reflect reality... And also the comments should say, WHAT THE HELL is 3200h... Arvind Shrivastava said:
org 3200h sjmp START Nono, don't put another org here... How is the processor supposed to walk from the previous instruction to here? Arvind Shrivastava said:
FLASH_SUBROUTINE: [... etc.] OK, now general comments on FLASH_SUBROUTINE:
Arvind Shrivastava said:
mov dpl, #r4 mov dph, #r5 This is a classical technical error; the assembler should throw an error on this (but this error it has also a more dangerous form, when an actual variable reference is used, which cannot be detected by the assembler). You wanted to write: mov dpl, r4 mov dph, r5 Arvind Shrivastava said:
; will I have to call the IAP for four times, unlike I have
' called once below Yes. --- I hope this helped to make an another step forward... Jan Waclawek |