關於PIC16F616微控制器的一些經驗

2021-09-21 23:10:34 字數 5201 閱讀 6953

4.pic的輸入輸出埠

在學習這個部分的時候,曾經遇到過一些問題.pic微控制器的引腳不多,大多都是復用引腳,例如ad、io、比較器、外接晶振等等,所以在配置埠的時候,一定要知道每個功能怎樣設定才能實現的,在這一小節中,我要講的是通用io口的設定問題.

pic16f616有12個io口,但是有乙個引腳(ra3)只能作為輸入引腳用,不能用作輸出,另外,a口具有電平變化中斷的功能,而c口沒有,在設計的時候要注意.

在設定的時候,一般要進行以下幾項設定:

(1)設定埠是模擬埠還是數字埠,可以通過暫存器ansel來設定.例如你想用ad,就要將相應的引腳設定為模擬輸入埠.

(2)如果你選擇的是數字埠,接下來就要設定埠的方向,是輸入還是輸出(ra3除外),可通過暫存器trisa(a口)或trisc(c口)來設定.

(3)設定埠的輸出電平,可以通過暫存器porta(a口)或portc(c口)來設定.

這是對io口的通用設定,但是這不是全部的設定,接下來的設定要看時a口還是c口了.對於a口,它有幾個特殊的功能:內部弱上拉、電平變化中斷、ra2/int引腳的沿中斷.

如果想要這些功能,就要對相應的暫存器進行設定.

弱上拉的設定:只有當引腳為輸出的時候弱上拉才有效,可以通過暫存器wpua來設定相應引腳的弱上拉,值得一提的如果開啟了弱上拉,會有多餘的電流浪費,這樣對於低功耗的設計是不可取的,但是如果在進行一些例如鍵盤電路設計的候,可以開啟弱上拉功能,這樣就不需要在鍵盤電路中加上拉電阻了.

電平變化中斷的設定:可以通過暫存器ioca來設定,但是首先要將相應引腳設定為數字埠且為輸入狀態.同時要將暫存器intcon的reie位設定為1,總中斷要允許(置暫存器intcon的gie位),如果設定相應引腳有這個功能,當此引腳電平發生的時候,就會產生乙個中斷,同時一些中斷標誌位被置上(intcon的raif位被置1),且總中斷gie被置為0.

在中斷服務程式中,要軟體清除raif位和重新置gie位才能繼續開啟此中斷.

ra2/int腳的沿中斷設定:同樣首先要將相應引腳設定為數字埠且為輸入狀態,設定intcon的intf位為1,表示允許int引腳外部中斷,暫存器option_reg的integd位可以設定是上公升沿中斷還是下降沿中斷.當發生中斷時,intcon的intf位被置為1,gie被清零,在中斷服務程式中,要軟體清除intf位和重新置gie位才能繼續開啟此中斷.

對於c口,不能產生電平變化中斷和沿中斷.

5.定時器

定時器是微控制器的乙個很重要的部分,用它可以產生很多不同的定時時間,來滿足程式設計的不同需求.pic16f616有三個定時器,分別是timer0、timer1、timer2.它們的用法不是很相同,下面來分別談談這三個定時器的用法和設定問題.

(1)timer0

timer0是乙個八位的計數器,它有乙個八位的計數暫存器tmr0,八位的預分頻器(與看門狗共用),可以選擇內部或者是外部時鐘源,有計數器溢位中斷的功能.

timer0可以作為乙個定時器或者計數器來使用,與timer0有關的暫存器有:tmr0,intcon,option_reg,trisa.

當timer0作為定時器來使用的時候,要設定option_reg的t0cs位為0,表示用的是內部時鐘,每乙個指令週期tmr0的值會增加(當沒有預分頻的時候),當tmr0被賦值的時候,會有兩個指令週期的延時.預分頻器可以和看門狗共用,可以由option_reg的psa位來設定,當psa 為0的時候分頻器選擇timer0,當psa為1的時候分頻器選擇看門狗.同時,與分頻器的分頻值可以通過暫存器option_reg來設定,設定的值可以由1:

2到1:256.當timer0的計數器tmr0計數從ffh到00h的時候會產生溢位,同時溢位標誌位(intcon暫存器的t0if位)會置位(無論timer0的中斷是否開啟),如果中斷已經開啟了(intcon暫存器的t0ie被置位),那麼就會產生溢位中斷.

