一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

8位處理器可以有效地處理這些功能

PCB線(xiàn)路板打樣 ? 來(lái)源:LONG ? 2019-08-13 11:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

至少有兩個(gè)因素表明轉(zhuǎn)向功能更強(qiáng)大的處理器并不一定意味著需要占用更多比特。隨著應(yīng)用程序的成熟,功能強(qiáng)大,功能特定的處理器或引擎可用于承擔(dān)大部分繁重的工作。例如,使用MP3播放器,您可以購(gòu)買(mǎi)完整的數(shù)字音頻解碼引擎。您只需要一個(gè)用戶(hù)

接口和PC的I/O接口,可以充實(shí)您的數(shù)字播放器。 8位處理器可以有效地處理這些功能。而且,對(duì)于需要更多功能的任務(wù),您可能會(huì)驚訝于那些小型8位處理器已經(jīng)成為40-MHz時(shí)鐘,可擴(kuò)展程序存儲(chǔ)器,向量中斷表,浮點(diǎn)庫(kù),C編譯器的強(qiáng)大工具,和外圍設(shè)備的范圍。您可能會(huì)發(fā)現(xiàn)選擇使用較少位的處理器可以更好地幫助您滿(mǎn)足成本和性能限制,同時(shí)節(jié)省空間。

我花了10多年的時(shí)間在工業(yè)控制應(yīng)用程序中使用16位和32位x86組裝。對(duì)于這個(gè)動(dòng)手實(shí)踐的項(xiàng)目,我想看看我所有的16/32位偏差會(huì)讓我們后退并使用8位處理器進(jìn)行設(shè)計(jì)。畢竟,因?yàn)樘幚砥鞑荒敲磸?fù)雜,設(shè)計(jì)過(guò)程應(yīng)該更簡(jiǎn)單,不應(yīng)該嗎?

一個(gè)人的愚蠢錯(cuò)誤往往會(huì)產(chǎn)生最好的學(xué)習(xí)材料。因此,一些設(shè)計(jì)經(jīng)驗(yàn)可能有點(diǎn)令人尷尬。幸運(yùn)的是,總是存在這樣的安慰:在完成這個(gè)項(xiàng)目之后,我不再是那些犯了這些錯(cuò)誤的程序員。如果你正在考慮轉(zhuǎn)向8位處理器,那么閱讀這個(gè)項(xiàng)目可能會(huì)讓你免于我所遇到的一些痛苦和痛苦。

項(xiàng)目

對(duì)于我的項(xiàng)目,我決定制作一個(gè)音序器。我的一些工程師和我最近發(fā)現(xiàn)了“Cool-Neon”,也稱(chēng)為電致發(fā)光線(xiàn)(參考文獻(xiàn)1)。您可以使用逆變器將9V電源轉(zhuǎn)換為300V交流電,從而驅(qū)動(dòng)電線(xiàn)以創(chuàng)建多色光雕塑。我們首先建造了一條二維魚(yú),我們可以騎在自行車(chē)上,創(chuàng)造一個(gè)游泳魚(yú)群的幻覺(jué)。對(duì)于我們的下一代項(xiàng)目,我們需要一個(gè)可以循環(huán)通過(guò)光線(xiàn)模式的音序器,為移動(dòng)的雕塑或電子萬(wàn)花筒創(chuàng)造一種運(yùn)動(dòng)的幻覺(jué),其中不同時(shí)間點(diǎn)亮的不同光束代表短幀和循環(huán)動(dòng)畫(huà)中的幀序列

8位處理器似乎非常適合這個(gè)項(xiàng)目。我需要一個(gè)輸出引腳來(lái)驅(qū)動(dòng)每根導(dǎo)線(xiàn);對(duì)于10股容量,我需要10個(gè)引腳。一個(gè)按鈕(使用另一個(gè)引腳)將允許某人循環(huán)通過(guò)模式選項(xiàng)。在功能列表中,我快速添加了傳感器的輸入。例如,放置在自行車(chē)車(chē)輪周?chē)膫鞲衅骺梢曰谕獠渴录皇莾?nèi)部計(jì)時(shí)器來(lái)觸發(fā)模式。決定使用MicrochipPIC系列產(chǎn)品,我發(fā)現(xiàn)18引腳封裝處理器有13個(gè)I/O引腳,所以我有一個(gè)引腳備用,但不會(huì)長(zhǎng)時(shí)間保留備用。

資源有限:記憶

您通??梢酝ㄟ^(guò)在更強(qiáng)大的處理器上投入資源(如內(nèi)存,處理和I/O)來(lái)解決問(wèn)題。然而,由于配置的多樣性,8位世界中的家庭成員之間的差異可以直接節(jié)省成本。例如,具有2千字節(jié)板載內(nèi)存的處理器成本低于4千字節(jié)的處理器。我記得有64千克的銀行可用;你可以通過(guò)使用一個(gè)大表來(lái)加速一個(gè)關(guān)鍵的計(jì)算 - 一個(gè)可行的,有時(shí)是至關(guān)重要的選項(xiàng)來(lái)燃燒記憶。

早期,我做了什么才能成為我的音序器的關(guān)鍵設(shè)計(jì)決策。我沒(méi)有用1位(10個(gè)燈等于10位)表示活動(dòng)燈,而是創(chuàng)建了一個(gè)10字節(jié)長(zhǎng)的表,其中包含適當(dāng)邏輯光的物理端口代碼;也就是說(shuō),I/O端口A上的指示燈1 =位3)。我制作這張桌子是因?yàn)?,?dāng)我測(cè)試是否填充了燈光時(shí),我必須計(jì)算物理端口。當(dāng)時(shí),存儲(chǔ)這個(gè)預(yù)先計(jì)算的值似乎更容易。鑒于我的心態(tài),這個(gè)選擇是明智的:在開(kāi)始時(shí)(主處理循環(huán)之外)執(zhí)行一次計(jì)算,并在每次稍后使用計(jì)算時(shí)保存那么多循環(huán)。

不幸的是,這個(gè)選擇很糟糕。首先,定序器將大部分時(shí)間花在輪詢(xún)循環(huán)中,等待按鍵是否被按下或是否已觸發(fā)定時(shí)器。因此,在輪詢(xún)循環(huán)中,我節(jié)省了幾個(gè)周期(最多10個(gè)燈,10個(gè)指令= 100個(gè)周期)。其次,更重要的是,我使用了比我需要多8個(gè)字節(jié)的RAM。我習(xí)慣丟掉數(shù)百字節(jié)的填充緩沖區(qū)來(lái)覆蓋可能出現(xiàn)的最壞情況。但是,當(dāng)8個(gè)字節(jié)幾乎占總數(shù)據(jù)存儲(chǔ)器的八分之一時(shí),這是一個(gè)糟糕的決定。

在我用完數(shù)據(jù)存儲(chǔ)器之前,我沒(méi)有意識(shí)到這種選擇的重要性。我添加了一個(gè)變量,程序無(wú)法運(yùn)行,因?yàn)榱硪粋€(gè)變量被推入未定義的0xFF區(qū)域。我的項(xiàng)目似乎沒(méi)有足夠的復(fù)雜性來(lái)使用這么多的內(nèi)存,但是當(dāng)我添加更多功能時(shí),我忘了留意內(nèi)存。當(dāng)我努力恢復(fù)字節(jié)時(shí),擊中數(shù)據(jù)存儲(chǔ)器的頂部使我的開(kāi)發(fā)暫時(shí)停止。然后我犯了一個(gè)愚蠢的錯(cuò)誤,即偶然試圖加倍臨時(shí)變量。例如,某些函數(shù)需要循環(huán)計(jì)數(shù)器。但是,您可以使用這些循環(huán)計(jì)數(shù)器來(lái)計(jì)算除這些函數(shù)之外的其他內(nèi)容。為了完成這項(xiàng)工作,我需要嚴(yán)格控制變量的范圍,以確保一個(gè)函數(shù)不使用相同的變量調(diào)用另一個(gè)函數(shù)。

