![]() |
Hỏi về table write trong PIC18FXXJXX
Mình đang viết ctrinh bootloader, trong đó có phần ghi data xuống lên flash memory (ROM) của con PIC18F67J10 vẫn còn bị lỗi. Sau khi thử chạy chức năng ghi này và đọc lại vùng memory vừa được ghi thì thấy ko có gì hết. Code của mình như sau:
Code:
int i; |
Bạn nên viết đoạn 'required sequence' (EECON2 = 0x55; EECON2 = 0xAA; EECON1bits.WR = 1; ) bằng hợp ngữ. Bạn kiểm tra lại mã máy đã được C18 dịch ra xem đoạn 'required sequence' đó có được đảm bảo hay không (không thể có bất kỳ lệnh gì chen vào bất kỳ vị trí nào của đoạn 'required sequence' đó).
while (EECON1bits.WR); là không cần thiết, vì nếu CPU bắt đầu thực hiện thao tác ghi, nó sẽ bị treo cho đến khi nào hoàn thành thao tác ghi đó. Thân, |
Sau khi thử thêm một vài lần nữa, cộng với gọi thêm hàm readMemory() ngay khi vừa ghi xong, thì đã đọc được data. Không biết có phải đó là do cần phải verify ngay sau khi write hay ko.
Cám ơn namqn nhé. |
Em cũng thử dùng chương trình trên của bác để nạp vào PIC18F97J60 nhưng chuyển sang Program Memory tại địa chỉ 0x2000 thì không thấy có data nào ghi vào địa chỉ đó cả. Cho em hỏi có cần phải thiết lập gì thêm nữa không ạ? Đoạn chương trình e chỉnh sửa:
TBLPTR = 0x2000; // địa chỉ của vùng nhớ mà data đc ghi, ở đây mình dùng 0x2000 EECON1bits.WREN = 1; // enable write to memory EECON1bits.FREE = 1; // enable Row Erase operation INTCONbits.GIE = 0; // disable interrupts // EECON2 = 0x55; // EECON2 = 0xAA; // EECON1bits.WR = 1; _asm MOVLW 0x55 MOVWF 0xfa7, ACCESS MOVLW 0xaa MOVWF 0xfa7, ACCESS BSF 0xfa6, 0x1, ACCESS _endasm INTCONbits.GIE = 1; // enable interupt // ghi 64 bytes data vào holding register trước khi bắt đầu write for (j=0;j<64;j++) { TABLAT = 0x43; // kí tự C sẽ đc ghi vào từng byte bộ nhớ _asm TBLWTPOSTINC _endasm } EECON1bits.WREN = 1; // bật bít write, cho phép ghi INTCONbits.GIE = 0; // tạm thời disable interrupt //EECON2 = 0x55; // unlock register //EECON2 = 0xAA; //EECON1bits.WR = 1; // bắt đầu ghi _asm MOVLW 0x55 MOVWF 0xfa7, ACCESS MOVLW 0xaa MOVWF 0xfa7, ACCESS BSF 0xfa6, 0x1, ACCESS _endasm while (EECON1bits.WR); // trong khi đang ghi thì chờ INTCONbits.GIE = 1; // enable interupt EECON1 = 0x00; // disable WREN , ko cho phép ghi nữa Cảm ơn các bác nhiều. |
Múi giờ GMT. Hiện tại là 11:31 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam