PDA

View Full Version : Hỏi về table write trong PIC18FXXJXX


dvdsoul
31-01-2008, 01:04 PM
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:


int i;

TBLPTR = addr; // địa chỉ của vùng nhớ mà data đc ghi, ở đây mình dùng 0x2000

// ghi 64 bytes data vào holding register trước khi bắt đầu write
for (i=0;i<64;i++) {
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
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

Trước khi thực thi đoạn code này, vùng nhớ đã được xóa bằng một hàm erase(addr) (đã được kiểm chứng). Nhờ các bạn debug giúp mình. Cám ơn nhiều.

namqn
31-01-2008, 07:59 PM
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,

dvdsoul
01-02-2008, 04:15 PM
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é.

pdtung
03-09-2009, 06:40 PM
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.