We are moving…

Move to

www.karedox.com

Cerita Bersambung: “Katanya Sih Aplikasi HMI/GUI”

BAGIAN 2

Di bagian 1, telah diceritakan secara singkat apa itu LCD TFT dan touch panel. Dan bagaimana sebuah IC driver TFT dan driver touch panel bekerja. Tentu saja LCD tidak bisa bekerja secata stand alone…dia memerlukan sebuah prosesor agar bisa menampilkan gambar atau teks. Dari pabrik LCD, module LCD, touch panel dan drivernya biasanya sudah dikemas sehingga memudahkan untuk dihubungkan dengan sebuah prosesor. Bahkan beberapa modul juga sudah disertakan socket MMC/SD Card dengan antarmuka SPI.

tft2

Module LCD TFT

 LCD yang ditunjukan gambar di atas merupakan LCD TFT 3.2″ dengan resolusi 320×240 piksel. Menggunakan driver TFT SSD1289 dan driver touch panel XPT2046, yang sepertinya tiruan dari ADS7843 dari Texas Instruments. Di module juga sudah terdapat konektor untuk MMC/SD Card dengan antarmukaSPI. Pin header 2×20 pin digunakan untuk menghubungkan LCD ke mikrokontroler. Susunan pin dari header tersebut bisa dilihat di gambar berikut.

TFTPinOut

Pin Out LCD TFT

Koneksi terhadap IC driver terdiri atas:

  1. Port Data (DB0 – DB15) 16 bit, port data ini bersifat 2 arah. Dengan lebar data 16 bit, LCD ini mendukung resolusi warna sampai 65K.
  2. Port kendali, yang terdiri atas pin kendali baca tulis (RD/WR), pemilih LCD (CS) dan pin untuk memilih akses ke register atau RAM (RS). Dan juga pin RSET untuk mereset LCD. Selain itu pin LEDA yang terhubung ke anoda LED backlight.
  3. Pin power yang menyediakan power untuk ic driver TFT, touch panel dan juga MMC/SD.

Koneksi ke driver touch panel:

  1. Port SPI (MISO/OUT, MOSI/IN, CLK/DCLK, TP_CS)
  2. Pin IRQ yang aktif low yang menunjukan touch panel ada perubahan data di touch panel (alias ada yang nyentuh).

Koneksi ke MMC/SD card adalah SPI (SCK, MOSI, MISO dan SD_CS).

Antarmuka Dengan Mikrokontroler STM32F207

Mengapa STM32F207? Ini karena saya baru membuat sebuah development board berbasis STM32F207. Mikrokontroler ini adalah mikrokontroler ARM Cortex-M3 keluaran ST Microelectronics. STM32F207 yang saya pakai adalah STM32F207ZGT, mempunya pin 144 (LQFP144) dengan memory flash internal sebesar 1Mbyte dan RAM internal 128Kbyte. Bisa running sampai 120MHz dengan PLL internal, STM32F207 ini dilengkapi dengan berbagai fitur untuk mendukung konektivity:

  1. 10/100 Ethernet MAC, membutuhkan ekesternal chip PHY untuk koneksi LAN/Internet
  2. USB high speed yang mendukung device, host dan OTG
  3. Periperal komunikasi standar seperti USART, I2C/SM Bus, SPI, CAN dan SDIO untuk konek ke MMC/SD Card
  4. ADC/DAC 12 bit
  5. Kamera interface (DCMI)
  6. dan, ini yang membuat cocok untuk koneksi dengan LCD, FSMC (Flexible Static Memory Controller).
  7. Fitur-fitur lain bisa dilihat di sini.

Dan fitur yang memungkinkan untuk koneksi ke LCD TFT dengan akses cepat adalah FSMC. Walaupun demikian, prosesor yang tidak mempunyai fitur FSMC pun dapat dengan mudah dikoneksikan dengan TFT LCD. Tetapi dengan FSMC, akses bisa sangat cepat, karena LCD TFT akan diakses sebagai memori eksternal. Tanpa FSMC, akses ke LCD akan “lebih lambat”. karena sinyal kontrol (WR, RD, CS dan RS) harus dihasilkan oleh software. Selain itu jika menggunakan prosesor 8 bit, dimana Port IOnya hanya 8 bit, pengiriman data juga harus 2 kali karena pastinya harus menggunakan 2 port yang berbeda ketika transfer data ke LCD.

FSMC, seperti tersirat dari namanya, merupakan fitur untuk mengakses memory eksternal seperti SRAM, flash memory type NOR atau NAND. FSMC ini bisa mengakses memori dengan data 8/16 bit dan bisa memilih bank memori yang berbeda dengan pin chip select yang berbeda. Diagram blok FSMC adalah sebagai berikut:

fsmc_block_diagram

Diagram Blok FSMC

Pada STM32F207 LQFP144 FSMC bisa mengakses sampai 4 bank memori. Setiap bank memori masing-masing berukura 256 Mbyte (4×64 Mbyte). Sinyal-sinyal kendali dari FSMC untuk SRAM:

  1. FSMC[D0:D15]: bus data 16 bit
  2. FSMC NEx: FSMC Chip Select, x: 1-4, tergantung type STM32
  3. FSMC NOE: FSMC Output Enable, sinyal baca
  4. FSMC NWE: FSMC Write Enable, sinyal tulis
  5. FSMC Ax: bus alamat 26 bit.

LCD TFT bisa dihubungkan dengan FSMC dalam 2 mode: mode Intel 8080 atau mode Motorola 6800. Di mode Intel, LCD akan mempunya antarmuka sebagai berikut:

intel8080

Sinyal Antarmuka LCD mode Intel 8080

Dengan sinyal seperti itu, LCD bisa dihubungkan dengan FSMC sebagai berikut:

intelinterface

Koneksi LCD Mode Intel dengan FSMC

Pin RS bisa dihubungkan dengan salah satu pin Address (A0 – A25). Pin ini akan menentukan alamat memori untuk mengakses register LCD (RS=0) atau mengakses RAM LCD (RS=1). Dan LCD yang akan dipakai adalah LCD dengan mode Intel8080.

Sedangkan LCD dengan mode Motorola 6800, mempunyai sinyal antarmuka sebagai berikut:

motorola6800

Sinyal Antarmuka LCD Motorola 6800

Di mode Motorola ini,sinyal RD tidak digunakan dan dipakai sinyal E. Sehingga pin FSMC NOE tidak bisa digunakan untuk mengontrol sinyal E ini. Mengingat sinyal E harus selalu berlogika tinggi saat proses baca maupun tulis, sehingga harus menggunakan pin GPIO yang terpisah dengan pin FSMC, atau bisa juga dengan cara membalik (logika NOT) sinyal NE.

68001

68002

Koneksi LCD Mode Motorola dengan FSMC

Perbedaan antara mode Intel dengan Motorola bisa dilihat dari gambar berikut:

motorolavsintel

Perbedaan Sinyal Mode Intel dengan Motorola

Dan berikut koneksi LCD ke STM32F207ZGT

lcdsch

LCD_IO

Koneksi LCD dengan STM32F207ZGT

