2011年11月27日 星期日

CadSoft EAGLE 制作新零件 - Package (五)

CadSoft EAGLE 制作新零件 - Package (五):

完成了新零件的符號,便需要制作新零件的底板封裝圖,首先要準備一份零件的底板封裝圖 (如下),便可開始制作。

▲ NCP1004 的底板圖
在Pad 2及中間用線分開,並計算出主要的距離。
▲ 新NCP1004 的底板圖
▲ 選擇 Package 圖示
▲ 輸入封裝名稱 (STO23-5) → OK
▲ 建立新的封裝 “STO23-5” → Yes
▲ 開始建立新的封裝
▲ 選擇 Grid → 更改 Grid顯示尺寸 (1mm)
▲ 選擇 Layer → smd → 更改 SMD尺寸 (0.7x1mm)
▲ 新的SMD尺寸 (0.7x1mm) → OK
▲ 選擇 Smd
▲ 放置好5個 Smd Pad
▲ 選擇 Display → Layers → 全部(I) → OK
▲ 顯示所有的Pad特性
▲ 右鍵 → 修改每個Pad的屬性
▲ 完成 Pad 的屬性包括位置
▲ 選擇 Display → 選擇 51 tDocu → 修改顏色
▲ 選擇 Wire → 繪出 Solder Mask 方框
▲ 選擇 Text → 輸入 >NAME
▲ 選擇 Layer → 選擇 25 tNames
▲ 文件(F) → 保存全部(I)
 完成了新零件的符號,便需要制作新零件的底板封裝圖,首先要準備一份零件的底板封裝圖 (如下),便可開始制作。

參考網址:http://www.sparkfun.com/tutorials/110

2011 年 11月 27日 天氣報告
氣溫:21.0 度 @ 23:00 
相對濕度:百分之87% 
天氣:天色良好

2011年11月26日 星期六

CadSoft EAGLE 制作新零件 - Symbol (四)

CadSoft EAGLE 制作新零件 - Symbol (四):

當我們使用 EAGLE 軟體來設計電路圖時,零件會從零件庫裏面取出並放到電路圖編輯器中,但有時有些零件是沒有放在零件庫內,這可能是太新或不通用,並未放進零件庫內,在這時候便需要創建一個新的零件,創建或設計一個零件(Device)並未放進零件庫中工作是比較煩擾,以下是制作新零件的流程。

▲ NCP1400
假設我們需要一個直流升壓轉換器的新零件 NCP1004,在現有的零件庫是沒有,那麼我們需要自己創造了。

須要準備資料及數據:http://www.onsemi.cn/pub_link/Collateral/NCP1400A-D.PDFDevice:元件的整體,包含著 Package 和 Symbol,以及原理圖與封裝之間的對應——引腳鏈結。Package:元件的封裝,暫時我只使用了其他元件庫的封裝。Symbol:元件的原理圖符號。

開始制作新零件:

▲ 首先打開 EAGLE 後進入主介面
▲ 文件(F) → 新建(N) → 元件庫 (L)
▲ 文件(F) → 另存為(a)
▲ 另存為 ncp
▲ 已保存 ncp.lbr
▲ Edit 零件圖
▲ Edit Sym (Symbol) → OK
▲ 建立新的符號 “NCP1004” → Yes
▲ 選擇 Wire → 繪畫一個四方形
▲ 選擇 Pin → 加入 Pin
▲ 完成 Pin 位置 → 右鍵 → 修改 Pin Name
▲ 輸入新的名稱 → OK
▲ 完成輸入所有新的名稱
▲ 選擇 Layer
▲ 選擇 95 Names
▲ 選擇 Text → 輸入文本 >NAME
▲ 選擇 96 Values
▲ 選擇 Text → 輸入文本 >VALUE
▲ 完成 >NAME 和 >VALUE 位置
▲ 選擇 Layer → Direction → 更改所有 Pin 的屬性
▲ 文件(F) → 保存(S)

參考網址:http://www.sparkfun.com/tutorials/110

2011 年 10月 26日 天氣報告 

氣溫:20.4 度 @ 21:00 
相對濕度:百分之76% 
天氣:多雲

2011年11月25日 星期五

DIY - PIC: PIC18F4550 3x3 Keypad 鍵盤中斷程式 (一百二十二)

DIY - PIC: PIC18F4550 3x3 Keypad 鍵盤中斷程式 (一百二十二) :

因為 Microchip 18F4550 的 PORTB <7:4>是其中可用作中斷的接腳,這次使用了 18F4550 的 PORTB RB5, RB6和 RB7 作為按鍵中斷 I/O,當PORTB<7:4> 在輸入狀態有改變,便會觸發中斷,執行程式,而程式是利用 Polling 方式作掃描,只要按 9號鍵, Polling 便會完成,中斷也會結束,回到主程式。