我的第一個(gè)直覺(jué)指示我只給一個(gè)雙重任務(wù)變量一個(gè)名字。我可以想象調(diào)試的噩夢(mèng)是沒(méi)有記住兩個(gè)不同的變量實(shí)際上是相同的變量并相互改變。至少如果他們有相同的名字,如果我不小心違反變量的范圍,我就有更好的機(jī)會(huì)抓住自己。

當(dāng)我嘗試按范圍對(duì)變量進(jìn)行分組時(shí),我了解到在整個(gè)程序中使用變量之前我可以更輕松地執(zhí)行此任務(wù)。例如,變量Temp具有直接范圍,這意味著如果函數(shù)調(diào)用另一個(gè)函數(shù),則第一個(gè)函數(shù)應(yīng)該假定Temp被銷(xiāo)毀。另一個(gè)極端是系統(tǒng)或全局變量,例如Flags,所有函數(shù)都可以使用。然后是灰色區(qū)域。例如,循環(huán)計(jì)算當(dāng)前正在處理燈光模式中的哪個(gè)步驟。因?yàn)橐淮沃荒軋?zhí)行一個(gè)模式,所以每個(gè)模式函數(shù)都可以使用Cycle。此外,當(dāng)用戶(hù)編輯用戶(hù)可編程模式時(shí),沒(méi)有預(yù)定義模式正在運(yùn)行,因此您也可以在此處使用Cycle。但是,當(dāng)我想在編輯時(shí)顯示用戶(hù)可編程模式時(shí),我確實(shí)存在潛在的范圍違規(guī)。我必須在顯示之前存儲(chǔ)Cycle并在編輯后恢復(fù)它,或者我可以讓用戶(hù)通過(guò)在他或她想要編輯的周期停止顯示來(lái)重置Cycle,這是我實(shí)現(xiàn)的選擇。

在這種情況下存儲(chǔ)Cycle會(huì)需要一個(gè)全局變量,因?yàn)轱@示一個(gè)模式使用了主程序循環(huán),但是為此目的專(zhuān)用變量會(huì)使變量首先加倍。我也可以選擇實(shí)現(xiàn)數(shù)據(jù)堆棧。在16位和32位的世界中,堆棧是一個(gè)方便的朋友。但是,我使用的微處理器只有一個(gè)內(nèi)部堆棧用于程序地址。 (我確信有一些方法可以欺騙處理器來(lái)存儲(chǔ)數(shù)據(jù),但只有8個(gè)級(jí)別,如果我想保存多于一個(gè)或兩個(gè)值,我會(huì)冒著堆棧的風(fēng)險(xiǎn)。)堆棧至少需要一個(gè)額外的字節(jié)用于尾部管理,你必須緩沖他們最壞情況下使用。我避免實(shí)現(xiàn)堆棧,因?yàn)槲艺J(rèn)為我的值太少而無(wú)法保存。

變量的范圍對(duì)于通過(guò)加倍使用變量來(lái)跟蹤和創(chuàng)建變量的依賴(lài)性至關(guān)重要。這項(xiàng)任務(wù)應(yīng)該是一個(gè)謹(jǐn)慎的決定。我試圖將變量劃分為功能塊,但是,即使仔細(xì)規(guī)劃,似乎總是可以同時(shí)使用兩個(gè)塊,因此也就是所有變量。然后我會(huì)發(fā)現(xiàn)自己正在追逐自己造成的錯(cuò)誤。

一旦您決定將處理器放在電路板上,您就有可能顯著降低處理器的成本。當(dāng)你發(fā)展時(shí),給自己一些重新編程的空間是有意義的;但是,您可能會(huì)發(fā)現(xiàn)自己只需幾個(gè)字節(jié)就可以將設(shè)計(jì)融入更便宜的處理器中。較便宜的選項(xiàng)并不總是等價(jià)的,并且會(huì)影響開(kāi)發(fā),因?yàn)樗鼈兌x了內(nèi)存和性能閾值。通過(guò)在開(kāi)始開(kāi)發(fā)時(shí)而不是在完成開(kāi)發(fā)時(shí)了解這些閾值,您可以確定限制可用資源的緊密程度。無(wú)論如何,你可能永遠(yuǎn)不會(huì)雇用一個(gè)字節(jié)作為一個(gè)角色。

資源有限:處理

由于“功能蠕變”-extra功能使設(shè)計(jì)復(fù)雜化并拋棄計(jì)劃 - 繼續(xù)為順控程序添加選項(xiàng)和增強(qiáng)功能,我意識(shí)到我可能也會(huì)在程序內(nèi)存中占據(jù)優(yōu)勢(shì)。在16位和32位的世界中,我經(jīng)常為一個(gè)問(wèn)題投入內(nèi)存以減少總計(jì)算時(shí)間。我發(fā)現(xiàn)自己正在使用我的音序器進(jìn)行反向權(quán)衡。

當(dāng)我設(shè)計(jì)用戶(hù)可編程模式(存儲(chǔ)在EEPROM中)時(shí),我使用位來(lái)表示每個(gè)光。但是,10位是1字節(jié),剩下2位,您可以打包成四個(gè)組以完全使用另一個(gè)字節(jié)。這個(gè)決定產(chǎn)生了一個(gè)問(wèn)題,因?yàn)槟J綄⒁耘c我用來(lái)打開(kāi)燈光的格式不同的格式存儲(chǔ)。 (EEPROM格式使用邏輯格式來(lái)跟蹤被點(diǎn)亮的燈:點(diǎn)亮零到九。燈格式使用物理格式:每個(gè)端口一個(gè)字節(jié),A和B,每個(gè)位代表相應(yīng)的I/O引腳,由于板布局考慮而無(wú)序。)存在兩種格式,因?yàn)槲锢砀袷绞怯糜隍?qū)動(dòng)輸出端口的實(shí)際掩碼。但是,物理格式使用16位而不是像邏輯格式那樣僅使用10位。因此,我需要一個(gè)轉(zhuǎn)換函數(shù)。

我通常會(huì)同時(shí)寫(xiě)兩個(gè)轉(zhuǎn)換函數(shù)的方向。為了最大限度地減少總處理周期,我將EEPROM邏輯格式轉(zhuǎn)換為光/物理格式。當(dāng)用戶(hù)編輯模式的這個(gè)循環(huán)時(shí),我將制作并顯示光/物理格式的變化。當(dāng)用戶(hù)完成編輯此循環(huán)后,我會(huì)將光/物理格式轉(zhuǎn)換回EEPROM/邏輯格式并保存循環(huán)。

我決定轉(zhuǎn)而支持內(nèi)存而不是處理性能。通過(guò)直接更改EEPROM/邏輯格式,我可以調(diào)用轉(zhuǎn)換函數(shù)來(lái)創(chuàng)建光/物理格式并顯示修改后的周期。每次運(yùn)行此轉(zhuǎn)換需要更多的處理周期,但同樣,這些周期僅來(lái)自輪詢(xún)循環(huán)。我獲得了廢除逆轉(zhuǎn)換函數(shù)的選項(xiàng),因?yàn)樗鼜奈幢徽{(diào)用過(guò)。因此,我節(jié)省了程序內(nèi)存和一些開(kāi)發(fā)時(shí)間。我還獲得了將所有更改立即保存在EEPROM中的好處,使我無(wú)需在用戶(hù)移動(dòng)到新周期時(shí)管理保存更改,想要顯示模式,左編輯模式等等。

計(jì)時(shí)器

在我的問(wèn)題上投擲處理能力而不是記憶力幾乎適用于我。 PIC16F84有一個(gè)內(nèi)部定時(shí)器TMR0,粒度為256個(gè)周期,預(yù)分頻器大小為2 8 (256×256 = 65,536個(gè)周期)。在沒(méi)有預(yù)分頻器的情況下運(yùn)行,每256個(gè)周期發(fā)生一次TMR0中斷。因?yàn)槲覍⒚總€(gè)模式的循環(huán)連接到TMR0,所以每個(gè)循環(huán)必須在256個(gè)循環(huán)內(nèi)完成執(zhí)行,或者在完成處理最后一個(gè)循環(huán)之前我會(huì)遇到TMR0事件,偶爾在模式期間丟失一個(gè)循環(huán)。增加預(yù)分頻器可以選擇將TMR0間隙增加2倍,以防止超出。通過(guò)盡可能多地處理中斷以避免中斷處理期間的中斷延遲,保持中斷處理程序的清潔和簡(jiǎn)單也很重要。

我使用電位計(jì)讓用戶(hù)調(diào)整音序器的速度。鑒于你需要在模式的周期之間進(jìn)行一點(diǎn)處理,我選擇使用RC時(shí)鐘而不是晶體。這個(gè)決定節(jié)省了晶體成本,系統(tǒng)復(fù)雜性和I/O引腳;電位計(jì)驅(qū)動(dòng)RC時(shí)鐘,而不是告訴PIC應(yīng)該運(yùn)行多快,并在內(nèi)部管理這個(gè)速度。如果我想讓兩個(gè)序列發(fā)生器相互通信,我將不得不創(chuàng)建一個(gè)連接兩個(gè)節(jié)點(diǎn)的協(xié)議,這些節(jié)點(diǎn)具有獨(dú)立且可能變化的時(shí)鐘速度。

我想要幾種速度選項(xiàng) - 從幾分之一到幾秒 - 用于循環(huán)模式。電位器給了我一個(gè)范圍,所以我創(chuàng)建了兩個(gè)用戶(hù)可選擇的速度區(qū)域,為T(mén)MR0使用了不同的預(yù)分頻器。我的設(shè)計(jì)最初支持三個(gè)區(qū)域,但有兩個(gè)簡(jiǎn)化的用戶(hù)選擇,將速度參數(shù)切換為1位,并簡(jiǎn)化了TMR0事件的內(nèi)部管理。

預(yù)分頻器3(2 4 = 16)和4(2 5 <之間的差異/sup> = 32)可以變寬,特別是RC時(shí)鐘被調(diào)到5和50 kHz。當(dāng)我的設(shè)計(jì)支持三種模式時(shí),我發(fā)現(xiàn)添加(TMR0_COUNT預(yù)分頻器讓我可以更好地控制中斷。如果你用一個(gè)10-MHz時(shí)鐘運(yùn)行PIC,你可能會(huì)發(fā)現(xiàn)這個(gè)額外的預(yù)分頻器讓你測(cè)量有用的時(shí)間長(zhǎng)度。

調(diào)試

鑒于要重復(fù)這個(gè)項(xiàng)目,我會(huì)獲得一個(gè)用于軟件開(kāi)發(fā)的模擬器。嘗試解決困難編程所節(jié)省的時(shí)間很快就會(huì)彌補(bǔ)費(fèi)用。相反,我非常依賴(lài)MPLAB模擬器。

模擬器的運(yùn)行速度比我預(yù)期的要慢得多。有時(shí),我認(rèn)為系統(tǒng)已經(jīng)凍結(jié),因?yàn)樗Φ竭_(dá)我的斷點(diǎn)。有時(shí)候,我引起了一個(gè)延遲,例如當(dāng)我在輪詢(xún)循環(huán)后將斷點(diǎn)放在代碼中的某個(gè)點(diǎn)時(shí),模擬器卡在輪詢(xún)循環(huán)中等待我響應(yīng)。我的設(shè)計(jì)有一個(gè)短于256個(gè)時(shí)鐘的主循環(huán),所以我可以快速測(cè)試迭代和情況。以10 MHz運(yùn)行的設(shè)計(jì)可能有更長(zhǎng)的主循環(huán)或更多的輪詢(xún)。

我發(fā)現(xiàn)使用Define創(chuàng)建模擬器標(biāo)簽很有用。在真正的董事會(huì)上,我想要真正的延遲。但是,通常沒(méi)有理由在模擬器中的輪詢(xún)或延遲循環(huán)中永遠(yuǎn)等待。例如,我有一個(gè)Flash功能,可以閃爍特定的線(xiàn)W次。在模擬器中,我沒(méi)有必要“看到”這種閃爍。因此,我添加了以下代碼以跳過(guò)無(wú)用的函數(shù)和速度模擬:

TMR0也觸發(fā)了事件。我將所有延遲量命名為常量,以便我可以將所有模擬器常量設(shè)置為零。我還添加了一些代碼來(lái)模擬按鈕按下或其他事件。有時(shí),等待TMR0中斷變得令人難以忍受。在我的輪詢(xún)循環(huán)中,然后,我添加了僅模擬器代碼,它將設(shè)置我的TMR0事件標(biāo)志(然后將TMR0重置為零,以便最終不會(huì)觸發(fā)我)。

模擬器代碼的另一個(gè)有用位置是中斷處理程序的開(kāi)頭。我的中斷處理程序足夠短,可以將它留在代碼的前面,而不是調(diào)用放在內(nèi)存中其他地方的函數(shù),這會(huì)增加中斷的延遲。但是,當(dāng)我模擬輸入時(shí),會(huì)調(diào)用一個(gè)中斷,我不得不單步執(zhí)行所有中斷代碼。我添加了代碼:

此代碼創(chuàng)建了一個(gè)調(diào)用,我可以用鍵擊來(lái)代替。

我通常發(fā)現(xiàn)MPLAB環(huán)境包含很多很好的功能,但是我很痛苦地追逐一個(gè)接口問(wèn)題。例如,我想測(cè)試需要按兩次按鈕才能到達(dá)的代碼。 MPLAB有一個(gè)“激勵(lì)模擬器”窗口,通過(guò)它我可以激活輸入端口。不幸的是,當(dāng)刺激窗口打開(kāi)時(shí),模擬器的運(yùn)行速度明顯變慢,所以我通常不得不關(guān)閉窗口并在幾秒鐘后重新打開(kāi)它。選擇刺激時(shí)鐘似乎比它值得更麻煩,因?yàn)槲冶仨毰宄蚁M斎胗|發(fā)的時(shí)鐘周期。通過(guò)查看合適的輸出引腳,我也可以看到燈是否亮起。但是,對(duì)于任何復(fù)雜的輸出序列,驗(yàn)證準(zhǔn)確的反饋可能很困難。

與MPLAB環(huán)境一樣有用,我建議您訪問(wèn)一個(gè)快速而骯臟的開(kāi)發(fā)環(huán)境,例如Basic,來(lái)測(cè)試算法。例如,微芯片應(yīng)用筆記庫(kù)中的隨機(jī)數(shù)生成器功能似乎在0到255的值中具有不均勻分布的數(shù)字。由于存儲(chǔ)器限制,在Microchip環(huán)境中測(cè)試此功能似乎很困難。例如,如果我有256字節(jié)的RAM,我可以很容易地計(jì)算很長(zhǎng)一段時(shí)間內(nèi)的分布。然而,如果不到40H字節(jié),我將不得不想出一個(gè)聰明的計(jì)數(shù)方案,并且可能會(huì)多次運(yùn)行我的模擬以確定傳播是均勻的。在Basic中,我可以在幾分鐘內(nèi)彈出這段代碼并幾乎立即看到結(jié)果。

我遇到了其他令人沮喪的錯(cuò)誤;如果我使用了模擬器,我會(huì)節(jié)省數(shù)小時(shí)的調(diào)試時(shí)間。

因?yàn)槲沂褂昧丝芍匦戮幊痰脑O(shè)備,所以我不得不將設(shè)備插入板中以及從板中取出設(shè)備以將其放入設(shè)備編程器中。我在電路板上有一個(gè)插座,但是將設(shè)備插入插座意味著我必須將插座插入插座中,從而產(chǎn)生松動(dòng)且因此不良的電氣配合。我最終在一臺(tái)設(shè)備上打破了領(lǐng)先優(yōu)勢(shì),使其無(wú)用。我還需要偶爾向外彎曲引線(xiàn),因?yàn)橄騼?nèi)彎曲的引腳連接不良,I/O引腳會(huì)神秘地停止工作。使用模擬器可以消除我的大部分套接字問(wèn)題。

