Re: 在PIC18f85j10中使用AD0遇到的一些問題,多謝大家能够幫幫我
|
||||
---|---|---|---|---|
新會員
|
問題已經解决了.
發表於: 2007/12/27 11:32
|
|||
|
版主您好,在PIC18f85j10中使用AD0遇到的一些問題
|
||||
---|---|---|---|---|
新會員
|
在PIC18F85J10中使用AD0做AD變換,我的程序這樣:
void PortInit(void) { TRISA = 0x1d; TRISB=0xfe; TRISC=0x91; TRISD=0x00; TRISE=0x00; TRISF=0x02; TRISH=0x00; TRISG=0x00; TRISJ=0xf0; } void CVPinit(void) { INTCON=0x20; PIR1=0x13; PIE1=0x23; CMCON=0x07; CVRCON=0x00; ADCON0 = 0x01; ADCON1 = 0x0c; ADCON2 = 0xBE; //40MHZ晶振 } unsigned int FADCDone(void) { unsigned int FADCtemp; FADCdat = 0; ADCON0 = 0x01; ADCON0bits.GO_DONE = 1; while(!PIR1bits.ADIF); PIR1bits.ADIF = 0; ADCON0bits.GO_DONE = 0; FADCtemp = ADRESH; FADCtemp <<= 8; FADCtemp += ADRESL; return FADCtemp; } void main(void) { unsigned int tdata; PortInit(); CVPinit(): tdata= FADCDone(); } AD變換得到的AD值總是一部分值是實際轉換出來的AD值,時不時的冒出一個AD值是0x200,我就不清楚0x200是怎麽得出來的,也不知我這軟件編寫的有什么錯誤?硬件上是采用3.3V基準,多謝大家能够幫幫我啊
發表於: 2007/12/15 8:28
|
|||
|
Re: 用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
新會員
|
我在bootloader程序中這樣編寫
#define MPROG_START 0x000000 #define RM_RESET_VECTOR 0x1000 #define RM_HIGH_INTERRUPT_VECTOR 0x001008 #define RM_LOW_INTERRUPT_VECTOR 0x001018 void high_isr(void); void low_isr(void); #pragma code high_vector=0x0008 void interrupt_at_high_vector(void) { _asm goto high_isr _endasm } #pragma code #pragma interrupt high_isr unsigned char Cnt=0; void high_isr(void) { unsigned char isr_tmp; if(bootloader==0x5a) { _asm goto RM_RESET_VECTOR+0x08 _endasm } } #pragma code low_vector=0x0018 void interrupt_at_low_vector(void) { _asm goto low_isr // goto RM_LOW_INTERRUPT_VECTOR _endasm } #pragma code #pragma interrupt low_isr void low_isr(void) { if(bootloader==0x5a) { _asm goto RM_RESET_VECTOR+0x18 _endasm } } #pragma code bootloader的lkr函數如下: // $Id: 18f85j10i.lkr,v 1.2.2.1 2006/01/08 22:33:35 curtiss Exp $ // File: 18f85j10i.lkr // Sample ICD2 linker script for the PIC18F85J10 processor LIBPATH . FILES c018i.o FILES clib.lib FILES p18f85j10.lib CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED CODEPAGE NAME=boot START=0x2A END=0xfff CODEPAGE NAME=rm_vectors START=0x1000 END=0x1029 PROTECTED CODEPAGE NAME=page START=0x102A END=0x7FF7 CODEPAGE NAME=config START=0x7FF8 END=0x7FFD PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED ACCESSBANK NAME=accessram START=0x0 END=0x5F DATABANK NAME=gpr0 START=0x60 END=0xFF DATABANK NAME=gpr1 START=0x100 END=0x1FF DATABANK NAME=gpr2 START=0x200 END=0x2FF DATABANK NAME=gpr3 START=0x300 END=0x3FF DATABANK NAME=gpr4 START=0x400 END=0x4FF DATABANK NAME=gpr5 START=0x500 END=0x5FF DATABANK NAME=gpr6 START=0x600 END=0x6FF DATABANK NAME=gpr7 START=0x700 END=0x7F3 DATABANK NAME=dbgspr START=0x7F4 END=0x7FF PROTECTED ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED SECTION NAME=CONFIG ROM=config STACK SIZE=0x100 RAM=gpr6 主程序中這樣定義 #pragma code _HIGH_INTERRUPT_VECTOR = 0x001008 void interrupt_at_high_vector(void) { _asm GOTO high_isr _endasm } #pragma code c018i.c作爲source code,改變如下 #pragma code _entry_scn=0x001000 void _entry (void) { _asm goto _startup _endasm } 主程序的lkr函數是: // $Id: 18f85j10i.lkr,v 1.2.2.1 2006/01/08 22:33:35 curtiss Exp $ // File: 18f85j10i.lkr // Sample ICD2 linker script for the PIC18F85J10 processor LIBPATH . //FILES c018i.o FILES clib.lib FILES p18f85j10.lib CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED CODEPAGE NAME=boot START=0x2A END=0xfff PROTECTED CODEPAGE NAME=rm_vectors START=0x1000 END=0x1029 PROTECTED CODEPAGE NAME=page START=0x102A END=0x7FF7 CODEPAGE NAME=config START=0x7FF8 END=0x7FFD PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED ACCESSBANK NAME=accessram START=0x0 END=0x5F DATABANK NAME=gpr0 START=0x60 END=0xFF DATABANK NAME=gpr1 START=0x100 END=0x1FF DATABANK NAME=gpr2 START=0x200 END=0x2FF DATABANK NAME=gpr3 START=0x300 END=0x3FF DATABANK NAME=gpr4 START=0x400 END=0x4FF DATABANK NAME=gpr5 START=0x500 END=0x5FF DATABANK NAME=gpr6 START=0x600 END=0x6FF DATABANK NAME=gpr7 START=0x700 END=0x7F3 DATABANK NAME=dbgspr START=0x7F4 END=0x7FF PROTECTED ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED SECTION NAME=CONFIG ROM=config STACK SIZE=0x100 RAM=gpr6 這樣編寫bootloader和主程序是合理的嘛?機器一直到執行完bootloader程序后就跑不起來了,不知道這個問題應該怎麽查找。 我在MPLINK的數據手册中查找到當bootloader函數用MPASM編寫時可以用版主給的方法,但用C語言編寫bootloader函數時用的是跟版主不一樣的方法。不知道是否有區別,我也用另外一種方法嘗試去做了,也是同樣的錯誤。 實在不知該怎么解决這個問題了,謝謝版主能够指點一下。
發表於: 2007/12/11 16:27
|
|||
|
Re: 用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
新會員
|
版主,您好!
我在程序中增加了中斷的轉移 #pragma code high_vector=0x1008 void interrupt_at_high_vector(void) { _asm GOTO high_isr _endasm } #pragma code #pragma interrupt high_isr void high_isr(void) 用ICD2調試發現不能正常的進入中斷,就不知這是爲什麽了? 還有我的bootloader程序是用C語言寫的,可以用您說得方法修改嘛?謝謝版主能幫助我~^_^
發表於: 2007/12/11 8:19
|
|||
|
Re: 用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
新會員
|
我明白版主的意思了,我將c018i.c另存爲一個.c文件,保存再source files中,將c018i.c文件改爲如下:
#pragma code _entry_scn=0x001000 void _entry (void) { _asm goto _startup _endasm } 在18f85j10i.lkr中改變如下: //FILES c018i.o FILES clib.lib FILES p18f85j10.lib CODEPAGE NAME=vectors START=0x0 END=0x1029 PROTECTED CODEPAGE NAME=page START=0x102A END=0x7FF7 CODEPAGE NAME=config START=0x7FF8 END=0x7FFD PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF 幷且將主程序的中斷地址也改變了,如下: #pragma code high_vector=0x1008 這樣改過以後,生成了hex文件,并在bootloader中加載了,但是程序不能正常運行。 所以這樣改過以後程序是否是正確的,我又試著通過這樣的方法將地址還是改爲0x0000,就是改變如下: #pragma code _entry_scn=0x000000 void _entry (void) { _asm goto _startup _endasm } 在18f85j10i.lkr中改變如下: //FILES c018i.o FILES clib.lib FILES p18f85j10.lib CODEPAGE NAME=vectors START=0x0 END=0x0029 PROTECTED CODEPAGE NAME=page START=0x002A END=0x7FF7 CODEPAGE NAME=config START=0x7FF8 END=0x7FFD PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF 幷且將主程序的中斷地址也改變了,如下: #pragma code high_vector=0x0008 下載了這個程序,還是不能正常運行,我想知道我這樣改是否正確?謝謝大家的幫助^_^
發表於: 2007/12/10 10:12
|
|||
|
Re: 用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
新會員
|
很感謝版主關注我的問題,這個問題我已經想了好久了。
我想問一下版主,我在source files中添加了C:\MCC18\src\traditional\startup中的c018i.c文件編譯后出現了以下錯誤Error - section '_entry_scn' type is non-overlay and absolute but occurs in more than one input file. 我怎麽在source files中添加c018i.c文件呢。 我的LKR檔裡只有18f85j10i.lkr,因爲我用的是ICD2調試,沒有您說得FILE c018i.o 的檔案,所以我不知道怎麽删除,您說得“前面加入 // File. c018i.0 的方式處理”,我也不是很明白。 請版主能够指點一下,非常感謝!
發表於: 2007/12/8 10:36
|
|||
|
用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
新會員
|
之前用PICC寫bootloader函數時,可以通過設定Specify offset for ROM確定函數的起始地址,但用MCCP18后我不知道怎麽設定起始地址,我只知道可以在c018i.c中改變_entry_scn的起始地址來改變復位地址,但是改變以後從hex文件看,0x100地址之前還是編譯了程序,我迫切想知道怎麽能做到程序從0x0100地址開始,這個問題我已經研究了好久了也沒有結果。謝謝大家!
#pragma code _entry_scn=0x000100 void _entry (void) { _asm goto _startup _endasm } #pragma code _startup_scn
發表於: 2007/12/7 14:25
|
|||
|