原理圖
配置位
大多數(shù)PIC程序在main.c文件的最頂部都有一個配置代碼塊。大部分內(nèi)容在相關(guān)之前不會被覆蓋,但重要的是在main.c文件中放入相同的代碼(如下所示)。
原因是PIC具有硬件(例如看門狗定時器)可以重置設(shè)備,這可能會導(dǎo)致意外的結(jié)果。因此,此處的配置代碼完全禁用所有這些額外功能,以確保它們不會妨礙您!
但是如果您很好奇,可以通過單擊生產(chǎn)》設(shè)置配置位來生成自己的配置代碼。
這將打開以下窗口,可用于更改位。完成所有更改后,單擊“生成源代碼以輸出”。然后,這將在輸出窗口中生成可以復(fù)制到主文件的代碼!
配置振蕩器
當我們用C編寫程序時,有些事情我們不必考慮,例如計算機將如何與鍵盤對話或CPU正在使用什么振蕩器。但是,微控制器與日常計算機不同,它們需要一定程度的配置才能正常運行。那么我們需要配置什么才能使PIC運行?通常,在運行主循環(huán)之前需要執(zhí)行兩個主要的配置代碼:振蕩器配置和I/O配置。
PIC器件由許多不同的模塊組成,包括定時器,存儲器和I/O外設(shè),但最重要的是CPU。 CPU或中央處理單元是實際以指令形式執(zhí)行操作的電路。當我們?yōu)檫\行的芯片創(chuàng)建C程序時,編譯器將C程序轉(zhuǎn)換為PIC的CPU可以理解的指令。與現(xiàn)有的其他CPU一樣,PIC中的CPU以離散的步驟工作,而不是瞬間完成。要使CPU執(zhí)行這些步驟(運行程序),需要一個時鐘源。該時鐘源可以來自外部振蕩器,晶振,甚至是PIC內(nèi)部的內(nèi)部振蕩器。為了簡化電路,這里的大多數(shù)項目都會將PIC配置為使用內(nèi)部振蕩器。
在PIC芯片上配置振蕩器要求我們調(diào)用一些特定指令并配置特定配置位。根據(jù)您使用的PIC,這將有所不同,因此本文中的代碼僅考慮PIC16F819。我們的主文件(在上一篇文章中創(chuàng)建)中的第一個任務(wù)是確保我們的振蕩器配置位設(shè)置為使用內(nèi)部振蕩器。
PIC16F819內(nèi)部振蕩器配置
設(shè)置該位不能配置振蕩器運行的速度;它只告訴PIC它將運行內(nèi)部振蕩器。
下一步是設(shè)置振蕩器的速度。由于PIC會逐步執(zhí)行指令,并且這些步驟發(fā)生在來自振蕩器的脈沖上,因此更快的振蕩器將導(dǎo)致更快的PIC,這意味著它將能夠每秒執(zhí)行更多指令。但有多少? PIC16和PIC18器件通常需要四個時鐘周期來執(zhí)行指令,因此經(jīng)驗法則是將振蕩器速度除以4,這就是PIC每秒指令的速度。
例如一個工作在8MHz的PIC每秒可以執(zhí)行大約200萬條指令,而工作在64MHz的PIC每秒可以執(zhí)行1600萬條指令。
那么,我們?nèi)绾闻渲盟俣龋窟@取決于每個PIC,但通常有一個名為OSCCON的寄存器可用于調(diào)整速度。找出所涉及寄存器的最佳方法是查看振蕩器配置章節(jié)下的器件數(shù)據(jù)表。以下是PIC16F819數(shù)據(jù)手冊中的摘錄,描述了第38頁上的不同速度(PDF)。
我們將配置我們的設(shè)備以8MHz運行,要做到這一點,我們需要將IRCF設(shè)置為111.在XC8中,可以使用它們的名稱直接訪問寄存器,可以使用位和點指令訪問特定位,并且可以訪問一組位(例如IRCF)作為單個值,如下所示。
OSCCON = 0b01110000(為整個OSCCON寄存器賦值)
OSCCONbits.IRCF = 0b111(將三個IRCF位分配給111)
OSCCONbits.IRCF0 = 1(為IRCF0指定二進制值1)
在我們的代碼中,我們將使用以下指令將振蕩器設(shè)置為8MHz:
配置和使用I/O端口
為了使我們的PIC能夠與外部電路進行交互,它需要能夠讀取和寫入其I/O引腳的數(shù)據(jù)。在處理PIC16F819上的I/O端口時,我們需要關(guān)注三個寄存器:
TRISA和TRISB寄存器(端口A和端口B上引腳的方向)
PORTA和PORTB寄存器(輸入和輸出寄存器)
ADCON1寄存器(引腳是數(shù)字引腳還是模擬輸入引腳)
在我們的大多數(shù)項目中,我們將處理數(shù)字輸出(如LED,顯示器等),因此務(wù)必確保I/O引腳未配置為模擬輸入。為確保這一點,我們將查看ADCON1寄存器(見第82頁(PDF))并設(shè)置相應(yīng)的PCFG位,以便與ADC相關(guān)的所有引腳都是數(shù)字引腳。
在我們的電路中,我們有一個LED輸出連接到RB2(引腳8),因此我們需要將其配置為輸出。為此,我們使用TRIS(TRISTATE)寄存器,該寄存器用于確定哪些引腳是輸入,哪些是輸出。
PIC上的每個端口最多可以為8位寬(RB0-RB7用于示例)并且TRIS寄存器中的每個位對應(yīng)于輸出引腳。如果某位為1(打開),則后續(xù)引腳為輸入,如果某位為0(關(guān)閉),則該位為輸出。
例如,如果TRISB等于0,則全部為8 PORT B上的引腳將是輸出。如果TRISB = 255(二進制為11111111),則PORT B上的所有引腳都是輸入。如果TRISB的值為0xF0(二進制為11110000),則PORT B(RB0-RB3)中的前四個引腳為輸出,后四個引腳(RB4-RB7)為輸入。請記住,二進制數(shù)首先從最右邊讀取!
有了這些知識,我們需要將RB2配置為輸出。這可以使用TRISB寄存器名稱并訪問TRISB2位來完成,如下所示。
但我們?nèi)绾巫x寫I/O銷?這在其他PIC上可能略有不同,但在PIC16F819上我們使用PORT寄存器,我們再次使用位和點訪問各個引腳!
端口引腳不限于一次讀取一個。您可以改為對整個PORT寄存器進行讀寫操作。這意味著您可以將PORT用作8位輸入/輸出端口,這在與字母數(shù)字LCD顯示器等設(shè)備交互時非常有用。
您可能想要記住的一個簡潔功能是您可以隨時配置I/O引腳!一分鐘你的引腳可能是一個輸入引腳,下一個它可能是一個輸出!重要的是你設(shè)置了TRIS位的正確值。
示例程序
本示例程序配置PIC16F819讀取連接到其引腳RA0(引腳17)的觸覺開關(guān),然后打開/關(guān)閉RB2上的LED(引腳) 8),取決于開關(guān)的狀態(tài)。
雖然這個例子看起來很基本,但你現(xiàn)在應(yīng)該可以編寫一個PIC設(shè)備來運行你的C程序和讀/寫端口。這已經(jīng)允許您與市場上的大多數(shù)硬件接口,并且您可以開始與您自己的電路和項目進行交互!
-
PIC
+關(guān)注
關(guān)注
8文章
507瀏覽量
87479 -
XC8
+關(guān)注
關(guān)注
0文章
8瀏覽量
13502
發(fā)布評論請先 登錄
相關(guān)推薦
評論