▲ 3x3 鍵盤中斷流程圖
▼主程式
void main(void)
{

    // Set Up PortA
ADCON0 = 0x00;             // Disable the AD converter
ADCON1 = 0x0F;             // 0x0F = Set all port A,B to digital
TRISA  = 0b00000000;        // Setup PORTA as Output

    // Set up PortB as Keypad
    TRISB = 0b11100000;  
    // Set up PortB Interrupt
    INTCON2bits.RBPU = 0;     // Enable Pull up resistors at PORTB
    RCONbits.IPEN    = 1;          // Enable INT Priority
    INTCON2bits.RBIP = 1;       // Set PORTB INT as High Priority INT
INTCONbits.PEIE  = 1;       // Enable Peripheral INT
INTCONbits.RBIE  = 1;        // Enable PORTB INT
INTCONbits.GIEH  = 1;       // Enable All INT
    INTCONbits.RBIF  = 0;        // Clear PORTB INT Flag

    while(1)
    {
        LATAbits.LATA0 = 0;          // RA0=0 LED=OFF Scope=50ms
Delay10KTCYx(1);

        LATAbits.LATA0 = 1;         // RA0=1 LED=ON Scope=1
        Delay10KTCYx(1)   ;           // 10,000 x 1 x (4 x 0.05us) = 2ms
                              // Scope = 2ms
    } // End Main Loop
} // End Main

▼中斷副程式
/******************************************************************************
 * Subroutine:  High Priority Interrupt Subroutine
 * When high interrupt occured GOTO here to check
 *****************************************************************************/
void high_isr()
{
    if(INTCONbits.RBIF ==1)        // if RB Port Change INT
        {
        key_detect();
        }
}

/******************************************************************************
 * Subroutine: Scan Keypad
 * Scan the key press and return the position of key (Key=9 will exit)
 *****************************************************************************/
void key_detect() {
    char key1=0;
    char lastkey1=0;

INTCONbits.RBIE=0;        // Disable PORTB INT
INTCONbits.RBIF=0;               // Clear PORTB INT Flag

if (high_int == 0){                             // 0=Normal High INT 99=First High INT
    LATB = 0b00000000;                   // Latch 1 to RB5
key1=kbd_getc();
    Delay10KTCYx(10);

do {
       key1 = kbd_getc();        // Read Ketboard Input
        if (key1 !=0 && lastkey1 != key1){
                lastkey1=key1;
            }
    Delay10KTCYx(100)   ;
} while(key1!=9);

   lastkey1 = 0;                          // Clear Key1
   key1 = 0;                               // Clear Key
   LATB = 0b11100000;          // Set PortB
}
else {
        key1 = kbd_getc();            // Scan to Clear PortB 5,6,7
        LATB = 0b11100000;      // Set PortB
        high_int = 0;}   // Clear High INT first time 

    INTCONbits.RBIE = 1;        // Enable PORTB INT
    INTCONbits.GIE  = 1;        // Enable All INT
  INTCONbits.RBIF=0;        // Clear PORTB INT Flag

}


▲3x3 鍵盤程式開始
▲讀取按鍵位置 1 資料
▲讀取按鍵位置 4 及位置 7資料
▲讀取按鍵位置 9資料
▲程式回到主程式及 LED 閃動

2011 年  11月 25日 天氣報告 
氣溫:20.9 度 @ 22:00 
相對濕度:百分之72% 
天氣:多雲

2011年11月23日 星期三

DIY - PIC: PIC18F4550 3x3 Keypad 鍵盤中斷電路 (一百二十一)

DIY - PIC: PIC18F4550 3x3 Keypad 鍵盤中斷電路 (一百二十一) :

修改了 3x3 鍵盤電路的原因,是由於使用中斷 (Interrupt) 效率高及其擴展性,COLs 接至 PortB RB5-RB7, ROWs 接至 PortB RB2-RB4,不再使用下拉電阻,而 COLs 的平常邏輯狀態為 “1” ,當掃描時 ROWs 會由  “1” 變成  “0” ,當鍵盤的按鍵被按下時,COL 便會接收到 “0” 的訊號,程式會計算 ROW 及 COL 的數值,便可得到按鍵的位置。
KeyPos = (ROW × Max_ROW) + COL

▲ PIC18F4550 3x3 鍵盤中斷電路圖
▲ PIC18F4550 3x3 鍵盤板
▲ 3x3 鍵盤板接至主控板
2011 年  11月 23日 天氣報告 
氣溫:21.1 度 @ 22:00 
相對濕度:百分之59% 
天氣:天色大致良好