顯示具有 開發者聖經 標籤的文章。 顯示所有文章
顯示具有 開發者聖經 標籤的文章。 顯示所有文章

2023年8月31日 星期四

[VS code]VS code 環境設定 與 好用套件&熱鍵教學

1.Code Runner 
 2.RemoteSSH 
 3.C/C++ 
 4.C/C++ Extension Pack 
 5.C/C++ Themes 
 6.GitLens -- Git supercharged 





 搜尋關鍵字在workspace的使用 雙擊(滑鼠圈選關鍵字) + Ctrl + Shift + F

2017年8月12日 星期六

[嵌入式C] MCU

MCU筆記

2017/8/12 更新:


microproccesser bus rate = Oscillator / 2 


int main()
{
  LOCK();   //disable irq

  init_periphery(); //initialize.c 
     ->Step1.Set up elpi mode (clock)
     ->Step2.Setup GPIO 
     ->Step3.Setup lp timer  
     ->Step4.Setup I2C
     ->Step5.
          /* switch to very low power run mode */
            set_vlpr_mode();
            /* switch to very low power stop mode */
            set_vlps_mode();
configure_NVIC(); //initialize.c
     ->Step0.設定&註冊 irq 優先權

init_app_objects(); //initialize.c
     ->Step1. initialize button press dispatcher */
     ->Step2.initialize state object */
  
init_watchdog(); //initialize.c

  UNLOCK();  //enable irq


  while(true)
  {
    set_vlps_mode();

    const sEvent * evt = GetEvent(&_BtnObj.base.EvQueue);
    if(evt != 0) {
      /* dispatch event to btn object */
      SMDispatch((sSM*) &_BtnObj, evt);
    }

    evt = GetEvent(&_StateObj.base.EvQueue);
    if(evt != 0) {
      /* dispatch event to state object */
      SMDispatch((sSM*) &_StateObj, evt);
    }

    /* feed the watchdog */
    COP_DRV_Refresh(0);
  }

  return 0;
}




2017年1月31日 星期二

[開發者聖經]物件導向 + 設計模式

交卷截止日 2017/12/31


物件導向三神器

繼承





多型






封裝





設計模式
設計模式共2x種

Observer 模式

Singleton 模式

 

2016年10月24日 星期一

[Python]Python中各種溝通控制介面介紹 UART(Serial) I2C SPI GPIB Socket等等

PySerial(UART)
import serial
#串口打开方式:
#1)带串口号和波特率
ser. interCharTimeout #字符間隔超時
print ser.portstr #能看到第一個serial的標示,windows下是COM1
ser #來查看當前serial的狀態


serial.Serial類——原生端口
class serial.Serial
{
    __init__(port=None, baudrate=9600, bytesize=EIGHTBITS,parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, writeTimeout=None, dsrdtr=False, interCharTimeout=None)
    #其中:
    #  bytesize:FIVEBITS、SIXBITS、SEVENBITS、EIGHTBITS
    #  parity: PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE
    #  stopbits: STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO
    #異常:
    #ValueError:參數錯誤
    #SerialException:找不到設備或不能配置
   ser = serial.Serial('COM6',115200)
    ser.open():打開串口
    ser.close():立即關閉串口
   ser.isOpen()   #確認ser物件是否已經被打開 若被打開回船True
    __del__():析構函數


    #只讀屬性:
    name:設備名字
    portstr:已廢棄,用name代替
    ser.port:讀或者寫端口
    ser.baudrate:鮑率      #9600   #115200
    ser.bytesize:字節大小   #8      #serial.EiGHTBITS   八位數據位
    ser.parity:校驗位     serial.PARITY_NONE #無校驗    serial.PARITY_EVEN  #偶校驗   serial.PARITY_ODD
    ser.stopbits:停止位
    ser.timeout:讀超時設置
    ser.writeTimeout:寫超時
    ser.xonxoff:軟體流程控制
    ser.rtscts:硬體流程控制
    ser.dsrdtr:硬體流程控制
    interCharTimeout:字符間隔超時

    #端口設置可以被讀入字典,也可從字典加載設置:
    getSettingDict():返回當前串口設置的字典
    applySettingDict(d):應用字典到串口設置
    #對提供io庫的系統(python 2.6或以上),Serial從io.RawIOBase派生。對其它系統,從FileLike派生。
    #異常:
    exception serial.SerialException
    exception serial.SerialTimeoutException
    #常量:
    serial.VERSION:pyserial版本
    #模塊函數和屬性:
    serial.device(number)
    serial.serial_for_url(url, *args, **kwargs)
    serial.protocol_handler_packages()
    serial.to_bytes(sequence):接收一個字符串或整數列表sequence,返回bytes實例
}


ser.write(“hello") #就是往serial裡面寫訊息hello


Serial write用法

write(data):發送data,並返回發送字節數。如果bytes和bytearray可用(python 2.6以上),則接受其作為參數;否則接受str作為參數。

    #異常:SerialTimeoutException——配置了寫超時並發生超時時發生此異常。

    inWaiting():返回接收緩存中的字節數

    flush():等待所有數據寫出。

    flushInput():丟棄接收緩存中的所有數據

    flushOutput():終止當前寫操作,並丟棄發送緩存中的數據。

    sendBreadk(duration=0.25):發送BREAK條件,並於duration時間之後返回IDLE

    setBreak(level=True):根據level設置break條件。

    setRTS(level=True)

    setDTR(level=True)

    getCTS()

    getDSR()

    getRI()

    getCD()



data = ser.read() #讀一個字節

read(size=1):從串口讀size個字節。如果指定超時,則可能在超時後返回較少的字節;如果沒有指定超時,則會一直等到收完指定的字節數。
data = ser.read(20) #讀20個字節
data = ser.readline() #一次讀一行,直到讀到/n當作结束,要是没有/n就會一直讀。

Readline方法的使用

        是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。

        使用readline()時應該注意:打開串口時應該指定超時,否則如果串口沒有收到新行,則會一直等待。如果沒有超時,readline會報異常。
data = ser.readlines() #和ser.xreadlines()都需要設定超時時間
ser.next() #讀下一個
===================================================================
i2C




===================================================================
SPI



===================================================================
GPIB(IEEE488) - Python GPIB控制 結合 NI VISA api
如此我們就可以透過python指令在cmd模式下 安裝pyvisa套件了 :
python -m pip 可以查看模組    pip模組介紹  pip套件官網(取代easy_install的python套件安裝神器)
python -m pip install -U pip 可以更新pip模組
python -m pip install -U pyvisa 可以安裝pyvisa模組,並更新到最新版本   pyvisa官網
 
為了確定此兩套件順利安裝,我們可以在cmd打python進入python mode或是開啟python專用的IDE (IDLE) 並打入
import visa(enter鍵送出)
來確定是否有錯誤訊息跳出,若順利執行則安裝成功
Q&A

Q:鍵入 import visa 時會出現下列錯誤訊息:
Traceback (most recent call last):
  File "", line 1, in 
  File "C:\Python27\lib\site-packages\visa.py", line 18, in 
    from pyvisa import logger, __version__, log_to_screen
  File "C:\Python27\lib\site-packages\pyvisa\__init__.py", line 20, in 
    import pkg_resources
ImportError: No module named pkg_resources
A:這是缺少 pkg_resources 模組所致,請到是德科技網站 http://www.keysight.com/ 下載 IO Libraries Suite 軟體,下載頁 http://www.keysight.com/main/software.jspx?ckey=1184883&lc=cht&cc=TW&nid=-11143.0.00&id=1184883
Q:Windows ERROR 126 A:詳 http://sourceforge.net/p/pyvisa/bugs/15/
程式碼範例 import visa rm = visa.ResourceManager() my_instrument = rm.open_resource('GPIB::14') my_instrument.write("*IDN?") print(my_instrument.read())
=================//作業系統NI 環境安裝//====================
安裝 NI-VISA 5.4.1

切換網頁到http://www.ni.com/download/ni-visa-5.4.1/4626/en/,點擊NIVISA541full_downloader.exe。它會要求您建立使用者帳號,如下圖。

如果您已經註冊過那麼就點擊「登入」,輸入正確的使用者名稱和密碼,然後再次點擊 NIVISA541full_downloader.exe  接著再雙擊下載的檔案NIVISA541full.exe,然後依照安裝視窗指示進行即可。



===================================================================
Socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(**b**'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')

while True:
    data = mysock.recv(512)
    if ( len(data) < 1 ) :
        break
    print (data);

mysock.close()


===================================================================
CANBus(Kvaser) - Python結合CAN Bus的初勘-以Kvaser為例
最近工作上需要使用Python透過CAN Bus的工具來跟車機(BDC)做溝通控制。
以CAN tool來說,除了NI以外Vector solution for CAN也非常有名。
但礙於經費,手上只有一條Kvaser的產品

我們來到其 官網的下載區,找到了CANKing以及kvaser driver,進行溝通模擬以綽綽有餘。
若需要利用第三方平台來開發工具進行連接,我們需要Kvaser CANlib SDK。

CANlib SDK中各種api的呼叫以及回傳表 : 點此連結

因為其工作需求,需要用Python開發,找到下列三部曲連結:

  1. Accessing Kvaser CANlib from Python
  2. Using Python to connect to your remote device
  3. A more object oriented approach on accessing your Kvaser device from Python
我使用第一部曲就已綽綽有餘!!!!



===================================================================

2016年2月22日 星期一

[設計模式]設計模式初勘

物件導向設計模式

以Python為基礎,可分為三大類 :

第一類、創建型設計模式 (主導物件的建立)
  1. 工廠設計模式 : 
  2. 建造者設計模式 : 
  3. 原型設計模式 : 

第二類、結構型設計模式 (主導類別與物件之間關係的設計模式)
  1. 轉接器模式 : 
  2. 裝飾器模式 : 
  3. 外觀模式 : 
  4. 輕量模式 : 
  5. 模型-檢視-控制器(MVC) 模式 : 
  6. 代理模式 : 

第三類、行為型設計模式 (主導類別與物件之間溝通的設計模式)
  1. 責任鏈模式 : 
  2. 命令模式 : 
  3. 直譯器模式 : 
  4. 觀察者模式 : 
  5. 狀態模式 : 
  6. 策略模式 : 
  7. 模板模式 : 




2015年11月2日 星期一

C# Thread的開端

while

Thread  th=new Thread(new ThreadStart()

2015年8月27日 星期四

物件導向程式設計導論

所謂偉大軟體
Step1. 讓客戶滿意 做客戶要它做的事情 ,最好確保Step1.已達到,再前進Step2.。
Step2. 應用基本OO原則 (&設計模式) ,增加軟體彈性。(擴充性)
尋找大問題,像是重複程式碼以及壞的類別設計
切記 : 程式架構改善後記得回頭驗證功能性是否依舊。

Step3. 努力達成可維護 可重複利用的設計。

物件導向

列舉
列舉型別 使避免拼字錯誤與大小寫錯誤
就像下拉選單一樣給設計師提供選項


封裝 - 在考慮繼承與多型之前先考慮封裝,因為繼承跟多型這兩種技術與重複程式碼跟封裝都有關

1.每一筆資料是獨特的 不封裝 = > 像是serialNumber 或是 price(價格)...等
2.任何時候看到重複程式碼,就找個地方進行封裝
使用成員變數不想讓應用程式其他部分直接操作 可用private宣告外
會配合封裝使用
封裝將資料與應用程式的行為分離開來.



繼承




多型(為了彈性)
Airplane plane = new Airplane(); //一般
Airplane plane = new Jet();//多型   (其中Jet是繼承Airplane的子類別)







設計原則
OCP->一步一步來
DRY ->不自我重覆
SRP ->單一責任原則
LSP -> Liskov替代原則




設計模式


2015年6月4日 星期四

[嵌入式系統]Ch4 看懂嵌入式系統的Schemantic各種電路及SoC與Peripheral的DataSheet

看懂嵌入式系統的Schemantic電路,參考

此外,我們要談的是如何看電路圖以及了解一些 電子零件的基礎特性以及其功能 : 

RLC電路

電阻(R):
依照V=IR公式 可見電阻在電子電路常常應用在電壓或電流的控制上
另外在科技業中,為了省電或是一些做動特性的考量,我們會在電路中設計
提升電阻與下降電組
Pull high resister
Pull low resister

二極體/電感(L):
二極體通常依照其特性及方向性主要是加在電路中作保護,避免電流回灌或是漏電

電容(C):
電容用來讓電壓電流輸出穩定的,

線性穩壓器 - LDO(Low Drop Out) : 將較大電壓的輸出切換到較小電壓,可以用它來做開關電路,適用於電壓差較小的電路,如5V->3.3V。

Level shifter : 常用於溝通的interface的電壓轉換 如 : I2C Level Shifter 5v to 3.3v 電路
也可用於一般的電壓轉換。




看懂嵌入式系統的SoC與Peripheral的DataSheet
通常軟體工程師(韌體)偏底層的開發人員需要跟硬體工程師合作,或模組廠合作

2015年5月18日 星期一

[嵌入式系統]Ch3-Baseband分析儀器使用介紹

Logic Analyzer(邏輯分析儀)
saleae 是知名的儀器商
手邊有個堪用的山寨品

可以透過不同的interface的各腳位去拉出對應的clock
關於interface 的介紹,可以詳見我這篇文章

[嵌入式系統]Ch2 嵌入式系統-The communication interface of SoC(System On Chip)


開啟該軟體後我們可以透過軟體右側的邊攔 選擇 : Analyzers的+






















接著,請hw工程師幫我們把module的特定腳位拉出來,再由系統(通常由晶片廠包給我們的command程式去填值初始化或執行相對應動作)
並透過LA分析結果判斷是否正常

以下圖spi為例 : channel切記不要重複 
一般SPI有四個腳位   分別是 Clock , MOSI, MISO, CS(chip Select)



























以下圖 i2c 為例 : channel切記不要重複 
一般i2c有兩個腳位   分別是 Clock(SCL) ,Data(SDA)















Saleae軟體 觸發點設置(Trigger)

為了觀看方便,我們會設置觸發點 當然也可以選擇自己慢慢找












觸發點的部分在此範例 我利用Enable 的上緣觸發 我們可以透過上圖左下角的黑色選取區塊來選定 觸發點


結語 : saleae好處多多 除了軟體操作方便外 不需要像示波器一樣需要調很多旋鈕及看不同儀器的使用說明
除非要看更即時動態的資訊 => 我們才會使用示波器
此外,saleae會自動幫我們解析各個波形所要傳送的訊號 0xXX+ACK等等....


oscilloscope(示波器)
示波器有四組訊號可以看 分別為1.2.3.4等四個頻道
我們可以用探棒同時差異化對比 也可以同時接不同儀器 看他們相依關係







如下圖 每一格代表一個單位 上面10為us所以一格為10us(10*10−12)








垂直調整旋鈕&準位調整
上排是垂直調整旋鈕 : 是看格子上下的精密度 伏特(電壓值)高低 如果是很小的電壓,就需要拉長來提高每格的精密度。
下排是準位調整 : 一般使用會將準位歸零 但如果需要比較或是拉低準位可以調整此旋鈕。












水平調整旋鈕










觸發控制









觸發設定







s








檔案存取

將波形存取起來,每種示波器的存檔存取方式不同,須參考該儀器說明書。





d






r



















dd










Function gernerator(訊號產生器)



三用電表(量測 電壓&電流&電阻)
其實比較量電壓跟電阻 RD們最長使用三用電表的功能是蜂鳴器測短路









交流檔位量測 : 有上下弦波圖案







直流檔位量測 : 有上下弦波圖案  通常由Adapter轉接後的皆為直流 不可量交流電source(插座用電)







歐姆檔 : 非上電即可測量測點間阻值







蜂鳴器 : RD常用 測試是否短路









交流安培 : 測試交流電的電流





直流安培 : 測試直流電的電流