Monday, February 22, 2016

IRQHandler pada StdPeriph dan Cube HAL

Latar belakang saya menulis postingan ini adalah saya ingin membahas tentang interrupt pada usart dari sudut pandang Cube HAL, namun setelah dipikir pikir, akan lebih mudah menjelaskan atau mempelajari perbedaan antara kode pada StdPeriph dengan kode Cube HAL jika penjelasannya menggunakan contoh external interrupt. Baiklah mari kita mulai dari sesuatu yang telah ada lebih dulu yaitu StdPeriph. untuk style ini saya menggunakan IDE CoIDE, sementara untuk Cube HAL saya akan menggunakan trueStudio. Berikut ini adalah beberapa alasan pembelaan diri saya.

Mengapa saya menggunakan dua IDE yang berbeda dalam percobaan ini atau lebih tepatnya dalam postingan ini, karena untuk contoh project penggunanan StdPeriph sangat mudah diperoleh pada CoIDE, sementara untuk Cube HAL, contoh project interupt tersedia untuk empat IDE yaitu IAR, Keil, TrueStudio dan SW4STM (AC6). Mengapa saya memilih trueStudio, karena dari keempat contoh project yang ada sebenarnya ada dua yang berbasis eclipse, namun saya lebih memilih trueStudio, karena menganggap IDE ini lebih stabil dari lainya.

Baiklah, mari kita mulai mengupas... bukan perbedaan melainkan gaya penulisannya pada masing masing project. karena pada akhirnya register yang diakses adalah sama karena untuk tujuan yang sama juga. yaitu untuk menangani eksternal interupsi yang terjadi pada sistem.

  • Bentuk struktur dari project
Pertama yang ingin saya tunjukkan adalah perbedaan struktur project dari kedua style ini, yaitu sebagai berikut

Dari struktur project dapat kita lihat perbedaan yang signifikan. pertama dari group file CMSIS, Pada StdPeriph terdiri dari tiga file, sementara pada Cube HAL hanya terdapat satu file. Pada postingan ini tidak akan membahas lebih dalam mengapa hal itu berbeda. Selanjutnya kita masuk pada inti dari pembahasan dari blog ini yaitu penelusuran intrrupt dan perbedaan pola penulisannya.
  • EXT INTERRUPT
Berikut ini adalah contoh kode yang terpada pada StdPeriph style.
void EXTI15_10_IRQHandler(void)
{
  if (EXTI_GetITStatus(USER_BUTTON_EXTI_LINE) != RESET)
  {  
    if(BlinkSpeed == 1)
    {
      BlinkSpeed = 0;
    }
    else
    {
      BlinkSpeed ++;
    }
    /* Clear the EXTI line pending bit */
    EXTI_ClearITPendingBit(USER_BUTTON_EXTI_LINE);
  } 
}
Potongan kode di atas merupakan fungsi IRQHandler, yaitu fungsi yang akan dieksekusi jika terjadi interupsi eksternal. Label USER_BUTTON_EXTI_LINE  adalah label yang bebas didefinisi oleh programer, label menunjukkan line external interupt yang digunakan. Misalnya dalam hal ini USER_BUTTON_EXTI_LINE = EXTI_Line13,  line ini menunjukkan bahwa yang difungsikan untuk menerima sinyal interrupt eksternal adalah pin 13. Pada contoh kode diatas, penanganan aksi dari interupsi yang terjadi langsung dilakukan dalam fungsi tersebut. Pada contoh ini aksi dari interupsi adalah mengubah kecepatan kedip dari LED. Mari kita tinjau kode pada project dengan Cube HAL style.
void EXTI15_10_IRQHandler(void)
{
  HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN);
}
Kode di atas adalah kode yang terdapat dalam file stm32f1xx_it.c. Fungsi yang menangani jika terjadi interupsi... bisa kita lihat... isi dari fungsi ini hanya satu baris.... waw... mari kita telusuri apa yang ada di balik satu baris ini...
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) 
  { 
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}
Setelah klik, ternyata isi dari fungsi HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN); adalah seperti list kode di atas. Mari kita lihat, apakah fungsi ini sudah menunjukkan suatu aksi jika interupsi itu terjadi... ternyata belum, fungsi ini bukan lah akhir yang menunjukkan aksi dari suatu interupsi. dalam fungsi ini masi ada fungsi lain yaitu HAL_GPIO_EXTI_Callback(GPIO_Pin);. Baiklah. mari kita lihat apa isi dari fungsi ini... CTRL+Klik. Kemudian saya diarahkan ke sebuah fungsi yang diawali dengan __weak  hem... sesuatu hal yang baru bagi saya. setelah di googling saya menemukan link ini. Ternyata fungsi itu bukan berisi kode yang saya cari. setelah ditelusuri ternyata ada fungsi lain yang memiliki nama yang sama dan berisi seperti pada list kode di bawa ini
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
    /* Toggle LED3 */
    BSP_LED_Toggle(LED3);
  }
}
Jika dilihat isi dari fungsi di atas, fungsi ini berisi suatu aksi yaitu toggle LED. Sehingga fungsi ini merupakan akhri interupsi yang terjadi. Gambar berikut menunjukkan inti dari blog ini, yaitu sebuah ilustrasi dengan Diagram Use Case, bagaimana sebuah interup ditangani berdasarkan dua style project yang ada.


Wednesday, February 17, 2016

Pengalaman menggunakan usart dengan HAL Library untuk menjalankan fungsi printf

Sampai lah pada satu ketika, saya harus mulai belajar lagi. ini semua karena tergiur dengan HAL library yang baru yang ada pada STM32 yang dapat diperoleh dengan cara generate otomatis menggunakan STM32Cube. Selama menggunakan STM32 saya menggunakan std_library, yang berjalan di atas IDE Cocox (CoIDE). IDE ini sangat membantu dalam pembuatan new project, karena kita hanya harus memilih type ic, peripheral apa yang akan digunakan, manambahkan fungsi yang kita tulis sendiri dengan cara drag and drop... dan tring... jadilah sebuah project yang langsung bisa diekseskusi. dan berjalan dengan lancar.

Biasanya, dalam dunia pemrograman, program yang pertama kali dieksekusi adalah "Hello World", jika dalam dunia pemrograman embedded system program "Hello World" sama dengan LED Blink. Namun, jika hanya sampai pada led blink menurut saya akan kesulitan untuk mendebug program yang lebih kompleks hanya dengan indikator led. Sehingga kebiasaan saya setelah berhasil menyalakan LED saya lanjutkan dengan setup USART/UART. Tujuannya agar perangkat embedded dapat mengirimkan karakter ke hyperterminal komputer dan lainnya dengan menggunakan antarmuka serial.

Dalam perangkat embedded, dalam hal ini mikrokontroler (uC), ada register yang perlu di konfigurasi dalam rangka setup peripheral USART. cara konfigurasi ini sudah banyak referensinya di internet.

yang membuat memunculkan karakter ke hyperterminal ini seru. adalah untuk menggunakan fungsi printf ternyata perlu perlakuan atau seting yang berberda beda pada setiap IDE yang sudah perna saya gunakan (Keil, CoIDE, TrueStudio). Untuk alasan mengapa saya sempat mencoba beberapa IDE. mungkin akan saya tulis pada postingan yang lain (kalau ada semangatnya).

Jika pada Keil kita hanya perlu menambahkan kode ini setelah fungsi main
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART1, (uint8_t) ch);

  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}

  return ch;
}

Cara setup printf pada CoIDE juga sangat berbeda. jika pada keil bisa dikatakan hanya menggunakan dua langkah seperti diatas. Jika pada CoIDE masi ada kode yang perlu diedit pada file prinf.c dalam grup stdio. dan mengedit linker pada saat compile program... mungkin secara singkat bisa dituliskan seperti itu. Tapi proses tidak sesingkat itu.

