PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

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

dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 10-05-2008, 02:14 AM   #1
lehung85
Nhập môn đệ tử
 
Tham gia ngày: May 2008
Bài gửi: 4
:
Exclamation Vấn đề ghi vào EEPROM nội của dspic30f6015

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 :
Code:
#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;
}

thay đổi nội dung bởi: namqn, 10-05-2008 lúc 03:48 AM.
lehung85 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-05-2008, 05:19 AM   #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
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,
__________________
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-05-2008, 11:15 AM   #3
lehung85
Nhập môn đệ tử
 
Tham gia ngày: May 2008
Bài gửi: 4
:
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.
lehung85 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-05-2008, 06:53 PM   #4
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
Trích:
Nguyên văn bởi lehung85 View Post
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,
__________________
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-05-2008, 03:23 PM   #5
lehung85
Nhập môn đệ tử
 
Tham gia ngày: May 2008
Bài gửi: 4
:
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ỉ.
lehung85 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-05-2008, 01:29 AM   #6
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
Trích:
Nguyên văn bởi lehung85 View Post
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,
__________________
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-09-2008, 10:29 AM   #7
zxcv
Nhập môn đệ tử
 
Tham gia ngày: Aug 2008
Bài gửi: 3
:
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.
zxcv vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-09-2008, 06:03 PM   #8
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
Trích:
Nguyên văn bởi zxcv View Post
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,
__________________
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
namqn 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à 03:22 PM.


Đượ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