53
專題製作 專題製作 - - PIC16 PIC16 系列 系列 /PIC18 /PIC18 系列應用實務 系列應用實務 報告人:黃嘉輝

專題製作-PIC16系列/PIC18系列應用實務 · 2012. 8. 13. · 7 單晶片概論(5) pic的系列產品 8位元晶片:pic10系列、pic12系列、pic16系 列、pic18系列

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

  • 專題製作專題製作--PIC16PIC16系列系列/PIC18/PIC18系列應用實務系列應用實務報告人:黃嘉輝

  • 1

    問題

    為什麼要選用為什麼要選用PICPIC,而不用,而不用8051 ?8051 ?

    為什麼要選用為什麼要選用C ?C ?

    為什麼要選用為什麼要選用PIC16?PIC16?

    為什麼要選用為什麼要選用MikroCMikroC ??

    容易上手嗎容易上手嗎??

    發展設備貴嗎發展設備貴嗎 ??

  • 2

    大綱

    單晶片概論1

    程式發展步驟2

    專題常用技術3

    技能競賽相關技術4

  • 3

    單晶片概論(1)

    單晶片全球現況

    28.4%Others

    3.4%10Samsung

    4.4%9ST

    4.8%8NXP

    5.5%7Fujitsu

    5.5%6Texas

    6.6%5Infineon

    6.7%4Microchip

    7.4%3ATMEL

    10.1%2Freescale17.3%1Renesas

    佔有率2011排名MCU廠商

  • 4

    單晶片概論(2)

    8 bit 單晶片概況(2009)

  • 5

    單晶片概論(3)

    PIC與8051硬體特性有何不同?

    便宜貴燒錄器

    I:25mA O:5mAI/O:25mA~50mAI/O能力

    稍慢(12T)快(4T)執行速度

    多少資源

    稍低高C/P値

    XO內部振盪

    少多種類

    XO內部RESET

    稍差稍好抗干擾

    20 PIN6 PIN最小包裝

    2.7~5.52~5.5工作電壓

    8051PIC

  • 6

    單晶片概論(4)

    PIC與8051寫法有何不同? PIC需有初始化,8051不用 PIC需有輸出入設定,8051不用 PIC暫存器多,必需規劃,8051較少 PIC組態必須設定,8051不用

    例:單純I/O PIC16F883 8051

    PORTA=0; P1.0=1;ANSEL=0;TRISA=0;PORTA.B0=1;

  • 7

    單晶片概論(5)

    PIC的系列產品 8位元晶片:PIC10系列、PIC12系列、PIC16系

    列、PIC18系列 16位元晶片:PIC24系列、dsPIC系列 32位元晶片:PIC32系列

    適用場合 8 bit:一般控制用 16 bit:馬達控制、DSP需求 32 bit:SOC、通訊、PDA

    常用包裝 6PIN、8 PIN、 14 PIN、16 PIN、28 PIN、40 PIN

  • 8

    單晶片概論(6)

    PIC16F883特性 振盪頻率:1Hz~20MHz

    工作電壓:2~5.5V

    EEPROM:256 bytes

    ROM:4K

    RAM: 256 Bytes

    I/O:I: 25 PIN O:24 PIN

    Watch Dog:防止當機

    A/D:11 CH 10 bit

    PWM:2個

    (1 Enhance , 1 Normal )

    USART:1個,可與

    RS232,RS485,SPI, I2C通訊

    計時器: T0,T1,T2

  • 9

    單晶片概論(7)

    PIC16F883單晶片腳位

  • 10

    單晶片概論(8)

    PIC16F883完整必備電路

    使用內部振盪及RESET使用外部振盪電路及RESET

  • 11

    單晶片概論(9)

    PIC實驗板

  • 12

    單晶片概論(10)

    PIC16F883實驗板能做什麼? LED 實驗 七段顯示+解碼實驗 LCD實驗 喇叭實驗 SSR實驗 直流馬達正反轉實驗 步進馬達實驗 PWM實驗 計時實驗 計次實驗

    按鈕實驗 DIP SW實驗 4*3鍵盤實驗 麥克風實驗 A/D實驗 EEPROM實驗 溫度感測實驗 串列埠實驗 看門狗實驗 外部中斷實驗

  • 13

    程式發展步驟(1)

    PIC C編譯器比較 MicroChip

    • PIC18、PIC24/dsPIC、PIC32• MPLAB XC8、XC16、XC32(ALL US495)

    Hi-Tech• PIC10/12/16/18、PIC24、PIC32• Microchip原廠合作,US495/US???/US895

    MikroC• PIC12/16/18、dsPIC/PIC24、PIC32• 3rd party,US249/US249/US299

    CCS• PIC12/16/18、PIC24、PIC32• 3rd party,US350/US500/US600

    KEIL C (不支援) IAR (不支援)

  • 14

    程式發展步驟(2)

    撰寫撰寫CC原始碼原始碼 編譯編譯//除錯除錯 燒錄燒錄//執行執行HEXHEX檔檔

    Mikro CIDE

    EZ PIC實驗板

    Mikro CDebug

  • 15

    程式發展步驟(3)

    8051組合語言delay:

    mov r7,#100l1_delay:

    mov r6,#217l2_delay:

    mov r5,#10djnz r5,$djnz r6,l2_delaydjnz r7,l1_delayret

  • 16

    程式發展步驟(4)

    KEIL C KEIL C(Delay ms) // 函數須自己撰寫void Delay_ms(int temp) //11.0592MHz{ //頻率換了又得重寫

    int i,j;for(i=0;i

  • 17

    程式發展步驟(5)

    KEIL C與MikroC的不同例:按鈕處理 KEIL C (按鈕處理)

    • 硬體處理 //• 軟體處理 // 程序須自己撰寫

    // 彈跳要自己處理 MikroC (按鈕處理)

    • 硬體處理• 軟體處理 // 內建函數

    Button(&PORTB,0,x,y); //x你要的彈跳延遲//y為作動的準位

    例:PWM處理 KEIL C

    • 需自己轉寫程式 MikroC

    • PWM1_init(5000); // 內建函數

  • 18

    程式發展步驟(6)

    STEP1:撰寫C程式(Mikro C IDE) C 程式的樣子:全域變數宣告;func1(){

    區域變數宣告;::

    }void main() //一開機後開始執行的地方{

    區域變數宣告;初始化部分; // 這是跟8051不同的地方您的程式;

    }

  • 19

    程式發展步驟(7)

    STEP 2:編譯與除錯 MikroC IDE 介紹

    STEP 3:燒錄與執行MikroC 檔案概述 *.mcppi:MikroC Pro專案檔 *.c:C原始檔 *.hex:十六進制檔(燒錄檔) *.asm:編譯之後的組語檔 *.mcl:編譯之後的二進制函數檔 *.lst:編譯後的記憶體配置情形

  • 20

    程式發展步驟(8)

    PIC組態介紹(Mikro IDE ctrl+shift+E) OSC設定

    • HS:石英振盪器 4MHz

  • 21

    程式發展步驟(9)

    撰寫MikroC PIC16程式:初始化輸出篇 PIC數位控制規劃三步驟:

    • STEP 1. 給定I/O初始值• STEP 2. 關閉複合功能• STEP 3. 規劃I/O方向

    例:PORTA全部數位輸出void main() // 一開機後開始執行的地方{

    PORTA=0; //1.讓PORTA輸出低電位ANSEL=0; //2.關閉PORTA的類比功能TRISA=0; //3.PORTA所有I/O為輸出::

    }

  • 22

    程式發展步驟(10)

    撰寫MikroC PIC18程式:初始化輸出篇 PIC數位控制規劃三步驟:

    • STEP 1.給定I/O初始值• STEP 2. 關閉複合功能• STEP 3. 規劃I/O方向

    例:PORTA全部數位輸出void main() // 一開機後開始執行的地方{

    PORTA=0; //1.讓PORTA低電位LATA=0; //2.讓LATA低電位ADCON1=0x0F; //3.關閉PORTA類比功能CMCON=7; //4.關閉PORTA比較器功能TRISA=0; //5.PORTA所有I/O為輸出::

    }

  • 23

    程式發展步驟(11)

    撰寫MikroC PIC16程式:初始化輸出篇 例: RB0~RB3輸出,RB4~RB7輸入

    void main() // 主程式開始{

    PORTB=0; //讓PORTB輸出低電位ANSELH=0; //關閉PORTB類比功能TRISB=0b11110000; //0b:二進制

    }

  • 24

    程式發展步驟(12)

    撰寫MikroC PIC18程式:初始化輸出篇 例: RB0~RB3輸出,RB4~RB7輸入

    void main() // 主程式開始{

    PORTB=0; //1. 讓PORTB低電位LATB=0; //2. 讓LATB低電位ADCON1=0x0F; //3. 關閉AN8~AN12功能TRISB=0b11110000; //4. 0b:二進制:

    :

    }

  • 25

    程式發展步驟(13)

    撰寫MikroC PIC16程式:初始化輸出篇 例: RC0~RC3輸出,RC4~RC7輸入

    void main() // 主程式開始{

    PORTC=0; //讓PORTC輸出低電位C1ON_bit=0; //關閉PORTC比較器C2ON_bit=0;

    TRISC=0xf0; //0x:十六進制:

    :

    }

  • 26

    程式發展步驟(14)

    撰寫MikroC PIC18程式:初始化輸出篇 例: RC0~RC3輸出,RC4~RC7輸入

    void main() // 主程式開始{

    PORTC=0; //1. 讓PORTC低電位LATC=0; //2. 讓LATC低電位TRISC=0xf0; //3. 0x:十六進制:

    :

    }

  • 27

    程式發展步驟(15)

    撰寫MikroC PIC18程式:初始化輸出篇 例: PORTD輸出

    void main() // 主程式開始{

    PORTD=0; //1. 讓PORTD低電位LATD=0; //2. 讓LATD低電位TRISD=0x00; //3.

    :

    :

    }

  • 28

    程式發展步驟(16)

    撰寫MikroC PIC18程式:初始化輸出篇 例: PORTE輸出

    void main() // 主程式開始{

    PORTE=0; //1. 讓PORTE低電位LATE=0; //2. 讓LATE低電位ADCON1=0x0A; //3. 關PORTE上AD功能TRISE=0x03; //4. RE0、RE1為輸入:

    :

    }

  • 29

    程式發展步驟(17)

    操作示範:PIC16 EX:利用RA0閃爍一顆LED

    void main() // 程式一開始{

    PORTA=0; // 初始化ANSEL=0; // 關閉類比功能TRISA=0; // 規劃I/O方向while(1){

    PORTA.B0=1; //也可以改為PORTA=0x01;Delay_ms(500);PORTA.B0=0; //也可以改為PORTA=0x00;Delay_ms(500);

    }}

  • 30

    程式發展步驟(18)

    操作示範:PIC18 EX:利用RA0閃爍一顆LED

    void main() // 程式一開始{

    PORTA=0; // 初始化LATA=0;ADCON1=0xF; // 關閉類比功能CMCON=7; // 關閉比較器功能TRISA=0; // 規劃I/O方向while(1){

    LATA=1; //也可以改為LATA.B0=1;Delay_ms(500);LATA=0;Delay_ms(500);

    }}

  • 31

    專題常用技術(1)

    101年 臺中高工-自動調節車流號誌系統

    • NE555+IR(8051) 臺中高工-智慧型停車場引導系統

    • Cds+PLC(8051) 100年 台中高工-智慧型追蹤電風扇

    • IR+焦電感測(A/D)+LCD+步進馬達(89S8252) 台中高工-LED環保香

    • Cds+驅蚊蟲電路(22KHz)(8051) 99年 台中高工-無線數位語音時鐘

    • IR+4*1 SEG(8051) 台中高工-步進馬達轉速控制

    • 步進馬達(8051)

  • 32

    專題常用技術(2)

    內部振盪 節省週邊電路

    Button 按鈕輸入

    ADC cds照度偵測 焦電感測 溫度感測(LM35)

    PWM IR

    DC Motor速度控制 頻率產生 LED照度控制

    KeyPad 輸入

    LCD 顯示

    EEPROM 參數記錄 資料記錄

    馬達控制 步進馬達控制 DC Motor控制

    溫度感測 環境控制 參數修正

  • 33

    專題常用技術(3)

    內部震盪器之使用• 優點:無外部振盪電路• 缺點:振盪頻率有1%的誤差。

    內部振盪器使用方式(MikroC IDE)• 組態設定:選擇INTOSCIO• 軟體書寫void main(){

    區域變數區;OSCCON=0x7F; // 8 MHz, 0x6F=4MHz: // 參考:OSCCON暫存器:

  • 34

    專題常用技術(4)

    按鈕技術 硬體電路

    • 同8051

    軟體• 使用內建函數

    內建函數Button Button(&PORTA,0,20,0) ;//檢查RA0是否為0(按下)

    //避開彈跳時間為20ms

    • 傳回値:1有 0無

  • 35

    專題常用技術(5)

    使用方式(Active Low) 有無按下(按下瞬間):直接偵測是否為0Vif(button(&PORTB,0,20,0)){

    按鈕被按下時,想做的事;}

    按下又放開(放開瞬間):先偵測按下,然後再測放開if(button(&PORTB,0,20,0))

    KeyPressed=1; // 使用變數記錄起來if(KeyPressed==1 && button(&PORTB,0,20,1)) // &&:AND{

    看你要幹嘛!}

  • 36

    專題常用技術(6)

    LCD顯示技術 腳位介紹

    D0~D7:資料線 Vo:控制對比 RS:暫存器選擇 E:晶片制能 R/W:讀取/寫入 A、K:背光

    EGN

    D

    Vo RS

    VCC

    R/W D0

    D1

    D2

    D3

    D4

    D5

    D6

    D7 A K

  • 37

    專題常用技術(7)

    LCD顯示器之使用 STEP1:規劃控制腳位(RS,E,R/W)及資料腳

    (D7,D6,D5,D4)

    STEP 2:利用輸出函數輸出ASCII內建函數 Lcd_Init() //初始化LCD的函數

    • 例:Lcd_Init();

    Lcd_Cmd(命令) //可以對LCD下命令的函數• 例:Lcd_Cmd(_LCD_CLEAR);

    Lcd_Out(1,1,“This is a test”) // (1,1)輸出字串 Lcd_Chr(2,1,’0’) // (2,1)輸出字元 Lcd_Chr_Cp(0x30); // 游標位置輸出字元

  • 38

    專題常用技術(8)

    LCD硬體 R/W:必須直接接地

    軟體書寫範例(LCD使用範例)sbit LCD_RS at RB4_bit;sbit LCD_EN at RB5_bit;sbit LCD_D7 at RB3_bit;sbit LCD_D6 at RB2_bit;sbit LCD_D5 at RB1_bit;sbit LCD_D4 at RB0_bit;sbit LCD_RS_Direction at TRISB4_bit;sbit LCD_EN_Direction at TRISB5_bit;sbit LCD_D7_Direction at TRISB3_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D5_Direction at TRISB1_bit;sbit LCD_D4_Direction at TRISB0_bit;

  • 39

    專題常用技術(9)

    void main(){

    PORTB=0;

    ANSELH=0;

    TRISB=0;

    Lcd_Init(); // 初始化LCDLcd_Cmd(_LCD_CLEAR); // 清除LCD螢幕Lcd_Cmd(_LCD_CURSOR_OFF); // 關閉游標Lcd_Out(1,3,”PIC EASY GO!”); // (1,3) 顯示

    }

  • 40

    專題常用技術(10)

    ADC技術 硬體

    • 請參閱接腳圖

    內建函數• Adc_Read(x); // x:channel NO.

    信號計算:

    軟體• 開啟A/D功能

    – ANSEL=0x01; // 打開RA0之AD功能• AD PIN規劃為輸入

    – TRISA=0x01; // 規劃RA0為輸入

    1023

    )(_V

    VrefVrefDataADin

  • 41

    專題常用技術(11)

    例:Cds+ADCvoid main()

    {

    unsigned AD_Data=0;

    float Vin=0.0;

    PORTA=0;

    ANSEL=0x01;

    TRISA=0x01;

    AD_Data=ADC_Read(0); // AN0:AD輸入Vin=AD_Data*(5-0)/1023;

    ::

  • 42

    專題常用技術(12)

    PWM技術• 硬體:

    • PWM1:RC2• PWM2:RC1

    內建函數• PWM1_Init(freq); // 所需頻率• PWM1_Set_Duty(百分比*255/100); // 設定Duty• PWM1_Start(); // PWM啟動• PWM1_Stop(); // 停止PWM

  • 43

    專題常用技術(13)

    使用方式 STEP 1:PWM初始化

    • Pwm1_Init(38000); // 38KHz

    STEP 2: PWM開始• Pwm1_Start () ; // PWM開始

    STEP 3:設定Duty• Pwm1_Set_Duty(50*255)/100); // Duty=50%

  • 44

    專題常用技術(14)

    例:IR+PWMvoid main(){

    PORTC=0;CCP1CON=CCP2CON=0;TRISC=0;Pwm1_Init(38000); // 38KHzPwm1_Start () ; // PWM開始Pwm1_Set_Duty(50*255)/100); // Duty=50%while(1){

    ::

    }}

  • 45

    專題常用技術(15)

    例:IR+PWM(硬體)

    2N2222

    220

    IR LED

    Vcc

    VCC

    U9

    PIC16F883

    RA7/OSC1/CLKIN9

    RA6/OSC2/CLKOUT10

    RE3/MCLR/VPP1

    RA0/AN0/ULPWU/C12IN0-2

    RA1/AN1/C12IN1-3

    RA2/AN2/VREF-/CVREF/C2IN+4

    RA3/AN3/VREF+/C1IN+5

    RA4/T0CKI/C1OUT6

    RA5/AN4/SS/C2OUT7

    RC0/T1OSO/T1CKI11

    RC1/T1OSI/CCP212

    RC2/P1A/CCP113

    RC4/SDI/SDA15RC5/SDO16RC6/TX/CK17RC7/RX/DT18

    RB2/AN8/P1B23RB3/AN9/PGM/C12IN2-24RB4/AN11/P1D25RB5/AN13/T1G26

    VSS19VDD20RB0/AN12/INT21RB1/AN10/P1C/C12IN3-22

    RB6/ICSPCLK27RB7/ICSPDAT28

    VSS8

    RC3/SCK/SCL14

    38KHz

  • 46

    技能競賽相關技術(1)

    ADC之使用(使用內建函數即可) RA0 RA1

    PWM之使用(使用內建函數即可) RC1(PWM2)

    LCD之使用(使用內建函數即可) D4~D7:RD4~RD7 RS:RE0 R/W:直接接地 E:RE2

    74HC595之使用(使用內建函數) CK:RC0 SDO:RC2 LATCH:RC3

  • 47

    技能競賽相關技術(2)

    例:74HC595N之使用(腳位被固定)

  • 48

    技能競賽相關技術(3)

    自寫函數寫法#define clock LATC.B0

    #define latch LATC.B1

    #define SDI LATC.B2void hc595 (unsigned unsigned char temp){

    unsigned int i;i=8;while (i>0){

    if (temp.F7==0) SDI = 0;else SDI = 1;temp = temp

  • 49

    技能競賽相關技術(4)

    void latch595(){

    latch = 1;Delay_us(1);latch = 0;

    }void main(){

    char i;PORTC=0; //1. 讓PORTC低電位LATC=0; //2. 讓LATC低電位TRISC=0x0; //3. 讓PORTC都輸出while(1){

    for(i=0;i

  • 50

    技能競賽相關技術(5)

    使用內建SPI函數#define latch LATC.B1sbit SoftSpi_SDI at RC7_bit;sbit SoftSpi_SDO at RC2_bit;sbit SoftSpi_CLK at RC0_bit;sbit SoftSpi_SDI_Direction at TRISC7_bit;sbit SoftSpi_SDO_Direction at TRISC2_bit;sbit SoftSpi_CLK_Direction at TRISC0_bit;void latch595(){

    latch = 1;Delay_us(1);latch = 0;

    }

  • 51

    技能競賽相關技術(6)

    void main(){

    char i;PORTC=0; //1. 讓PORTC低電位LATC=0; //2. 讓LATC低電位TRISC=0x0; //3. 讓PORTC都輸出Soft_SPI_Init();while(1){

    for(i=0;i