2012年8月18日 星期六

linux embedded嵌入式系統初學

不是電子相關科系的,突然就鑽進了單晶片的世界,第一堂課老師就叫大家畫一個USB電子電路圖,要學的可多了,找到了一個講PIC單晶片的初學資料,怕忘了在那找的,就放這了。

剛才看到一個PIC的板子 不知道它跟51的區別 特此 去相關論壇上找到這篇文章,以求給跟我類似的人掃掃盲  高球可以飄過 (*^__^*) 嘻嘻……

前段時間,小弟閒逛,偶發現一論壇,一前輩講pic系列,講得那個通俗啊!估計識字的都能看的懂,好東西不敢獨享,拿出來與大家分享,未經作者同意擅自轉載,請作者諒解,不過既然前輩那能這麼無私,我這樣也不為過吧,呵呵! 

閒話少說,上菜了! 


單片機入門不難------談PIC系列(轉自礦石收音機論壇---嶗山) 


罈子裡的老兄小弟,如果你已經多次想進單片機之門而未入,如果你有很多空閒時間想打發,如果你玩收音機感到疲勞想換個口味,如果。。。 
那就聽小弟我白話白話,反正我們這些老大難也沒有什麼重要的事情做。。。。 

閒言少許,話說人間事物的學習,不外兩類:一類入門易,精通難比如礦石機,再比如練書法誰都會寫兩下,可寫好卻不是一朝一夕的事兒。另一類則入門難精通易,比如超外差收音機,學會需要各種放大、振蕩、反饋、混頻、中頻、統調等等,但是一旦你學會,做出一個高質量的收音機,確也不是難事。單片機屬於後者,所以無論如何,你得用些時間,學習一些新名詞並理解,甚至還得花一些小錢。但是,一旦你掌握,其樂趣也像收音機一樣,很有吸引力的。本故事說給一點也不懂計算機,甚至數字電路的引引道。一般入門應該有保障。 

改為:  本故事說給懂電工、電子、邏輯電路的老傢伙和半老傢伙,如果對電子一竅不通人講那我勸你也別瞎子點燈了,要是邊講基礎邊講pic這書就不知唱到何年何月啦。 

    單片機不同於收音機,收音機的任務最終就是聽好聲音一個,單片機可以做很多事情,要你來安排它的工作。安排它就先的認識它,熟悉它 
請看圖1 


這個8條腿的小螃蟹就是我們的第一頓飯,只要把它吃下去,以後的大餐就好辦了。 
第1、8條腿接電源 +5V  和 地線。頭兩條腿是螃蟹鉗子,好吃的很。 現在剩下了 6 條腿 
第2、3條腿 使用時外接一個晶振的東西  我們接一個 4 MHz的。 
第4條腿是復位腳,是一個信號輸入腳。單片機正常運行時接高電平。當有一個低電平脈衝輸入到這個腳時單片機就復位。所謂復位就是單片機內部所有的工作部件統統回到規定的狀態,程序也復位到頭一句上開始逐條運行。例如,你設計的一個報警鎖定的 LED紅燈亮後,當需要解除報警時,用一個按鈕給這個腳瞬時接地一下,相當於給它一個夫脈衝,系統就復位了,led燈就熄滅了,程序從頭開始。 

以上5個腳,幾乎所有單片機都有,包括世界上最複雜的,和世界比較簡單的單片機-----PIC12CE519 

輪到底幾條腿啦?奧是第5條腿,這條叫單片機的 I/O 腳。就是輸入輸出腳。你可通過程序動態地控制它作為輸入或輸出,作為輸出時可以程序控制它的輸出電平為高1或低0。所以,他的工作狀態有四種:輸入0,輸入1,輸出0,輸出1 

剩下的兩條腿和第5腳功能一個樣。 
原來編輯帖子是有時間限制的阿。也好,俺學乖了,先在記事本上編輯,在複製粘帖。 
歡迎各位捧場,在此不敢以講課回答問題的姿態出現,不過各位的問題我盡力而為。 

       上邊我們已經把8條腿消化掉了,其實我們要弄明白的也就3只腿,我們再簡單一些,先整明白兩條腿,即GP0,GP1.這兩條腿低級一點的用法,可以控制繼電器,LED燈,高級一些的用法可以進行I2C總線,RS232總線的通信,作為擴展輸入可以模擬出來A/D轉換器(6--7bit),可以測量一個電阻的粗略值。作為輸出也可以直接推動揚聲器奏出音樂。這是後話暫且不提。 

