Modul Exp UC Nuvoton-V1.0

Embed Size (px)

Citation preview

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Modul 1: Konsep I/O pada NUC1XX series

    Tujuan Memahami konsep Luaran/Masukan (I/O) pada mikrokontroler ARM Cortex M0 NuMicro

    1XX Series (NUC140VE3CN)

    Pendahuluan NUC1XX series adalah ARM Cortex -mikrokontroler dengan M0 core didalamnya yang

    cocok digunakan untuk kontrol industri dan aplikasi yang membutuhkan fungsi komunikasi

    khusus. Cortex -M0 adalah prosesor ARM terbaru dengan kinerja 32-bit dengan biaya yang

    setara dengan mikrokontroler 8-bit.

    NuMicro Seri NUC100 memiliki inti ARM Cortex M0 yang tertanam dengan kecepatan

    hingga 50 MHz, dilengkapi dengan memori flash untuk program 32K/64K/128Kbyte.,

    SRAM sebesar 4K/8K/16K-byte dan memori flash loader untuk ISP (In System

    Programming) sebesar 4K-byte. Selain itu juga dilengkapi dengan berbagai macam periferal,

    seperti GPIO, Timer, Watchdog Timer, RTC, PDMA, UART, SPI/MICROWIRE, I2C, I2S,

    PWM, LIN, CAN, PS2, USB 2.0 FS Device, ADC 12-bit, komparator analog, Low Voltage

    Reset dan Brown-out Detector. Gambar 1 menunjukkan diagram blok dari NuMicro

    NUC130/140 Series.

    Gambar 1. Diagram Blok NuMicro NUC130/140 Series

    NUC140 Learning Board Board ini menggunakan catudaya 5V, yang dapat diperoleh dari konektor USB ataupun

    melalui konektor catudaya adaptor. Tegangan ini langsung menjadi VDD untuk chip

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    NUC140VE3CN, sehingga perlu diperhatikan tegangan input ini maksimal adalah 5.5V

    (menurut datasheet NUC140).

    Pada board terdapat juga catudaya teregulasi 3.3V menggunakan chip LM1117. Tipe chip

    regulator ini tidak dinyatakan dalam skematik. Tegangan dari Powerjack 3 pin dan konektor

    USB dilewatkan melalui dioda sehingga aman dari kesalahan polaritas pemasangan, namun

    tidak melindungi dari kerusakan jika tegangan masuk melebihi 5.5V. Gambar 1 menunjukkan

    layout NUC140 Learning Board. Sedangkan Tabel 1 menunjukkan penggunaan pin pada

    Learning Board tsb.

    Gambar 1. Layout NUC140 Learning Board dari Nuvoton

    Tabel 1. Konfigurasi Sistem pada NuMicro 1XX series Development Board

    Blok Pin Fungsi

    ICE Bridge Nu-Link ICE_CLK

    ICE_DATA

    Antarmuka SWD

    UART GPB0

    GPB1

    Rx UART0

    Tx UART0

    Pushbutton GPB15 GPB15 INT0

    CAN GPD6

    GPD7

    Rx CAN0

    Tx CAN0

    GPB12-13 CAN transceiver speed

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Blok Pin Fungsi

    WAU8822 Codec GPC0

    GPC1

    GPC2

    GPC3

    GPA15

    I2SLRCLK

    I2SBCLK

    I2SDI

    I2SDO

    I2SMCLK

    GPA8

    GPA9

    I2C0 SDA

    I2C0 SCL

    GPE14 Line out Enable/Disable

    GPE15 Line in Enable/Disable

    LIN GPB4

    GPB5

    Rx UART1

    Tx UART1

    GPB6 LIN transceiver wakeup

    GPB7 LIN transc. Enable/Disable

    7-Seg LED GPE0-7 Baris

    GPC4-7 Kolom

    LCD Panel Dot Matrix GPD8

    GPD9

    GPD10

    GPD11

    SPI3 SS30

    SPI3 SPCLK

    SPI3 MISO0

    SPI3 MOSI0

    GPD14 Lampu latar LCD

    Potensiometer GPA7 Antarmuka ADC

    Buzzer GPB11 PWM4

    Keypad matrix GPA0-5 GPIO

    Reset RESET Reset

    EEPROM GPA10

    GPA11

    I2C1 SDA

    I2C1 SCL

    Slot SD card GPD12 Catudaya SD card

    GPD13 Deteksi SD card

    GPC8-11 Antarmuka SD card

    Flash GPD0

    GPD1

    GPD2

    GPD3

    GPD4

    GPD5

    SPI2 SS20

    SPI2 SPCLK

    SPI2 MISO0

    SPI2 MOSI0

    SPI2 MISO1

    SPI2 MOSI1

    LED GPA12

    GPA13

    GPA14

    PWM0

    PWM1

    PWM2

    GPC12-15 GPIO

    Perangkat Lunak Kompilasi

    Untuk membuat sebuah proyek aplikasi menggunakan ARM Cortex-M0 dari NuMicro

    Nuvoton NUC1XX series, dapat digunakan CooCox IDE.

    Berikut langkah yang digunakan dalam membuat sebuah project baru dengan menggunakan

    CooCox IDE:

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    1. Klik menu Project New Project lalu tulis nama proyek aplikasi yang akan dibuat dan tentukan lokasi penyimpanan project tersebut. Setelah itu klik finish;

    2. Lalu klik Nuvoton dan pilih jenis mikrokontroler NUC140VE3CN;

    3. Kemudian akan muncul jendela repository. Pada bagian ini dapat dipilih pustaka components yang akan digunakan;

    4. Kemudian buka file main.c pada bagian jendela project. Pada main.c inilah dapat ditulis kode program yang akan digunakan pada mikrokontroler Nuvoton;

    5. Untuk mengkompile program klik menu Project build atau tekan F7;

    6. Untuk mendownload program yang telah ditulis, klik Flash Program Download.

    Latihan 1. Menyalakan LED

    Pada NuMicro Development Board tersedia LED yang terhubung pada GPCC12 sampai

    GPC15. Pada program untuk menyalakan LED digunakan fungsi DrvGPIO_SetPortBits

    untuk membuat port GPIO bernilai HIGH dan LOW tertentu pada bit-bitnya.

    Untuk membuat program, klik panel repository lalu pilih M0 Cmsis Core, Cmsis Boot,

    System definition, SYS, dan GPIO.

    Lalu ketik listing program berikut:

    #include "DrvSYS.h"

    #include "DrvGPIO.h"

    void delay_loop(void)

    {

    uint32_t i,j;

    for(i=0;i

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */

    for(i=12;i

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Gambar 2. Konfigurasi RGB LED pada NuMicro 1XX series Development Board

    Buatlah program untuk menyalakan LED RGB tersebut dengan menuliskan listing program

    berikut pada program utama yang telah anda buat pada latihan 1.

    DrvGPIO_SetPortBits(E_GPA, 0x0000);

    delay_loop();

    DrvGPIO_SetPortBits(E_GPA, 0x1000);

    delay_loop();

    DrvGPIO_SetPortBits(E_GPA, 0x2000);

    delay_loop();

    DrvGPIO_SetPortBits(E_GPA, 0x3000);

    delay_loop();

    DrvGPIO_SetPortBits(E_GPA, 0x4000);

    delay_loop();

    DrvGPIO_SetPortBits(E_GPA, 0x5000);

    delay_loop();

    DrvGPIO_SetPortBits(E_GPA, 0x6000);

    delay_loop();

    DrvGPIO_SetPortBits(E_GPA, 0x7000);

    delay_loop();

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Modul 2: Seven Segment

    Tujuan Memahami konsep Input Output yang digunakan pada Seven Segment yang terdapat di

    NuMicro 1XX Series Development Board

    Pendahuluan Pada NuMicro 1XX series development board terdapat 4 buah Seven Segment yang terdapat

    pada PORT GPE.0-7 sebagai Row dan GPC.4-7 sebagai column. Untuk menggunakan Seven

    Segment ini, pengguna perlu memasukkan Seven_Segment.h dan Seven_Segment.c kedalam

    program.

    Pada program, pengguna dapat menggunakan syntax show_seven_segment(column,row)

    untuk menampilkan karakter pada Seven Segment. Karena Seven Segment tersebut

    terhubung dengan Multiplexer terlebih dahulu sebelum masuk ke mikrokontroler, maka

    pengguna harus mematikan Multiplexer terlebih dahulu sebelum memulai perintah

    selanjutnya dengan syntax close_seven_segment()

    Gambar 3 berikut ini menunjukkan konfigurasi Seven Segment pada NuMicro 1XX series:

    Latihan-1: Lengkapi listing program dibawah ini

    void delay_loop(void)

    {

    uint32_t i,j;

    for(i=0;i

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    while(1)

    {

    for(i=0;i

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Modul 3. Penggunaan LCD

    Tujuan - Praktikan memahami penggunaan LCD pada mikrokontroler ARM Cortex M0

    NuMicro 1XX Series

    Pada development board NUC 1XX series terdapat sebuah DOT MATRIX LCD Pannel

    Gambar 3 berikut konfigurasi dari LCD tersebut:

    Gambar 3. Konfigurasi Dot Matrix LCD NuMicro 1XX series Development Board

    Latihan-1: Contoh program antarmuka LCD

    Untuk menggunakan LCD tersebut, pengguna perlu memanggil sebuah library, yaitu:

    LCD_Driver.h.

    Untuk menambahkan library tersebut, klik menu Project>>Configuration. Lalu

    pada bagian include path tambahkan library LCD_Driver.h dengan cara mengarahkannya ke

    folder tempat library tersebut disimpan.

    Kemudian tambahkan file LCD_Driver.c dan Ascii_Table.c pada bagian project

    dengan cara klik kanan folder nama project anda lalu add linked file. Kemudian masukkan

    file-file tersebut.

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Setelah semua file dan library tersebut dimasukkan, tuliskan listing program berikut

    pada main.c

    #include "NUC1xx.h"

    #include "DrvSYS.h"

    #include "DrvGPIO.h"

    #include "LCD_Driver.h"

    void delay_loop(void)

    {

    uint32_t i,j;

    for(i=0;i

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    while(1)

    {

    if (DrvGPIO_GetBit(E_GPB, 15)==0)

    {

    clr_all_pannal();

    print_lcd(0, "Button Test.. ");

    print_lcd(1, "OK.....");

    print_lcd(2, "ELINS * 2012 Yes");

    }

    else

    {

    clr_all_pannal();

    print_lcd(1, "Tekan Button...");

    }

    }

    }

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Modul 4: Penggunaan Keypad Matrix 3x3

    Tujuan - Praktikan memahami penggunaan keypad matrix 3x3 pada NuMicro 1XX Series

    Development Board

    Pada development board NUC 1XX series, terdapat keypad matrix 3x3.

    Gambar 4 berikut skematik rangkaian dari keypad matrix tersebut:

    Gambar 4. Konfigurasi Keypad Matrix 3x3 NuMicro 1XX series Development Board

    Untuk menggunakannya, pertama-tama masukkan library ScanKey.h dan file ScanKey.c.

    Pengguna dapat memanggil fungsi scankey() saat akan menggunakan keypad matrix tersebut

    Contoh program: temp=scan_key();

    if(temp==1)

    {

    print_lcd(0,"Key1 had pressed ");

    }

    Pada program diatas, akan ditampilkan tombol yang telah ditekan pada LCD.

    Latihan-1: Lengkapi listing program dibawah ini

    1. Lengkapi program diatas untuk keypad 1-9 kemudian downloadkan pada

    mikrokontroler

    2. Buatlah program yang menampilkan di LCD setiap keypad yang ditekan tanpa

    menghapus hasil penekanan sebelumnya

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    MODUL 5: ADC

    Tujuan - Praktikan memahami penggunaan ADC pada NuMicro 1XX Series Development

    Board dengan menggunakan CoCoox IDE

    Pada NuMicro 1XX series terdapat variable resistor yang terhubung dengan port ADC

    dengan resolusi 12bit pada GPA.7

    Gambar 5 berikut ini merupakan konfigurasi ADC pada NuMicro 1XX series Development

    Board

    Gambar 5. Konfigurasi ADC pada NuMicro 1XX series Development Board

    Berikut program yang digunakan untuk menginisialisasi fungsi ADC pada NuMicro 1XX

    series:

    void InitADC(void)

    {

    /* Step 1. GPIO initial */

    GPIOA->OFFD|=0x00800000; //Disable digital input path

    SYS->GPAMFP.ADC7_SS21_AD6=1; //Set ADC function

    /* Step 2. Enable and Select ADC clock source, and then enable ADC module

    */

    SYSCLK->CLKSEL1.ADC_S = 2; //Select 22Mhz for ADC

    SYSCLK->CLKDIV.ADC_N = 1; //ADC clock source = 22Mhz/2 =11Mhz;

    SYSCLK->APBCLK.ADC_EN = 1; //Enable clock source

    ADC->ADCR.ADEN = 1; //Enable ADC module

    /* Step 3. Select Operation mode */

    ADC->ADCR.DIFFEN = 0; //single end input

    ADC->ADCR.ADMD = 0; //single mode

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    /* Step 4. Select ADC channel */

    ADC->ADCHER.CHEN = 0x80;

    /* Step 5. Enable ADC interrupt */

    ADC->ADSR.ADF =1; //clear the A/D interrupt flags for safe

    ADC->ADCR.ADIE = 1; // NVIC_EnableIRQ(ADC_IRQn);

    /* Step 6. Enable WDT module */

    ADC->ADCR.ADST=1;

    }

    Untuk mendapatkan nilai ADC pada port tertentu, bias digunakan instruksi

    ADDR[namaport].RSLT

    Misal untuk mendapatkan nilai ADC pada Port GPA7, digunakan instruksi:

    ADC->ADDR[7].RSLT

    Latihan:

    Tulis program utama berikut pada program utama yang telah anda buat:

    int main (void)

    {

    //Enable 12Mhz and set HCLK->12Mhz

    char adc_value1[15]="ADC Value:";

    char adc_value2[15]="ADC Volt :";

    UNLOCKREG();

    SYSCLK->PWRCON.XTL12M_EN = 1;

    SYSCLK->CLKSEL0.HCLK_S = 0;

    LOCKREG();

    InitADC();

    Initial_pannel(); //call initial pannel function

    clr_all_pannal();

    /* Synch field transmission & Request Identifier Field transmission*/

    double volt;

    while(1)

    {

    while(ADC->ADSR.ADF==0);

    ADC->ADSR.ADF=1;

    Show_Word(0,11,' ');

    Show_Word(0,12,' ');

    Show_Word(0,13,' ');

    volt = ((ADC->ADDR[7].RSLT)/4095);

    // 12bit ADC resolution, Vref=5volt

    sprintf(adc_value1+10,"%d",ADC->ADDR[7].RSLT);

    sprintf(adc_value2+10,"%3.2f",volt);

    print_lcd(0, adc_value1);

    print_lcd(1, adc_value2);

    Delay(20000);

    ADC->ADCR.ADST=1;

    }

    }

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    MODUL 6: I2C

    Tujuan - Praktikan memahami penggunaan I2C pada NuMicro 1XX Series Development

    Board dengan menggunakan CoCoox IDE

    Pendahuluan I2C (Inter-Integrated Circuit) bus merupakan antarmuka 2 wire serial yang dikembangkan

    oleh Philips. Dikembangkan untuk aplikasi 8 bit dan banyak digunakan pada consumer

    electronics, automotive dan indistri. I2C bus ini berfungsi sebagai antarmuka jaringan multi-

    master, multi-slave dengan deteksi tabrakan data. Jaringan dapat dipasangkan hingga 128

    titik dalam jarak 10 meter. Setiap titik dalam jaringan dapat mengirim dan menerima data.

    Setiap titik dalam jaringan harus memiliki alamat yang unik. Seiring berkembangnya waktu,

    I2C menjadi sebuah standar komunikasi yang banyak digunakan dalam aplikasi embedded

    system.

    Pada NuMicro 1XX series ini memiliki fitur I2C sebagai berikut:

    Up to two I2C controllers.

    Compatible with Philips I2C standard.

    Support Master/Slave mode

    Support 7 bit addressing mode

    Built-in a 14-bit time-out counter to avoid the

    I2C bus hang-up.5

    Features (2/2)

    Multiple address recognition

    Pada praktikum kali ini akan dicoba menuliskan flash memori pada 24LC64 EEPROM

    dengan menggunakan I2C pada NuMicro. 24AA64/24LC64 (24XX64 *) adalah 64 Kbit

    Electrically Erasable PROM. Perangkat ini disusun sebagai delapan blok dari 1K x 8-bit

    memori dengan antarmuka 2-wire serial. Berikut diagram blok dari 24LC64 EEPROM:

    Gambar 3. Diagram blok 24LC64 EEPROM

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Untuk menggunakan fungsi I2C pada EEPROM 24LC64 yang tersedia pada NuMicro

    development Board, dapat digunakan library EEPROM_24LC64.h dan Driver\DrvI2C.h.

    Tuliskan listing program berikut:

    #include

    #include "NUC1xx.h"

    #include "Driver\DrvSYS.h"

    void delay_loop(void)

    {

    uint32_t i,j;

    for(i=0;i

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    else

    DrvGPIO_ClrBit(E_GPA,pin);

    temp=temp>>1;

    }

    delay();

    if(DrvGPIO_GetBit(E_GPA,4)==0)

    return (i+4);

    }

    for(i=0;i1;

    }

    delay();

    if(DrvGPIO_GetBit(E_GPA,5)==0)

    return (i+7);

    }

    return 0;

    }

    int main(void)

    {

    uint32_t i2cdata=0,i;

    unsigned char temp;

    char addr[16]="Address:";

    char Write[16]="Write:";

    char read[16]="Read:";

    /* Unlock the protected registers */

    UNLOCKREG();

    /* Enable the 12MHz oscillator oscillation */

    DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);

    /* Waiting for 12M Xtal stalble */

    SysTimerDelay(5000);

    /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */

    DrvSYS_SelectHCLKSource(0);

    /*lock the protected registers */

    LOCKREG();

    DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);

    /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */

    Initial_pannel(); //call initial pannel function

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    clr_all_pannal();

    print_lcd(0, "I2C with 24LC64");

    print_lcd(1, "test read and ");

    print_lcd(2, "write function ");

    print_lcd(3, "press keypad");

    //initial key board

    for(i=0;i

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Write_24LC64(0x00000000+temp,temp+33);

    i2cdata= Read_24LC64(0x00000000+temp);

    sprintf(addr+8,"%x",temp);

    sprintf(Write+6,"%x",temp+33);

    sprintf(read+5,"%x",i2cdata);

    print_lcd(1,addr);

    print_lcd(2,Write);

    print_lcd(3,read);

    }

    }

    }

    Program diatas digunakan untuk menulis data melalui I2C ke EEPROM 24LC64 kemudian

    membaca data yang ditulis tersebut.

    Latihan-1: Buat program Lanjutkan listing program diatas untuk tombol keypad matrix 4-9

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    MODUL 7: Timer (pewaktu mikrokontroler)

    Tujuan - Praktikan memahami penggunaan Timer pada NuMicro 1XX Series Development

    Board dengan menggunakan CoCoox IDE

    Pada NuMicro 1XX series tersedia Timer, dengan fitur sebagai berikut:

    Four sets of 24-bit up-counting timer

    Five selections of clock source and a

    prescale for every timer

    Time out period = (Period of timer clock input)

    (8-bit Prescale + 1) * (24-bit TCMP)

    Four operation modes: one shot, periodic, toggle mode and auto-reload, counting

    mode

    Berikut diagram alur dari Timer operation:

    Berikut NuMicro Family Timer Block Diagram:

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Gambar. NuMicro Family Timer Block Diagram

    Cara menghitung periode timer dari Timer 0 ialah:

    Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)

    TMAX = (1 / 12 MHz) * (28) * (224-1) 341.3 sec.

    TMIN = (1 / 12 MHz) * (1+1) * (2) 0.318usec.

    8-bit Prescale: 1~255, Setting 0 will disable prescale clock

    24bit TCMP: 2~(224-1)

    Timer clock input: 12Mhz

    Berikut ini contoh fungsi yang digunakan untuk menginisialisasi Timer 0 Periodic Mode

    Interupt

    void Timer_initial(void)

    {

    /* Step 1. Enable and Select Timer clock source */

    SYSCLK->CLKSEL1.TMR0_S = 0; //Select 12Mhz for Timer0 clock source

    SYSCLK->APBCLK.TMR0_EN =1; //Enable Timer0 clock source

    /* Step 2. Select Operation mode */

    TIMER0->TCSR.MODE=1; //Select periodic mode for operation mode

    /* Step 3. Select Time out period = (Period of timer clock input) *

    (8-bit Prescale + 1) * (24-bit TCMP)*/

    TIMER0->TCSR.PRESCALE=0; // Set Prescale [0~255]

    TIMER0->TCMPR = 1000000; // Set TICR(TCMP) [0~16777215]

    //(1/22118400)*(0+1)*(2765)= 125.01usec or 7999.42Hz

    /* Step 4. Enable interrupt */

    TIMER0->TCSR.IE = 1;

    TIMER0->TISR.TIF = 1; //Write 1 to clear for safty

    NVIC_EnableIRQ(TMR0_IRQn); //Enable Timer0 Interrupt

    /* Step 5. Enable Timer module */

    TIMER0->TCSR.CRST = 1; //Reset up counter

    TIMER0->TCSR.CEN = 1; //Enable Timer0

    TIMER0->TCSR.TDR_EN=1; // Enable TDR function

    }

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Saat terjadi overflow, maka mikrokontroler akan mengeksekusi program yang terdapat pada

    fungsi

    void TMR0_IRQHandler(void) // Timer0 interrupt subroutine

    {

    -masukkan program interupsi-

    }

    Berikut contoh program saat terjadi interupsi: /*-------------------------------------------------------------------------

    ---

    Interrupt subroutine

    -------------------------------------------------------------------------

    ---*/

    static unsigned char count=0;

    static unsigned char loop=12;

    void TMR0_IRQHandler(void) // Timer0 interrupt subroutine

    {

    unsigned char i=0;

    TIMER0->TISR.TIF =1;

    count++;

    if(count==5)

    {

    DrvGPIO_ClrBit(E_GPC,loop);

    loop++;

    count=0;

    if(loop==17)

    {

    for(i=12;i

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    unsigned char i=0;

    TIMER0->TISR.TIF =1;

    count++;

    if(count==5)

    {

    DrvGPIO_ClrBit(E_GPC,loop);

    loop++;

    count=0;

    if(loop==17)

    {

    for(i=12;iCLKSEL1.TMR0_S = 0; //Select 12Mhz for Timer0 clock source

    SYSCLK->APBCLK.TMR0_EN =1; //Enable Timer0 clock source

    /* Step 2. Select Operation mode */

    TIMER0->TCSR.MODE=1; //Select periodic mode for operation mode

    /* Step 3. Select Time out period = (Period of timer clock input) *

    (8-bit Prescale + 1) * (24-bit TCMP)*/

    TIMER0->TCSR.PRESCALE=0; // Set Prescale [0~255]

    TIMER0->TCMPR = 1000000; // Set TICR(TCMP) [0~16777215]

    // (1/22118400)*(0+1)*(2765)= 125.01usec or 7999.42Hz

    /* Step 4. Enable interrupt */

    TIMER0->TCSR.IE = 1;

    TIMER0->TISR.TIF = 1; //Write 1 to clear for safty

    NVIC_EnableIRQ(TMR0_IRQn); //Enable Timer0 Interrupt

    /* Step 5. Enable Timer module */

    TIMER0->TCSR.CRST = 1; //Reset up counter

    TIMER0->TCSR.CEN = 1; //Enable Timer0

    TIMER0->TCSR.TDR_EN=1; // Enable TDR function

    }

    int main(void)

    {

    int i=0,j=0;

    /* Unlock the protected registers */

    UNLOCKREG();

    /* Enable the 12MHz oscillator oscillation */

    DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);

    /* Waiting for 12M Xtal stalble */

    SysTimerDelay(5000);

    /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */

    DrvSYS_SelectHCLKSource(0);

    /*lock the protected registers */

    LOCKREG();

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);

    /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */

    for(i=12;i

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Modul 8: PWM Pulse Width Modulation

    Tujuan - Praktikan memahami penggunaan Pulse Width Modulation pada NuMicro 1XX

    Series Development Board dengan menggunakan CoCoox IDE

    Pada NuMicro 1xx series, terdapat PORT yang memiliki fungsi khusus sebagai port

    penghasil Pulse Width Modulation atau biasa disebut PWM.

    Berikut fitur-fitur yang terdapat didalamnya:

    Four PWM Generators, each generator supports

    One 8-bit prescaler

    One clock divider

    Two PWM-timers for two outputs, each timer includes

    A 16-bit PWM down-counter

    A 16-bit PWM reload value register (CNR)

    A 16-bit PWM compare register (CMR)

    One dead-zone generator

    Two PWM outputs.

    8 PWM channels or 4 PWM paired channels.

    16 bits resolution.

    PWM Interrupt synchronized with PWM period.

    Single-shot or Continuous mode PWM.5

    Berikut konfigurasi PWM/Capture Clock Source

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Konfigurasi PWM Generator:

    Untuk memanggil fungsi PWM pada NuMicro 1xx series ini, pengguna diwajibkan

    menginisialisasi fungsi PWM terlebih dahulu. Contoh inisialisasi fungsi PWM dapat dilihat

    pada program berikut:

    void InitPWM(void)

    {

    /* Step 1. GPIO initial */

    SYS->GPAMFP.PWM0_AD13=1;

    /* Step 2. Enable and Select PWM clock source*/

    SYSCLK->APBCLK.PWM01_EN = 1;//Enable PWM clock

    SYSCLK->CLKSEL1.PWM01_S = 3;//Select 22.1184Mhz for PWM clock source

    PWMA->PPR.CP01=1; //Prescaler 0~255, Setting 0 to stop output clock

    PWMA->CSR.CSR0=0; // PWM clock = clock source/(Prescaler + 1)/divider

    /* Step 3. Select PWM Operation mode */

    //PWM0

    PWMA->PCR.CH0MOD=1; //0:One-shot mode, 1:Auto-load mode

    //CNR and CMR will be auto-cleared after setting CH0MOD form 0 to 1.

    PWMA->CNR0=0xFFFF;

    PWMA->CMR0=0xFFFF;

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    PWMA->PCR.CH0INV=0; //Inverter->0:off, 1:on

    PWMA->PCR.CH0EN=1; //PWM function->0:Disable, 1:Enable

    PWMA->POE.PWM0=1; //Output to pin->0:Diasble, 1:Enable

    }

    Fungsi diatas digunakan untuk melakukan setting PORT PWM0 dengan mode operasi auto-

    load mode.

    Berikut ini contoh program penggunaan PWM.

    while(ADC->ADSR.ADF==0);

    ADC->ADSR.ADF=1;

    PWMA->CMR0=ADC->ADDR[7].RSLTADCR.ADST=1;

    Pada program diatas, akan digunakan pengontrolan lebar pulsa PWM dengan memanfaatkan

    nilai ADC pada address 7 yang masuk pada input variabel resistor

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    MODUL 9: SPI Serial Peripheral Interface

    Tujuan - Praktikan memahami penggunaan Serial Peripheral Interface (SPI) pada NuMicro

    1XX Series Development Board dengan menggunakan CoCoox IDE

    SPI (serial peripheral interface) merupakan port komunikasi serial sinkron. Pada development

    board NuMicro 1XX series terdapat fitur SPI sebagai berikut:

    Up to four SPI controllers

    Each SPI controller can drive up to two

    slave devices in master mode

    Support master/slave mode operation

    Support 1-channel or 2-channel serial data

    IN/OUT

    Configurable data length

    Provide burst mode operation

    Berikut blok diagram kerja SPI pada NuMicro Development Board 1XX

    1bit SPI+SPI Flash+PDMA Connection

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Condition:

    Master mode

    One channel data in/out

    SPI clock rate 1MHz

    Transmit data at negative edge

    Receive data at positive edge

    Disable the auto slave select

    Slave select is active low

    SPICLK2 SPI-Flash0_CLK

    MISO20 SPI-Flash0_DO

    MOSI20 SPI-Flash0_DI

    SPISS20 SPI-Flash0_/CS

    Pada NuMicro 1XX series Development board, terdapat flash memory eksternal W25Q16BV

    yang memiliki konfigurasi sebagai berikut:

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    Berikut contoh pemrograman flash memory eksternal W25Q16BV dengan menggunakan SPI

    #define TEST_NUMBER 1 /* page numbers */

    //void SPI0_Callback(uint32_t u32UserData);

    //volatile uint32_t SPI0_INT_Flag;

    void SpiFlashx2_ReadMidDid(void);

    void SpiFlashx2_ChipErase(void);

    uint32_t SpiFlash2_ReadStatusReg1(void);

    uint32_t SpiFlash2_ReadStatusReg2(void);

    void SpiFlashx2_WaitReady(void);

    void SpiFlashx2_PageProgram(uint8_t *, uint32_t, uint32_t);

    void SpiFlashx2_ReadData(uint8_t *, uint8_t *, uint32_t, uint32_t);

    void Initial_pannel(void);

    void clr_all_pannal(void);

    void print_lcd(unsigned char, char *);

    void SysTimerDelay(uint32_t);

    void delay(void)

    {

    int j;

    for(j=0; j

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    uint8_t scan_key(void)

    {

    uint8_t act[4]={0x3b, 0x3d, 0x3e};

    uint8_t i,temp,pin;

    for(i=0;i1;

    }

    delay();

    if(DrvGPIO_GetBit(E_GPA,3)==0)

    return (i+1);

    }

    for(i=0;i1;

    }

    delay();

    if(DrvGPIO_GetBit(E_GPA,4)==0)

    return (i+4);

    }

    for(i=0;i1;

    }

    delay();

    if(DrvGPIO_GetBit(E_GPA,5)==0)

    return (i+7);

    }

    return 0;

    }

    int main(void)

    {

    uint32_t u32ByteCount, u32FlashAddress, u32PageNumber;

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    uint8_t DataBuffer0[256];

    uint8_t DataBuffer1[256];

    /* Unlock the protected registers */

    UNLOCKREG();

    /* Enable the 12MHz oscillator oscillation */

    DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);

    /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */

    DrvSYS_SelectHCLKSource(0);

    LOCKREG();

    DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);

    /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */

    Initial_pannel();

    clr_all_pannal();

    /* GPIO init for SPI2 */

    DrvGPIO_InitFunction(E_FUNC_SPI2);

    /* GPIO init for SPI2 2-bit mode */

    DrvGPIO_InitFunction(E_FUNC_SPI2_2BIT_MODE);

    /* Configure SPI2 as a master, Type1 waveform, 32-bit transaction */

    DrvSPI_Open(eDRVSPI_PORT2, eDRVSPI_MASTER, eDRVSPI_TYPE1, 32);

    /* MSB first */

    DrvSPI_SetEndian(eDRVSPI_PORT2, eDRVSPI_MSB_FIRST);

    /* Disable the automatic slave select function of SS0. */

    DrvSPI_DisableAutoSS(eDRVSPI_PORT2);

    /* Set the active level of slave select. */

    DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT2,

    eDRVSPI_ACTIVE_LOW_FALLING);

    /* Configure SPI2 as 2 bits transfer mode */

    DrvSPI_Set2BitTransferMode(eDRVSPI_PORT2, TRUE);

    /* Enable the SPI2 interrupt and install the callback function. */

    //DrvSPI_EnableInt(eDRVSPI_PORT2, SPI2_Callback, 0);

    /* SPI clock rate 1MHz */

    DrvSPI_SetClockFreq(eDRVSPI_PORT2, 1000000, 0);

    print_lcd(0,"SPI Sample Code ");

    print_lcd(1," for Flash x 2 ");

    print_lcd(3,"Press key 1 ....");

    while(1) {

    if (scan_key() == 1) break;

    }

    /* read MID & DID */

    SpiFlashx2_ReadMidDid();

    SysTimerDelay(1000000);

    /* Erase SPI flash */

    print_lcd(2,"Erase Flash.....");

    print_lcd(3," ");

    SpiFlashx2_ChipErase();

    /* Wait ready */

    SpiFlashx2_WaitReady();

    /* Get the status of SPI flash */

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    print_lcd(3,"Erase done !!! ");

    SysTimerDelay(1000000);

    /* source data */

    for(u32ByteCount=0; u32ByteCount

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    }

    print_lcd(3,"Verify done !!! ");

    DrvSPI_Close(eDRVSPI_PORT2);

    return 1;

    }

    /*

    void SPI2_Callback(uint32_t u32UserData)

    {

    SPI2_INT_Flag = 1;

    }

    */

    // **************************************

    // For W25Q16BV, Manufacturer ID: 0xEF; Device ID: 0x14

    // For W26X16, Manufacturer ID: 0xEF; Device ID: 0x14

    void SpiFlashx2_ReadMidDid(void)

    {

    uint32_t au32SourceData[2];

    uint32_t au32DestinationData[2];

    // configure transaction length as 8 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);

    // /CS: active

    DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // send Command: 0x90, Read Manufacturer/Device ID

    au32SourceData[0] = 0x90;

    au32SourceData[1] = 0x90;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // configure transaction length as 24 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 24);

    // send 24-bit '0', dummy

    au32SourceData[0] = 0x0;

    au32SourceData[1] = 0x0;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // configure transaction length as 16 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 16);

    // receive

    au32SourceData[0] = 0x0;

    au32SourceData[1] = 0x0;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // /CS: de-active

    DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    DrvSPI_DumpRxRegister(eDRVSPI_PORT2, &au32DestinationData[0], 2);

    if ((au32DestinationData[0] & au32DestinationData[1] & 0xffff) ==

    0xEF14)

    print_lcd(3,"MID & DID=0xEF14");

    else

    print_lcd(3,"MID & DID Error!");

    }

    // **************************************

    void SpiFlashx2_ChipErase(void)

    {

    uint32_t au32SourceData[2];

    // configure transaction length as 8 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);

    // /CS: active

    DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // send Command: 0x06, Write enable

    au32SourceData[0] = 0x06;

    au32SourceData[1] = 0x06;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // /CS: de-active

    DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // /CS: active

    DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // send Command: 0xC7, Chip Erase

    au32SourceData[0] = 0xc7;

    au32SourceData[1] = 0xc7;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // /CS: de-active

    DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    }

    // **************************************

    uint32_t SpiFlash2_ReadStatusReg1(void)

    {

    uint32_t au32SourceData[2];

    uint32_t au32DestinationData[2];

    // configure transaction length as 16 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 16);

    // /CS: active

    DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    // send Command: 0x05, Read status register 1

    au32SourceData[0] = 0x0500;

    au32SourceData[1] = 0x0500;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // /CS: de-active

    DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // dump Rx register

    DrvSPI_DumpRxRegister(eDRVSPI_PORT2, &au32DestinationData[0], 2);

    return ((au32DestinationData[0] | au32DestinationData[1]) & 0xFF);

    }

    // **************************************

    uint32_t SpiFlash2_ReadStatusReg2(void)

    {

    uint32_t au32SourceData[2];

    uint32_t au32DestinationData[2];

    // configure transaction length as 16 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 16);

    // /CS: active

    DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // send Command: 0x35, Read status register 2

    au32SourceData[0] = 0x3500;

    au32SourceData[1] = 0x3500;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // /CS: de-active

    DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // dump Rx register

    DrvSPI_DumpRxRegister(eDRVSPI_PORT2, &au32DestinationData[0], 2);

    return ((au32DestinationData[0] | au32DestinationData[1]) & 0xFF);

    }

    // **************************************

    void SpiFlashx2_WaitReady(void)

    {

    uint32_t ReturnValue;

    do{

    ReturnValue = SpiFlash2_ReadStatusReg1();

    ReturnValue = ReturnValue & 1;

    }while(ReturnValue!=0); // check the BUSY bit

    }

    // **************************************

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    void SpiFlashx2_PageProgram(uint8_t *DataBuffer, uint32_t StartAddress,

    uint32_t ByteCount)

    {

    uint32_t au32SourceData[2];

    uint32_t Counter;

    // configure transaction length as 8 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);

    // /CS: active

    DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // send Command: 0x06, Write enable

    au32SourceData[0] = 0x06;

    au32SourceData[1] = 0x06;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // /CS: de-active

    DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // /CS: active

    DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // send Command: 0x02, Page program

    au32SourceData[0] = 0x02;

    au32SourceData[1] = 0x02;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // configure transaction length as 24 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 24);

    // send 24-bit start address

    au32SourceData[0] = StartAddress;

    au32SourceData[1] = StartAddress;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // configure transaction length as 8 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);

    for(Counter=0; Counter

  • Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM

    }

    // **************************************

    void SpiFlashx2_ReadData(uint8_t *DataBuffer0, uint8_t *DataBuffer1,

    uint32_t StartAddress, uint32_t ByteCount)

    {

    uint32_t au32SourceData[2];

    uint32_t au32DestinationData[2];

    uint32_t Counter;

    // configure transaction length as 8 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);

    // /CS: active

    DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);

    // send Command: 0x03, Read data

    au32SourceData[0] = 0x03;

    au32SourceData[1] = 0x03;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // configure transaction length as 24 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 24);

    // send 24-bit start address

    au32SourceData[0] = StartAddress;

    au32SourceData[1] = StartAddress;

    DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

    // wait

    while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

    // configure transaction length as 8 bits

    DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);

    for(Counter=0; Counter