Tôi viết code ASM, 1 chương trình con để ghi từ RAM vào Flash ROM (làm theo datasheet = Studio 4.
Nhưng khi chạy thử trên Studio 4 (chưa chạy thực tế), thì có vấn đề:
1/- Không cần qua bước xóa trang, khi ghi word đầu tiên thì toàn bộ trang đều bị xóa (studio 4). thực tế có đúng vậy không?
2/- Khi ghi từ (word) cuối cùng/page (sau lệnh SPM) thì không ghi được, mà lại có hiện tượng kỳ lạ:
- Copy toàn bộ trang 'n' đang ghi lên trang 'n+1', kể cả từ cuối cùng/page, trong khi trang 'n' lại không có từ đó.
Gửi code ASM các bạn xem có sai ở phần nào không, mong giúp đở.
Nhưng khi chạy thử trên Studio 4 (chưa chạy thực tế), thì có vấn đề:
1/- Không cần qua bước xóa trang, khi ghi word đầu tiên thì toàn bộ trang đều bị xóa (studio 4). thực tế có đúng vậy không?
2/- Khi ghi từ (word) cuối cùng/page (sau lệnh SPM) thì không ghi được, mà lại có hiện tượng kỳ lạ:
- Copy toàn bộ trang 'n' đang ghi lên trang 'n+1', kể cả từ cuối cùng/page, trong khi trang 'n' lại không có từ đó.
Gửi code ASM các bạn xem có sai ở phần nào không, mong giúp đở.
;**************************
.include "m16def.inc"
;**************************
jmp wr_ram
.org SMALLBOOTSTART ;($1F80)
;***write 1 page from ram to flash rom (40h word/page)
;r1:r0=ram adress, r2=flash rom page
wr_ram: ;***RAM + PAGE & WORD ADRESS;
mov XL, r0 ;XH:XL=r1:r0 con trỏ ram
mov XH, r1
ldi r16, $80
mul r2, r16
movw ZH:ZL, r0 ; địa chỉ trang & word
ldi r17, $40 ; ghi 40H WORD
;***PAGE EREASE******
ldi r16, 0b00000011
out SPMCR, r16 ;SPMCR=$37
SPM
;**************
wr_r_1:
ld r0, X+
ld r1, X+
;***FILL THE TEMPORALY BUFFET
ldi r16, 0b00000001
out SPMCR, r16 ;SPMCR=$37
SPM
;***PERFORMING A PAGE WRITE
ldi r16, 0b00000101
out SPMCR, r16 ;SPMCR=$37
SPM
;*** WORD ADRESS + 2
adiw ZH:ZL, 2 ;tăng địa chỉ word lên 1
;***Kiểm tra đủ 40H word
dec r17
tst r17
brne wr_r_1
Forever:
jmp forever
.include "m16def.inc"
;**************************
jmp wr_ram
.org SMALLBOOTSTART ;($1F80)
;***write 1 page from ram to flash rom (40h word/page)
;r1:r0=ram adress, r2=flash rom page
wr_ram: ;***RAM + PAGE & WORD ADRESS;
mov XL, r0 ;XH:XL=r1:r0 con trỏ ram
mov XH, r1
ldi r16, $80
mul r2, r16
movw ZH:ZL, r0 ; địa chỉ trang & word
ldi r17, $40 ; ghi 40H WORD
;***PAGE EREASE******
ldi r16, 0b00000011
out SPMCR, r16 ;SPMCR=$37
SPM
;**************
wr_r_1:
ld r0, X+
ld r1, X+
;***FILL THE TEMPORALY BUFFET
ldi r16, 0b00000001
out SPMCR, r16 ;SPMCR=$37
SPM
;***PERFORMING A PAGE WRITE
ldi r16, 0b00000101
out SPMCR, r16 ;SPMCR=$37
SPM
;*** WORD ADRESS + 2
adiw ZH:ZL, 2 ;tăng địa chỉ word lên 1
;***Kiểm tra đủ 40H word
dec r17
tst r17
brne wr_r_1
Forever:
jmp forever