PDA

View Full Version : Vấn đề ghi vào EEPROM nội của dspic30f6015


lehung85
10-05-2008, 02:14 AM
Mình đang muốn sử dụng eeprom nội của dspic30f , việc ghi , đọc hay xóa dữ liệu trong eeprom thì mình đã giải quyết được.Nhưng vấn đề là mình không thể ghi đi ghi lại tại cùng một địa chỉ trong eeprom được.Nếu cố thực hiện thì dữ liệu tại đó sẽ bị xóa .Không hiểu là do cấu tạo của thằng này nó thế hay là do code bị sai.Rất mong mọi người giải đáp cho .Thanks!

Dưới đây là code mà mình sử dụng :
#ifndef EEPROM_H
#define EEPROM_H

#define _row 0x4045
#define _word 0x4044
void unlockEEPROM()
{
asm("DISI #28");
asm("MOV #0x55,W0");
asm("MOV W0,NVMKEY");
asm("MOV #0xAA,W0");
asm("MOV W0,NVMKEY");
NVMCONbits.WR=1;
while(NVMCONbits.WR){};
}

unsigned int readEEPROM(unsigned int address)
{
unsigned int data=0;
// asm("MOV #0xFC20,W0");
WREG0= address;
asm("MOV #0x7F,W1" );
asm("MOV W1,TBLPAG");
asm("TBLRDL [W0],W4");
asm("TBLRDH [W0],W5");
data=WREG4|(WREG5<<8);
return data;

}

void writeEEPROM(unsigned int address, unsigned int data)
{
NVMCON=0x4004; // ghi 1 word
TBLPAG=0x7f;
WREG6=&data;
WREG7=address;
asm("TBLWTL [W6],[W7]");
unlockEEPROM();
}
// che do mode=_row thi address phai la boi cua 10
void eraseEEPROM(unsigned int address,unsigned char mode)
{
NVMCON=mode; //
NVMADR=address;//
NVMADRU=0x7F ;//
unlockEEPROM();

}
#endif


****************************************
trong chương trình chính :

void _ISR _ADCInterrupt(void)
{

adc=ADCBUF8;
adc=adc&0xfffe;
eraseEEPROM(0xF000,_word);
writeEEPROM(0xF000,adc);
d1=readEEPROM(0xF000);

lcd_gotoxy(0,0);lcd_putnum(adc);
lcd_gotoxy(8,0);lcd_putnum(d1);
delayms(150);
_ADIF=0;
}

namqn
10-05-2008, 05:19 AM
Trong hàm eraseEEPROM() của bạn, đối số thứ hai của bạn được khai báo có kiểu unsigned char. Trong code của bạn thì đối số đó được gán cho NVMCON, là một thanh ghi 16-bit.

Như vậy hàm eraseEEPROM() của bạn có thực hiện được chức năng xóa hay không? Nếu không xóa được thì có ghi được hay không?

Thân,

lehung85
10-05-2008, 11:15 AM
Cám ơn bác đã chỉ ra lỗi. Đúng là vì cái lỗi vớ vẩn đấy mà em mất bao nhiêu thời gian .Chắc tại trong lúc coding đầu óc để đi đâu đây mà. Chán quá.Mà tệ nhất là nó lại cho phép ghi lần đầu tiên chứ.Cho nên em không tài nào đoán được bệnh. Phù........ Cuối cùng thì cũng xong.

namqn
10-05-2008, 06:53 PM
Cám ơn bác đã chỉ ra lỗi. Đúng là vì cái lỗi vớ vẩn đấy mà em mất bao nhiêu thời gian .Chắc tại trong lúc coding đầu óc để đi đâu đây mà. Chán quá.Mà tệ nhất là nó lại cho phép ghi lần đầu tiên chứ.Cho nên em không tài nào đoán được bệnh. Phù........ Cuối cùng thì cũng xong.
Lần đầu tiên, khi bạn không xóa được EEPROM, thì EEPROM vẫn ở trạng thái bị xóa, do thao tác xóa chip được thực hiện khi nạp chương trình cho chip. Do đó, bạn vẫn ghi được lần đầu tiên vào EEPROM, mặc dù thao tác xóa không thành công (chính xác hơn là bạn không gửi được lệnh xóa đến dsPIC). Từ lần thứ hai trở đi, nội dung của ô nhớ EEPROM không còn ở trạng thái bị xóa, mà bạn không thực hiện thao tác xóa, nên mới sinh ra lỗi khi ghi.

Thân,

lehung85
11-05-2008, 03:23 PM
Em dùng eeprom để ghi dữ liệu ADC của con dspic6015, scan kênh 0,ứng dụng chỉ cần dùng 8 đầu vào trên từ 8->15 thôi, thế mà khi dùng ngắt để scan em vẫn phải đặt số lần chuyển đổi trước khi sảy ra ngắt là 16 nếu không sẽ không thể đọc được dữ liệu. Cái này của dsPic có lẽ không được hợp lý lắm bác nhỉ.

namqn
12-05-2008, 01:29 AM
Em dùng eeprom để ghi dữ liệu ADC của con dspic6015, scan kênh 0,ứng dụng chỉ cần dùng 8 đầu vào trên từ 8->15 thôi, thế mà khi dùng ngắt để scan em vẫn phải đặt số lần chuyển đổi trước khi sảy ra ngắt là 16 nếu không sẽ không thể đọc được dữ liệu. Cái này của dsPic có lẽ không được hợp lý lắm bác nhỉ.
Tôi tin là bạn có thể dùng dsPIC để scan 8 ngõ vào tùy ý, và tạo ra ngắt sau 8 lần chuyển đổi.

Thân,

zxcv
03-09-2008, 10:29 AM
Em đọc datasheet của 12f683 phần EEPROM thì thấy: "A byte write automatically erases the location and writes the new data (erase before write)." tức là EEPROM sẽ tự động xóa trước khi ghi, vậy sao ở đây mình lại phải làm động tác xóa rồi mới ghi được.

namqn
03-09-2008, 06:03 PM
Em đọc datasheet của 12f683 phần EEPROM thì thấy: "A byte write automatically erases the location and writes the new data (erase before write)." tức là EEPROM sẽ tự động xóa trước khi ghi, vậy sao ở đây mình lại phải làm động tác xóa rồi mới ghi được.
Bạn tự đọc lại bài viết của bạn nhé. Datasheet mà bạn nói đến là của PIC12F683, còn luồng này đang bàn về dsPIC30F6015!

Datasheet của dsPIC30F6015 nêu rằng trước khi ghi vào EEPROM thì phải xóa.

Thân,