痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 6089|回復: 20

廉價邏輯分析儀學習微處理的好工具!!

[複製鏈接]
發表於 2014-11-30 23:41:19 | 顯示全部樓層 |閱讀模式
本文章最後由 antlu 於 2014-12-1 12:41 AM 編輯

用 C語言 控制MCU作玩具也已經好幾年了,沒有壓力進步慢是一定的,最近開始用 舅舅您 對岸代購的 SALEAE 的邏輯分析儀,好用!! 所以一定要分享給網友們,這不是推銷,但是誠心的推薦(價格記得只有幾百元)!!
日前 寫 LGC12002 串列七段顯示,這幾天 想要了解 溫溼度感應器的特性,有這個儀器可以把現象顯示出來,很容易發現自己的程式寫錯,對於時序的確認來說最好不過了,...

DSC08106.JPG

DSC08107.JPG


screenshot.png


上圖的白色部分解開放大
screenshot1.png


這是 LGC12002 的相關波形
DSC08091.JPG

DSC08092.JPG

當然期間也發現一些問題,期待大家的協助釋疑!!
  1. #include "stm8s.h"

  2. #define DHT_Port GPIOD
  3. #define DHT_data GPIO_PIN_2
  4. #define FAILURE 0
  5. #define success 1


  6. u8 count80,count81,DHT_get;
  7. u8 DHT[5];
  8. void Delayus(u16 ust)//
  9. {
  10.         while(ust !=0)
  11.         {
  12.                 ust--;
  13.         }
  14. }

  15. void DelayMs(u16 mst)
  16. {
  17.         while( mst !=0)
  18.         {
  19.                 Delayus(164);
  20.                 mst--;
  21.         }
  22. }



  23. void DHT_Start(void)
  24. {
  25.         GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_OUT_PP_HIGH_FAST);
  26.         GPIO_WriteLow(DHT_Port,DHT_data);
  27.         DelayMs(18);//18.17ms
  28.         GPIO_WriteHigh(DHT_Port,DHT_data);//10us
  29.         Delayus(1);
  30.         //nop();
  31.         //nop();
  32.         //nop();        
  33. //        GPIO_WriteLow(DHT_Port,DHT_data);//
  34. //        Delayus(1);//26us
  35. //        GPIO_WriteHigh(DHT_Port,DHT_data);
  36. //        Delayus(2);//68us
  37. }

  38. u8 DHT_Read(void)
  39. {
  40.         u8 i, j;
  41.         GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_IN_PU_NO_IT);
  42.         //check start low 80us start high 80us
  43.         count81=0;
  44.         while(!(GPIO_ReadInputPin(DHT_Port,DHT_data)))
  45.         {
  46.                 count81++;
  47.         }
  48. //        if(count80>80)
  49. //        return FAILURE;
  50.   count80=0;
  51.         while(GPIO_ReadInputPin(DHT_Port,DHT_data))
  52.         {
  53.                 nop();
  54.                 count80++;
  55.         }
  56. //        if(count80>80)
  57. //        return FAILURE;        
  58.         
  59.         //40bit 5byte read and store LOOP 5 sloop8
  60.         /*
  61.         for(j=0;j<5;j++)
  62.         {
  63.         for(i=0;i<8;i++)
  64.         {
  65.                         while(!(GPIO_ReadInputPin(DHT_Port,DHT_data)))
  66.                         {
  67.                                 count80++;
  68.                         }
  69.         if(count80 <50)
  70.            DHT_get+=1;
  71.         else
  72.            DHT_get+=0;
  73.                  DHT_get<<1;
  74.         
  75.   }
  76.         DHT[j]=DHT_get;
  77.   }
  78.         */
  79.         
  80. }


  81. main()
  82. {
  83.         
  84.         while (1)
  85.         {
  86.                 DHT_Start();
  87.                 DHT_Read();
  88.                
  89.                 DelayMs(20);
  90.         }
  91. }
複製代碼
原先以為 Delayus(n) 會延遲n 微秒,沒想到跟事實天差地遠,
        GPIO_WriteLow(DHT_Port,DHT_data);
        Delayus(1);//26us
        GPIO_WriteHigh(DHT_Port,DHT_data);
        Delayus(2);//68us

我用 邏輯分析儀量取 一個輸出為low並且延遲  Delayus(1) 居然要花上 26us.一個輸出並且延遲Delayus(2) 要花掉 68us 這讓我大吃一驚,接下來的動作,要把我考倒了.
   因為這個溫溼度發出來的信號是 拉低位準時間50us 升高位準作為資料 24us(0) 70us(1) http://www.adafruit.com/datasheets/DHT11-chinese.pdf
不知道我這個 STM8S103 怎麼解決?


評分

7

查看全部評分

發表於 2014-12-1 01:11:58 | 顯示全部樓層
你截圖上左邊的那2個數字是多少?
LA 需要注意的是取樣頻率,這基本上代表你所能取樣的最小變化點喔~
 樓主| 發表於 2014-12-1 01:42:58 | 顯示全部樓層
jojoling 發表於 2014-12-1 01:11 AM
你截圖上左邊的那2個數字是多少?
LA 需要注意的是取樣頻率,這基本上代表你所能取樣的最小變化點喔~
...

jojoling大;
   5M 2M
 樓主| 發表於 2014-12-1 01:49:05 | 顯示全部樓層
新發現


  1. main()
  2. {
  3.        
  4.         while (1)
  5.         {
  6.         //        DHT_Start();
  7.         //        DHT_Read();
  8.                 GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_OUT_PP_HIGH_FAST);
  9.                         GPIO_WriteHigh(DHT_Port,DHT_data);//10us
  10.                         count81++;
  11.                         count81++;
  12.                         count81++;
  13.                         count81++;
  14.                         count81++;
  15.                         GPIO_WriteLow(DHT_Port,DHT_data);//10us
  16.                         count81++;
  17.                         count81++;
  18.                         count81++;
  19.                         count81++;
  20.                         count81++;
  21.         GPIO_WriteHigh(DHT_Port,DHT_data);//10us
  22.                         count81++;
  23.                         count81++;
  24.                         count81++;
  25.                         count81++;
  26.                         count81++;       
  27.         GPIO_WriteLow(DHT_Port,DHT_data);//10us
  28.                        
  29.                 DelayMs(2);
  30.         }
  31. }
複製代碼
它的波形 注意 第一個時間41.5us
screenshot.png

我把 gpio定義放在 loop之前
  1. main()
  2. {
  3.                 GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_OUT_PP_HIGH_FAST);
  4.         while (1)
  5.         {
  6.         //        DHT_Start();
  7.         //        DHT_Read();
  8.        
  9.                         GPIO_WriteHigh(DHT_Port,DHT_data);//10us
  10.                         count81++;
  11.                         count81++;
  12.                         count81++;
  13.                         count81++;
  14.                         count81++;
  15.                 //        count81++;
  16.                 //        count81++;
  17.                 //        count81++;
  18.                 //        count81++;
  19.                 //        count81++;
  20.                         GPIO_WriteLow(DHT_Port,DHT_data);//10us
  21.                         count81++;
  22.                         count81++;
  23.                         count81++;
  24.                         count81++;
  25.                         count81++;
  26.         GPIO_WriteHigh(DHT_Port,DHT_data);//10us
  27.                         count81++;
  28.                         count81++;
  29.                         count81++;
  30.                         count81++;
  31.                         count81++;       
  32.         GPIO_WriteLow(DHT_Port,DHT_data);//10us
  33.                        
  34.                 DelayMs(2);
  35.         }
  36. }
複製代碼
它的波形就不一樣了

screenshot1.png
真是奇怪居然 gpio定義會影響到接下來的 i/o 輸出


