![]() |
|
Tài trợ cho PIC Vietnam |
Bootloaders - Programmers - Debuggers - Emulators Những công cụ cần thiết để lập trình cho PIC/dsPIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Jan 2008
Bài gửi: 10
: |
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; 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 thay đổi nội dung bởi: namqn, 31-01-2008 lúc 07:43 PM. Lý do: bổ sung thông tin |
![]() |
![]() |
![]() |
#2 |
Trưởng lão PIC bang
|
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,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 thay đổi nội dung bởi: namqn, 02-02-2008 lúc 12:49 AM. |
![]() |
![]() |
![]() |
#3 |
Nhập môn đệ tử
Tham gia ngày: Jan 2008
Bài gửi: 10
: |
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é. |
![]() |
![]() |
![]() |
#4 |
Nhập môn đệ tử
Tham gia ngày: May 2009
Bài gửi: 1
: |
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. |
![]() |
![]() |
![]() |
|
|