![]() |
|
Tài trợ cho PIC Vietnam |
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 |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: May 2008
Bài gửi: 4
: |
![]() 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. |
![]() |
![]() |
![]() |
#2 |
Trưởng lão PIC bang
|
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 |
![]() |
![]() |
![]() |
#3 |
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.
|
![]() |
![]() |
![]() |
#4 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
![]() |
![]() |
![]() |
#5 |
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ỉ.
|
![]() |
![]() |
![]() |
#6 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
![]() |
![]() |
![]() |
#7 |
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.
|
![]() |
![]() |
![]() |
#8 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
![]() |
![]() |
![]() |
|
|