發表於 2014-12-1 03:30:49 | 顯示全部樓層
本文章最後由 jojoling 於 2014-12-1 03:33 AM 編輯

1.那是正常的~因為 pipeline 與 I/O的動作,是不能加速的。寫 BIOS常常需要 delay 的時後,常常是下 I/O 指令,這就是我們常見BIOS用的 I/O delay用法~
2.pipeline 與 條件分支指令,也是不能加速的(以這種簡單便宜的 mcu來說,成本問題,那是硬體設計分支預測的數字我看不到,那是取樣筆數,第2個數字是說目前的取樣頻率~你一開始圖上的數字是 125Khz,需注意沒弄錯喔。
4.一般來說 I/O指令都是比較慢的,不過這顆,應該在這方面需要很注意,看起來真的特性很不同,需特別了解。
問題)。
5. Saleae 8 ,最高速 25Mhz 取樣,是有條件的,就是不能同時取樣過多隻腳。以你的圖來看,最左邊的6. 最後,要討論指令時間,需要貼出compiler產生的組語~很多情形,高階語言你沒指令,它會假定那不是 I/O 動作,而被最佳化移除。
  ex: 一個用於 delay 的 loop,有時會被空間與效能的最佳化而直接移除。

評分

1

查看全部評分

發表於 2014-12-1 11:14:50 | 顯示全部樓層
找看看有沒有 .lst 產生,或需要設定讓它產生~這個為 ST virtual Studio 的投影片~
2014-12-01_110452.png

底下為產生出來的 .lst
1.可以用來參考組語怎麼寫
2.查真正底層的 code
3.查如何編寫一個組語的副程式與高階連結
4.檢查高階的最佳化~
.......
2014-12-01_110524.png

評分

1

查看全部評分

 樓主| 發表於 2014-12-2 01:24:59 | 顯示全部樓層
要求助了!!
波形 screenshot.png
放大後
screenshot1.png

要把它解出來,請大家幫忙看看程式應該怎麼改才正確!!  感謝!!

  1. #include "stm8s.h"
  2. #define DHT_Port GPIOD
  3. #define DHT_data GPIO_PIN_2
  4. u8 count80,count81;//計數時間
  5. u8 DHT_get;
  6. u8 DHT[5];
  7. void Delayus(u16 ust)//
  8. {
  9.         while(ust !=0)
  10.         {
  11.                 ust--;
  12.         }
  13. }

  14. void DelayMs(u16 mst)
  15. {
  16.         while( mst !=0)
  17.         {
  18.                 Delayus(164);
  19.                 mst--;
  20.         }
  21. }



  22. void DHT_Start(void)
  23. {
  24.         GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_OUT_PP_HIGH_FAST);
  25.         GPIO_WriteLow(DHT_Port,DHT_data);
  26.         DelayMs(18);//18.17ms
  27.         GPIO_WriteHigh(DHT_Port,DHT_data);//10us
  28.         Delayus(1);

  29. }

  30. u8 DHT_Read(void)
  31. {
  32.         u8 i, j,pulse,k;
  33.         pulse=0;
  34.         count81=0;
  35.        
  36.                 while(!GPIO_ReadInputPin(DHT_Port,DHT_data));
  37.                 while(GPIO_ReadInputPin(DHT_Port,DHT_data));
  38.                 for(i=0;i<5;i++)
  39.                 {
  40.                         for (j=0;j<8;j++)
  41.                         {
  42.                                  while(GPIO_ReadInputPin(DHT_Port,DHT_data))
  43.                                  {
  44.                                   count81++;
  45.                                  }
  46.                                    if(count81>2)
  47.                                                 pulse +=0x80;
  48.                                                 else
  49.                                                 pulse +=0x00;
  50.                                                 pulse>>1;       
  51.                                                 count81=0;
  52.                         }
  53.                         DHT[i]=pulse;
  54.                         pulse=0;
  55.                 }
  56. }


  57. main()
  58. {
  59.                 GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_OUT_PP_HIGH_FAST);
  60.         while (1)
  61.         {
  62.         DHT_Start();//送出讀取的指令
  63.         GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_IN_PU_NO_IT);//此一 設定大大會影響 時間所以要獨立出來
  64.         DHT_Read();
  65.                 DelayMs(300);
  66.         }
  67. }