現在要控制使用這兩隻腿,我這個三腳貓功夫的說書的不得不講一下軟件了,要想講明白軟件又不得不涉及到單片機的內部結構。那位說啦,你可別提這軟件和結構了,以前俺就是讓它們打敗的,現在聽到這個心裡就打鼓。嘿嘿,不要緊,果真如你所說,那你就不妨跟著我再失敗一次, 反正嗎多一次失敗又不納稅,嘿嘿。不過你也要有思想準備,徹底弄明白是個漸進的過程。 

       要說這程序和單片機內部結構,還真是老大難,不過蟹黃蟹肉都可都在裡面。我現在要是給你說PIC單片機是哈佛結構的,51系列是馮-諾伊曼結構的,恐怕你要立馬扎走人了。所以我得用點心思不讓你溜號。 

       好在PIC系列的製造商(microchip 微芯公司 美國)理解我等苦衷,全部只有35條指令,而且有一些指令我們一般很少使用,常用的也就十幾句,用的時候查手冊,無需記憶。就算我們兩天學習一句,也就兩三個月時間,總比到老了還怕它們強啊。廢話少說先看下面的兩個例語: 

my_name006:           movlw  02h       '常數2進入w 
                              movwf  GPIO     'W 的數進入 寄存器GPIO 
          
這就是我們編的程序裡的兩個句子,也叫源程序。有以下特點 

每行只能寫一句話 
每句話由四部分組成: 

標號:  操作指令   操作數        '程序註釋 

下面我結合例子把這四部分解釋一下。 

第一部分 my_name006: 叫做標號,它是由字母或數字組成,由冒號結束。標號可有可無,比如第二句就沒有標號。 
第二部分movlw 叫做操作指令。它是必須有的,不能省略。PIC 系列的單片機共有 35 條指令。 
第三部分02h   叫做操作數。有的指令沒有操作數或者操作數是默認的,也不用寫。 
第四部分是程序註釋,必須以單引號開頭,主要作用是提醒和備忘。註釋也是可有可無。 

第二個例句中,省略了標號,當然註釋也可以省略。他的指令是movwf, 操作數是GPIO。操作數不一定是數字,也可能是一個由字母組成的字符串。 

      知道了語句格式以後,我們下面就學習一些常用語句。我們先把這兩個例句弄清楚。 

      這兩句話的作用是把 2 這個常數寫入到 GPIO 這個寄存器裡。 
      單片機裡有一些部件需要我們使用和操作,都是通過讀寫寄存器來實現的。每個部件都對應有操控它的寄存器,例如我們要控制使用的管腳GP0,GP1 這兩個管腳對應的寄存器就叫做GPIO。對GPIO寄存器讀操作,實際等效察看管腳電平的高低;對GPIO寄存器相應的位寫1操作,實際等校讓管腳輸出高電平。寫0,輸出低電平。 

每個寄存器可以儲存一個八位的二進制數。這八個位的每個位都有名稱,從左向右的名稱是: 
                                            左端第首位名稱叫D7, 
                                            左端第二位名稱叫D6, 
                                            左端第三位名稱叫D5, 
                                            左端第四位名稱叫D4, 
                                            左端第五位名稱叫D3, 
                                            左端第六位名稱叫D2, 
                                            左端第七位名稱叫D1, 
                                                 最後一位叫D0, 

