Re: PIC18F 內部EEPROM讀寫函式
|
||||
---|---|---|---|---|
資深會員
|
參照:
還是看不懂為什麼那3行C source code 需要改用asm 來寫 我用的是pic16f87x 我都是直接用C寫的, compilier 的結果如下 應該可以看得出來, c compliier後的結果和asm的寫法是一樣的 ================================= ; EECON2=0x55; C 的source code MOVLW .85 MOVWF EECON2 ; EECON2=0xAA; C 的source code MOVLW .170 MOVWF EECON2 ; WR=1; C 的source code BSF 0x18C,WR ================================= 程式確定可以正常寫入讀出.. 還是pic16 和18的程序是否有所差別??
發表於: 2005/6/21 10:54
|
|||
|
Re: PIC18F 內部EEPROM讀寫函式
|
||||
---|---|---|---|---|
高級會員
|
我ㄧ開始設好像也不行
你的這邊這樣好像不能直接改變EECON2 EECON2 = 0x55; EECON2 = 0xaa; 要這樣 _asm MOVLW 0X55 MOVWF EECON2,0 MOVLW 0XAA MOVWF EECON2,0 BSF EECON1,1,0 _endasm ㄧ開始我也是那樣設~~但是涉不過去~~用DEBUGER模式看EECON2好像不會改變,用那5行組語後就寫的過去了 void wrEEPROM(void) { EECON1bits.EEPGD = 0; EECON1bits.CFGS = 0; EECON1bits.WREN = 1; INTCONbits.GIE = 0; _asm MOVLW 0X55 MOVWF EECON2,0 MOVLW 0XAA MOVWF EECON2,0 BSF EECON1,1,0 _endasm INTCONbits.GIE = 1; while (!PIR2bits.EEIF); PIR2bits.EEIF = 0; EECON1bits.WREN = 0; } 我是先把要存的值放到EEDATA 位址放在EEADDR 然後就呼叫這個副程式就可以了你試試看吧 呼叫前的程式 PIR2bits.EEIF = 0; EEADR = i; EEDATA = j; wrEEPROM();
發表於: 2005/6/21 10:18
|
|||
|
Re: PIC18F 內部EEPROM讀寫函式
|
||||
---|---|---|---|---|
高級會員
|
依照範例然後將
INTCONbits.GIE = 0; INTCONbits.GIE = 1; 拿掉就可以了,試試看吧
發表於: 2005/6/18 23:34
|
|||
|
Re: PIC18F 內部EEPROM讀寫函式
|
||||
---|---|---|---|---|
高級會員
|
>>可參考左邊的檔案下載區中就有範例程式
// * Define byte data into the Internal EEPROM #pragma romdata EEDATA rom unsigned char EE_Data[] = {'H','i','-','T','e','c','h',0x00,}; #pragma romdata 請問一下根據範例程式,是不是這樣就可以設定初值... 但我的好像不行,在hex檔檔尾並沒有加入'值' ORG 0xf00000 DE "Test Data",0,1,2,3,4,5 ASM 的就正常,
發表於: 2005/6/17 19:10
|
|||
|
訪客
|
Re: PIC18F 內部EEPROM讀寫函式
|
|||
---|---|---|---|---|
歹勢
那個範例程式我也試過了, 就是因為不行才改成目前這個樣子. 不知是否有其他該注意的細節沒注意到... 你指的是這個嗎? void EE_Write (unsigned int EE_Address, unsigned char EE_Data) { PIR2bits.EEIF = 0; EEADRH = (EE_Address>>8) & 0xFF; EEADR = EE_Address & 0xFF; EEDATA = EE_Data; EECON1bits.EEPGD = 0; EECON1bits.WREN = 1; INTCONbits.GIE = 0; _asm MOVLW 0X55 MOVWF EECON2,0 MOVLW 0XAA MOVWF EECON2,0 BSF EECON1,1,0 _endasm INTCONbits.GIE = 1; while (!PIR2bits.EEIF); PIR2bits.EEIF = 0; EECON1bits.WREN = 0; } unsigned char EE_Read (unsigned int EE_Address) { EEADRH = (EE_Address>>8) & 0xFF; EEADR = EE_Address & 0xFF; EECON1bits.EEPGD = 0; EECON1bits.RD = 1; return EEDATA; } |
||||
|
Re: PIC18F 內部EEPROM讀寫函式
|
||||
---|---|---|---|---|
高級會員
|
可參考左邊的檔案下載區中就有範例程式
發表於: 2005/6/17 17:40
|
|||
人生最長久的擁有是珍惜 但是大都在失去後才發現
|
||||
|
訪客
|
Re: PIC18F 內部EEPROM讀寫函式
|
|||
---|---|---|---|---|
EEDATA = WREG;
本來也是沒加,一樣不行. 加了還是不行. 傷腦筋... |
||||
|
Re: PIC18F 內部EEPROM讀寫函式
|
||||
---|---|---|---|---|
資深會員
|
參照:
抱歉~~說聲明 我沒寫過18的EEPROM讀寫喔, 個人是覺得讀取EEDATA 應該不需要加 EEDATA = WREG; 這一行吧
發表於: 2005/6/17 16:37
|
|||
|
訪客
|
PIC18F 內部EEPROM讀寫函式
|
|||
---|---|---|---|---|
請各位先進幫我看一下PIC 18F 內部EEPROM讀寫函式是否有誤, 因為寫入及讀出資料不正確, 謝謝!
unsigned char ReadEEPChar(int Addr) { EEADRH = Addr / 256; EEADR = Addr % 256; //Disable Interrupt INTCONbits.GIE = 0; EECON1bits.EEPGD = 0; //EECON1bits.CFGS = 0; EECON1bits.RD = 1; EEDATA = WREG; //Enable Interrupt INTCONbits.GIE = 1; return(EEDATA); } bool WriteEEPChar(int Addr, unsigned char wrData) { int writetimes = 0; unsigned long counter; // 寫入至多5次, 以防止寫入失敗 do { EEADRH = Addr / 256; EEADR = Addr % 256; EEDATA = wrData; EECON1bits.EEPGD = 0; EECON1bits.WREN = 1; //Disable Interrupt INTCONbits.GIE = 0; EECON2 = 0x55; EECON2 = 0xaa; EECON1bits.WR = 1; //Enable Interrupt INTCONbits.GIE = 1; counter = 0; while(PIR2bits.EEIF == 0) { counter++; if (counter > 0xfffe) break; } EECON1bits.WREN = 0; PIR2bits.EEIF = 0; if (counter > 0xfffe) writetimes++; else return true; }while (writetimes < 5); return false; } |
||||
|