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,當PORTB7: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% 
天氣:天色大致良好