Pin LCD_RST dan LCD_BL bukan merupakan bagian dari FSMC. LCD_RST digunakan untuk mereset LCD, sedangkan LCD_BL digunakan untuk mengendalikan LED backlight yang ada di LCD. LCD akan bisa diakses sebagai bank memori ke-1 dengan pin FSMC NE3 (LCD_CS) dan pin RS terkoneksi ke FSMC A16.

Bukan Alamat Palsu

Alamat merupakan hal yang penting dalam mengakses memori. Jangan sampai derita yang dialami oleh Ayu Tingting gara-gara salah alamat (alamat palsu) juga dialami oleh STM32F207 ketika mengakses LCD. Alamat bisa ditentukan setelah menentukan koneksi LCD ke pin-pin FSMC prosesor, khususnya pin FSMC NEx(LCD_CS), yang menentukan bank memori mana yang dipakai dan pin FSMC Ax (LCD_RS) yang akan menentukan alamat register dan RAM LCD.

Bank Memori FSMC STM32F207 dipetakan sebagai berikut:

MemoryBanksMapping

Pemetaan Bank Memori STM32F207

Karena LCD akan diakses sebagai SRAM (NOR Flash/PSRAM), maka bank memori yang akan dipakai adalah Bank 1. Sehingga LCD akan berada di alamat 0x60000000 – 0x6FFFFFFF. Bank 1 ini dipakai menjadi 4 region memori yang masing-masing berukuran 64MByte. Dikendalikan oleh sinyal FSMC NEx (x= 1..4). Pengalamatan FSMC dikendalikan oleh register HDDR (32 bit). Region Memori di bank 1 dikendalikan oleh Bit A27:A26 register HDDR.

  1. A27:A26 = 00 –> Bank 1 NOR/PSRAM 1, kendali yang aktif FSMC NE1
  2. A27:A26 = 01 –> Bank 1 NOR/PSRAM 2, kendali yang aktif FSMC NE2
  3. A27:A26 = 10 –>Bank 1 NOR/PSRAM 3, kendali yang aktif FSMC NE3
  4. A27:A26 = 11 –> Bank 1 NOR/PSRAM 4. kendali yang aktif FSMC NE4.

Di rangkain digunakan FSMC NE3, sehingga A27:A26 register HDDR harus bernilai 10. Dan alamat register LCD dan RAM ditentukan oleh FSMC A16. Walaupun register HDDR merupakan register 32 bit, tetapi pin alamat yang dikeluarkan oleh STM32 hanya 26 bit (A25:A0). Ada ketentuan mengenai hubungan pin alamat di MCU dengan bit-bit alamat di register HDDR. Ketika lebar data yang digunakan adalah 8 bit, maka pin-pin alamat ditentukan oleh A25:A0 register HDDR. Tetapi jika lebar data yang digunakan adalah 16 maka register HDDR yang dipakai adalah A25:A1. Jika sinyal LCD_RS dihubungkan dengan FSMC A16, maka alamat register LCD ditentukan oleh bit A17 register HDDR.

HDDR

Register HDDR

Dengan demikian LCD register (saat RS=0 atau FSMC A16 =0) akan berada di alamat 0x68000000, dan alamat RAM LCD (RS=1/FSMC A16 =1) akan berada di alamat 0x68020000.

Dalam bahasa C, pendeklarasian variable agar berada di alamat tertentu adalah sebagai berikut:


#define LCD_REG (*((volatile unsigned short *) 0x68010000)) /* RS = 0 */
#define LCD_RAM (*((volatile unsigned short *) 0x68020000)) /* RS = 1 */

Untuk menulis/membaca data ke/dari register atau RAM LCD dilakukan dengan operasi variable biasa. Misal untuk menulis data ke register dan RAM


LCD_REG = REGValue;
LCD_RAM = RAMValue;

Operasi pembacaan


REGValue = LCD_REG;
RAMValue = LCD_RAM;
(Bersambung)

 

Cerita Bersambung: “Katanya Sih Aplikasi HMI/GUI”

BAGIAN I

Sudah lama tidak menengok dan mengupdate blog ini. Mengutip perkataan teman: “Keperluan dapur mengalahkan idealisme”. Yup bener, lagi disibukan memenuhi keperluan dapur. Dan sekarang mari sejenak keluar dari kesibukan-kesibukan tersebut.

Blok diagram sebuah sistem  embedded atau sistem komputer akan ada input, proses dan output. Salah satu alat input adalah layar sentuh (touch panel) dan alat output adalah LCD. Kalau dulu mungkin LCD yang sering dipakai adalah LCD karakter atau LCD grafik monokrom, sekarang LCD TFT dengan resolusi dan warna yang cukup lumayan sudah banyak dan gampang digunakan. LCD ini biasanya juga sudah digabungkan dengan touch panel. Harganya pun cukup terjangkau, yang ukuran 3.2 inch dengan resolusi 320 x 24o dan 65K warna bisa didapat dengan harga 230 ribu – 250 ribu. Kalau beli dari China sih bisa dapat $8 – $12. Kalau mau lebih murah lagi sih bisa pakai LCD yang biasa dipakai di smartphone. Harga LCD + touch panel untuk iPhone 4 saja cuma 300 ribu. Sayang belum nemu datasheet untuk menggunakannya.

Dengan LCD TFT dan touch panel, dan tentunya sebuah prosesor bisa dibangun sebuah sistem embedded berbasiskan GUI (Graphic User Interface) atau juga HMI (Human Machine Interface). Dan inilah kisah tentang bagaimana sebuah alat HMI dirancang, walaupun sampai tulisan bagian pertama ini diturunkan alat yang akan dibuat belum jadi. Tapi kira-kira alatnya hanya akan mengendalikan LED, membaca tegangan dengan ADC dan mungkin komunikasi serial dengan PC.

Hari Sabtu pagi, di sebuah tempat di Purwakarta, ketika itu hujan belum turun….

Struktur LCD TFT

Sebuah panel LCD memiliki struktur seperti gambar berikut

TFT LCD Structure

TFT LCD Structure 2 TFT LCD Structure 3

Struktur LCD TFT

 

TFT atau Thin Film Transistor pada dasarnya adalah sebuah transistor efek medan (FET – Field Effect Transistor). Di LCD TFT ini berperan aktif untuk mengontrol setiap piksel yang dimiliki oleh LCD, sehingga sering disebut “active matrix TFT”. Setiap piksel ini memiliki kemampuan untuk memancarkan warna yang sesuai. Untuk itu diperlukan backlight yang biasanya sebuah lampu flourescent atau LED warna putih. Setiap piksel terdiri atas 3 sub-piksel dengan warna merah, hijau dan biru (RGB –  Red, Green, Blue). Menurut teori warna, dengan mengatur komposisi ketika warna ini, maka warna-warna lain bisa dihasilkan. Setiap sub-piksel ini dikendalikan oleh sebuah TFT.

piksel

Struktur Piksel LCD TFT

Warna-warna dihasilkan dengan mengatur tegangan atau arus atau bias ke setiap TFT. Dan tentu saja, diperlukan sebuah driver untuk mengendalikan TFT-TFT tersebut. Prosesor sepertinya tidak bisa mendrive secara langsung, karena pasti jumlah pin yang diperlukan tidak tersedia. Sebagai contoh sebuah LCD dengan resolusi 320×240 akan ada 960×240 piksel atau TFT yang diperlukan. IC driver ini dirancang agar mudah dihubungkan dengan mikrokontroler, pada umumnya menggunakan antarmuka paralel untuk kecepatan tinggi atau serial (UART, SPI atau I2C) untuk menghemat pin, tentu saja kecepatan transfer data yang berkurang.