複製代碼


發表於 2014-12-2 10:09:43 | 顯示全部樓層
這個DHT11記得是單線作串列傳輸的,所以在時序上要控制的比較精準一點
而且時序一旦不準就什麼都不對了,所以要先控制好信號的時序準確問題
主要是一旦用C來寫的話,編譯後在時序上恐怕變數很大
單純用DELAY的模式也不是不行,但一般應該都是用計數中斷來作的
DHT11自己手上也有2棵,但覺得麻煩和精度問題都改用DHT21來用
如果不能用中斷方式來處理,恐怕要想看看怎麼用組合語言去作那一段
發表於 2014-12-2 13:35:24 | 顯示全部樓層
antlu 發表於 2014-12-1 01:49 AM
新發現

它的波形 注意 第一個時間41.5us

init包在裡面每次都會執行所以時間就拉長了,移出來後只做hi & low時間就比較對稱。
 樓主| 發表於 2014-12-3 21:04:18 | 顯示全部樓層
easy2led 發表於 2014-12-2 01:35 PM
init包在裡面每次都會執行所以時間就拉長了,移出來後只做hi & low時間就比較對稱。 ...

easy2led大:
   感謝,的確如此!!
 樓主| 發表於 2014-12-3 21:09:58 | 顯示全部樓層
legion 發表於 2014-12-2 10:09 AM
這個DHT11記得是單線作串列傳輸的,所以在時序上要控制的比較精準一點
而且時序一旦不準就什麼都不對了,所以 ...

legion大:
    感謝你的建議!! 我感覺這個MCU 對C有一點負擔!!

補充內容 (2014-12-4 11:38 AM):
問題造就進步!!  昨天發現這個MCU正常被設定為16M 除頻8,我把它改成 16M除頻1好樣有一點"眉目"了!!
 樓主| 發表於 2014-12-6 00:40:05 | 顯示全部樓層
legion 發表於 2014-12-2 10:09 AM
這個DHT11記得是單線作串列傳輸的,所以在時序上要控制的比較精準一點
而且時序一旦不準就什麼都不對了,所以 ...

legion大:
   我的問題解決了!!
        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); 這樣它的速度就快了 8倍!!


  1. /*
  2. 20141205 因應溼度sensor而寫的程式出了幾個問題
  3. 1.mcu速度不夠快因為mcu自動設定頻率16M除8 於是更改之後後速度 變快許多而解決速的的問題
  4.         CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//以16m速度 進行
  5. */
  6. #include "stm8s.h"
  7. #include "stm8s_clk.h"
  8. #define DHT_Port GPIOD
  9. #define DHT_data GPIO_PIN_2
  10. u8 count80,count81;//計數時間
  11. u8 DHT_get;
  12. u8 DHT[5];




  13. void Delayus(u16 ust)//
  14. {
  15.         while(ust !=0)
  16.         {
  17.                 ust--;
  18.         }
  19. }

  20. void DelayMs(u16 mst)
  21. {
  22.         while( mst !=0)
  23.         {
  24.                 Delayus(1315);//164
  25.                 mst--;
  26.         }
  27. }



  28. void DHT_Start(void)
  29. {

  30.         GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_OUT_PP_HIGH_FAST);
  31.         GPIO_WriteLow(DHT_Port,DHT_data);
  32.         DelayMs(18);//18.17ms
  33.         GPIO_WriteHigh(DHT_Port,DHT_data);//10us
  34.         Delayus(20);

  35. }

  36. u8 DHT_Read(void)
  37. {
  38.         u8 i, j,pulse,k;
  39.         pulse=0;
  40.         count81=0;       
  41.                 while(!GPIO_ReadInputPin(DHT_Port,DHT_data));
  42.                 while(GPIO_ReadInputPin(DHT_Port,DHT_data));
  43.                 for(i=0;i<5;i++)
  44.                 {
  45.                         for (j=0;j<8;j++)
  46.                         {
  47.                                 while(!GPIO_ReadInputPin(DHT_Port,DHT_data));
  48.                                  while(GPIO_ReadInputPin(DHT_Port,DHT_data))
  49.                                  {
  50.                                   count81++;
  51.                                  }
  52.                                                 pulse<<=1;
  53.                                    if(count81>20)
  54.                                                 pulse +=1;
  55.                                                 else
  56.                                                 pulse +=0;                       
  57.                                                 count81=0;
  58.                         }
  59.                         DHT[i]=pulse;
  60.                         pulse=0;
  61.                 }
  62. }


  63. main()
  64. {
  65.                 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//以16m速度 進行
  66.                 GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_OUT_PP_HIGH_FAST);
  67.         while (1)
  68.         {
  69.                
  70.         DHT_Start();//送出讀取的指令
  71.         GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_IN_PU_NO_IT);//此一 設定大大會影響 時間所以要獨立出來
  72.         DHT_Read();
  73. //        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);//以16m速度 進行
  74.                 DelayMs(300);
  75.         }
  76. }