我安裝了一個(gè)新的逆變器,可以驅(qū)動(dòng)比我當(dāng)前的逆變器更多的電線(xiàn),從而使我能夠同時(shí)點(diǎn)亮幾根電線(xiàn)。雖然設(shè)計(jì)是在程序模式下,但我會(huì)閃現(xiàn)一條線(xiàn)來(lái)代表一個(gè)參數(shù)。參數(shù)One工作正常,但參數(shù)二不會(huì)閃爍。因?yàn)槲覍?zhuān)注于用戶(hù)可編程模式并禁用了其他參數(shù),所以我認(rèn)為我的一些更改可能會(huì)改變代碼的閃存能力 - 通過(guò)使用變量。經(jīng)過(guò)大約一個(gè)小時(shí)的追逐幻象代碼錯(cuò)誤后,我終于將問(wèn)題縮小到了實(shí)際的電線(xiàn),除非我點(diǎn)亮另一根電線(xiàn),否則我無(wú)法關(guān)閉。突然間,我意識(shí)到新的逆變器可能是問(wèn)題所在。當(dāng)我連接舊逆變器時(shí),電線(xiàn)正確閃爍。

出現(xiàn)問(wèn)題是因?yàn)槟孀兤鲀A向于保持電線(xiàn)點(diǎn)亮;一些導(dǎo)線(xiàn) - 但不是其他導(dǎo)線(xiàn) - 超過(guò)驅(qū)動(dòng)導(dǎo)線(xiàn)的三端雙向可控硅開(kāi)關(guān)中的相位間隙。我通過(guò)代碼搜索,因?yàn)橐桓娋€(xiàn)工作,而另一根沒(méi)電。我懷疑是一個(gè)邏輯問(wèn)題,并且忽視了導(dǎo)線(xiàn)出錯(cuò)的可能性,因?yàn)樗耙恢庇行АJ褂媚M器,我會(huì)看到端口已經(jīng)變低,我正面臨硬件,而不是邏輯問(wèn)題。我還了解到,當(dāng)我使用新設(shè)備進(jìn)行測(cè)試時(shí),我應(yīng)該檢查一下,在更改硬件之前是否存在先前設(shè)置中存在的錯(cuò)誤。

值得一提的是,我保持了“健全性” - 使用舊版本代碼刻錄的幾個(gè)芯片。每當(dāng)原型開(kāi)始變得怪異時(shí),我就會(huì)放入其中一個(gè)完整的燒傷。如果原型工作,那么我的最新版本的代碼已經(jīng)破壞了一些關(guān)鍵的東西。如果健全性刻錄無(wú)法正常工作,則硬件會(huì)出現(xiàn)諸如斷線(xiàn)之類(lèi)的問(wèn)題。

電源問(wèn)題引發(fā)了一系列令人討厭的錯(cuò)誤。我最初使用壁式電源為我的原型供電。但是,我得到了一些奇怪的閃爍,我很快就將其評(píng)估為電源問(wèn)題。由于電路板應(yīng)使用9V電池供電,因此我切換到電池供電。然而,點(diǎn)亮的電線(xiàn)消耗大量電力。我還做了一個(gè)不幸的假設(shè),即當(dāng)電池電量太低時(shí)我的電線(xiàn)就會(huì)死掉。 PIC實(shí)際上首先變得缺電,然后行動(dòng)不穩(wěn)定。我在追逐想象中的錯(cuò)誤一天之后才發(fā)現(xiàn)了這個(gè)事實(shí)。使用新電池可以處理所有事情。我希望在嘗試查找錯(cuò)誤并注釋掉部分,設(shè)置不必要的調(diào)試掛鉤等之前保存了特殊版本的代碼。

為了避免電池問(wèn)題,我回到墻上供應(yīng)。然后我發(fā)現(xiàn)閃爍不是由電源引起的,正如我所假設(shè)的那樣。 (墻上插座給了我足夠的力量來(lái)看到我的弱電池上的閃爍。)相反,這是我在設(shè)置下一個(gè)周期之前短暫關(guān)閉燈并顯示它們的問(wèn)題。我將代碼更改為只是從一個(gè)循環(huán)移動(dòng)到另一個(gè)循環(huán)而不顯示其間的所有燈。奇怪的閃爍消失了。

我創(chuàng)建的另一個(gè)原型錯(cuò)誤涉及使用重置按鈕。我在面包板原型上添加了一個(gè)復(fù)位按鈕,這樣我就可以輕松地重置電路板而無(wú)需進(jìn)行物理斷開(kāi),然后重新連接9V電池。模擬器可以提供相同的功能。但是,最終產(chǎn)品沒(méi)有重置按鈕。使用原型,當(dāng)我想離開(kāi)程序模式時(shí),我會(huì)按下重置按鈕重新啟動(dòng)電路板。然而,這種復(fù)位不是全功率復(fù)位,這意味著標(biāo)志和存儲(chǔ)器沒(méi)有被清除;在這種情況下唯一重大的變化是程序計(jì)數(shù)器重置為0x00。當(dāng)我最終轉(zhuǎn)移到真正的用戶(hù)所擁有的制造原型時(shí),我通過(guò)關(guān)閉然后再打開(kāi)電路板離開(kāi)編程模式,但是電路板沒(méi)有注冊(cè)我的更改。出現(xiàn)此問(wèn)題的原因是斷電復(fù)位也會(huì)清除內(nèi)存。

我列舉了這些例子,因?yàn)樗鼈冋f(shuō)明了使用原型的一些危險(xiǎn)。一方面,你需要一個(gè)干凈的環(huán)境來(lái)開(kāi)發(fā),所以你不會(huì)追逐幻影。您還希望訪問(wèn)所有硬件,并且應(yīng)該能夠隨意進(jìn)行探測(cè)。另一方面,您需要使用與客戶(hù)相同的硬件來(lái)查看實(shí)際發(fā)生的情況。

時(shí)滯

當(dāng)我炸掉我唯一的控制器時(shí),我遇到了開(kāi)發(fā)周期中最大的延遲之一。我首先訪問(wèn)Microchip的網(wǎng)站以獲得更多芯片。最快的送貨服務(wù)是三天,這意味著我只能使用模擬器進(jìn)行開(kāi)發(fā)。我找到了多個(gè)銷(xiāo)售PIC芯片的互聯(lián)網(wǎng)網(wǎng)站,并且可選擇更快的交付。雖然其他站點(diǎn)提供了有限的PIC選擇,但我確實(shí)找到了PIC16F84,這是很好的開(kāi)發(fā),然后計(jì)劃換成更便宜的芯片。鑒于PIC微處理器的普遍可用性,我購(gòu)買(mǎi)了一些零件而無(wú)需與經(jīng)銷(xiāo)商建立關(guān)系。我還學(xué)到了庫(kù)存的第一條規(guī)則:有一些。當(dāng)出現(xiàn)問(wèn)題時(shí),您的時(shí)間和產(chǎn)品的上市時(shí)間應(yīng)該得到一些額外部件的保險(xiǎn)。

延遲的一個(gè)更具破壞性的因素是特征蠕變。在我完成基本功能之前,我已經(jīng)決定了一系列新功能,例如用戶(hù)可編程模式,這些功能已經(jīng)進(jìn)入規(guī)范。我為需要非標(biāo)準(zhǔn)模式的專(zhuān)家用戶(hù)構(gòu)思了用戶(hù)可編程模式。這些模式還需要與項(xiàng)目其余部分一樣多的編碼開(kāi)發(fā)時(shí)間。突然之間,由于我努力解決專(zhuān)家代碼中的錯(cuò)誤,上市時(shí)間受到了沖擊。具有諷刺意味的是,beta測(cè)試人員對(duì)用戶(hù)可編程模式不感興趣。換句話(huà)說(shuō),如果我關(guān)閉了規(guī)范并將專(zhuān)家功能推遲到第二版(參見(jiàn)附文“經(jīng)典混音和錯(cuò)誤”),我本可以更快地將測(cè)試板交付給beta測(cè)試人員并測(cè)試音序器的基本穩(wěn)健性。

殺手NOP

每當(dāng)我得到一個(gè)新工具時(shí),我總會(huì)感到興奮。安裝后,我要做的最后一件事是特別注意說(shuō)明。我已經(jīng)閱讀了足夠的內(nèi)容以便開(kāi)始,然后向我保證我會(huì)返回并稍后完成。

早期,當(dāng)我嘗試實(shí)現(xiàn)演示模式時(shí),我發(fā)現(xiàn)了一個(gè)奇怪的問(wèn)題:電路板只能點(diǎn)亮六盞燈。當(dāng)我刪除代碼時(shí),電路板工作正常。此時(shí),我開(kāi)始重新編寫(xiě)代碼片段,每次測(cè)試電路板時(shí)都會(huì)進(jìn)行測(cè)試。最后,除了一段代碼之外的所有代碼都重新進(jìn)入。當(dāng)我注釋掉代碼時(shí),電路板運(yùn)行了。奇怪的是,只有按下按鈕才會(huì)執(zhí)行此代碼。不知何故,我想,事件是錯(cuò)誤地觸發(fā)的。當(dāng)我刪除除了Goto和Return之外的所有代碼時(shí),代碼工作正常。添加CLRF標(biāo)志會(huì)導(dǎo)致失敗。但是怎么樣?然后,我決定添加非操作(NOP)指令而不是CLRF標(biāo)志。隨著NOP,董事會(huì)失敗了。如果沒(méi)有NOP,代碼就會(huì)運(yùn)行。

當(dāng)NOP指令導(dǎo)致嚴(yán)重錯(cuò)誤時(shí),通常意味著存在內(nèi)存誤解。果然,我的一張桌子越過(guò)100H邊界,因?yàn)槲衣卦谒懊嫣砑恿?a target="_blank">程序代碼。在這種情況下,出現(xiàn)問(wèn)題是因?yàn)楸淼刂纷優(yōu)?位長(zhǎng); 14位PIC指令可以容納Goto地址的額外位,但它們會(huì)丟棄算術(shù)指令的第9位和第10位,例如Add。因?yàn)槲覝y(cè)試的代碼長(zhǎng)5個(gè)字節(jié),所以表超過(guò)了4個(gè)字節(jié)。 (因此,在光7之前只有六個(gè)燈顯示PIC設(shè)置為00H(復(fù)位)而不是100H。)

我通過(guò)將所有表移動(dòng)到代碼部分的前面然后仔細(xì)閱讀指令集來(lái)解決問(wèn)題,以查看是否有任何更多的命令具有匯編程序無(wú)法捕獲的偷偷摸摸的細(xì)微差別。后來(lái),當(dāng)我閱讀John Peatman的使用PIC微控制器進(jìn)行設(shè)計(jì)時(shí),我發(fā)現(xiàn)將表放在存儲(chǔ)器前面是PIC的標(biāo)準(zhǔn)做法,因?yàn)檫@個(gè)原因(參考文獻(xiàn)) 2)。我快速閱讀,看看是否還有其他標(biāo)準(zhǔn)做法我應(yīng)該遵循。在中斷區(qū)域,這本書(shū)給我?guī)?lái)了很大的悲傷。例如,在16位和32位的世界中,標(biāo)志會(huì)自動(dòng)保存,并且有一個(gè)堆棧來(lái)保存寄存器。使用PIC系列,您必須自己保存標(biāo)志,但首先必須以一種棘手的方式保存累加器(使用Swap)而不影響標(biāo)志(清單1)。我發(fā)現(xiàn)disable-interrupt命令特別具有欺騙性。由于PIC具有兩級(jí)流水線(xiàn),因此如果中斷因此與請(qǐng)求禁用中斷同時(shí)發(fā)生,則會(huì)出現(xiàn)問(wèn)題。 PIC根據(jù)您的指令清除中斷標(biāo)志,然后執(zhí)行掛起中斷。當(dāng)您從中斷返回,從而啟用中斷標(biāo)志時(shí),即使您認(rèn)為剛剛禁用了它們,也會(huì)在主代碼中啟用中斷(清單2)。

最后,我發(fā)現(xiàn)PIC規(guī)格表雖然技術(shù)上已經(jīng)完整,但需要一些澄清。至少買(mǎi)一本像皮特曼這樣的書(shū)。他建議一個(gè)強(qiáng)大的編程結(jié)構(gòu),可以幫助您避免許多問(wèn)題。然而,他的問(wèn)題部分讓我煩惱,因?yàn)槟惚仨毺崆伴喿x一兩章才能最終發(fā)現(xiàn)答案。在任何情況下,在您發(fā)現(xiàn)之前閱讀本書(shū),與大多數(shù)錯(cuò)誤一樣,您無(wú)法理解架構(gòu)的細(xì)微差別。

你可能會(huì)問(wèn)35條指令有多復(fù)雜。不幸的是,減少的指令集實(shí)際上導(dǎo)致更復(fù)雜的程序。對(duì)于一個(gè)簡(jiǎn)單的類(lèi)比,想象一下,我試著寫(xiě)這篇文章而不使用字母T.較少的單詞構(gòu)成一個(gè)不太復(fù)雜的詞匯,但可用的單詞較少意味著說(shuō)某些事情需要更長(zhǎng)的時(shí)間。例如,高階語(yǔ)言具有復(fù)雜的詞匯表,可以讓您在一條指令中描述復(fù)雜的匯編任務(wù),例如打印或乘法。使用精簡(jiǎn)的指令集,例如PIC系列的指令集,即使是簡(jiǎn)單的函數(shù),例如位移,也會(huì)變得更加復(fù)雜。例如,x86的程序集提供了諸如旋轉(zhuǎn)而不進(jìn)位和旋轉(zhuǎn)CL次等命令(清單3)。當(dāng)我需要將比特封裝的位移實(shí)現(xiàn)到這個(gè)項(xiàng)目時(shí),我不得不考慮這個(gè)過(guò)程。沒(méi)有旋轉(zhuǎn) - 不進(jìn)位指令,所以在右旋轉(zhuǎn)的情況下,我必須在每次旋轉(zhuǎn)之前將進(jìn)位標(biāo)志設(shè)置到最右邊的位置。

創(chuàng)建比特移位等功能并不困難;但是,你仍然需要?jiǎng)?chuàng)建它們。如果您從未在此級(jí)別工作 - 例如,如果您始終有可用的打印指令 - 創(chuàng)建基本功能庫(kù)可能需要一段時(shí)間。您還會(huì)發(fā)現(xiàn),第一次嘗試時(shí),您可能無(wú)法確定實(shí)現(xiàn)功能的最有效或最靈活的方式。因此,我的項(xiàng)目花費(fèi)的時(shí)間比我想象的要長(zhǎng),因?yàn)槲揖帉?xiě)了“基本”函數(shù),我習(xí)慣于在不太復(fù)雜的16位和32位架構(gòu)中實(shí)現(xiàn)這些函數(shù)。

我還發(fā)現(xiàn),盡早構(gòu)建我的基本功能庫(kù)可以提高我布置音序器架構(gòu)的能力。例如,一旦我編寫(xiě)了用于讀寫(xiě)EEPROM的基本功能,我開(kāi)始將EEPROM視為一種資源,而不僅僅是我后來(lái)需要編寫(xiě)代碼的東西。這種觀點(diǎn)的改變促使我考慮創(chuàng)建在斷電后保持設(shè)置的靜態(tài)用戶(hù)參數(shù)的想法。 EEPROM還打開(kāi)了一組可用的數(shù)據(jù)存儲(chǔ)器,訪問(wèn)速度要慢得多,但可以想象我會(huì)忘記內(nèi)存堵塞。

硬件/軟件斷開(kāi)連接

在我編程16位和32位架構(gòu)的過(guò)程中,我一直使用完整的硬件系統(tǒng);也就是說(shuō),我在PC或已經(jīng)設(shè)計(jì),打印,填充和測(cè)試的電路板上工作。在這些條件下,我的首要任務(wù)之一是確定新功能的可行性。通常,您可以在軟件中實(shí)現(xiàn)任何功能,因?yàn)樵摴δ軡M(mǎn)足處理速度,內(nèi)存和接口的限制。如果不是這三個(gè)限制,8位μP可以執(zhí)行視頻會(huì)議,雖然速度很慢。一旦我確定我有足夠的處理能力,并且我可以在必要時(shí)實(shí)時(shí)執(zhí)行任務(wù),足夠的內(nèi)存和正確的接口,我會(huì)編寫(xiě)該函數(shù)。

然而,在這個(gè)項(xiàng)目中,我是構(gòu)建電路板的設(shè)計(jì)團(tuán)隊(duì)的一員。雖然我的硬件技能有限,但我提供了一個(gè)在代碼中可以合理實(shí)現(xiàn)的視角。也就是說(shuō),包含PIC無(wú)法有效處理的硬件接口將是荒謬的。該團(tuán)隊(duì)開(kāi)發(fā)的一項(xiàng)功能是自動(dòng)檢測(cè)電路,確定端口是否實(shí)際連接到電線(xiàn)。如果沒(méi)有這樣的電路,PIC就無(wú)法知道用戶(hù)想要點(diǎn)亮和循環(huán)多少根導(dǎo)線(xiàn),除非他每次給電路板加電時(shí)輸入該值。相比之下,由于帶有電位計(jì)的RC電路為PIC提供時(shí)鐘,因此PIC永遠(yuǎn)不會(huì)知道它的運(yùn)行速度。 (PIC的設(shè)計(jì)人員認(rèn)為此功能不是必需或有用的。)

請(qǐng)注意,在我們支付第一批電路板之前,我們沒(méi)有鎖定硬件規(guī)格??紤]到產(chǎn)品上市時(shí)間的壓力,即使我們?nèi)匀恍枰帉?xiě)代碼,我們也會(huì)將電路板放到屏幕上進(jìn)行篩選。我們完成了足夠的代碼來(lái)滿(mǎn)足團(tuán)隊(duì)需求,硬件按照我們的預(yù)期運(yùn)行,但是我們還沒(méi)有把所有的花里胡哨都用到了。

一旦我們鎖定硬件規(guī)格,整個(gè)設(shè)計(jì)氛圍就會(huì)改變:硬件和軟件之間發(fā)生斷開(kāi)連接。到目前為止,硬件設(shè)計(jì)是瓶頸。軟件隨時(shí)準(zhǔn)備好等待測(cè)試電路板。一旦我們完成硬件,軟件突然成為瓶頸。此外,我們不再討論我們?cè)谟布蜍浖矫婵梢宰鲂┦裁?現(xiàn)在,這是所有的軟件。硬件團(tuán)隊(duì)離開(kāi)了項(xiàng)目,因?yàn)闆](méi)有人能做到。任何硬件“問(wèn)題”,例如I/O引腳反轉(zhuǎn)或引腳布局,現(xiàn)在都是軟件問(wèn)題。令人沮喪的一天,當(dāng)硬件團(tuán)隊(duì)努力解決地面問(wèn)題時(shí),他們宣稱(chēng)董事會(huì)已經(jīng)完成并走開(kāi)了,留下了一個(gè)未能運(yùn)行與會(huì)話(huà)開(kāi)始時(shí)相同代碼的原型。我發(fā)現(xiàn),有人將輸入按鈕反轉(zhuǎn)為驅(qū)動(dòng)低而不是高,但沒(méi)有給我這個(gè)信息。

此外,每個(gè)人都對(duì)如何改善董事會(huì)的職能有很好的想法,這也帶來(lái)了另一個(gè)挑戰(zhàn)。我們擁有簡(jiǎn)單的硬件基礎(chǔ),為軟件提供了極大的靈活性現(xiàn)在我在槍口下,規(guī)格變化和特征蠕變成了流行病。存在兩類(lèi)規(guī)范更改:功能更改以及如何向用戶(hù)(接口)提供這些功能的更改。在這兩者中,設(shè)計(jì)師通常認(rèn)為界面變化更簡(jiǎn)單,但實(shí)際上它們更難。例如,音序器沒(méi)有顯示,只有兩個(gè)按鈕。經(jīng)過(guò)一些反思,我們意識(shí)到我們可以使用線(xiàn)本身來(lái)向用戶(hù)傳達(dá)信息,所以我現(xiàn)在有一個(gè)原始的10位顯示器。但是,我還必須創(chuàng)建一個(gè)用于“打印”到此顯示的函數(shù)庫(kù)。只有兩個(gè)按鈕創(chuàng)造了在用戶(hù)可編程序列模式下嘗試為多達(dá)10個(gè)命令提供用戶(hù)訪問(wèn)的挑戰(zhàn)。我們提出了一個(gè)擴(kuò)展移位鍵的想法;也就是說(shuō),按住一個(gè)按鈕,同時(shí)反復(fù)按下另一個(gè)按鈕。盡管該計(jì)劃允許我們?cè)L問(wèn)許多功能,但它在按鈕事件的評(píng)估中產(chǎn)生了復(fù)雜性。最初,當(dāng)按下按鈕時(shí),我標(biāo)記了按鈕1或按鈕2事件。現(xiàn)在,我仍然不得不支持這個(gè)機(jī)制來(lái)編寫(xiě)我編寫(xiě)的代碼,同時(shí)創(chuàng)建一個(gè)計(jì)數(shù)按鈕2按下的移位狀態(tài)并觸發(fā)按鈕1的釋放。鑒于我必須在模擬環(huán)境中調(diào)試此問(wèn)題,擴(kuò)展移位起到中斷的作用,并且我必須支持觸發(fā)事件的舊方法,這個(gè)函數(shù)是我設(shè)計(jì)中最復(fù)雜的部分。

PIC匯編語(yǔ)言最令人煩惱的一個(gè)方面是你必須記住位組合。例如,PIC16F84的文檔說(shuō)您可以在累加器W(0)或正在使用的文件寄存器(1)中存儲(chǔ)計(jì)算?;蛘呤侵?chē)钠渌绞?直到我讀到Peatman的書(shū)時(shí),我才意識(shí)到,在F84包含文件中,PIC的設(shè)計(jì)者已經(jīng)為你設(shè)置了W = 0和F = 1的常數(shù)。

使用常量和宏來(lái)簡(jiǎn)化代碼的誘惑誘惑了我。對(duì)于W/F區(qū)別,使用常量是有意義的。但是,我猶豫是否盡可能使用宏。例如,我發(fā)現(xiàn)自己總是被SUBLW和SUBWF拋棄。首先,助記符是不一致的:SUBLW從文字(LW)中減去W,SUBWF從F中減去W(應(yīng)該是SUBWF?)。我一直不得不回到手冊(cè)來(lái)說(shuō)明問(wèn)題。此外,在比較期間使用減法設(shè)置標(biāo)志始終需要仔細(xì)檢查。在x86匯編中,標(biāo)志JA(如果在上面跳轉(zhuǎn)),JB(如果在下面跳轉(zhuǎn))和JZ(如果在零時(shí)跳轉(zhuǎn))清楚地定義比較后的動(dòng)作。這些命令在一條指令中測(cè)試零和進(jìn)位標(biāo)志。您還可以使用PIC(清單4)在一條指令中測(cè)試高于,低于和零。但是,您必須在從A減去A或從A減去A以?xún)H檢查進(jìn)位標(biāo)志而不是零標(biāo)志。 (交換順序會(huì)改變進(jìn)位標(biāo)志是否占零情況。)

