|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
絕對是pic12f675有問題,我想高手們也會回答錯(cuò) |
| 作者:sunzefeng 欄目:單片機(jī) |
我最近編了一個(gè)PIC12F675程序,由于沒有仿真器,所以只能燒一次試一次,真是被害慘了,絞盡腦汁也想不出問題所在,最后做了一個(gè)簡單的程序測試了一下,發(fā)現(xiàn)應(yīng)該是芯片的問題(因?yàn)槲蚁氩怀銎湟蚶碛蓙斫忉專?br>我的簡單測試程序如下: org 000h goto main org 0004h retfie main: call 3ff ;取晶振校正值 bsf STATUS,RP0 movwf OSCCAL ;晶振校正 movlw b'11000000' movwf TRISI0 ;設(shè)置所有口為輸出 clrw movwf ANSEL ;設(shè)置所有口為數(shù)字口 bcf STATUS,RP0 movlw 0ffh movwf GPIO ;點(diǎn)亮所有燈 bcf GPIO,0 ;關(guān)閉為燈1 goto $ end 我把675的5個(gè)口全用作數(shù)字口(除GP3),在每個(gè)引腳上接一個(gè)LED,當(dāng)然有限流電阻,燒寫設(shè)置,看門狗關(guān)閉,GP3設(shè)置為復(fù)位腳,有上拉電阻,選擇內(nèi)部4M,RC振蕩,GP4,GP5,都設(shè)為I/O口, 請大家分析一下,最后能亮幾個(gè)燈,分別是那幾個(gè),為什么? 如果大家沒有做過實(shí)驗(yàn)我想肯定說不出正確答案,等下我公布答案,看有沒有人能答對。 經(jīng)過反復(fù)實(shí)驗(yàn),有問題的指令為:bcf GPIO,0 如果改成bcf GPIO,1或者2,3,4,5,又會怎么? * - 本貼最后修改時(shí)間:2003-7-2 16:02:26 修改者:sunzefeng |
| 2樓: | >>參與討論 |
| 作者: martin 于 2003/7/2 15:33:00 發(fā)布:
一大堆錯(cuò)誤 1) movlw b'11000000' movwf GPIO ;設(shè)置所有口為輸出 設(shè)置IO口方向是用movwf TRISIO這條指令,看過數(shù)據(jù)手冊嗎? 2) movwf GPIO ;設(shè)置所有口為輸出 clrw movwf ANSEL ;設(shè)置所有口為數(shù)字口 GPIO寄存器在BANK0,ANSEL寄存器不在BANK0,你不知道怎么切換BANK嗎? 3)GP0,GP1是內(nèi)部模擬比較器輸入腳,你還需要設(shè)置CMCON才可以關(guān)掉比較器讓IO作為輸出的,具體去看數(shù)據(jù)手冊。 4)您難道不知道MPLAB有軟件模擬的功能嗎?象這樣簡單的錯(cuò)誤分分鐘就能查出來的,用的著慘到燒芯片嗎? 5)建議不要再犯這種“睡不著覺怨床歪”的通病,多看看數(shù)據(jù)手冊。 |
|
| 3樓: | >>參與討論 |
| 作者: lingl2 于 2003/7/2 15:35:00 發(fā)布:
bcf GPIO,0前加 nop試試 |
|
| 4樓: | >>參與討論 |
| 作者: sunzefeng 于 2003/7/2 16:36:00 發(fā)布:
剛才寫錯(cuò)了 斑主說的是,是應(yīng)該多看看數(shù)據(jù)手冊,不過我英文不好,習(xí)慣看翻譯過資料剛才是我寫錯(cuò)了,不好意思,我剛開始寫的程序是:(我開始部分是從MPLAP模板上復(fù)制下來的) ORG 0x000 ; processor reset goto main ; go to beginning of ORG 0x004 ; interrupt vector location retfie main: call 0x3ff bsf STATUS,RP0 movwf OSCCAL ; update register with factory c movlw b'11000000' movwf TRISIO ;設(shè)置口為輸出 clrf ANSEL ;設(shè)置為數(shù)字口 bcf STATUS,RP0 loop: movlw 0ff movwf GPIO ;所有燈亮 call delay bcf GPIO,2 ;熄滅第3個(gè)燈 call delay goto loop ;-------------delay-------------------- delay: movlw 0ff movwf count1 set_delay1: movlw 0ff movwf count2 set_delay11: decfsz count2,f goto set_delay11 decfsz count1,f goto set_delay1 return END ; directive 'end of program' 我的意圖是讓第3個(gè)燈一閃一閃,不過實(shí)際上,第1,2,3個(gè)燈都在閃,分析結(jié)果是:bcf GPIO,2 把第3個(gè)息滅同時(shí),又把1,2燈也息滅了,所以我懷凝芯片有問題而且如果把bcf GPIO,2換成其他如bcf GPIO,3,bcf GPIO,4,bcf GPIO,5,第1,2,個(gè)燈都會閃 * - 本貼最后修改時(shí)間:2003-7-2 16:42:49 修改者:sunzefeng |
|
| 5樓: | >>參與討論 |
| 作者: martin 于 2003/7/2 17:49:00 發(fā)布:
沒看到我上面說的第三條嗎? 沒看到我上面說的第三條嗎?如果你不設(shè)置CMCON(內(nèi)部模擬比較器的控制寄存器),上電時(shí)默認(rèn)GP0,GP1是比較器的兩個(gè)模擬輸入口。由于“Read Modify Write”的特性(詳見精華區(qū)中的《關(guān)于“Read Modify Write”》貼 ),bcf一個(gè)口線時(shí),從GP0,GP1兩個(gè)模擬輸入腳讀到的電平是零(數(shù)據(jù)手冊里說明了),改寫回去后就輸出零了,也就是你看到的現(xiàn)象,只要執(zhí)行bcf GPIO的任何一位,GP0,GP1都會清零。 很簡單,把CMCON的低三位全部置一就好了。 |
|
| 6樓: | >>參與討論 |
| 作者: sunzefeng 于 2003/7/3 11:33:00 發(fā)布:
太感謝斑主了! 按斑主說的一試,果然沒有這種現(xiàn)象了,原來這里涉及的地方這么多,哎,只能說自己是個(gè)進(jìn)底之蛙,想想我們這里的技術(shù)保密和斑主的無私奉獻(xiàn)真是太感動了 |
|
| 7樓: | >>參與討論 |
| 作者: eling 于 2003/7/4 13:24:00 發(fā)布:
為什么都不好好看資料,真是無奈 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |