Move to
Filed under: Uncategorized | Leave a comment »
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.
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.
Pin Out LCD TFT
Koneksi terhadap IC driver terdiri atas:
Koneksi ke driver touch panel:
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:
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:
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:
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:
Sinyal Antarmuka LCD mode Intel 8080
Dengan sinyal seperti itu, LCD bisa dihubungkan dengan FSMC sebagai berikut:
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:
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.
Koneksi LCD Mode Motorola dengan FSMC
Perbedaan antara mode Intel dengan Motorola bisa dilihat dari gambar berikut:
Perbedaan Sinyal Mode Intel dengan Motorola
Dan berikut koneksi LCD ke STM32F207ZGT
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:
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.
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.
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)
Filed under: ARMania, Micro Mania | Tagged: ARM Cortex-M3, LCD TFT, STemWin, STM32F207 | Leave a comment »
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
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.
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.
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).
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).
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)
Filed under: ARMania, Micro Mania | Tagged: ARM Cortex-M3, LCD TFT, STemWin, STM32F207 | 2 Comments »
Mari kita lanjutkan pembahasan kita tentang arsitektur ARM Cortex-M3. Pembahasan ini mengambil referensi dari:
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:
dan mempunyai 2 level hak akses (privilege):
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.
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.
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.
Filed under: ARMania | Leave a comment »
Sejak tahun 2005 menggolongkan arsitektur prosesornya ke dalam 3 profile:
ARM Cortex-M sendiri dibagi menjadi beberapa keluarga:
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.
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…
Filed under: ARMania, Micro Mania | Leave a comment »
Tersebutlah berdirilah sebuah perusahaan pembuat komputer di negeri Inggis, tepatnya di Cambridge, dengan nama Acorn Computers Ltd. Perusahaan 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.
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.
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.
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:
Arsitektur ARM
Daftar Pustaka
http://en.wikipedia.org/wiki/ARM_architecture
https://www.semiwiki.com/forum/content/2791-brief-history-arm-holdings.html
Click to access thehistoryofthearmarchitecture.pdf
Filed under: ARMania, Micro Mania | Leave a comment »
Tos lami teu ngupdate ieu blog….
Mari kita membahas STM32, ARM Cortexnya ST Microelectronics…Insya Allah
Filed under: Uncategorized | Leave a comment »
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#
Filed under: Micro Mania, RTOS | 1 Comment »
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.
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.
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.
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.
UI EDITOR
Saatnya melakukan seting terhadap dua aplikasi PWM yang telah terinstal. Tinggal klik kanan di salah satu aplikasi, lalu pilih UIEditor.
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.
Lakukanlah setingan sebagai berikut:
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.
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.
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.
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(&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(&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(&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(&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<thedelay); }
Dan berikit videonya…
Filed under: ARMania, Micro Mania | Leave a comment »
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.
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
Filed under: ARMania, Micro Mania | Leave a comment »