Masuk dalam pembahasan utama, bagaimana jika menggunakan HAL library. Dan tanggapan saya adalah waw... cukup mendatangkan ngantuk karena suntuk mengapa tidak pernah bisa... bailah cukup basa basinya.

Proses setup printf. dimulai dari konfigurasi usart, tentu dengan menggunakan fungsi HAL library. selanjutnya saya mengikuti atau mencopas dari contoh yang ada, dalam rangka membuat project baru secara custom alias tidak melanjutkan dari project example yang sudah ada. Kelebihannya adalah kita tidak terikan dengan ic yang digunakan pada contoh tersebut (jika arsitektur ic yang digunakan berbeda). dan masi banyak lagi. Lanjut.....

Dalam file main menambahkan kode ini sebelum fungsi main
/* Private function prototypes -----------------------------------------------*/
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
Dan kode ini setelah fungsi main
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;
}

Tidak cukup dengan penambahan tersebut, dalam truestudio (karena project atau library HAL dapat di generate ke IDE ini). Kita masi perlu membuat file syscalls.c. Kurang lebih isi dari file ini adalah fungsi fungsi standar yang dapat kita jumpai pada pemrogram bahasa C. Nah dalam file ini terdapat fungsi _write yang masi perlu kita edit lagi.

jika sebelumnya fungsi _write hanya berupa:
int _write(int32_t file, uint8_t *ptr, int32_t len)
{
 /* Implement your write code here, this is used by puts and printf for example */
 return len;
}

Maka perlu kita tambahkan beberapa barid kode, sehingga menjadi
int _write(int32_t file, uint8_t *ptr, int32_t len)
{
 /* Implement your write code here, this is used by puts and printf for example */
 int DataIdx;

 for (DataIdx = 0; DataIdx < len; DataIdx++)
 {
    __io_putchar( *ptr++ );
 }
 return len;
}

Kode di atas juga saya copas dari contoh kode yang sudah ada alias bukan hasil dari pemikiran diri sendiri.

Nah untuk dapat menggerate file syscalls.c, dapat mengukuti cara seperti yang ditunjukkan dalam video ini... dalam kurung bukan buatan saya... n_nV

Sunday, February 14, 2016

Weekend project - remote WD-TV

Postingan pertama di tahun ini, baiklah.... selamat tahun baru. dan selamat menjalani resolusi ditahun yang baru ini.

Tidak perlu panjang lebar lagi, ayo kita langsung pada maksud dan tujuan... Weekend project. Project ini biasanya berisi konten yang ringan ringan, sama seperti isi weekend project yang lain, atau bahkan mirip dengan weekend project pada webside webside populer lainnya.

Namun yah sudah lah, weekend porject ini memang mungkin sama. Tapi satu yang pasti, ini adalah kerjaan sendiri yang meniru, merubah, dan menjadikan itu nyata. 

Weekend kali ini adalah membuat atau tepatnya merangkai remote WD-TV. Latar belakang pembuatan remote ini adalah karena remote bawannya rusak alias tidak berfungsi. sebenarnya ada alteratif lain agar WD-TV ini masi bisa digunakan yaitu dengan menggunakan kabel data yang langsung masuk ke TV yang ada konektor USB nya.

Menggunakan kabel data ternyata ada keterbatasanya, yaitu kemampuan dari WD-TV ini tidak dapat dinikmati secara maksimal. karena difungsikan sebagai perangkat storge biasa bukan sebagai pemutar film dengan definisi tinggi, alias HD.

Untuk mencari gantinya, hal pertama yang terpikirkan adalah kontak service center dan menanyakan apakah menyediakan remote cadangan atau tidak. Tapi begitulah telephon semua nomor yang ada di internet, tetapi tidak ada yang menyediakannya. Selanjutnya, browsing di internet apakah ada remote lain yang bisa digunakan. Ternyata ada, remote dari Creative, waw remote yang sangat canggih. Sebanding dengan harganya....bahkan remote ini bisa diprogram diganti ganti fungsinya... seperti HP saja... tambah aplikasi tinggal colok kabel data...

Mungkin karena latar belakang saya yang bisa elektronika, jadi hal selanjutnya yang terpikirkan adalah bagaimana kalau membuat remote tersebut. Berhubung dukungan hardware di daerah tempat tinggal saya cukup bervariasi, jadi apa salahnya untuk mencoba.

langkah pertama yaitu mengumpulkan resource dari internet dan berikut ini adalah beberapa resource yang diperoleh dan menjadi acuan.
  • WDTLIVE remote codes, link ini berisi kode-kode remote yang sudah di capture oleh orang lain, dan dipublis. yah mungkin sama latar belakannya yaitu ingin membuat remote pengganti. atau ada yang menyanyakannya di forum.
  • IR-Remote Library, Selanjutnya pustaka Arduino, perangkat hardware yang dapat diprogram. Perangkat ini merupakan perangkat favorit bagi para penghobby elektronik.
  • Keypad Library, lebrary ini juga digunakan untuk memprogram Arduino. Jika library sebelumnya berhubungan dengan data apa yang akan dikirim, library ini berhubungan dengan manusia, yaitu data apa yang dikenedaki untuk dikirim. (Sulit banget kalimat nya n_nV)
Selanjutnya adalah mempersiapakan dapur (meracik kode yang ada). Beberapa kode yang digabungkan adalah, Kode atau sinyal remote WD-TV, kode keypad, dan kode untuk mengirimkan data lewat irda. Tidak semua fungsi dari remote dikeluarkan dalam remote yang dibuat kali ini, hanya fungsi yang sering dipakai saja. berikut ini adalah gambar yang menggabarkan menu yang diracik.

Setelah kode selesai diracik dan menjadi customize remote, maka tahap selanjutnya adalah percobaan kode tersebut. Berikut ini adalah penampakan dari purnarupa (prototype) remote.


Untuk led irda ada di sebelah kiri. prototype ini sempat digunakan selama kurang lebih 2 bulan, namun, karena kurang fleksibel karena harus selalu terhubung dengan sumber tegangan atau adaptor.
Sehingga selanjutnya dibuatkan sebuah remote yang portable.

Berikut ini adalah alat dan bahan yang digunakan dalam pembuatan remote, proses ini yang saya sebut dengan weekend project. 
  • Kesing universal
  • Arduino Pro Mini, perangkat ini dipilih karena konsumsi tenganan 3.3v dan bentuknya yang kecil. Konsumsi tegangan sebanding dengan kecepatan komputasi, namun pada project ini tidak memerlukan proses komputasi yang cepat.
  • Kabel. Sudah tentu harus ada
  • Led Irda. apalagi untuk komponen yang satu ini, harus ada
  • Led indikator, opsional
  • Saklar ON OFF.
  • Battre Holder
  • LED Holder.
  • Lem Tembak.
  • Grinda tangan. untuk melubangkan kesing.
Foto persiapan alat dan bahan ditunjukkan pada gambar di bawa.


Hal yang pertama dilakukan adalah membaut garis bantu pada kesing dalam rangka pemotongan. beberapa lubang yang dibuat untuk komponen komponen sebagai berikut
  • keypad
  • Irda
  • saklar on/off dan
  • led indikator.
Setelah kesing selesai dilubang, maka tahap selanjutnya menyolder semua komponen yang telah disediakan. Seperti yang ditunjukkan pada gambar dibawa ini.



Dan beginilah penampakan akhir dari remote hasil dari weekend project kali ini. btw.. video pengujiannya nyusul yah... n_nV


berikut ini adalah video pengujiannya n_nV