• Tidak ada hasil yang ditemukan

Modul Exp UC Nuvoton-V1.0

N/A
N/A
Protected

Academic year: 2021

Membagikan "Modul Exp UC Nuvoton-V1.0"

Copied!
38
0
0

Teks penuh

(1)

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

(2)

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

(3)

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:

(4)

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<4;i++) { for(j=0;j<60000;j++); } } int main(void) { int i=0;

/* Unlock the protected registers */ UNLOCKREG();

/* Enable the 12MHz oscillator oscillation */ DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);

/* Waiting for 12M Xtal stable */ //SysTimerDelay(5000);

DrvSYS_Delay(5000);

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

/*lock the protected registers */ LOCKREG();

(5)

/* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */ for(i=12;i<16;i++)

{

DrvGPIO_Open(E_GPC, i, E_IO_OUTPUT); /* set all GPA12-15 as OUTPUT */

} while(1) { DrvGPIO_SetPortBits(E_GPC, 0xF000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0xE000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0xD000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0xC000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0xB000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0xA000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0x9000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0x8000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0x7000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0x6000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0x5000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0x4000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0x3000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0x2000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0x1000); delay_loop(); DrvGPIO_SetPortBits(E_GPC, 0x0000); delay_loop(); } }

Latihan 2. Menyalakan LED RGB

Pada latihan kedua akan dibuat program untuk menyalakan LED RGB yang tersedia pada

port GPA12-14. Gambar 2 menunjukkan konfigurasi LED RGB yang terdapat pada NuMicro

1xx Series :

(6)

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();

(7)

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<3;i++) { for(j=0;j<60000;j++); } } 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 */ DrvSYS_Delay(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) */

(8)

while(1) { for(i=0;i<9;i++) { for(j=0;j<4;j++) { show_seven_segment(j,i); delay_loop(); } } } }

Gambar 3

(9)

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.

(10)

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<3;i++) { for(j=0;j<60000;j++); } } void delays() { delay_loop(); delay_loop(); delay_loop(); } 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);

DrvSYS_Delay(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

clr_all_pannal();

print_lcd(0, "LCD TEST");

print_lcd(1, " ARM M0 Nuvoton "); delays();

clr_all_pannal();

DrvGPIO_ClrBit(E_GPD,14);

(11)

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..."); }

} }

(12)

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

(13)

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

(14)

/* 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; }

(15)

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:

(16)

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 <stdio.h> #include "NUC1xx.h" #include "Driver\DrvSYS.h" void delay_loop(void) { uint32_t i,j; for(i=0;i<3;i++) { for(j=0;j<60000;j++); } } void delay(void) { int j; for(j=0; j<1000; j++); } uint8_t scan_key(void) {

uint8_t act[4]={0x3b, 0x3d, 0x3e}; uint8_t i,temp,pin; for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA,pin); else DrvGPIO_ClrBit(E_GPA,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit(E_GPA,3)==0) return (i+1); } for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA,pin);

(17)

else DrvGPIO_ClrBit(E_GPA,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit(E_GPA,4)==0) return (i+4); } for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA,pin); else DrvGPIO_ClrBit(E_GPA,pin); temp=temp>>1; } 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

(18)

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<6;i++) DrvGPIO_Open(E_GPA, i, E_IO_QUASI); while(1) { temp=scan_key(); if(temp==1) {

print_lcd(0,"Key1 had pressed "); print_lcd(1," "); print_lcd(2," "); print_lcd(3," "); DrvGPIO_InitFunction(E_FUNC_I2C1); Write_24LC64(0x00000000+temp,temp+11); i2cdata= Read_24LC64(0x00000000+temp); sprintf(addr+8,"%x",temp); sprintf(Write+6,"%x",temp+11); sprintf(read+5,"%x",i2cdata); print_lcd(1,addr); print_lcd(2,Write); print_lcd(3,read); } if(temp==2) {

print_lcd(0,"Key2 had pressed "); print_lcd(1," "); print_lcd(2," "); print_lcd(3," "); DrvGPIO_InitFunction(E_FUNC_I2C1); Write_24LC64(0x00000000+temp,temp+22); i2cdata= Read_24LC64(0x00000000+temp); sprintf(addr+8,"%x",temp); sprintf(Write+6,"%x",temp+22); sprintf(read+5,"%x",i2cdata); print_lcd(1,addr); print_lcd(2,Write); print_lcd(3,read); } if(temp==3) {

print_lcd(0,"Key3 had pressed "); print_lcd(1," "); print_lcd(2," "); print_lcd(3," ");

(19)

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

(20)

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:

(21)

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

(22)

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<16;i++) {

DrvGPIO_SetBit(E_GPC,i);

} loop=12; } } }

Tugas:

Lengkapi listing program Timer 0 Interupt berikut ini

void delay_loop(void) { uint32_t i,j; for(i=0;i<3;i++) { for(j=0;j<60000;j++); } } Interrupt subroutine ---*/

static unsigned char loop=12;

void TMR0_IRQHandler(void) // Timer0 interrupt subroutine

(23)

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<16;i++) {

DrvGPIO_SetBit(E_GPC,i);

} loop=12; } } } 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

}

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 */

(24)

DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);

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

for(i=12;i<16;i++) {

DrvGPIO_Open(E_GPC, i, E_IO_OUTPUT); }

Initial_pannel(); //call initial pannel function clr_all_pannal();

print_lcd(0, "Welcome to ELINS");

print_lcd(1, "This is LB test ");

print_lcd(2, "7segmen + LCD.. ");