IC Driver

Diagram blok IC driver sebuah LCD TFT ditunjukan oleh gambar di bawah. Ini adalah blok diagram dari SSD1289, sebuah driver keluaran Solomon Systech.

ssd1289

Diagram Blok IC Driver

Sebuah driver TFT akan mempunyai sebuah regulator tegangan (DC-DC Converter) untuk menyediakan tegangan untuk membias TFT di panel LCD. GDDRAM (Graphic Display Data RAM) dan tentu saja driver untuk dihubungkan dengan panel LCD. IC driver biasanya dirancang untuk resolusi dan warna tertentu, misalnya SSD1289 dirancang untuk mendrive LCD 320×240 piksel dengan resolusi warna sampai 262K. Antarmukanya menggunakan data paralel 18 bit (agar bisa mendukung resolusi 262K). Namun bisa juga dikonfigurasi untuk antarmuka  8/9/16/18-bit atau SPI (Serial Perpheral Interface). Di dalamnya sudah terdapat  GDDRAM 172,800 bytes (240 x 320 x 18 / 8), melalui GDDRAM inilah mikrokontroler menggambar sesuatu di panel LCD. Fitur-fiturnya diatur melalui register-register kendali.

Dengan mode paralel mode 6800 atau 8080, bisa diakses sebagai RAM dengan kecepatan tinggi, mikrokontroler dengan fitur FSMC (Flexible Static Memory Controller) bisa memanfaatkan fitur ini. Sedangkan mode serial, digunakan untuk mikrokontroler dengan jumlah pin terbatas. Sinyal-sinyal sinkronisasi  (VSYNC, HSYNC, DOTCLK, DEN) bisa digunakan untuk aplikasi animasi atau bahkan video.

Semua cerita di atas hanyalah katanya….

Touch Panel

Touch panel biasanya dipasang di atas LCD panel. Ada banyak type touch panel, seperti resistive touch panel, capacitive touch panel, surface acoustic wave (SAW) touch panel, optical touch panel dan lain-lain (kata si ini).

resistive-touch-panel

Secara sederhana, sebuah resistive touch panel bekerja ketika panel disentuh, maka akan mengubah resistansi. Touch panel akan mempunyai 4 pin, dua untuk X (X+ dan X-) dan dua untuk Y (Y+ dan Y-). Sehingga touch panel akan mengeluarkan 2 nilai resistansi, resistansi yang diukur dari pin X dan nilai resistansi yang diukur dari pin Y. Dengan demikian, nilai-nilai resistansi ini akan menunjukan posisi di mana touch panel ini di sentuh. Karena keluarannya analog, sebenarnya touch panel bisa dibaca langsung oleh mikrokontroler mealalui input analog (ADC), tentu saja dengan rangkaian bias tertentu. Tapi kebanyakan, touch panel juga dibaca melalui sebuah driver. Dan module LCD TFT biasanya juga sudah termasuk driver untuk membaca touch panel. Driver ini bisa dihubungkan dengan mikrokontroler secara serial (SPI atau mungkin I2C).

tp

 Diagram Blok Driver Touch Panel

Karena pengaruh toleransi, pembacaan touch panel tidak akan selalu presisi, dan ini akan membutuhkan kalibrasi di aplikasi mikrokontroler. Proses kalibrasi biasanya dilakukan dengan menekan titik-titik tertentu yang ditampilkan dengan LCD, nilai pembacaan ini kemudian akan disimpan sebagai offset agar pembacaan touch panel sesuai dengan tampilan LCD.

 

(Bersambung)

ARM Cortex-M3: Programmer Model

Mari kita lanjutkan pembahasan kita tentang arsitektur ARM Cortex-M3. Pembahasan ini mengambil referensi dari:

  1. ARMv7-M Architecture Reference Manual
  2. Cortex-M3 Technical Reference Manual
  3. The Insider’s Guide To The STM32 ARM® BasedMicrocontroller, An Engineer’s Instroduction To The STM32 Series Version 1.8

Karena ruang yang terbatas, tidak bisa semua bisa disajikan di sini. Informasi lebih detail bisa dilihat dari link di atas.

Mode Operasi

ARM Cortex-M3 bisa beroperasi di 2 mode operasi:

  • Mode Handler
  • Mode Thread

dan mempunyai 2 level hak akses (privilege):

  • privileged
  • user atau non-privileged

Mode operasi ini menunjukan apakah prosesor sedang menjalankan program normal atau sedang menangani eksepsi atau interupsi (interrupt/exception handler). Pada saat menjalankan program normal, prosesor berada di mode thread sedangkan pada saat menangani interupsi prosesor berada di mode handler.

Hak akses adalah pengaturan dalam mengakses memori, apakah semua area memori bisa diakses atau tidak. Saat berada di level privileged, semua area memori bisa diakses, kecuali jika ada pengaturan melalui Memory Protection Unit (MPU). Di level ini, semua instruksi juga bisa dijalankan. Di mode user, akses terhadap memori dibatasi, dan tidak bisa menjalankan instruksi-instruksi tertentu.

Sesaat setelah reset, prosesor akan berada di mode thread dengan level privileged. Di level privileged, prosesor bisa mengubah menjadi lever user dengan menggunakan register CONTROL. Sedangkan di level user, prosesor tidak bisa mengubah menjadi level privileged, kecuali masuk dulu ke mode handler. Level user hanya bisa terjadi di mode thread, sedangkan level privileged bisa terjadi di mode thread maupun mode handler.

operationmode

Mode Operasi dan Hak Akses

Mode operasi dan hak akses ini sangat berguna apabila ARM Cortex-M3 menjalankan sebuah kernel Real Time Operating System (RTOS). Komponen utama sebuah RTOS adalah kernel atau scheduler yang bertugas untuk menjalankan task-task yang ada. Saat menjalankan kernel, prosesor berada di level privileged, sehingga semua area memori bisa diakses (kecuali yang diset di MPU). Saat menjalankan task, level akan berubah menjadi level user, sehingga area memori yang dipakai oleh kernel tidak bisa diakses oleh task yang sedang berjalan.

Register

ARM Cortex-M3 dilengkapi dengan register-register untuk melakukan pemrosesan data. load (ambil) dan store (simpan). Register-register ini merupakan bagian dari CPU, dan berbeda dengan register-register yang digunakan untuk mengatur periperal internal yang dimiliki oleh chip lengkap. Register-register ini pada dasarnya adalah memori, instruksi-instruksi yang berhubungan dengan data pasti akan menggunakan register-register ini. ARM Cortex-M3 memiliki 16 register (R0 – R15) dan beberapa register khusus yang semuanya merupakan register 32 bit sesuai dengan arsitektur ARM.

registercortexm3

Register ARM Cortex-M3

Register R0 – R12 merupakan general purpose registers, dengan R0 – R7 dinamakan dengan Low Registers dan R8 – R12 dinamakan dengan High Registers. Digunakan untuk melakukan operasi data (transfer, aritmatika atau logika).

R13 merupakan Stack Pointer (SP), merupakan register penunjuk ke alamat memori stack. Ada dua tipe stack yaitu, Process Stack Pointer (PSP) dan Main Stack Pointer (PSP), yang diatur oleh register CONTROL, tapi hanya satu yang aktif. Berguna saat menjalankan RTOS, kernel OS akan menggunakan MSP sedangkan task menggunakan PSP.

R14 adalah Link Register (LR), untuk menyimpan alamat sekarang atau alamat kembali ketika sebuah sub-rutin dipanggil.

R15 adalah Program Counter (PC), menyimpan alamat program yang sedang berjalan. Bisa digunakan untuk mengatur arah program.

Register-register yang lain merupakan register-register fungsi khusus dan hanya bisa diakses oleh instruksi khusus.

Register PSR (Program Status Register) atau disebut juga register xPSR, merupakan register yang digunakan untuk menyimpan flag dari operasi aritmatika, misal zero flag atau carry flag. Selain itu juga menyimpan nomor interupsi yang sedang dijalankan dan status eksekusi sebuah instruksi.

Register PRIMASK digunakan untuk mematikan semua interupsi kecuali NMI (Non Maskable Interrupt) dan Hard Fault.

Register FAULTMASK digunakan juga untuk mematikan semua interupsi termasuk Hard fault kecuali NMI.

Register BASEPRI digunakan untuk mematikan interupsi berdasarkan prioritas tertentu atau prioritas di bawahnya.

Register CONTROL digunakan untuk pemilihan stack (MSP atau PSP) dan juga level privileged.

 

 

ARM Cortex-M3: Sekilas Info

Sejak tahun 2005 menggolongkan arsitektur prosesornya ke dalam 3 profile:

  1. Cortex-A (Application), arsitektur prosesor untuk menjalankan sistem operasi (OS) tingkat tinggi, seperti Linux, Android, iOS, Windows dan lain-lain, dengan aplikasi smartphone, tablet dan sebagainya.
  2. Cortex-R (Real time), arsitektur prosesor yang dirancang untuk aplikasi real time, misalnya ECU di mesin mobil.
  3. Cortex-M (Microcontroller), arsitektur prosesor untuk aplikasi-aplikasi low cost.

ARM Cortex-M sendiri dibagi menjadi beberapa keluarga:

  1. Cortex-M0: tipe Cortex-M yang paling rendah, dirancang untuk menggantikan aplikasi prosesor 8/16 bit. Dengan hanya 56 instruksi dan diproduksi dengan hanya 12K gerbang membuat prosesor ini sangat hemat daya (16µW/MHz).
  2. Cortex-M0+: arsitektur hasil dari optimalisasi Cortex-M0 dengan mengurangi pipeline dari 3 stage menjadi 2 stage, membuat konsumsi daya Cortex-M0+ manjadi hanya 9.8µW/MHz .
  3. Cortex-M1: arsitektur prosesor yang dirancang untuk FPGA
  4. Cortex-M3: dirancang sebagai prosesor mainstream. Dengan fitur nested interupt (NVIC), hardware untuk pembagian, perkalian satu siklus.
  5. Cortex-M4: dirancang untuk aplikasi pemrosesan sinyal digital (DSP). Dilengkapi dengan instruksi-instruksi DPS dan Floating Point Unit (FPU)

ARM Cortex-M3 diperkenalkan sejak tahun 2004 dengan menggunakan arsitektur bersi ARMv7-M. Cortex-M3 dirancang dengan arsitektur Harvard, di mana ada pemisahan antara bus instruksi (program) dan bus data sehingga bisa menambag performa ARM Cortex-M3 karena bisa membaca (fetch) kode dari memori program dan data dari RAM secara bersamaan. Walaupun secara manufaktur arsitektur Harvard lebih rumit, tetapi kerumitannya tidak sebanding dengan performa yang diperoleh.

ARM Cortex-M3 merupakan standar core mikrokontroler yang lengkap, di dalamnya sudah termasuk sistem interupsi, timer Systick, sistem debug, dan pemetaan memori. Tersedia 4 Gbyte memori yang dipisahkan antara kode, SRAM (Static RAM), periperal dan periperal sistem. Gambar di bawah menunjukan core dari ARM Cortex-M3 yang dirancang oleh ARM Ltd. Perusahaan semikonduktor yang membeli lisensi dari ARM Ltd, akan menambahkan berbagai macam periperal membentuk sebuah chip mikrokontroler yang lengkap. Penambahan ini tidak ditentukan oleh ARM Ltd, tetapi tergantung kepada perusahaan yang akan memproduksi chip mikrokontroler tersebut. Penambahan ini bisa berupa ADC, DAC, UART, SPI, Ethernet, USB dan lain-lain.

cortexm3

Core ARM Cortex-M3

Teknik pipeline 3 stage, memungkinkan Cortex-M3 mengeksekusi instruksi dalam 1 siklus karena code fetch, decoding dan execution bisa dilakukan secara bersamaan dalam pipeline tersebut. Kendali interupsi bersifat nested (NVIC Nested Vectrored Interrupt Controller), memungkinkan interupsi dengan prioritas lebih tinggi bisa menunda (pre-empt) eksekusi interupsi dengan prioritas lebih rendah. Akses memori dirancang untuk lebih efisien terutama untuk menangani data 8 bit (byte) dengan teknik unaligned access, sehingga setiap alamat RAM 32 bit bisa menyimpan 4 data bertipe byte. Selain itu disediakan juga area memori untuk akses secara bit dengan teknik yang dinamakan bit banding, sehingga untuk akses secara bit, ke periperal atau memori, tidak diperlukan tambahan prosesor Boolean.

Prosesor pendahulunya, ARM7,  mengenal instruksi ARM (32 bit) dan instruksi Thumb (16 bit). Untuk kecepatan tinggi digunakan instruksi ARM, tetapi tentu saja memakan lebih banyak memori. Sehingga diperkenalkan instruksi Thumb dengan 16 bit, lebih hemat memori tetapi kecepatan/performa berkurang. Dan ini harus di-switch saat compile. Di ARM Cortex, diperkenalkan mode instruksi baru yaitu instruksi Thumb-2 yang pada dasarnya keluarga ARM Cortex bisa menjalankan instruksi ARM 32 bit dan instruksi Thumb 16 bit secara bersamaan, tidak perlu memilih mode saat meng-compile program. Compiler akan otomatis memilih mana baris program yang akan di-compile dengan instruksi 32 bit dan mana yang akan di-compile dengan instruksi 16 bit. Dengan demikian instruksi Thumb-2 akan 26% lebih hemat memori dari pada instruksi ARM dan 25% lebih cepat bila dibandingkan dengan instruksi Thumb.

Selain itu ARM Cortex-M3 juga dilengkapi dengan timer SysTick (System Tick) dan unit proteksi memori (Memory Protection Unit – MPU). Kedua periperal ini biasa digunakan untuk sistem aplikasi yang menggunakan sistem operasi (Real Time Operating System – RTOS). Timer SysTick diperlukan untuk menyediakan pewaktuan untuk scheduler dari RTOS sedangkan MPU akan mengatur akses memori antara aplikasi dengan OS. ARM Cortex-M3 juga menyediakan jalur untuk debugging program yang dinamakan Debug Access Port (DAP) dengan protokol JTAG (Joint Test Action Group) atau SWD (Serial Wire Debug).