複製代碼
發表於 2014-12-6 14:34:17 | 顯示全部樓層
本文章最後由 cnpan 於 2014-12-6 01:49 PM 編輯

STM 8 與51 不同處除了核心不同還有增強增邊的功能,有多個計時器,計時要用TIMER 才不會影響程式的運作.
例如:使用不同的timer對應單一IO 的output及input,運算load 就不會加重.
如果沒有用到這些新增的特點,運算能力不會大幅提昇.也就不能使用更多的功能在這低價的MCU上.
MCU 內定的低工作頻率的觀念是考慮降低運作功率,對應長時間運作的系統,這是重要的能運源使用管理.  
發表於 2014-12-6 16:27:19 | 顯示全部樓層
antlu 發表於 2014-12-6 12:40 AM
legion大:
   我的問題解決了!!
        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); 這樣它的速度就快了  ...

antlu大
單純時序上的問題比較好解決
不過antlu大,其實也都作了相當一段時間了,
有點好奇你還一直都糾結在溫度,時鐘這些上面是還蠻奇怪的
有時應該想想可否找個較大型的題目來作,也許能產生更多想法及方向
不管用那種mcu一旦上手後,應該作點不同的東西,或者找塊TFT來作也是可以的


 樓主| 發表於 2014-12-6 20:11:30 | 顯示全部樓層
legion 發表於 2014-12-6 04:27 PM
antlu大
單純時序上的問題比較好解決
不過antlu大,其實也都作了相當一段時間了,

LEGION大:
   抱歉,有點辜負你的期待,大型的題目很費腦袋,我不太想給自己太大壓力!!
  說到溫度 時間 其實這只是一個"媒介" 一路上從模仿實驗板資料,作的時鐘溫度計 1302和 18B20 到 溫度計使用 NTC 元件,這段時間慢慢的學到 AD 轉換 GPS 轉換 溫度查表的技巧以及較高階的MCU語言,這次的 PT6961 LED 也算是進階吧!! 後續還有 I2C 的轉換,這樣就可以做到 紀錄器的動作!!
  再次感謝!!
 樓主| 發表於 2014-12-6 20:15:04 | 顯示全部樓層
cnpan 發表於 2014-12-6 02:34 PM
STM 8 與51 不同處除了核心不同還有增強增邊的功能,有多個計時器,計時要用TIMER 才不會影響程式的運作.
例 ...

CNPAN大:
      不是很了解ㄟ!!
      這一個MCU TIMER 很強,只是我還在起步階段!!
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-22 03:24 PM , Processed in 0.196280 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.