print_lcd(3, "and Timer Int. "); Timer_initial(); while(1) { for(i=0;i<9;i++) { for(j=0;j<4;j++) { show_seven_segment(j,i); delay_loop(); } } } }

(25)

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

(26)

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;

(27)

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].RSLT<<4;

Show_Word(0,11,' ');

Show_Word(0,12,' ');

Show_Word(0,13,' ');

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

print_lcd(0, adc_value); Delay(20000);

ADC->ADCR.ADST=1;

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

nilai ADC pada address 7 yang masuk pada input variabel resistor

(28)

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

(29)

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:

(30)

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<1000; j++); }

(31)

uint8_t scan_key(void) {

uint8_t act[4]={0x3b, 0x3d, 0x3e}; uint8_t i,temp,pin; for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA,pin);

else

DrvGPIO_ClrBit(E_GPA,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit(E_GPA,3)==0) return (i+1); } for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA,pin);

else

DrvGPIO_ClrBit(E_GPA,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit(E_GPA,4)==0) return (i+4); } for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA,pin);

else

DrvGPIO_ClrBit(E_GPA,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit(E_GPA,5)==0) return (i+7); } return 0; } int main(void) {

(32)

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();

(33)

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

/* source data */

for(u32ByteCount=0; u32ByteCount<256; u32ByteCount++) {

DataBuffer0[u32ByteCount] = u32ByteCount; }

/* Program SPI flash */

print_lcd(2,"Program Flash..."); print_lcd(3," "); u32FlashAddress = 0;

for(u32PageNumber=0; u32PageNumber<TEST_NUMBER; u32PageNumber++) { /* page program */ SpiFlashx2_PageProgram(DataBuffer0, u32FlashAddress, 256); SpiFlashx2_WaitReady(); u32FlashAddress += 0x100; }

print_lcd(3,"Program done !!!"); SysTimerDelay(1000000);

/* clear data buffer */

for(u32ByteCount=0; u32ByteCount<256; u32ByteCount++) {

DataBuffer0[u32ByteCount] = 0; DataBuffer1[u32ByteCount] = 0; }

/* read back and compare */

print_lcd(2,"Verify Flash...."); print_lcd(3," "); u32FlashAddress = 0;

for(u32PageNumber=0; u32PageNumber<TEST_NUMBER; u32PageNumber++) {

SpiFlashx2_ReadData(DataBuffer0, DataBuffer1, u32FlashAddress, 256); u32FlashAddress += 0x100;

for(u32ByteCount=0; u32ByteCount<256; u32ByteCount++) {

if(DataBuffer0[u32ByteCount]!=u32ByteCount) {

print_lcd(3,"F0 Verify Error!"); while(1);

}

if((uint8_t) DataBuffer1[u32ByteCount]!=(uint8_t) ~DataBuffer0[u32ByteCount])

{

print_lcd(3,"F1 Verify Error!"); while(1);

} }

/* clear data buffer */

for(u32ByteCount=0; u32ByteCount<256; u32ByteCount++) {

DataBuffer0[u32ByteCount] = 0; DataBuffer1[u32ByteCount] = 0; }

(34)

}

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

(35)

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

(36)

// 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

}

(37)

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<ByteCount; Counter++) {

// send data to program

au32SourceData[0] = DataBuffer[Counter]; au32SourceData[1] = ~au32SourceData[0];

DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

// wait

while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {} }

// /CS: de-active

(38)

}

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

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<ByteCount; Counter++) {

// receive

au32SourceData[0] = 0x0; au32SourceData[1] = 0x0;

DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);

// wait

while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}

// dump Rx register

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

DataBuffer0[Counter] = (uint8_t) au32DestinationData[0]; DataBuffer1[Counter] = (uint8_t) au32DestinationData[1]; }

// /CS: de-active

DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0); }

Gambar

Gambar 1. Diagram Blok NuMicro NUC130/140 Series  NUC140 Learning Board
Gambar 1. Layout NUC140 Learning Board dari Nuvoton
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
Gambar 3. Konfigurasi Dot Matrix LCD NuMicro 1XX series Development Board
+4

Referensi

Dokumen terkait

[r]

Permasalahan dalam penelitian ini yang dapat dirumuskan adalah “Apakah penggunaan model pembelajaran kooperatif tipe group investigation pada mata kuliah pengantar

Trauma yang tidak berhubungan dengan olah raga benturan keras pada sendi saat kecelakaan motor biasanya menyebabkan dislokasi, terjatuh dari tangga atau terjatuh saat

Penelitian ini diperkuat oleh penelitian sebelumnya yang dilakukan oleh Rosvitasari (2015) yang menunjukan bahwa pengaruh inflasi terhadap dana deposito pada bank

Berisi tentang tinjauan kasus bayi Ny M dengan Asuhan Kebidanan Komprehensif mulai dari Kehamilan, Persalinan, Nifas, BBL dan KB patologis yang diberikan

Dengan pesatnya perkembangan penduduk di Kecamatan Lima Puluh ini pada setiap tahunnya, tentu saja akan menimbulkan berbagai masalah – masalah kependudukan di wilayah ini,

dimilikinya. Tentu saja dengan menyesuiakan dengan kemampuan anak dan orang tua masing-masing. Karena semakin lengkap layanan dan fasilitas yang diberikan akan

“Krusialnya, kita butuh ruang jalan. Sekarang yang tersisa saja hanya dua lajur. Tentu dalam pelaksanaan pem- bangunan akan ada gangguan ham- batan lalu lintas. Kami minta semua