t0if位需要軟體對其進行清零.

當timer0作為計數器來使用的時候,就要用外部時鐘源(option_reg的t0cs置1),每次當引腳t0ck1的沿到來時timer0的 tmr0會增加1,上公升沿和下降沿可以由option_reg的t0se來設定.中斷和timer0作為定時器使用時一樣.在我們程式設計序的時候,可以用 timer0進行定時或產生定時資訊,下面我來解釋定時器的定時時間的計算.

假設timer0用的時鐘源是內部的4mhz,那麼每條指令的執行時間就是 1us,設timer0的預分頻係數是1:256,tmr0的初值是6,那麼定時時間為:

256×(256-6)×1us=64ms

在程式設計的時候需要注意的是timer0的中斷是不能把微控制器從sleep的狀態喚醒的.

(2)timer1

timer1是乙個十六位的計數器.它有乙個計數暫存器對(tmr1h:tmr1l),時鐘源也是內外可選的,具有乙個2bit的預分頻器,可以同步或者非同步操作,具有中斷功能,但是溢位中斷只能在外部時鐘、非同步的模式才能將微控制器從sleep中喚醒,timer1具有捕獲/比較功能,還有被一些特殊事件觸發功能(eccp),比較器的輸出可以與timer1的時鐘同步.

下面來一一介紹這些功能.

在程式設計的時候也可以按照這樣的步驟來進行.設定暫存器t1con,時鐘源可以選擇外部或者內部的時鐘源,外部時鐘源可以選擇lp晶體.timer1在選擇內部時鐘時,可以執行在定時器的狀態,選擇外部時鐘的時候,可以執行在定時器或者是計數器狀態,工作於計數器狀態時可以選擇門限是高電平還是低電平計數.

這些都可以通過暫存器t1con來設定.

以下是t1con每個位的具體功能:bit1:timer1是否開啟位,當此位設為1時,timer1開啟,設為0時,timer1關閉;bit2:

時鐘源選擇位,置1時,選擇外部時鐘(t1ck1引腳的上公升沿),此位置0時,選擇的是內部時鐘,並且和t1acs(暫存器cm2con1中)配合,當 t1acs位為0時,時鐘為fosc/4,當t1acs位為1時,時鐘為fosc.bit2:t1sync:

定時器1的外部時鐘輸入同步位,當 tmr1cs位為1、t1sync位為1,定時器1被設定成與外部時鐘不同步,t1sync位為0時,定時器1被設定成與外部時鐘同步模式.bit3: t1oscen:

此位為1時timer1的時鐘選擇lp,為0時lp晶體被關閉.bit5-4:t1ckps:

timer1時鐘的預分頻係數設定,通過這兩位的是指,可以講timer1設定成1:1、1:2、1:

4、1:8幾種分頻值.bit6:

tmr1ge:只有當tmr1on位為1時才有效,當此位為 1時,timer1計數被timer1的門限控制,此位為0時,timer1正常計數.bit7:

t1ginv:此位為1時,timer1在門限為高時計數,此位為0時,timer1在門限為低時計數.

timer1的中斷程式設計:當timer1的計數產生溢位的時候,如果timer1中斷允許的話,就會產生中斷.中斷可以這樣設定,timer1的中斷允許位tmr1ie(在pie1暫存器中)置1,暫存器intcon的peie位置1,同時總中斷位gie(位於暫存器intcon中)要置為1.

當定時器產生中斷的時候,會把中斷標誌t1if置為1(位於暫存器pir1中),然後pc指標指向0004h位址.t1if位必須軟體清除.

(3)timer2

timer2的功能於timer1有些不同,timer2時乙個八位的計數器,有乙個八位的計數暫存器tmr2,timer2具有以下功能:有兩個分頻器,乙個是前分頻器,乙個是後分頻器.分頻可以軟體進行設定,另外,timer2的時鐘源是指令時間(fosc/4),timer2有乙個暫存器 pr2,此暫存器的功能是當tmr2增加到pr2的值時,將產生中斷,當然,中斷必須允許,然後pr2的值會重新變為00h.

下面來介紹timer2的程式設計:

timer2的控制暫存器t2con作用是設定timer2的開啟關閉和前後分頻的分頻係數,暫存器t2con的toutps<3:0> 位設定後分頻係數,可以被設定成1:1~1:

