PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Bootloaders - Programmers - Debuggers - Emulators

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Bootloaders - Programmers - Debuggers - Emulators Những công cụ cần thiết để lập trình cho PIC/dsPIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 31-01-2008, 01:04 PM   #1
dvdsoul
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
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.

thay đổi nội dung bởi: namqn, 31-01-2008 lúc 07:43 PM. Lý do: bổ sung thông tin
dvdsoul vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-01-2008, 07:59 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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.
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-02-2008, 04:15 PM   #3
dvdsoul
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é.
dvdsoul vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-09-2009, 06:40 PM   #4
pdtung
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.
pdtung vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 05:02 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam