ตุลาคม 17, 2017, 12:56:30 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: สอบถามเรื่องการแจ้งเตือนของ MPLAB C30 ฟังค์ชันก์อ่านEEPROM ครับ  (อ่าน 315 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
surasak
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 3


| |
« เมื่อ: เมษายน 11, 2017, 05:19:31 pm »

ผมใช้ MPLAB C30 V3.31 คอมไพโค้ด ฟังค์ชันก์อ่านค่าจาก EEPROM ปรากฎว่า เมื่อ คอมไพมีการแจ้งเตือนว่า

Eeprom.c: In function 'eeprom_read_word':
Eeprom.c:41: warning: 'WREG4' access is not safe to use within C

ตอนนี้ยังไม่สามารถอ่านค่า จากEEPROM ได้ครับ อยากสอบถามว่าการแจ้งเตือนนี้เกิดจากสาเหตุเกิดจากอะไรครับ ขอบคุณครับ

 u16 eeprom_read_word(unsigned long addr)
{
   
   __asm__("MOV W1,TBLPAG");   // Keep  High byte address
   __asm__("TBLRDL [W0],W4");   // Load data into W4   
   return(WREG4);
}
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8267


ShadowWares


| |
« ตอบ #1 เมื่อ: เมษายน 14, 2017, 08:59:31 am »

การแจ้งเตือนลักษณะนี้เป็นเรื่องปกติครับ เพราะมีการเข้าถึง register โดยตรง ซึ่ง c-compiler ตีความว่ามีความเสี่ยง
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
surasak
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 3


| |
« ตอบ #2 เมื่อ: เมษายน 18, 2017, 03:37:41 pm »

MPLAB V8.92  C30 V3.31
เรื่อง ปัญหาในการเขียนและอ่านค่า EEPROM

    ปัญหาที่เจอในตอนนี้คือเมื่อผม debug  โค้ดด้านล่าง ปรากฎว่า มีริจิตเตอร์ตัวหนึ่งที่ค่าไม่เปลี่ยนแปลง NVMKEY ไม่เปลี่ยนแปลง เมื่อผมใช้คำสั่งใช่คำสั่ง
__asm__ ("MOV #0x55,W0");      // Lanch command step 1
__asm__ ("MOV W0,NVMKEY");

เพื่อที่จะให้ ,NVMKEY เก็บค่า 0x55 
ปรากฎว่า มันยังคงเป็น 0x00 ไม่เปลี่ยนตามที่ได้เขียนโค้ด อยากสอบถามว่า ปัญหานี้ เกิดจากสาเหตุได ควรจะแก้ไขอย่างไร ขอบคุณครับ


_EEPROM_C void eeprom_erase_word(unsigned long addr){
   __asm__ ("MOV W1,NVMADRU");   // Keep  High byte address
   __asm__ ("MOV W0,NVMADR");   // Write data to table
   __asm__ ("MOV #0x4044,W0");   // Load comamnd
   __asm__ ("MOV W0,NVMCON");
   __asm__ ("DISI #5");
   __asm__ ("MOV #0x55,W0");      // Lanch command step 1
   __asm__ ("MOV W0,NVMKEY");
   __asm__ ("MOV #0xAA,W1");   // Lanch command step 2   
   __asm__ ("MOV W1,NVMKEY");
   _WR=SET;
   while(_WR) continue;
   _WREN=CLR;
บันทึกการเข้า
Somisaki
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #3 เมื่อ: เมษายน 26, 2017, 11:41:31 am »

ข้อมูลนี้เป็นประโยชน์กับผมมากเลยครับ
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: