2013年2月8日 星期五

古怪的儀器偵測電路(未解決)

  前些日子,生化部門的表示他們要做個實驗,但是需要開關電路,他們有一台電位儀http://chinstruments.com/chi600.shtml,會供應0.4V給試片,並且測量出流經試片的電流。

接著,當試片進血後,電路斷開,等待四秒後,電路再接上,這樣的需求不知道有沒有辦法做到。
我思考後,換成工程師的講法就是,偵測到進血,斷開,計數四秒後,再度接回。
於是我構想出以下的電路。
圖一
圖一為整個電路架構圖,需要三個開關,一個電阻一個電容,還有一個A/D輸入。

STEP1:等待進血

  試片在未進血時電阻是MΩ等級的,也就是相當於斷路,進血後會跳到10KΩ左右,為了要偵測電阻變化,所以必須要給另外一個電阻做分壓,抓A/D輸入,當輸入不等於0.4V時,就知道進血了,但是等待時串聯一個無限大電阻相當於浮動電位,故加了一個電容,讓它充到0.4V,確保A/D輸入數值正確。

STEP2:進血後斷開4秒
  進血後將三個開關都切掉,等待四秒。

STEP3:恢復通路
  恢復通路這點的關鍵在於,能否使電路恢復到只有電位儀接到試片的狀態,所以跟電阻並聯的開關是必要的,才可以在恢復通路時,電流不走到電阻的那條路徑,串聯的開關則是為了斷開完全。

   電路設計好了,剩下就是寫韌體,開關用MCU的類比開關搞定,韌體寫好後,我用電源供應器供應0.4V,試片的部分拿個電阻接上跟沒接來測試,三種狀態一切正常。

  給生化部門的拿來測,他們要看的只是有沒有四秒延遲波形出現,有了,他們表示滿意,好像就這樣搞定了,一天思考一天實作,兩天搞定,難的是如何將需求用硬體+韌體完成。

-----------------------------------------------------------------

但是他們後來使用市售的試片測試,卻產生直接就觸發的現象,沒有四秒延遲,等我上去測試時發現,當電位儀接上版子,0.4V變成了2.5V,意味著電位跑掉了,所以其實我們以為的等待狀態,實際上是STEP3的狀態,電腦上面電位儀依然顯示0.4V,就算設定其他電位,一接上版子還是變成2.5V,這怪異的現象到現在仍然無解。

一接上就變2.5V,所以之前可用或許只是運氣好,電位儀應該算是微電流計,它可以設定電位,偵測迴路的電流,為了維持固定電位,應該會因為負載效應持續調整電位直到設定的電位,又因為是電流計,是否跟單晶片共地造成這樣的錯誤,可是偏偏電源供應器跟單晶片共地卻操作正常,這讓我百思不得其解。

我問了是否可用繼電器的做法,他們說曾經找過研發部的做過,訊號變很怪,所以失敗。

實在不知道該如何解決了,話說杜老師的交流訊號干擾也是不知怎麼解決的問題,想不出解決方法的東西又一個,實在令人不快。