我考慮編寫(xiě)一個(gè)宏來(lái)進(jìn)行比較,但是認(rèn)為這個(gè)任務(wù)可能變得復(fù)雜,因?yàn)橹悼赡苁菙?shù)據(jù)或常量,因此需要MOVLW或SUBLW。另外,我考慮了宏的一個(gè)有害的副作用:它們創(chuàng)建“專(zhuān)有”命令。專(zhuān)有命令的問(wèn)題在于,有人閱讀代碼最初會(huì)發(fā)現(xiàn)它們令人困惑并且必須學(xué)習(xí)它們。此外,您在其他應(yīng)用程序中編寫(xiě)代碼時(shí)會(huì)遇到問(wèn)題,因?yàn)槟承┰蚰鸁o(wú)法使用宏,或者必須使用其他人的代碼。

Microchip可以通過(guò)管理標(biāo)準(zhǔn)宏庫(kù)來(lái)簡(jiǎn)化該領(lǐng)域的開(kāi)發(fā)。例如,幾乎每個(gè)程序都使用比較宏(參考文獻(xiàn)3)。如果您使用標(biāo)準(zhǔn)宏庫(kù),宏將成為整個(gè)行業(yè)的命令,而不是程序員之間的絆腳石。在其辯護(hù)中,Microchip確實(shí)提供了一個(gè)令人印象深刻的應(yīng)用筆記庫(kù)(參考文獻(xiàn)4),展示了程序員如何在PIC??上實(shí)現(xiàn)各種功能。但是,需要花時(shí)間對(duì)這些筆記進(jìn)行分類(lèi),讓我自己通過(guò)自己開(kāi)發(fā)代碼來(lái)節(jié)省時(shí)間。

在盒子外面思考

我們?cè)趯⒁粜蚱魍度肷a(chǎn)時(shí)學(xué)到的最重要的一課是設(shè)計(jì)不是一個(gè)線(xiàn)性過(guò)程。團(tuán)隊(duì)通常分為功能組:硬件;軟件;包裝,制造和測(cè)試;等等。不幸的是,設(shè)計(jì)依賴(lài)性不那么整齊。例如,包裝被證明是一種粗魯?shù)挠X(jué)醒。塑料盒似乎比電路板成本更高,我們必須將大部分元件安裝在電路板的背面,以使電路板適合我們選擇的現(xiàn)成的??盒子。設(shè)計(jì)的每個(gè)階段,無(wú)論其看似簡(jiǎn)單,都對(duì)其他階段具有依賴(lài)性和影響。如果我們?cè)诩庇谥圃祀娐钒逯耙呀?jīng)看過(guò)盒子,我們可以用不同的外形設(shè)計(jì)電路板并擴(kuò)大我們可能的盒子選項(xiàng)。

總而言之,這種經(jīng)歷啟發(fā)了我們。我天真地認(rèn)為編碼只需要幾天時(shí)間,所以我對(duì)我們超出預(yù)計(jì)時(shí)間表的時(shí)間感到震驚。當(dāng)然,我們每個(gè)人都有其他全職工作和個(gè)人生活。但是,我嚴(yán)重低估了我加快PIC速度所需的時(shí)間。我忘記了我有多年的x86匯編經(jīng)驗(yàn),并且已經(jīng)花費(fèi)了大量的時(shí)間來(lái)理解該架構(gòu)的復(fù)雜性和細(xì)微差別,以及常見(jiàn)的邏輯結(jié)構(gòu),例如表格。這些知識(shí)讓我在PIC開(kāi)發(fā)方面處于領(lǐng)先地位,但我仍然不得不重新構(gòu)建我可編碼的許多函數(shù),而不用考慮x86,以及克服我的偏見(jiàn)和假設(shè)。關(guān)于假設(shè)的令人討厭的事情是很容易忘記你曾經(jīng)做過(guò)它們。

現(xiàn)實(shí)情況是,8位μP仍然存在,并且正在尋找越來(lái)越復(fù)雜的應(yīng)用程序(參考文獻(xiàn)5)。在某些方面,它們專(zhuān)門(mén)用于某些任務(wù),例如接口管理,傳感器監(jiān)控和串行通信,因?yàn)?a target="_blank">音頻解碼器適用于MP3播放器。而且,在設(shè)備不斷變得更加智能化的世界中,它們以低成本提供了相當(dāng)大的智能。

經(jīng)典混淆和錯(cuò)誤

臭蟲(chóng)是討厭的小家伙,特別是如果他們是你自己的錯(cuò)。以下是我制作的一些經(jīng)典混淆和錯(cuò)誤,希望您能避免:

十六進(jìn)制/十進(jìn)制混音:示例:當(dāng)您使用10代替10而不是0'0a時(shí)。我發(fā)現(xiàn)最好在整個(gè)程序中使用一個(gè)基數(shù)和編號(hào)約定來(lái)避免歧義。

文字/地址混淆:我有很多關(guān)于文字和地址的混淆,因?yàn)閮烧叨急欢x為常量。在16位和32位的世界中,匯編程序通常會(huì)標(biāo)記對(duì)常量的誤用。例如,我沒(méi)有使用ADDLW posxw_table,而是使用ADDWF posxw_table,W。很明顯,這個(gè)錯(cuò)誤是我的,因?yàn)槲以噲D在該地址而不是偏移處添加字節(jié)。然而,對(duì)于不熟悉的助記符,更容易犯這個(gè)錯(cuò)誤,因?yàn)槲伊?xí)慣于使用Offset命令而不是明確地聲明我在add指令中使用了文字。

拐杖功能:早期,我的設(shè)計(jì)需要延遲功能。我第一次寫(xiě)了一個(gè)計(jì)算周期。制作這種快速和骯臟功能的問(wèn)題在于我繼續(xù)使用它的時(shí)間比我應(yīng)該的時(shí)間長(zhǎng)得多。更有用的功能,我知道我最終還是要編寫(xiě),是TMR0延遲。因?yàn)槲乙蕾?lài)于拐杖功能,所以我避免編寫(xiě)TMR0延遲,它定義了我的中斷結(jié)構(gòu)和事件標(biāo)記機(jī)制。當(dāng)我寫(xiě)TMR0延遲時(shí),我不得不調(diào)整并重新調(diào)整它影響的部分。您應(yīng)該更早而不是更晚地編寫(xiě)基礎(chǔ)和結(jié)構(gòu)函數(shù)。

始終清除內(nèi)存或假設(shè)它未定義:一度,我遇到了一個(gè)看起來(lái)像參數(shù)的問(wèn)題,讓我想知道存儲(chǔ)在EEPROM中的參數(shù)是如何設(shè)置的。當(dāng)我檢查EEPROM時(shí),參數(shù)是正確的,但程序無(wú)法根據(jù)參數(shù)執(zhí)行。問(wèn)題是由物理參數(shù)轉(zhuǎn)換為邏輯參數(shù)造成的。 EEPROM存儲(chǔ)上電參數(shù),但您可以在運(yùn)行模式下在RAM中更改它們。例如,您可以將速度從慢速切換到快速。我一直在為演示模式開(kāi)發(fā)代碼,其中邏輯參數(shù)工作(以慢速模式啟動(dòng)),但是當(dāng)我以正常模式運(yùn)行(以快速模式啟動(dòng))時(shí)它們失敗了。我造成了這個(gè)問(wèn)題,因?yàn)槲以谟帽忍匮诖a之前從未清除過(guò)邏輯參數(shù);我錯(cuò)誤地認(rèn)為內(nèi)存從0開(kāi)始(當(dāng)芯片通過(guò)0xff啟動(dòng)時(shí)尤其愚蠢)!

確認(rèn)所有模式在主要代碼更改:我經(jīng)常在演示模式或編程模式下進(jìn)行更改,然后在返回運(yùn)行模式時(shí)發(fā)現(xiàn)錯(cuò)誤。模式對(duì)整個(gè)系統(tǒng)狀態(tài)做出了不同的假設(shè),并且在您花費(fèi)時(shí)間對(duì)代碼的其他部分進(jìn)行重大更改后,確認(rèn)您的代碼不會(huì)違反這些假設(shè)。