而每一個位對應一個管腳的電平,例如當GPIO寄存器的D0位等於1時表示管腳GP0 的電平是高電平。D0位等於0時表示管腳GP0 的電平是低電平。常數2的八位二進製表示是「00000010」  所以,GPIO寄存器存放的8位2進制數的每個位的值以及管腳電平是: 
                                D7對 應於內部總線管腳的電平      D7=0  內部總線管腳輸出低電平              
                                D6對應於內部總線管腳的電平       D6=0  內部總線管腳輸出低電平 
                                D5對應於GP5 管腳的電平            D5=0   GP5 管腳輸出低電平 
                                D4對應於GP4 管腳的電平            D4=0   GP4 管腳輸出低電平 
                                D3對應於GP3 管腳的電平            D3=0   GP3 管腳輸出低電平 
                                D2對應於GP2 管腳的電平            D2=0   GP2 管腳輸出低電平 
                                D1對應於GP1 管腳的電平            D1=1   GP1 管腳輸出低電平      
                                D0對應於GP0 管腳的電平            D0=0   GP0 管腳輸出低電平 
GP0---GP5管腳我們可以從上一講的圖1硬件中查出所對應的管腳。d7 d6 對應的內部時鐘和數據總線我們現在暫且不要管它。以後本事大了在調_教它們。在我們的例句中,向GPIO寄存器寫入了2,常數2的八位二進製表示是「00000010」  因此如果此時GP0, Gp1等都已經被定義成輸出的話,那麼GP1輸出高電平(接LED燈亮),GP0 輸出低電平(所接led燈熄) 。 

       截止到現在,你已經學會如何控制管腳的電平高低了。儘管還有一些疑問,比如怎樣定義管腳為輸出腳(以後會說),我得說如果事先gp1,gp0這兩個管腳處於輸入狀態,這兩個例句無效,是控制不了電平的。 

      無論如何,這一會兒,你就學會了兩個指令,35條我看也沒啥難的。   
                                         
'------------------------------------------------------------------------------ 
                                           
再加深一下對寄存器的認識: 

要把一個常數存儲到,或者說寫到一個寄存器中,僅用一條指令是辦不到的,必須通過一個特殊的寄存器W,把數據倒過去. 這就應該使用到兩個語句。 

movlw   02H    指令的意思是把一個常數存入特殊寄存器W, 這個常數是3,後面的H是表示十六進制 
movwf   GPIO   指令的意思是把特殊寄存器W的數值存入寄存器. 這個寄存器的名稱是 GPIO 

這裡涉及到兩個概念,常數和寄存器. 
常數好說,比如說十進制數 35,  26 但要注意,在單片機系統裡我們一般不用十進制,而使用十六進制. 有關數制轉換方面的知識,是計算機的基礎,必須會熟練地在二進制、十六進制、十進制之間轉換,我就不羅索了. 
寄存器也叫單片機的內存。 
一個寄存器可以存儲的數值範圍是0--255,用十六進製表示就是 0---FFH.用二進製表示就是00000000----11111111. 
以後要養成習慣用十六進製表示數.  

那麼,一個單片機裡有多少個這樣的寄存器哩,pic12ce512里面有1024個這樣的寄存器可以供你使用,為了使用方便生產商已經給它們編上了號碼,第一號碼是000H,往下依照次序為 001H,002H........3FFH.(怎麼樣,開始用十六進制說事了吧,如果你不熟悉熟制轉換趕緊補課來得及) 

有了編號就像我們居住的房間有了房間號碼,使用就方便的多了.房間號碼在郵政行業叫地址,因此我們稱這些號碼叫做寄存器地址,或稱地址數  例如 名稱為 GPIO 的寄存器,他的地址,或地址數是  06H 。所以我們的兩個例句完全等同於: 

my_name006:           movlw  02h      '常數2進入w 
                              movwf  06H      'W 的數進入 寄存器GPIO 
'----------------------------------------- 
有兩個寄存器比較特殊,它們沒有地址,一個名字叫做 W,  另一個叫做 TRIS. 所以他們兩個在存儲數據的時候比較快,一個指令就可以解決問題,例如:    movlw   03H    一條指令就把常數3寫入到W寄存器了。關於TRIS寄存器,我們以後用到它再說. 
除了他們兩個以外的其他所有寄存器,在寫入數據時一般都要用兩條指令進行。 

今天就扯到這裡,雖然只有兩個指令,但主要目的是要同學們接觸一下指令,建立寄存器的概念以及他們同硬件部件的聯繫。增強學習的信心。能有這些體會,這一節就算過關了。 
           隨著以後的深入,你會發現小小單片機裡面是一個大世界,興趣也由此而生。

沒有留言:

張貼留言