21 則留言:

  1. 0.0 我的印象中這類儀器一般好像用在量測電化學特性
    我覺得會不會他們自己的儀器的 Mode 有調整錯誤阿

    這種機器的 Mode 會有兩種

    1.定電壓 量電流
    2.定電流 量電壓

    而且兩種 Mode 怎麼跟待測物體接 電路好像也不同
    看看能不能要到儀器的說明書來看一看或是有原廠 pdf
    搞不好會有頭緒

    不知道你們的機器有沒有電流檔能看到當前消耗電流

    假如調成 定電流 量電壓 ;
    那一旦電流變小那機器就會調高電壓

    因為感覺你的電路沒甚麼問題阿 XD
    是不是他們機器的 mode 自己沒調整好阿

    所以找儀器的說明書來看看要怎麼搭配你目前的架構
    接 也許是一個解決問題的方向

    在不行 可能就要搬出以前我們討論的那種
    專門直接量測電流的特殊電路轉成 Volt 在灌進 MCU
    直接量測電流 不過那個電路好麻煩 是我的話也不想接阿 XD

    回覆刪除
  2. 因為這類的機器一般後面就會有提供跟電腦連接的界面
    0.0 一般都會有 RS232 或 GPIB 也許還有其它介面
    或是直接提供類比輸出 讓你直接接電腦 AD 卡
    直接在電腦上寫軟體去接收 ; 或是夜風有特殊用途
    所以得在外部自行用電路量測 ??

    回覆刪除
  3. 他好像只有一些供應波形的設定
    但是沒有相關可撰寫的平台

    這個儀器就是設定定電壓後 偵測電流
    可是問題是接上去後 好像連他定電壓的能力都失掉了
    http://chinstruments.com/images/chi600/schematic.svg
    可以看到他有sense counter reference 三個腳
    counter和reference要接在一起才有辦法定電壓
    這種接法好像是電化學才會知道的

    不過他量測的是微電流 10^-6A
    所以換別的方法量測可能有沒有這台儀器可以量測的能力

    回覆刪除
  4. 從圖看我有看到
    sense (工作電極)
    reference (參考電極)
    counter (輔助電極)

    接法的話我查了一些資料

    http://www.chinstruments.com/Brochure.pdf 第16頁

    reference 的表達法我這樣畫是指 不是直接浸入溶液
    外面是一個鹽橋

    我的理解是
    reference 上面不會有電流
    sense 要接上被鍍材料
    counter 要接上電鍍素材

    例如 counter 接上銅棒 ; sense接上石墨
    銅棒會越來越短 變銅離子 移動到 sense

    sense----------------------|
    reference------------| |
    [|] |
    counter ----| [=] |
    ==|===待測溶液==|===
    | [=] |

    我看了這台機器的規格也是有 Potentiostat 與 Galvanostat (是恆電位與電流都有)
    Potentiostat 是 CV 然後電流連續變化 不斷記錄 sense 的 電流 變化曲線
    Galvanostat 是 CC 然後電壓連續變化 不斷記錄 sense 的 電壓 變化曲線

    所謂的電壓都是相對值 Vref-Vsen 與 Vref-Vcntr

    不知道在你的平台上要怎麼去接 XD

    你看到 0.4 會不會是指那個 reference 所以外面變 2.5 機器還是寫 0.4 ??
    另外圖中使用的輸入電阻後面要不要在掛一個 follower 弄成高阻抗再試試看阿
    不過夜風的目的好像是要量測電流 量測電流用MCU應該是蠻有挑戰性的試驗~~

    再研究再研究~~~

    回覆刪除
  5. 囧 我辛苦畫的ASCII圖跑掉了 ;
    看 http://www.chinstruments.com/Brochure.pdf 第16頁
    會比較快

    回覆刪除
  6. 這玩意老美還有代理給大陸公司

    CHI600E系列電化學分析儀/工作站
    http://www.chinstr.com/_d274606761.htm
    可以看一看對應的中文描述 每一個都好像很艱深

    參數沒一個看得懂 雞同鴨講 只能說同樣是電路
    在溶液裡面跑的電你我就不懂啦~~~~~
    隔行如隔山阿 這些搞電化學的怎麼會需要這麼多種方法 囧

    收尋一下你的強者集團中 有沒有學電化學的
    看看有沒有甚麼 竅門可以打通

    話說 paper 回了 問題一堆 囧
    只能拼拼看了 /\.

    回覆刪除
    回覆
    1. paper加油啊
      參考一下加恩回信的方式看看 

      刪除
  7. counter和reference要接在一起並接在地端
    sense端是接在正端
    這樣出來對於被動原件的負載才會是0.4V

    如果counter和reference沒接在一起
    就跑不出他在電腦上設定的0.4V
    然後我就問說 那為什麼還要做兩個腳位
    感覺還有其他接法

    回覆刪除
    回覆
    1. 怪了 這跟wiki上的Potentiostat 接法相反

      刪除
    2. 0.0 我想你的猜測應該是正確

      因為這類儀器應用在實際電鍍槽中雖然沒有接在一起 可是電解液可是會導通的喔
      這樣就好像你將它們接在一起,而且 reference 一般要貼近 sense 電極類似

      --counter電極---電解液面------reference電極--sense電極---

      一個比較有趣的問題在於 假如是透過一個電解液介質在傳導 你在去量測 這幾個
      電極到底對地的電位是多少; 我猜在電解液裡面 電極之間有距離存在
      所以應該就會有電壓差存在 所以才需要有三極; 因為電解液中的壓差都是相對於
      reference的差值; 假如你弄一杯食鹽水攪拌一下 把這三支電
      極都夾一個金屬片 插進 食鹽水 三極在分別用電表對GND量電壓 不知道會看到
      甚麼樣的值 ?? 這樣或許會釐清一些問題

      ㄎㄎ 我怎麼感覺有點是把 恆電位儀 當成另外一種儀器 電源量測單位儀(SMU)
      在使用 不過 恆電位儀 我看那架構 其實就很像一台 SMU ;
      另外就是會不會機器能提供的電流不大 有沒有可能你串接的那個電阻
      太小了 要用更大的電阻

      刪除
  8. 夜風在CHAT上的問題 :

    其實try迴圈是很沒效率的方法

    通常 delay 的副程式會用一組可以精確算幾個 machine cycle (mc)
    的指令構成,這些指令通常都是都是占用 1mc 或 2mc

    常見的做法通常先量測 用一組保證固定長度的指令測試程式的 mc
    程式如下 :

    void main() {
    #pragma ASM
    CLR P1.2
    NOP
    NOP
    NOP
    NOP
    SETB P1.2
    #pragma ENDASM
    }

    這個標準測試程式占用 5 MCs (why? CLR+SETB 只需 1 mc C8051有這種特性)
    其他的51 你可以查閱指令集看 CLR+SETB 要幾個 mc
    假如你的檔案是 main.c 記得先去 Option for File 'main.c'
    啟動 Generate Assembler SRC file
    啟動 Assemble SRC file
    這樣inline asm 才能編譯, 接著設定好 邏輯分析儀 只有邊緣變化才觸發
    程式down後先將51電源關閉 先接好邏輯分析儀並進入等待觸發的狀態 接著打開 51 的電 就馬上在電腦螢幕就可以抓到一個 凸起的 脈波
    把邏輯分析儀給的 脈波時寬 除掉 5 就知道一個真正的 mc 是多少了~~~~
    示波器也是可以設定觸發條件 設定成 只有邊緣觸發才會抓且為非連續模式
    假如沒這樣的功能 改用狂按reset法 手動run/stop示波器 其實也是可以 XD
    只是比較難抓就是啦

    以下是一個我常使用可以設定 要 delay 幾個 mc 的範例

    // Delay Routine
    void RoutineDelayMCs(unsigned int interval) {
    #pragma ASM
    DJNZ R7, $
    DJNZ R6, $-2
    #pragma ENDASM
    }

    // Delay Macro -> Calculate interval to pass into Delay Routine
    #define MacroDelayMCs(interval) \
    ((!(((interval)/2) - 257*((((interval)/2)+256-1)/257))) ? \
    RoutineDelayMCs(257*((((interval)/2)+256-1)/257)) : RoutineDelayMCs(((interval)/2)+256-(((interval)/2)+256-1)/257))

    // Offset Macro -> Calculate offset MCs of MOV, LCALL, RET ...
    // command -> for better accuracy
    // Accuracy (if interval even, error = 0;
    // if interval odd, error = -1 MCs
    // interval apply Range : 14 -> 131592
    #define DelayMCs(interval) \
    MacroDelayMCs(interval-10)

    void main() {
    DelayMCs(14); // This call delay 14 Machine Cycles
    DelayMCs(512); // This call delay 512 MCs
    DelayMCs(131592); // This call delay 131592 MCs
    }

    當然假如你只是要 delay 幾個 u 像 5u 還是 打幾個 nop 就好

    所以 Delay函式的設計 要以 machine cycle(量子時間)為單位設計會比較好
    這樣以後拿到 不同的 51 只要量測 1mc 等於多少時間 因為CPU不可能
    知道自己有多快 至少 Delay的函式 不用改來改去

    至於你可能會思考中Macro中怎麼會有一堆加減乘除,恩 這些東西都是常數
    編譯階段實際上會被 compiler 經過預先計算代換成一個常數而已
    這個設計有他巧妙的地方 當三元運算子條件只是一個常數,那結果就會預先被
    編譯器預測,編譯器就會簡化成直接呼叫 true 或 false 的條件 跳躍就會消失;
    夜風可以看到 沒有使用迴圈, 迴圈會有不可測性
    因為不知道 假如非 Keil 品牌的 51 編譯器 會不會產生不一樣的 ASM Code

    回覆刪除
  9. 因為 machine cycle 至少是量子時間 意義上比較清楚
    迴圈次數其實可讀性很差迴圈次數跟時間往往對不起來也沒有意義
    完全就是得要用示波器去try

    別人也不知道你到底真實 delay幾個 u ; 上面的寫法
    給量子時間的意義就明確多了,接手看程式的人 在自己去
    量一下 "一顆時間有多長" 就知道了

    而量 "一顆時間有多長" 的標準技巧我也給在文中~~~ :)

    回覆刪除
    回覆
    1. 如果要使用delay 1s 2s這種要用timer嗎
      我之前寫過 但是呼叫出來都不是很準

      刪除
    2. 0.0 夜風的 8051 有內建鎖相迴路嗎? 假如沒有內建鎖相迴路
      的CPU只是純粹將石英震盪器頻率整成方波輸入CPU內部這樣其實在
      怎麼調都不準 CPU 並不知道自己有多快, CPU 只知道幾個有 MCs
      。timer 的 register 也只是一種計數, 只要你的 BCLK 準 大概不管用甚麼方法都很準, 也就是餵給 CPU 時脈的產生源要準, 第二點
      就是選用的震盪頻率要能跟 timer 相關的control register 要能
      整除; 石英震盪器頻率的物理頻率不會很準只是個大概; 我以前
      要解決這種問題的辦法就是搬出 CY25811; 一顆 1:1 的 PLL IC

      簡單的講就是例如

      不太準的石英頻率12MHz-->CY25811-->吐出一個很準的12MHz
      吐出的12MHz在灌入你的CPU那delay的準度保證就嚇嚇叫~~~
      不管用甚麼 timer 還是 其他的 delay 方法都是很準的喔
      CY25811 的 S0 S1 腳位 還可以對中心震盪頻率進行微調
      當然 會用到 CY25811 作為時脈產生器是真的對準度吹毛求疪
      你看它應用於掃描器上面,掃描器的CPU對於時間計數要很準

      假如沒有要很準 建議你還是總是先量出 CPU上一個 NOP
      到底是花多少時間; 因為 NOP 在所有 CPU 上都一定只佔用 1MC
      不會有任何變化; 在用 DelayMCs 觀察示波器去實驗
      因為慢慢微調幾個 MC 絕對是最可靠的方法

      Example Code:

      static unsigned int iCntr;

      void main() {
      #pragma ASM
      CLR P1.2
      #pragma ENDASM

      // 這樣可以微調出想要的delay 而且有較大的範圍
      iCntr = 10000; // 夜風自己try看看
      while(1)
      if(--iCntr) DelayMCs(100000); // 夜風自己try看看
      else goto _exit_dly;
      _exit_dly:
      // 以上有DelayMCs搭配一個Counter這樣的微調機制比較有彈性
      // 寫 51 多善用減法特性 用零當出口是最簡單的方式, 這樣就
      // 不需要 大於小於 做比較 :)

      #pragma ASM
      SETB P1.2
      #pragma ENDASM
      }

      0.0 因為拿 timer 作 delay 太可惜了
      中斷對於CPU來說是很寶貴資源 不會拿 timer 只是去 delay

      中間那段假如夜風想要放在一個副程式裡面try
      就把 goto _exit_dly 改成 return 就好了
      中間那段砍掉 換成呼叫這個副程式

      // Range of DelayMCs : 14 -> 131592
      void delay_any(unsigned int cntr)
      {
      iCntr = cntr;
      while(1)
      if(--iCntr) DelayMCs(131592);
      else return;
      }

      我是覺得你可以先用示波器try一些你常用的小delay時間 HAL化
      常寫時間一久 你就累積出一套自己的 know how 像

      #define delay_0025u DelayMCs(??)
      #define delay_0050u DelayMCs(??)
      #define delay_0075u DelayMCs(??)
      #define delay_0100u DelayMCs(??)
      #define delay_0200u DelayMCs(??)
      #define delay_1000u DelayMCs(??)

      其實問題本質還是在震盪源本身,假如要極高精度的要求
      解決問題的根源就是直接外掛 CY25811 震盪源給 8051 吃

      0.0 所以 看你的需求囉~~~

      刪除
    3. 我後來利用timer當計數器來計算delay實際到底是過了多少mc
      微調出1s的delay
      不過像你那邊用巨集不用迴圈的方式我還沒試出來
      編譯會過
      但是連main都進不去
      我在想可能是偉詮的這顆不支援組語的動作

      compiling main.c...
      SOURCE\MAIN.C(42): warning C280: 'interval': unreferenced local variable
      assembling .\OUT\main.src...
      assembling ICE5075.ASM...
      assembling STARTUP.A51...
      linking...
      *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
      SYMBOL: ?C?FPMUL
      MODULE: .\OUT\main.obj (MAIN)
      *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
      SYMBOL: ?C?FPADD
      MODULE: .\OUT\main.obj (MAIN)
      *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
      SYMBOL: ?C?FCASTI
      MODULE: .\OUT\main.obj (MAIN)
      *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
      SYMBOL: ?C?FPSUB
      MODULE: .\OUT\main.obj (MAIN)
      *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
      SYMBOL: ?C?FPDIV
      MODULE: .\OUT\main.obj (MAIN)
      *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
      SYMBOL: ?C?CASTF
      MODULE: .\OUT\main.obj (MAIN)
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FPMUL
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 01DEH
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FPADD
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 01E9H
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FCASTI
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 0219H
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FPSUB
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 0224H
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FPMUL
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 022FH
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FPADD
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 023AH
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FCASTI
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 025EH
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FPSUB
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 0269H
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FPMUL
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 0274H
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FPDIV
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 027FH
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?FPADD
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 028AH
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C?CASTF
      MODULE: .\OUT\main.obj (MAIN)
      ADDRESS: 02B1H
      *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
      SYMBOL: ?C_START
      MODULE: .\OUT\STARTUP.obj (?C_STARTUP)
      *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
      SYMBOL: ?C_START
      MODULE: .\OUT\STARTUP.obj (?C_STARTUP)
      ADDRESS: 0593H
      Program Size: data=81.0 xdata=67 code=1361
      creating hex file from ".\OUT\LCD"...
      ".\OUT\LCD" - 0 Error(s), 21 Warning(s).

      warning很多 但是就不知道死在哪
      debug mode進去他找不到main() 就一直run

      刪除
    4. ㄎㄎ 不是這樣的; 你想想 Keil 公司是一個開發 Compiler 的公司
      不可能知道全世界有多少變種 8051 ; 可是全世界 8051 都可以用 Keil C51來編譯; C51 一旦你啟動嵌入式組語支援 你就得自己引入正確的 C51 程式庫;就是說 你忘記引入 Library 啦 所以才出現連結時期 找不到 該函式
      符號 就跟 你以前寫 mfc 我教你 用馬達的 API 要引入 帶有這些 API 實體
      的 .lib ; 這個觀念在所有CPU平台都是一樣; 所以 答案是.....

      請在你在專案加入 C51FPS.LIB; 假如還有其他連結問題 有許多不同型式 51
      Runtime程式庫像 C51XXX.LIB都可以引入試試看;
      反正出現這類連結時期 找不到 函式符號
      你的反射動作就是到 Keil\C51\LIB try 看看 是不是在函式躲在
      某個 .lib 裡面 或是去 Keil 官網查詢~~

      再次強調 .lib .obj 這些 就跟你的 .c 程式完全一樣 只是它們是預先
      被編譯好了, 你直接引入專案裡面用就好~~~

      原來你是用 WT5075F

      刪除
    5. ㄏㄏ 而且我看到缺的函式還可知道 你在 51 裡面使用了浮點運算
      C51 Library Function 這本手冊有很詳細介紹 Keil 提供哪些
      C51 標準程式庫, 還有就是剛剛上面講的這些程式庫還有不同版本
      我幫你找好了

      51 沒有浮點運算單元 浮點運算是用整數演算法模擬出來的喔

      以下截錄自 C51 Library Function

      The C51 library includes six different compile-time libraries which are optimized for various functional requirements. These libraries support most of the ANSI C function calls.

      Library File Description
      C51S.LIB
      Small model library without floating-point arithmetic
      C51FPS.LIB
      Small model floating-point arithmetic library
      C51C.LIB
      Compact model library without floating-point arithmetic
      C51FPC.LIB
      Compact model floating-point arithmetic library
      C51L.LIB
      Large model library without floating-point arithmetic
      C51FPL.LIB
      Large model floating-point arithmetic library
      80C751.LIB
      Library for use with the Signetics 8xC751 and
      derivatives.

      Several library modules are provided in source code form. These routines are used to perform low-level hardware-related I/O for the stream I/O functions. You can find the source for these routines in the LIB directory. You may modify these source files and substitute them for the library routines. By using these routines, you can quickly adapt the library to perform (using any hardware I/O device available in your target) stream I/O.

      0.0b 你自己挑挑看 看你想用那一種版本~~~
      我常用的是 假如程式完全都只有整數運算 我採用 C51S.LIB
      假如程式有需要用到浮點運算 我採用 C51FPS.LIB
      其他的我沒用過。

      刪除
    6. 另外 我的 IDE 是用 uVision4 ; 有類似 Visual Studio 會自動
      將原始檔每個 .c/.cpp 的函式清楚列在 Functions Windows
      尤其在開發 比較複雜的 C51 程式 時候 就可以直接在不同函式
      跳來跳去也不用記憶某某函式到底在哪個 .c 裡面;
      這個IDE的Upgrade是免費的喔;我是用 UV400Beta1.EXE
      灌完後在uVision4中設定好 原來UV2 裡面的 C51 相關的 include
      compiler linker library 等等相關工具 程式庫 標頭檔的路徑

      我覺得 Keil 現在本身也已經不太重視 IDE 本身 因為現在要開發一個
      編輯程式有語法色彩解析的編輯器太容易了 到處都有開放原始碼專案可以參考
      而且免費的工具還比 Keil 本身編輯器更強; 我以前就嘗試過
      用 Visual Studio 自訂C51工具路徑 在 VS下 開發 C51; 這實在很瘋狂
      開發 C51 用 Visual Studio ; 我後來 發現 uVision4 Beta 還不錯
      就換回來了畢竟還是不要拿氫彈炸螞蟻; 基本上以後 IDE 都會免費

      那 Keil 最賺的是甚麼? 恩 就是現在 Keil公司的 ARM 編譯器工具

      夜風應該會很感興趣 怎麼在 Visual Studio 架設 C51 的環境
      恩 其實只要會使用 NMAKE 要在 Visual Studio 下做甚麼其實都可以

      現在開放原始碼大行其道的時代 我的觀點是 至少 NMake 或 GNU Make
      要學會一套(因為所有 Make 都是基於 System V 學會其中一個 學
      其他的就很快)

      因為你會 Make 就可以玩許多好玩的程式 自己編譯 自己跑 也不用期待
      有編譯好的版本 一切自己來...

      刪除
    7. 我看你還有 ?C_START 沒有找到
      這兩個可能在你的 case 都得要引入
      C51S.LIB
      C51FPS.LIB

      沒有連結到 ?C_START 你的 C51 程式就掛掉了
      因為 ?C_START 最終會呼叫你的 main()

      刪除
    8. 我還是稍微解釋一下 RoutineDelayMCs
      你看到

      warning C280: 'interval': unreferenced local variable
      不用去管它因為 編譯器並不知道你直接去 call 它

      這個 unsigned int interval 編譯器會翻譯成
      一個 unsigned int 被拆解成 R7 R6 來表示

      MOV R7,#XXH
      MOV R6,#XXH
      LCALL _RoutineDelayMCs

      這就是 C51 呼叫一條函式的 呼叫慣例

      現在夜風知道啟動內嵌組語的好處了吧, 這樣就可以觀察
      一個 main.c 吐出的 main.src 把, main.src 打開來看
      我的51組語就是這樣學 編譯器就是我們最好的指導者

      先這樣 有甚麼問題可以在繼續互相討論討論~~~ 0.0b

      刪除
  10. 真是太感謝了
    提供了這麼多資料
    因為組語對我來說實在太陌生了

    回覆刪除