{"id":469,"date":"2009-02-01T06:47:50","date_gmt":"2009-01-31T23:47:50","guid":{"rendered":"http:\/\/sulhansetiawan.com\/?p=469"},"modified":"2014-04-10T21:08:28","modified_gmt":"2014-04-10T14:08:28","slug":"pertanyaan-seputar-buku-mudah-dan-menyenangkan-belajar-mikrokontroler","status":"publish","type":"post","link":"https:\/\/sulhansetiawan.com\/id\/pertanyaan-seputar-buku-mudah-dan-menyenangkan-belajar-mikrokontroler\/","title":{"rendered":"Pertanyaan seputar buku &#8220;Mudah dan Menyenangkan Belajar Mikrokontroler&#8221;"},"content":{"rendered":"<p><\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/sulhansetiawan.com\/_wordpress_\/2012\/11\/bkmdhmnynangkntnyknp.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" title=\"BkMdhMnynangknTnyKnp\" src=\"https:\/\/sulhansetiawan.com\/_wordpress_\/2012\/11\/bkmdhmnynangkntnyknp.jpg\" alt=\"\" width=\"73\" height=\"97\" \/><\/a><\/p>\n<p>Seorang pembaca buku <a title=\"Mudah dan Menyenangkan Belajar Mikrokontroler\" href=\"\/id\/?p=20\">Mudah dan Menyenangkan Belajar Mikrokontroler<\/a> bertanya sebagai berikut:<\/p>\n<p><a name=\"Top\"><\/a><\/p>\n<ol style=\"text-align: justify;\">\n<li style=\"text-align: justify;\"><a href=\"#1\">Pada listing program jam digital yang sudah ada tombol (hal. 91), tolong jelaskan lebih lanjut tentang penggunaan dan perhitungan Timer 0 Mode 2 sehingga menghasilkan timer 1 detik yang akurat.<\/a><\/li>\n<li style=\"text-align: justify;\"><a href=\"#2\">Tolong jelaskan lebih lanjut tentang cara kerja listing pengambilan data tombol (hal. 119).<\/a><\/li>\n<li style=\"text-align: justify;\"><a href=\"#3\">Bagaimana cara menggunakan deklarasi variabel dalam listing berekstensi *.M51 seperti: ~byte, ~bit,~word, dan ~array?<\/a><\/li>\n<li style=\"text-align: justify;\"><a href=\"#4\">Bagaimana cara menggunakan tool: virtual LCD, Tombol, MXLED, dalam simulator?<\/a><\/li>\n<li style=\"text-align: justify;\"><a href=\"#5\">Nah, pertanyaan  selanjutnya mungkin tidak berhubungan dengan buku, namun masih seputar mikrokontroler. Bagaimana membuat 1 tombol menjadi 2 fungsi? Misalnya kita pasang tombol pada P3.0. Jika ditekan 1x maka akan menjalankan subprogram A dan jika ditekan 2x akan menjalankan subprogram B.<\/a><\/li>\n<li style=\"text-align: justify;\"><a href=\"#6\">Mas, saya mencoba membuat rangkaian PCB jam dan saya memasukan listing program debouncing 2.HEX. Hasilnya memang berjalan dengan sempurna. Tapi saat tombol pengubah menit atau jam ditekan, 7 segment tidak langsung berubah angkanya tapi menunggu dulu program menyelesaikan  hitungan menit. Bagaimana cara agar langsung berubah?<\/a><\/li>\n<\/ol>\n<p>Dan inilah jawabannya:<\/p>\n<ol><a name=\"1\"><\/a><\/p>\n<li style=\"text-align: justify;\">\n<h4>Timer 1 detik yang akurat.<\/h4>\n<p>Sebenarnya keterangan di buku sudah cukup jelas. Pertama, kristal yang digunakan adalah 11,0592MHz. Dengan demikian kecepatan siklus mesin adalah 921,6KHz (11,0592MHz\/12). Kedua, TH0 diisi #0, yang artinya interupsi timer0 akan dipanggil setiap 256 siklus mesin. Ingat bahwa TH=256-interval atau interval=256-TH. Dengan demikian interval pemanggilan adalah 256 siklus mesin.<\/p>\n<p>Dari kedua data tadi kita bisa menghitung kecepatan pemanggilan terhadap interupsi timer0 adalah 3600Hz (921,6KHz\/256). Nah, untuk memperoleh 1 detik, kita harus membagi lagi interval ini dengan 3600. Jadi kita melakukannya dengan dua tingkatan, yaitu dibagi dengan 225 (3600\/225=16), kemudian kita bisa langsung membagi hasilnya dengan 16 untuk memperoleh frekuensi 1 Hz. Akan tetapi karena kita membutuhkan frekuensi 2 Hz untuk mengatur kedipan titik, maka kita tidak membagi dengan 16 tetapi dengan 8.<\/p>\n<p>Frekuensi 1 Hz diperoleh dengan flip-flop yang merupakan pembagi 2. Flip-flop ini diperoleh dengan menggunakan perintah cpl pada sebuah bendera (Bendera1Detik). Semoga cukup jelas.<\/p>\n<p><a href=\"#Top\">Kembali ke atas<\/a>\n<\/li>\n<p><a name=\"2\"><\/a><\/p>\n<li style=\"text-align: justify;\">\n<h4>Teknik mengambil data tombol dengan debouncing.<\/h4>\n<p>Potongan program tersebut akan mengambil data beberapa tombol secara bersamaan dan telah dilakukan debouncing. Jadi kita bisa menggunakan sembarang tombol dan tidak perlu kuatir dengan yang namanya bounce. Cara menggunakannya tinggal dipanggil saja nama prosedurnya, yaitu &#8220;AmbilTombol&#8221;.<\/p>\n<p>Setelah pemanggilan terhadap prosedur ini, maka Acc akan berisi data tombol. Sebagai contoh, jika tombol dipasang pada bit0 dan bit1, maka setelah pemanggilan prosedur ini, A akan berisi 0 jika tidak ada tombol yang ditekan, 1 jika tombol pada bit0 saja yang ditekan, 2 jika tombol pada bit1 saja yang ditekan, dan 3 jika kedua tombol ditekan.<\/p>\n<p>Tentu saja nilai yang dihasilkan tergantung di mana saja tombol dipasang. Kita tinggal melihat pada nilai bitnya. Bit0 bernilai 1 dan bit2 bernilai 2. Tentang bagaimana hal itu terjadi, coba perhatikan pada flowchart yang disertakan. Pelajari baik-baik flowchart tersebut. Semoga cukup jelas.<\/p>\n<p><a href=\"#Top\">Kembali ke atas<\/a>\n<\/li>\n<p><a name=\"3\"><\/a><\/p>\n<li style=\"text-align: justify;\">\n<h4>Alokasi memori untuk variabel dengan teknik yang memudahkan jika terjadi perubahan.<\/h4>\n<p>Variabel <b>~byte, ~bit, ~word,<\/b> dan <b>~array<\/b> adalah cara yang relatif mudah untuk mengatur lokasi memory dibanding dengan mengatur lokasi memori dengan cara seperti:<\/p>\n<pre class='notranslate'>  Buffer  <b>equ<\/b> 8  <i>;misalkan butuh 4 byte<\/i>\r\n  Angka   <b>equ<\/b> 12\r\n  Puluhan <b>equ<\/b> 13\r\n  Satuan  <b>equ<\/b> 14<\/pre>\n<p>Akan lebih mudah jika kita menggunakan:<\/p>\n<pre class='notranslate'>  <b>~Array<\/b> 4 Buffer\r\n  <b>~byte<\/b> Angka Puluhan Satuan<\/pre>\n<p>Dengan cara yang kedua, kita akan menempatkan Buffer pada lokasi 8, Angka pada lokasi 12, Puluhan pada lokasi 13, dan Satuan pada lokasi 14. Dan secara otomatis akan ada sebuah konstanta yang menyimpan posisi tertinggi dari lokasi memori yang tidak digunakan. Pada posisi inilah sebaiknya stack disimpan untuk inisiasinya. Konstanta ini diberi nama SaveStack. Dengan demikian, kita bisa menginisiasi stack dengan:<\/p>\n<pre class='notranslate'>  <b>mov SP<\/b>,#SaveStack<\/pre>\n<p>dan itu akan sama artinya dengan:<\/p>\n<pre class='notranslate'>  <b>mov SP<\/b>,#14<\/pre>\n<p>karena lokasi tertinggi yang digunakan adalah 14.<\/p>\n<p>Jika kita menggunakan cara yang pertama dan kita hendak mengubah kebutuhan memori untuk Buffer menjadi hanya 2 byte, kita akan mengaturnya menjadi:<\/p>\n<pre class='notranslate'>  Buffer  equ 8\r\n  Angka   <b>equ<\/b> 10\r\n  Puluhan <b>equ<\/b> 11\r\n  Satuan  <b>equ<\/b> 12<\/pre>\n<p>dan pada inisiasi stack menjadi:<\/p>\n<pre class='notranslate'>  <b>mov SP<\/b>,#12<\/pre>\n<p>Nah, kita harus mengubah semua angka pada pengaturan lokasi memorinya. Tapi jika kita menggunakan cara yang kedua, maka kita cukup mengganti bilangan 4 menjadi 2 pada deklarasi <b>~array<\/b> seperti:<\/p>\n<pre class='notranslate'>  <b>~Array<\/b> 2 Buffer\r\n  <b>~byte<\/b> Angka Puluhan Satuan<\/pre>\n<p>atau karena Buffer hanya membutuhkan 2 byte, maka kita bisa menggantinya dengan tipe <b>~word<\/b> seperti:<\/p>\n<pre class='notranslate'>  <b>~word<\/b> Buffer\r\n  <b>~byte<\/b> Angka Puluhan Satuan<\/pre>\n<p>Perhatikan bahwa kita hanya mengubah bagian deklarasi Buffer dan tidak ada bagian lain yang kita ubah.<\/p>\n<p>Sedangkan variabel <b>~bit<\/b> merupakan variabel berukuran 1 bit yang ditempatkan pada lokasi 20H.0 hingga 3FH.7.<\/p>\n<p>Penempatan semua variabel tersebut selalu mencari lokasi terbawah yang masih kosong dimulai dari alamat 8 (default) atau bisa dipindah ke posisi tertentu menggunakan <b>~basequ<\/b>.<\/p>\n<p>Dan sebenarnya tentang ini juga sudah ada di lampiran pada buku. Semoga cukup jelas.<\/p>\n<p><a href=\"#Top\">Kembali ke atas<\/a>\n<\/li>\n<p><a name=\"4\"><\/a><\/p>\n<li style=\"text-align: justify;\">\n<h4>&#8220;Virtual LCD&#8221; (Simulasi LCD), &#8220;MXLED&#8221; (Simulasi Matriks LED), dan &#8220;Tombol&#8221; (Simulasi tombol dengan keyboard).<\/h4>\n<ul>\n<li style=\"text-align: justify;\">&#8220;Virtual LCD&#8221; bisa digunakan untuk percobaan yang membutuhkan tampilan karakter yang cukup banyak. Simulasi ini bisa dihubungkan dengan rangkaian nyata menggunakan koneksi serial. Lihat Bab 19 buku &#8220;Mudah dan Menyenangkan Belajar Mikrokontroler&#8221;. Akan tetapi simulasi ini juga bisa digunakan dari simulator dengan &#8220;Link Message&#8221;. Untuk melakukan hal tersebut, pilih Com yang digunakan berupa &#8220;Message&#8221;. Jika Data penekanan tombol keyboard hendak dikirim ke simulator melalui komunikasi serial (diterima di SBUF), maka &#8220;Message yang dikirim&#8221; harus diisi dengan 1035. Sedangkan jika data diinginkan untuk diterima oleh port, maka &#8220;Message yang dikirim&#8221; adalah 1034 dan &#8220;lParam yang dikirim&#8221; diisi dengan nomor port, yaitu 0, 1, 2, atau 3. Disamping itu &#8220;Handle&#8221; harus mengarah ke simulator yang aktif. Kita bisa menggunakan tombol &#8220;Capture Handle&#8221; kemudian klik pada jendela simulator yang dituju. Selain melakukan pengaturan pada &#8220;Virtual LCD&#8221;, port simulator juga harus disesuaikan. Jika simulator ingin mengirimkan data ke &#8220;Virtual LCD&#8221; melalui simulasi serial, maka Com harus menggunakan &#8220;Message&#8221; dan mengatur &#8220;Handle&#8221; agar mengarah ke &#8220;Virtual LCD&#8221; yang dituju dengan &#8220;Message yang dikirim&#8221; berupa WM_USER (1024). Sedangkan jika simulator hendak mengirim datanya melalui port, maka kita harus mengatur port untuk di &#8220;Link Message&#8221; ke arah &#8220;Virtual LCD&#8221; tersebut.<\/li>\n<li style=\"text-align: justify;\">&#8220;MXLED&#8221; merupakan simulasi Matriks LED. Simulasi ini juga menerima data melalui &#8220;Link Message&#8221; dari pengaturan port pada simulator. Karena penjelasannya agak panjang, maka saya tempatkan pada post tersendiri yaitu di <a href=\"\/id\/?p=257\">Menampilkan Gambar pada LED Matriks Menggunakan Simulator.<\/a><\/li>\n<li style=\"text-align: justify;\">Untuk &#8220;Tombol&#8221;, jika pengaturan port pada simulator menggunakan &#8220;Link Message&#8221;, maka penekanan keyboard pada &#8220;Tombol&#8221; akan dikirim ke simulator. &#8220;Tombol&#8221; sendiri tidak membutuhkan pengaturan, karena secara otomatis dia akan mencari simulator yang sedang aktif.<\/li>\n<\/ul>\n<p><a href=\"#Top\">Kembali ke atas<\/a>\n<\/li>\n<p><a name=\"5\"><\/a><\/p>\n<li style=\"text-align: justify;\">\n<h4>Satu tombol untuk banyak fungsi.<\/h4>\n<p>Pemrograman tombol yang seperti itu membutuhkan pewaktuan yang cukup teliti. Pertama adalah melakukan pengecekkan apakah tombol ditekan atau tidak. Jika ya, maka dimulailah proses pendeteksian tombol.<\/p>\n<p>Pendeteksian tombol ini pada dasarnya adalah sama dengan debouncing lainnya, yaitu menunggu sampai tombol dilepas lagi, tapi jika tombol telah dilepas tidak langsung menganggap bahwa tombol telah dilepas. Ada sebuah waktu minimum sehingga tombol yang telah dilepas benar-benar dianggap telah dilepas. Jika waktu tersebut tidak tercapai, maka penekanan tombol berikutnya masih akan dianggap sebagai bagian dari penekanan tombol sebelumnya.<\/p>\n<p>Sekarang jika tombol telah memenuhi syarat untuk dianggap telah dilepas, artinya waktu tunggu minimum (debouncing timeout) terlampaui. Program tidak langsung melakukan aksi tertentu tetapi hanya menaikkan variabel yang menyatakan jumlah penekanan tombol, kemudian menunggu lagi adanya penekanan tombol berikutnya. Hal ini dilakukan dengan membuat bendera yang menyatakan bahwa program sedang menunggu penekanan tombol lagi. Waktu tunggu ini sekarang kita sebut sebagai &#8220;next press timeout&#8221;. Jika tombol ditekan lagi sebelum waktu tunggu terlampaui, maka penekanan tersebut hanya akan menaikkan perhitungan jumlah penekanan. Program hanya akan memproses data penekanan tombol hanya jika &#8220;next press timeout&#8221; terlampaui.<\/p>\n<p>Anda bisa mendownload <a title=\"SatuTombol.7z 2,8KB\" href=\"https:\/\/sulhansetiawan.com\/_gdrive_\/download&#038;id=0BySPQ_LZsdXvcXhpdDltelBkbjA\">program contoh<\/a> yang merupakan penghitung dua digit 0 &#8211; 99. Port0 digunakan untuk mengirimkan data segment, Port1 untuk kendali digit, sedangkan Port3.0 digunakan sebagai tombol. Untuk menaikkan hitungan, kita harus menekan tombol sekali. Sedangkan untuk menurunkan hitungan, kita harus menekan tombol dua kali dengan interval yang cepat. Kita juga bisa langsung mencapai nilai 99 dengan cara menekan tombol empat kali dengan cepat. Sedangkan untuk lansung mengembalikan ke 0, maka kita harus menekan tombol tiga kali dengan cepat.<\/p>\n<p>Dari contoh ini, kita bisa menggunakan satu tombol untuk banyak aksi. Akan tetapi ingat, jika Anda membuat program dan ada fungsi yang dijalankan dengan cara menekan tombol secara cepat hingga sepuluh kali, bisa dipastikan akan tidak nyaman dalam penggunaannya \ud83d\ude41<\/p>\n<p><a href=\"#Top\">Kembali ke atas<\/a>\n<\/li>\n<p><a name=\"6\"><\/a><\/p>\n<li style=\"text-align: justify;\">\n<h4>Revisi contoh program jam digital dengan tombol yang di <em>debouncing.<\/em><\/h4>\n<p>Setelah saya cek kembali, mamang ada yang kurang dan ada beberapa yang salah. Seharusnya pada MainLoop susunannya adalah seperti:<\/p>\n<pre class='notranslate'>              <b>mov   R4<\/b>,#NoMode     <i>;R4 =status mode<\/i>\r\n   MainLoop0: <b>acall<\/b> IsiBuffer\r\n   MainLoop:  <b>acall<\/b> AmbilTombol<\/pre>\n<p>Dan setiap selesai melakukan perubahan pada data baik menit ataupun jam, maka melompatnya adalah ke arah MainLoop0 dan bukan ke MainLoop. Selain itu, konstanta untuk penekanan tombol seharusnya adalah:<\/p>\n<pre class='notranslate'>   S1ditekan   <b>equ<\/b>   00010000b <i>;aslinya =00001000b<\/i>\r\n   S2ditekan   <b>equ<\/b>   00100000b <i>;aslinya =00010000b<\/i>\r\n   S1S2ditekan <b>equ<\/b>   00110000b <i>;aslinya =00011000b<\/i><\/pre>\n<p>Dan penyaringan tombol pada &#8220;AmbilTombol&#8221; seharusnya:<\/p>\n<pre class='notranslate'>   AmbilTombol_:\r\n               <b>mov   A<\/b>,P3\r\n               <b>cpl   a<\/b>            <i>;pembalikan data<\/i>\r\n               <b>anl   A<\/b>,#00110000b <i>;aslinya =00011000b<\/i>\r\n               <b>ret<\/b><\/pre>\n<p>Kesalahan tersebut mengakibatkan pembacaan tombol menjadi keliru karena posisi tombol berada pada P3.4 dan P3.5 bukan pada P3.3 dan P3.4. Akan tetapi saya telah membuat versi revisinya dengan sedikit tambahan sehingga saat status mode berada pada ModeJam, maka digit jam akan dikedipkan. Demikian juga saat status mode berada pada ModeMenit, maka digit menit juga akan dikedipkan. Dengan demikian pemakai tahu apa yang akan terjadi jika tombol ditekan. Listing program revisi bisa didownload <a title=\"Debouncing2rev.7z 1,5KB\" href=\"https:\/\/sulhansetiawan.com\/_gdrive_\/download&#038;id=0BySPQ_LZsdXvZ2ZxUmpONGVwU0E\">di sini<\/a>.<\/p>\n<p><a href=\"#Top\">Kembali ke atas<\/a><\/li>\n<\/ol>\n<p>Yang bisa didownload dari post ini:<\/p>\n<ol>\n<li><a title=\"SatuTombol.7z 2,8KB\" href=\"https:\/\/sulhansetiawan.com\/_gdrive_\/download&#038;id=0BySPQ_LZsdXvcXhpdDltelBkbjA\">Contoh program satu tombol banyak fungsi<\/a><\/li>\n<li><a title=\"Debouncing2rev.7z 1,5KB\" href=\"https:\/\/sulhansetiawan.com\/_gdrive_\/download&#038;id=0BySPQ_LZsdXvZ2ZxUmpONGVwU0E\">Revisi program Debouncing 2<\/a><\/li>\n<\/ol>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Seorang pembaca buku Mudah dan Menyenangkan Belajar Mikrokontroler bertanya sebagai berikut: Pada listing program jam digital yang sudah ada tombol (hal. 91), tolong jelaskan lebih lanjut tentang penggunaan dan perhitungan Timer 0 Mode 2 sehingga menghasilkan timer 1 detik yang akurat. Tolong jelaskan lebih lanjut tentang cara kerja listing pengambilan data tombol (hal. 119). Bagaimana&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[42,96],"tags":[86,120,147,132,73],"class_list":["post-469","post","type-post","status-publish","format-standard","hentry","category-buku-mikrokontroler","category-all","tag-microcontroller-learning","tag-buku-karya-sulhan-setiawan-2","tag-buku-mikrokontroler","tag-tutorial-mikrokontroler","tag-microcontroler"],"_links":{"self":[{"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/posts\/469","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/comments?post=469"}],"version-history":[{"count":0,"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/posts\/469\/revisions"}],"wp:attachment":[{"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/media?parent=469"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/categories?post=469"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/tags?post=469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}