Insya Allah, kita akan bahas arsitektur ARM Cortex-M3 secara lebih detail di posting berikutnya…

Prosesor ARM: Awal Kisah

Tersebutlah berdirilah sebuah perusahaan pembuat komputer di negeri Inggis, tepatnya di Cambridge, dengan nama Acorn Computers LtdPerusahaan yang didirikan pada tahun 1978 ini memproduksi berbagai macam komputer terkanal di Inggirs, seperti  Acorn Electron,  BBC Micro, dan Acorn Archimedes. BBC Micro merupakan model yang paling laris di antara ketiganya di tahun 1980-an, dan lebih dikenal sebagai komputer BBC Micro model B.

300px-BBC_Micro_Front_Restored

Komputer BBC Micro

Komputer BBC Micro merupakan komputer dengan prosesor 8 bit, menggunakan core MOS Technology 6502. Prosesor dengan core 6500 buatan Motorola, sekarang Freescale, berkecepatan 2MHz. Komputer ini sukses besar setelah di rilis ulang tahun 1982 (model B).

Kesuksesan ini ternyata disaingi oleh Apple yang mengeluarkan produk komputernya, Lisa. Komputer Lisa menggunakan prosesor Motorola 68000 16 bit, sehingga kemampuannya lebih baik bila dibandingkan dengan komputer berbasis prosesor 8 bit. Hal ini membuat Acorn berpikir untuk merancang ulang sebuah komputer dengan prosesor dengan kemampuan lebih tinggi (32 bit). Oleh karena Acorn menjual komputer kebanyakan ke sekolah-sekolah, maka komputer tersebut harus murah. Artinya prosesor sebagai jantung dari komputer juga harus murah. Oleh karena itu Hermann Hauser, Acorn Managing Director, membuat keputusan untuk membuat prosesor 32 bit sendiri. Kemudian Acorn membentuk sebuah tim untuk sebuah proyek: mengembangkan prosesor Reduced Instruction Set Computer (RISC), sebuah proyek yang cukup revolusioner untuk saat itu. Tim ini dipimpin oleh Steve Furber dan Sophie Wilson.

Kelahiran Pertama

Tim Acorn kemudian menggandeng VLSI Technology sebagai mitra untuk proses manufaktur chip. Prosesor tipe pertama diciptakan sekitar tahun 1985, tepatnya 26 April 1985. Prosesor dibangun dengan 25.000 transistor ini kemudian dinamakan dengan ARM1, Acorn RISC Machine. Ada hal yang menarik ketika prosesor pertama ini diuji coba. Ketika pemakaian arusnya diukur oleh ampere meter, menunjukan tidak ada pemakaian arus sama sekali. Sehingga pada awalnya Steve Furber menduga bahwa prosesor rancangannya tidak bekerja dengan baik. Walaupun kemudian diketahui bahwa prosesor ini mengkonsumsi daya yang rendah sekali. Dan inilah salah satu keunggulan prosesor RISC, rendah konsumsi daya.

220px-Acorn-ARM-Evaluation-System

ARM1 di Komputer BBC Micro

Tahun berikutnya tim mengeluarkan ARM2 untuk diproduksi. ARM2 memiliki bus data 32 bit, alamat 26 bit dan 27 buah register 32 bit. Bus alamat dikembangkan menjadi 32 bit di ARM6, tetapi ukuran memori program tetap 64MB untuk menjaga kompabilitas. ARM2 hanya memiliki 30 ribu transistor di dalamnya (bandingkan dengan 68000 Motorola yang memiliki 68 ribu). Hal ini dikarenakan ARM2 tidak dilengkapi dengan Microcode dan cache. Hal ini membuat ARM2 lebih hemat daya, lebih baik dari pada prosesor Intel 80286. Versi prosesor ARM berikutnya, ARM3, telah dilengkapi dengan cache 4KB, untuk meningkatkan performa.

Berdirinya ARM Ltd

Sekitar awal 1990 Apple sedang mengembangkan sebuah PDA (Personal Digital Assistant) yang dinamakan Newton. Oleh karena menggunakan batere, Apple menginginkan sebuah prosesor dengan konsumsi daya yang sangat rendah. Apple tertarik dengan prosesor ARM. Maka dibentuklah kerja sama antara Apple dan Acorn. Pada tanggal 27 November 1990 dibentuklah ARM Ltd, Acorn menempatkan 12 orang Engineer, Apple berinvestasi £1.5 Juta, dan VLSI Technology menyediakan peralatan design dan produksi. ARM yang tadinya Acorn RISC Machine, berubah menjadi Advanced RISC Machine.

Prosesor pertama yang dihasilkan pada Januari 1990 adalah ARM610 dan PDA Newton diluncurkan pada 1993. Namun sayangnya, Newton tidak terlalu sukses dipenjualan. Sehingga CEO ARM saat itu, Robin Saxby, memutuskan untuk mengubah model bisnis ARM Ltd menjadi bisnis IP (Intellectual Property). Artinya ARM tidak memproduksi langsung prosesor yang dirancangnya, tetapi menjual lisensi ke manufaktur semikonduktor. Manufakturlah yang kemudian memproduksi arsitektur ARM menjadi sebuah System on Chip.

Apple Newton

PDA Newton

Arsitektur ARM

Sejak pertama kali didirikan, ARM telah banyak membuat beberapa tipe arsitektur ARM dan telah banyak di produksi oleh beberapa produsen semikonduktor, seperti NXP, Texas Instrument, ST Microelectronic, Atmel, Freescale, Fujitsu, dan lain-lain. ARM7TDMI adalah salah satu tipe prosesor yang terkenal, berbasis arsitektur ARMv3, dan telah diproduksi sampai 10 miliar unit sejak 1994. ARM7TDMI juga adalah prosesor ARM yang pertama dipakai sebagai prosesor untuk handphone. Adalah Nokia (1993) yang tertarik untuk mengadopsi prosesor ARM karena konsumsi dayanya yang rendah. Awalnya akan menggunakan ARM7, namun dianggap costnya teralalu tinggi karena instruksi 32 bit memerlukan 4 byte. Sehingga ARM kemudian mendesain instruksi Thumb yang bisa mengerjakan instruksi 16 bit, dari sinilah ARM7TDMI lahir. Nokia6110 adalah handphone pertama yang menggunakan ARM7TDMI.

Tahun 2001 ARM926EJ-S diluncurkan, prosesor dengan 5 tahap pipeline dan MMU (Memory Management Unit) dan dukungan hardware untuk Java dan DSP (Digital Signal Processing). Selain itu juga mendukung instruksi SIMD (Single Instruction Multiple Data) untuk aplikasi multimedia.

Sejak ARM9 dan ARM11, ARM Ltd melihat bahwa ada segmen apliaksi lain yang belum tersentuh. Sehingga pada 2005 ARM, membagi arsitektur prosesornya menjadi 3 profile: Cortex-A (Application), Cortex-R (Real time) dan Cortex-M (Microcontroller).

Sekitar tahun 2008, mulai booming Smartphone, dan ARM untuk memenuhi permintaan prosesor untuk smartphone mengeluarkan Cortex-A9 yang merupakan ARM pertama dengan multi core prosesor.

Berikut tabel arsitektur prosesor ARM:

ARM arsiteketur

Arsitektur ARM

Daftar Pustaka

http://en.wikipedia.org/wiki/ARM_architecture

http://www.telegraph.co.uk/finance/newsbysector/epic/arm/8243162/History-of-ARM-from-Acorn-to-Apple.html

https://www.semiwiki.com/forum/content/2791-brief-history-arm-holdings.html

Click to access thehistoryofthearmarchitecture.pdf

http://www.theregister.co.uk/2012/05/02/unsung_heroes_of_tech_arm_creators_sophie_wilson_and_steve_furber/

 

 

 

Hello World…

Tos lami teu ngupdate ieu blog….

 

Mari kita membahas STM32, ARM Cortexnya ST Microelectronics…Insya Allah

RTOS: Mun ngaRTOS Tiasa Kanggo Milari aRTOS

PROLOG

Judul di atas kalau diartikan “RTOS: kalau mengerti (ngertos) bisa untuk cari uang (artos)”. Baru beberapa hari sih saya baca-baca mengenai RTOS (Real Time Operating System), jadi belum teralalu ngertos sehingga belum bisa dipakai untuk cari artos.. :). Tapi saya sudah ingin menuliskan apa-apa yang sudah saya pahami mengenai RTOS, karena pada dasarnya menulis adalah mengingat kembali apa-apa yang telah kita pelajari. Saya akan berusaha untuk memberikan penjelasan mengenai dasar-dasar RTOS dan sedikit contoh programnya, walaupun mungkin hanya sebatas mengedipkan LED. Tapi dengan memahami dasarnya, maka aplikasi apa pun bisa kita buat. Jadi, para pembaca mohon untuk tidak terlalu banyak bertanya ya..hehhe. Kalau saran atau tambahan informasi sangat saya harapkan, walaupun saya juga tetap akan menjawab kalau ada pertanyaan sebatas pemahaman saya.

RTOS: APAAN TUUH?

Waktu saya pertama kali belajar mikrokontroler dan masih menggunakan bahasa assembler (kebetulan menggunakan mikrokontroler 8051), setiap kali program selesai selalu diakhiri dengan

sjmp $

artinya program akan selalu ngeloop di baris itu. Atau kalau programnya mengedipkan LED maka:

Loop:
setb  P1.0
call Delay
clr P1.0
call Delay
sjmp Loop

Begitu juga ketika beralih ke bahasa C, struktur fungsi main dalam program akan seperti ini:

int main()
{
  LED_init();
  while(1)
  {
    Toggle_LED();
    delayms(500);
  }
 }

“while(1)” sama dengan instruksi assembler di atas. Metode ini dinamakan dengan super loop atau forever loop. Perhatikan potongan C di atas, setelah memanggil fungsi Toggle_LED(), program akan memanggil delayms(500), yang artinya “diam selama 500 ms”. Dalam program super loop, setiap fungsi akan dilakukan sampai selesai sebelum memanggil fungsi lain. Lalu bagaimana kalau pada saat melaksanakan fungsi delayms(), ada event yang harus dilayani saat itu juga? Misal ada data serial masuk?  Metode interupsi bisa mengatasi hal ini. Saat terjadi interupsi, maka program secara otomatis akan meninggalkan fungsi yang sedang dikerjaka saat ini untuk memanggil atau melompat ke fungsi yang melayani interupsi tersebut, Interrupt Service Routine (ISR). Setelah ISR selesai dikerjakan, maka program kembali ke fungsi yang tadi ditinggalkan. Masalah timbul kalau misalkan, waktu untuk mengerjakan ISR cukup lama. Misal, saat 100 ms fungsi delayms dikerjakan, terjadi interupsi serial. Nah ISR serial dikerjakan selama 100 ms. Ketika program kembali, maka program delayms akan menyelesaikan 400ms sisanya. Fungsi delayms() memang dikerjakan 500mS, namun karena ada interupsi selama 100 ms, maka fungsi toggle berikutnya akan dikerjakan setelah 600 mS. Nah dengan RTOS, hal itu bisa diatasi. RTOS, atau OS (Operating System) adalah sebuah program yang menyediakan fungsi dasar dan layanan untuk program (atau aplikasi) lain yang dijalankan di sebuah sistem komputer. Aplikasi-aplikasilah yang kemudian menyediakan fungsi yang dibutuhkan oleh pengguna. Selain itu RTOS juga akan mengijinkan beberapa aplikasi dijalankan secara bersama-sama atau multi tasking. Sebagai contoh dalam sistem operasi Windows, ketika kita ingin membuka internet maka kita harus menjalankan aplikasi lain, sebuah browser internet, karena memang Windows sendiri tidak menyediakannya. Walaupun pada saat instalasi Windows langsung tersedia Internet Explorer (IE), tapi IE adalah sebuah aplikasi yang secara default ikut terinstal saat kita menginstal Window. Selain itu, Windows juga sudah mendukung multi tasking, sehingga kita bisa mengetik di blog sambil mendengarkan musik atau menconton film kesukaan kita. Bandingkan dengan sistem operasi DOS (Disk Operating System), yang hanya menjalankan satu aplikasi dalam satu waktu. Saat kita ingin mengedit sebuah naskah maka kita menjalankan sebuah aplikasi pengolah kata, misal Wordstar. Tapi saat kita ingin membuat program dengan Pascal, maka kita harus menutup dulu aplikasi Wordstar baru kemudian menjalankan Pascal.

MULTI-TASKING DAN SCHEDULING

Dalam RTOS yang sudah mendukung multi-tasking, maka RTOS bertanggung jawab untuk memastikan semua aplikasi atau task dijalankan secara simultan. Windows, misalnya akan mengatur kapan membaca keyboard dan menampilkannya ke layar sementara tetap membaca file mp3 yang diputar oleh Winamp dan mengirimkannya ke buffer sound card agar lagu tidak terputus.

#Bersambung#

It’s Relax Time: Meng-pe-we-em-kan LED dan Me-LED-kan Pe-we-em

Pada 2 postingan sebelumnya, saya masih belum menggunakan aplikasi DAVE CE. Sekaranglah saatnya…!

Kita akan membuat sebuah aplikasi yang masih menggunakan LED, tidak mengedipkannya, tapi akan mengatur terang redupnya menggunakan sinyal PWM. Pertama buatlah proyek baru dengan type DAVE CE Project.

CreateDAVECE

MENAMBAH APPLIKASI PWMSP001

Perbedaan antara aplikasi DAVE CE dengan sebelumnya adalah, kita bisa menggunakan komponen-komponen yang pada dasarnya adalah library-library yang telah disediaan oleh IDE  DAVE. Karena kita akan membuat PWM, maka kita akan menggunakan komponen PWMSP001 yang merupakan komponen untuk menghasilkan sinyal PWM berdasarkan CCU4 (Capture/Compare Unit 4). CCU4 pada dasarnya terdiri dari 4 buah timer 16 bit. Namun bisa di-kaskade menjadi timer 32, 48 atau 64 bit. Untuk menggunakan komponen ini, dan juga komponen-komponen lainnya, dipilih melalui window App Selection View. Klik ganda di PWMSP001.  Karena kita akan menggunakan 2 LED maka lakukanlah 2 kali.

PWMSP001_App

Ketika kita menambah PWMSP001 yang kedua, DAVE akan menampilkan dialog App Sharability, karena PWMSP001 menggunakan CCU4, maka DAVE akan menanyakan apakah akan membuat CCU4 yang baru (new instance) atau menggunakan CCU4 yang sudah dipakai oleh PWMSP001 sebelumnya (share/Existing Apps), kita pilih saja Existing Apps, dengan memilih app/ccuglobal/0.

App_Shar

Maka di window App Dependency Treeview akan terinstal 2 aplikasi PWMSP001 (PWMSP001/0 dan PWMSP001/1) dengan CCU4 yang sama (CCU4GLOBAL/0). Kalau tadi kita memilih buat new instance, maka akan di PWMSP001/1 akan menggunakan CCU4GLOBAL/1.

AppDependency

UI EDITOR

Saatnya melakukan seting terhadap dua aplikasi PWM yang telah terinstal.  Tinggal klik kanan di salah satu aplikasi, lalu pilih UIEditor.

app_editor

Lalu akan keluar window setingan untuk aplikasi yang telah kita instal tadi (PWMPS001). Window setingan ini juga bisa dimunculkan dengan mengklik ganda aplikasi dari S/W App Connectivity View.

ui_editor

Lakukanlah setingan sebagai berikut:

  • Counting Mode: Edge-Aligned Mode
  • Cek Start during initialization
  • CCU4 resolution : 10uSec (10000 nsec)
  • PWM freq: 200 Hz
  • Duty Cycle: 0 % (Pertama kali LED mati)
  • Pilih Period Match (cek Enable at initialization)

Lakukan hal yang sama untuk PWMPS001/1.

CCU4GLOBAL menggunakan setingan default (dengan PLL aktif, frekeunsi kerja 120 MHz).

MANUAL PIN ASSIGMENT

Aplikasi PWM adalah aplikasi yang membutuhkan sebuah pin mikro untuk mengeluarkan sinyal PWMnya. Oleh karena itu kita harus mengalokasikan sebuah pin untuk aplikasi PWM yang telah kita install ini, dalam hal ini 2 pin. Oleh karena sudah ada 2 buah LED di board Relax Kit, maka kita akan mengalokasikan kedua LED ini untuk aplikasi PWM kita. Klik di aplikasi kita lalu klik kanan dan pilih Manual Pin Assignment.

manual_pin_assign

Di Resource pilih pin_directouput sedangkan di Port-Pin/Pin Number pilih P1.0 dan P1.1 untuk masing-masing aplikasi. Lalu klik Solve And Save. Dari sini, setingan untuk kedua apliaksi yang kita pakai sudah selesai. Apabila kita akan menggunakan interupsi, kita harus menambahkan aplikasi kendali interupsi (NVIC), dan dari aplikasi yang akan ditentukan interupsinya kita harus set Signal Connectionnya. Untuk kali ini kita tidak akan menggunakan interupsi.

Setelah selesai, kita tinggal generate kode dari setingan yang telah kita buat, caranya dengan mengklik tombol SOLVER dan Generate Code. DAVE kemudian akan menghasilkan source code berdasarkan setingan yang telah ditentukan sebelumnya. Setiap kali kita mengubah setingan aplikasi, Solver dan Generate Code harus selalu dilakukan.

solver3

Apakah setelah generate code program bisa langsung di download dan dijalankan di Relax Kit? Tentu saja tidak. Seperti halnya kita membuat sebuah program di PC dengan menggunakan pemrograman visual, misal Delphi. Maka kita baru sebatas membuat tampilan dengan cara mengatur property-property visual yang dimiliki oleh setiap komponen. Tapi kalau dijalankan terus kita mengklik komponen Button maka tidak akan terjadi apa-apa, jika kita belum memasukan kode pada event on clicknya tombol tersebut.

FUNGSI-FUNGSI APLIKASI PWMPS001

DAVE mempunyai dokumentasi yang cukup bagus di file helpnya. Untuk menampilkan helpnya tinggal klik menu Help->Help Content. Kemudian akan muncul helpnya DAVE, pilihlah Dave Apps lalu klik PWMSP001.

DAVEHelp

Pilih API Documentation, maka akan ditampilkan fungsi-fungsi yang dimiliki oleh apliaksi PWMSP001.

Pada dasarnya fungsi-fungsi yang dimiliki oleh PWMSP001 adalah fungsi untuk menjalankan atau menghentikan PWM, mengatur frekuensi PWM, mengatur duty cycle, dan sebagainya. Kalau pengaturan yang dilakukan melalui aplikasi DAVE adalah untuk menginisialisasi atau mengatur aplikasi pada saat design (design time) maka fungsi-fungsi ini akan melakukan pengaturan saat program dijalankan (run time).

PROGRAM PWM

Kita akan membuat program untuk mengatur kedua LED dengan PWM. Pertama kali kedua LED mati, sesuai dengan setingan aplikasi (duty cycle 0%), kemudian duty cycle PWMSP001/0 akan dinaikan sampai 100% dengan jeda 25 mS. Delay diperoleh menggunakan System Tick Timer. Setelah mencapai 100%, giliran PWMSP001/1 yang dinaikan dengan jeda yang sama. Setelah itu duty cyclenya diturunkan kembali menjadi 0%. Begitu seterusnya. Fungsi yang digunakan adalah fungsi untuk mengatur duty cycle:

PWMSP001_SetDutyCycle

Berikut program lengkapnya:

/*
* Main.c
*
* Created on: Dec 16, 2012
* Author: Kang Usman
*/


#include <DAVE3.h> //Declarations from DAVE3 Code Generation (includes SFR declaration)

uint32_t ticks = 0UL;

void SysTick_Handler(void);
void delayms(uint32_t thedelay);

int main(void)
{
  status_t status; //declaration of return variable for DAVE3 APIs
  uint32_t PWMerrorcount = 0; // accumulation of number of not successful executed API for the PWMSP001 App
  uint32_t PWMerrorcount2 = 0; // accumulation of number of not successful executed API for the PWMSP001 App
  int i;

  DAVE_Init(); // Initialization of DAVE Apps
  SysTick_Config(SystemCoreClock / 1000UL);

  status = PWMSP001_Start(&PWMSP001_Handle0); // start of the PWMSP001 App, instance 0
  if (status != DAVEApp_SUCCESS) PWMerrorcount++; // if start was not successful PWM error counter incremented
  status = PWMSP001_Start(&PWMSP001_Handle1); // start of the PWMSP001 App, instance 0
  if (status != DAVEApp_SUCCESS) PWMerrorcount2++; // if start was not successful PWM error counter incremented

  while(1)
  {
    for(i=0;i<101;i+=5)
     {
       status = PWMSP001_SetDutyCycle(&amp;PWMSP001_Handle0, i); //change brightness of LED
       if (status != DAVEApp_SUCCESS) PWMerrorcount++; //if set of new duty cycle was not successful
       delayms(25);
     }

   for(i=0;i<101;i+=5)
    {
      status = PWMSP001_SetDutyCycle(&amp;PWMSP001_Handle1, i); //change brightness of LED
      if (status != DAVEApp_SUCCESS) PWMerrorcount2++; //if set of new duty cycle was not successful
      delayms(25);
    }

   for(i=100;i>=0;i-=5)
    {
      status = PWMSP001_SetDutyCycle(&amp;PWMSP001_Handle0, i); //change brightness of LED
      if (status != DAVEApp_SUCCESS) PWMerrorcount++; //if set of new duty cycle was not successful
      delayms(25);
    }

   for(i=100;i>=0;i-=10)
    {
      status = PWMSP001_SetDutyCycle(&amp;PWMSP001_Handle1, i); //change brightness of LED
      if (status != DAVEApp_SUCCESS) PWMerrorcount2++; //if set of new duty cycle was not successful
      delayms(25);
    }

  }
 return 0;
}

void SysTick_Handler(void)
{
  ticks++;
}

void delayms(uint32_t thedelay)
{
  uint32_t currenttick;

  currenttick= ticks;
  while(ticks-currenttick&lt;thedelay);
}

Dan berikit videonya…

It’s Relax Time: Baca push button yuuk

Dalam postingan sebelumnya kita telah mempelajari bagaimana membuat program menggunakan DAVE dari awal. Kita harus memahami terlebih dahulu register-register yang akan dipakai di dalam program. Yup, tanpa bantuan library sehingga dengan terpaksa kita harus membuka referensi manual XMC4500 secara detail. Saya pikir ini bagus bagi pemula seperti saya, sehingga tidak terlalu dimanja oleh library yang disediakan oleh IDE. Atau kalau misalnya librarynya tidak sesuai dengan yang kita inginkan, kita bisa buat sendiri. 🙂

Marilah kita mulai menggunakan fasilitas yang diberikan oleh DAVE. Cobalah buat proyek baru (Dave Project) lalu pilih Easy Start Project.

EasyStart

Lalu bukalah file Main.c.


/* SFR declarations of the selected device */

#include <XMC4500.h>

#include "GPIO.h"

void SysTick_Handler(void);

typedef enum { OFF = 0, ON = 1} state_t ;

state_t led1_state = ON;

state_t led2_state = ON;

int main(void) {

 /* Initialize LED1 */

 P1_1_set_mode(OUTPUT_PP_GP);

 P1_1_set_driver_strength(STRONG);

 /* Initialize LED2 */

 P1_0_set_mode(OUTPUT_PP_GP);

 P1_0_set_driver_strength(STRONG);

 /* Initialize BUTTON1 */

 P1_14_set_mode(INPUT);

 /* Initialize BUTTON2 */

 P1_15_set_mode(INPUT);

 /* fSYS=fCPU at 120MHz */

 /* Systick every 120000 cycles = 10ms */

  if(SysTick_Config(SystemCoreClock / 100UL) == 0){

 /* Loop forever */

    for(;;) {

 }

}

 else{

    asm("BKPT 255");

 }

}

void SysTick_Handler(void) {

static uint32_t ticks = 0UL;

static state_t button1_state = OFF;

static state_t button2_state = OFF;

ticks++;

/* Read BUTTON1, update state if pressed */

if(P1_14_read() == 0UL){

button1_state = ON;

}

else{

if(button1_state == ON){

if(led1_state == ON){

led1_state = OFF;

}

else{

led1_state = ON;

}

}

button1_state = OFF;

}

/* Read BUTTON2, update state if pressed */

if(P1_15_read() == 0UL){

button2_state = ON;

}

else{

if(button2_state == ON){

if(led2_state == ON){

led2_state = OFF;

}

else{

led2_state = ON;

}

}

button2_state = OFF;

}

/* Toggle every 1s */

if(ticks == 100UL){

if(led1_state == ON){

/* Toggle LED1 */

P1_1_toggle();

}

if(led2_state == ON){

/* Toggle LED2 */

P1_0_toggle();

}

ticks = 0UL;

}

}

Kalau dilihat programnya, tidak ada nama register disebut-sebut.Karena memang sudah dideklarasikan di file “GPIO.h”. Seperti telah disebutkan di postingan sebelumnya, ada 2 LED di Relax Kit yang terhubung ke P1.0 dan P1.1, dan juga ada 2 buah push button yang terhubung ke P1.14 dan P1.15. Sehingga untuk menginisialisasi P1.0 dan P1.1 sebagai output dengan mode driver strong maka dinyatakan dalam program sebagai


/* Initialize LED1 */

P1_1_set_mode(OUTPUT_PP_GP);

P1_1_set_driver_strength(STRONG);

/* Initialize LED2 */

P1_0_set_mode(OUTPUT_PP_GP);

P1_0_set_driver_strength(STRONG);

Sedangkan untuk menginisialisasi P1.14 dan P1.15:


 /* Initialize BUTTON1 */

P1_14_set_mode(INPUT);

/* Initialize BUTTON2 */

P1_15_set_mode(INPUT);

Selain itu, di program ini juga menggunakan System Tick timer, yang diset untuk interupsi pada 10ms.

Tapi, saya mengubah sedikit programnya. Saya akan mengubah programnya menjadi program Blink LED dengan kecepatan kedip yang bisa diatur oleh kedua button tersebut, dinaikan atau diturunkan. System tick timer akan diset untuk berinterupsi pada 1 ms. LED akan di-toggle di rutin interupsi system tick timer, sedangkan program utama hanya bertugas untuk membaca kedua tombol tersebut. Jika Button1 (P1.14) ditekan, nilai thedelay akan ditambah 10, artinya waktu kedip LED akan bertambah 10 ms, sedangkan jika Button2 (P1.15) yang ditekan, thedelay akan dikurangi 10, maka kedipan LED akan makin cepat 10 ms.

Dan inilah program lengkapnya…


/* SFR declarations of the selected device */

#include <XMC4500.h>

#include "GPIO.h"

void SysTick_Handler(void);

void delayms(uint32_t delay_ms);

typedef enum { OFF = 0, ON = 1} state_t ;

state_t led1_state = ON;

state_t led2_state = ON;

uint32_t thedelay;

uint32_t ticks = 0UL;

uint32_t currentticks;

int main(void) {

/* Initialize LED1 */

P1_1_set_mode(OUTPUT_PP_GP);

P1_1_set_driver_strength(STRONG);

/* Initialize LED2 */

P1_0_set_mode(OUTPUT_PP_GP);

P1_0_set_driver_strength(STRONG);

/* Initialize BUTTON1 */

P1_14_set_mode(INPUT);

/* Initialize BUTTON2 */

P1_15_set_mode(INPUT);

thedelay= 500;

ticks=0;

currentticks=ticks;

/* fSYS=fCPU at 120MHz */

/* Systick every 120000 cycles = 1ms */

SysTick_Config(SystemCoreClock / 1000UL);

while(1)

{

   if(P1_14_read()== 0UL)

    {

      delayms(100);

      while(P1_14_read()==0UL);

      thedelay+=10;

      if(thedelay>1000)

         thedelay=1000;

    }

  if(P1_15_read()== 0UL)

   {

     delayms(100);

     while(P1_15_read()==0UL);

     thedelay-=10;

     if(thedelay<;10)

       thedelay=10;

   }

}

}

void delayms(uint32_t delay_ms)

{

  uint32_t currenttick;

  currenttick=ticks;

  while(ticks-currenttick<delay_ms);

}

void SysTick_Handler(void) {

 ticks++;

 if(ticks-currentticks>=thedelay)

 {

   P1_0_toggle();

   P1_1_toggle();

   currentticks=ticks;

 }

}

Cek videonya