16;位tmr2on為1時,timer2開啟,為0時,timer2關閉;位t2ckps<1: 0>可以設定前分頻係數,可以被設定成1、4、16.

timer2的中斷可以這樣控制,允許timer2中斷位tmr2ie(位於pie1暫存器內)被置1時,timer2中斷被允許,被置0時, timer2中斷禁止.暫存器intcon的peie位置1,同時總中斷位gie(位於暫存器intcon中)置為1.通過上面的設定,timer2就可以產生中斷了.

當定時器產生中斷的時候,會把中斷標誌t2if置為1(位於暫存器pir1中),然後pc指標指向0004h位址.中斷標誌位t2if必須軟體清除.

下面是三個定時器的比較:

喚醒功能

其他功能

定時器timer0

內部或外部時鐘源,有乙個預分頻器.

定時器、

醒功能.

計數器值溢位時發生中斷

預分頻器與看門狗共用.

定時器timer1

內部或外部時鐘源,有乙個預分頻器

定時器、計數器

外部時鐘、非同步模式時可喚醒cpu

計數器值溢位時發生中斷

與比較器模組、

捕獲/比較模組共用

定時器timer2

有前分頻器和後分頻器

醒功能.

計數器值與預置值相等時發生中斷

pwm的產生需要此定時器

6.ad模組

pic16f616有乙個十位、八路的ad轉換器.其參考電壓可以為電源電壓vdd,也可以是外部參考電壓(vref引腳),當ad轉換完成後可以產生乙個中斷,此中斷可以把微控制器從睡眠狀態中喚醒.下面來介紹一下關於ad轉換的程式設計方法.

要使用乙個adc,要做的有一下幾件事情:

(1)設定埠,需要取樣模擬訊號的埠必須設定為模擬輸入狀態,如果設定為數字埠,將使轉換結果不正確,埠的模擬輸入可以由暫存器ansel來配置,在講ra口的時候已經說到了如何配置了.

(2)通道的選擇,有八路外部通道和三路內部通道,可以通過adcon0暫存器的chs<3:0>位來設定通道的選擇.

(3)參考電壓的選擇,參考電壓可以是vdd,也可以是外部參考電壓,可以通過adcon0暫存器的vcfg位來設定,當vcfg=0時,參考電壓為vdd,當vcfg=1時,參考電壓為外部參考電壓(來自vref引腳)

(4)adc的轉換格式,ad轉換後的結果儲存在乙個暫存器對裡面:adresh和adresl,但是ad轉換結果只有十位,設定ad轉換格式可以通過設定 adcon0的adfm位來選擇,當adfm=1時10位的ad結果的低八位儲存在adresl內,高兩位儲存在adresh內;當adfm=0時10位的ad結果的高八位儲存在adresh內,低兩位儲存在adresl內.

(5)ad時鐘源的選擇,暫存器adcon1專門來設定ad的時鐘源,adcs<2:0>不同組合,可以將ad的時鐘源設定為不同的頻率,可以為fosc/2、fosc/4、fosc/8、fosc/16、fosc/32、fosc/64和frc(內部rc).

基於一種PIC16F73微控制器超聲波潔牙機設計方案

致芯科技晶元解密研究所是國內權威的反向技術研究機構,也是由解密行業鼻祖的晶元解密研發小組分化發展起來的權威技術研究部門,是國內最早的以研究所形式存在的專業晶元解密技術研發機構。該潔牙機的基本工作過程如下 tl494為核心振盪電路在mpu控制下產生占空比可控的推挽脈衝輸出,由mpu序列傳送資料到振盪頻...

我的PIC微控制器除錯心得

我的pic微控制器除錯心得,給像我一樣曾經苦苦尋覓的初學者一點啟示 我是一位初學者,pic初學者,但是在微控制器行當已經混跡多年了。說句實話,c開發環境都大同小異,只不過燒寫和 大同小異。鑽研了兩天,收到了很多回應和啟發。下面應soso的請求,把最近的除錯心得和大家分享 1 先說說我要做的東西 說來...

替代PIC的台系微控制器

2009 超牛台系微控制器替代microchip pic微控制器完全對照表 microchip微控制器當中pic12,pic16系列雖是其低端產品,但應用量卻是非常大,基於這種原因,就出現了microchip的替代產品。除了抗干擾性能還比不上以外,其它如外觀,腳位排列,甚至就連指令都差不多,有些公司...