強(qiáng)大的id =“id1138604-119-strong”>了解設(shè)備的架構(gòu):沒(méi)有什么比認(rèn)識(shí)到芯片不能按照你想象的那樣工作的尷尬或沮喪。我已經(jīng)說(shuō)明了PIC家族對(duì)我的一些驚喜。雖然我可能會(huì)認(rèn)為我使用了不充分的文檔,但我不理解芯片,并且我失去了寶貴的開(kāi)發(fā)時(shí)間。我在16位和32位世界中學(xué)到的許多經(jīng)驗(yàn)都沒(méi)有延續(xù)到8位領(lǐng)域。僅當(dāng)我無(wú)法弄清楚某些內(nèi)容時(shí)才參考規(guī)格表,這不利于學(xué)習(xí)PIC架構(gòu)。

了解您自己的硬件:一兩次,硬件人員的任務(wù)與他們說(shuō)的不同。早期,我希望我創(chuàng)建了一個(gè)簡(jiǎn)單測(cè)試硬件特性的虛擬程序,例如它是否驅(qū)動(dòng)輸出高或低,所以我可以確認(rèn)沒(méi)有人在我的原型上“修復(fù)”或“改進(jìn)”電路板。此程序也類(lèi)似于“健全性刻錄”,以確認(rèn)測(cè)試運(yùn)行失敗是您的代碼的結(jié)果,而不是因?yàn)橛布收匣蚋摹?/p>


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    新戰(zhàn)局,解析64位處理器以及未來(lái)發(fā)展趨勢(shì)

    就目前而言,64位處理器對(duì)于用戶(hù)來(lái)說(shuō),并沒(méi)有太大的意義。不過(guò)在未來(lái),或許手機(jī)真的需要8GBRAM甚至更高的RAM時(shí),64位處理器及系統(tǒng)應(yīng)用才能真正得到性能上的發(fā)揮,讓用戶(hù)真正的體驗(yàn)到64位處理
    發(fā)表于 10-03 13:30 ?1786次閱讀

    32嵌入式處理器8位處理器應(yīng)用開(kāi)發(fā)的區(qū)別

    32的RISC嵌入式處理器非常大的優(yōu)勢(shì),為嵌入式設(shè)計(jì)帶來(lái)豐富的硬件功能和額外的性能,已經(jīng)成為嵌入式應(yīng)用和設(shè)計(jì)的主流。而8位處理器通常受到的
    發(fā)表于 09-22 10:42 ?1691次閱讀

    詳細(xì)解析32嵌入式處理器8位處理器應(yīng)用開(kāi)發(fā)的不同之處

    目前,國(guó)內(nèi)熟悉8位處理器開(kāi)發(fā)的工程師非常多,開(kāi)發(fā)工具和手段也很豐富,并且價(jià)格較低。而32位處理器的開(kāi)發(fā)與8位處理器的開(kāi)發(fā)則有著許多明顯的不同
    的頭像 發(fā)表于 02-07 09:14 ?8794次閱讀

    一個(gè)簡(jiǎn)單的8位處理器完整設(shè)計(jì)過(guò)程及verilog代碼

    一個(gè)簡(jiǎn)單的8位處理器完整設(shè)計(jì)過(guò)程及verilog代碼,適合入門(mén)學(xué)習(xí)參考,并含有作者個(gè)人寫(xiě)的指令執(zhí)行過(guò)程。
    的頭像 發(fā)表于 04-10 11:43 ?4693次閱讀

    32位處理器可以裝64系統(tǒng)嗎 32位處理器能否裝64系統(tǒng)分析

    32位處理器可以裝64系統(tǒng)嗎?從技術(shù)角度看,32位處理器是不能裝64系統(tǒng)的,因?yàn)椴恢С?,不確定的用戶(hù)
    發(fā)表于 06-28 09:57

    32位處理器的開(kāi)發(fā)與8位處理器的開(kāi)發(fā)有哪些明顯的不同?

    32位處理器的開(kāi)發(fā)與8位處理器的開(kāi)發(fā)有哪些明顯的不同?開(kāi)發(fā)一個(gè)32的嵌入式系統(tǒng)需要哪些工具和環(huán)境呢?32嵌入式系統(tǒng)的開(kāi)發(fā)過(guò)程中存在哪些技
    發(fā)表于 04-19 08:11

    何謂32位處理器

    32位處理器首先處理器都是8的倍數(shù):8/16/32/64。表示一個(gè)時(shí)鐘周期里,處理器處理的代碼數(shù)
    發(fā)表于 07-13 08:41

    為什么說(shuō)8086是16位處理器

    為什么說(shuō)8086是16位處理器?什么是編程結(jié)構(gòu)?由哪兩部分組成,功能是啥?AD為何又能發(fā)地址,又能發(fā)數(shù)據(jù)?io端口是什么?編址方法有哪兩種?8086用的哪種?
    發(fā)表于 08-06 06:48

    Intel 32位處理器 ,Intel 32位處理器結(jié)構(gòu)原理

    Intel 32位處理器 ,Intel 32位處理器結(jié)構(gòu)原理是什么? 微型計(jì)算機(jī)中的運(yùn)算和控制合起來(lái)稱(chēng)為CPU,因CPU通常集成在一塊大規(guī)模集成電路
    發(fā)表于 03-26 15:05 ?2154次閱讀

    Intel 64位處理器,Intel 64位處理器結(jié)構(gòu)原理

    Intel 64位處理器,Intel 64位處理器結(jié)構(gòu)原理 現(xiàn)在人們廣泛使用的是由32處理器構(gòu)成的計(jì)算系統(tǒng),但是32的計(jì)算和操作系統(tǒng)
    發(fā)表于 03-26 15:07 ?3425次閱讀

    AMD 32位處理器,AMD 32位處理器有哪些系列?

    AMD 32位處理器,AMD 32位處理器有哪些系列? AMD,這個(gè)成立于1969年、總部位于美國(guó)加利福尼亞州桑尼維爾的處理器廠商,經(jīng)過(guò)多年不懈地
    發(fā)表于 03-26 15:14 ?4547次閱讀

    基于NiosII 32位處理器的LED大屏幕顯示系統(tǒng)設(shè)計(jì)

    本文提出了一種基于NiosII32位處理器的設(shè)計(jì)方案,能有效地實(shí)現(xiàn)單屏幕多窗口的任意位置顯示,使得顯示方式更加靈活方便。
    發(fā)表于 09-07 11:50 ?1936次閱讀
    基于NiosII 32<b class='flag-5'>位處理器</b>的LED大屏幕顯示系統(tǒng)設(shè)計(jì)

    8位處理器上實(shí)現(xiàn)高效文件系統(tǒng)

    8位處理器上實(shí)現(xiàn)fat fat12 fat16 fat32的高效文件系統(tǒng)
    發(fā)表于 12-30 15:37 ?0次下載

    “硬件軟件化”,32位處理器的開(kāi)發(fā)與8位處理器的開(kāi)發(fā)資料下載

    電子發(fā)燒友網(wǎng)為你提供“硬件軟件化”,32位處理器的開(kāi)發(fā)與8位處理器的開(kāi)發(fā)資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶(hù)指南、解決方案等資料,希望
    發(fā)表于 04-22 08:55 ?6次下載
    “硬件軟件化”,32<b class='flag-5'>位處理器</b>的開(kāi)發(fā)與<b class='flag-5'>8</b><b class='flag-5'>位處理器</b>的開(kāi)發(fā)資料下載

    到底64位處理器和32位處理器有什么區(qū)別呢?資料下載

    電子發(fā)燒友網(wǎng)為你提供到底64位處理器和32位處理器有什么區(qū)別呢?資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶(hù)指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-25 08:47 ?8次下載
    到底64<b class='flag-5'>位處理器</b>和32<b class='flag-5'>位處理器</b>有什么區(qū)別呢?資料下載