Thursday 11 September 2014

Jam Digital Pada Mikrokontroler

Salam kapasitorrr!!!
Pada kesempatan kali ini kita akan bermain pada salah satu fitur mikrokontroler yaitu timer/counter. Timer/counter ini akan dijadikan sebagai pencacah nilai untuk pertambahan nilai pada jam digital.

Langkah-langkah sebagai berikut:
1. Buat rangkain pada simulasi proteus seperti dibawah ini.


 4 buah tombol digunakan untuk mengatur nilai jam. Kemudian yang terpenting jangan sampai lupa mengubah CKSEL fuse menjadi eksternal clock. Langkah lengkapnya bisa kita buka pada Cara setting Simulasi Proteus Agar menjadi eksternal Clock.

2. Setelah selesai membuat rangkain proteus, kita lanjutke pemrogramannya.

1. Pertama-tama kita buka CodeVisionnya.
2. Klik New, kemudian muncul jendela pilih Project,OK. Kemudian muncul jendela dengan  pertanyaan apakah ingin menggunakan codewizard? pilih Yes.


3.  Kemudian Tampil jendela codewizard, kita pilih jenis mikrokontroler & frekuensi crystal yang kita gunakan. Pada bahasan kali ini saya menggunakan atmega8535 dan crystal 11.059200 MHZ.


4. Klik tab LCD, kemudian kita pilih di PIN mana kita menggunakan LCD tersebut.


5. Klik tab Timer, kemudian samakan seperti dibawah. 


Mengapa kita pilih seperti itu?? 
Dimulai dari yang paling atas, yaitu clock value 10.800 khz = 10800 hz. 
artinya disini clock timer yang kita gunakan adalah sebesar 10800 hz. Nilai tersebut dihasilkan dari nilai clock mikrokontroler yaitu sebesar 11.059200 Mhz dibagi dengan nilai prescaller, dimana nilai prescaller nya adalah 1024. 

11059200 Hz / 1024 = 10800 hz.
 artinya timer/counter 0 akan mencacah sebanyak 10800 kali tiap 1 detik(Ingat pengertian frekuensi).

nilai pertambahan tiap 1 kali TCNT0(periode) = 1/10800 = 0.0000925925 detik.

terus mengapa kita pilih 1024??
karena hasilnya lebih mendekati 1 detik dibandingkan dengan hasil bagi dari nilai prescaller yang lain(1,8,64,256) jadi untuk mempermudah nya kita pilih yang paling mendekati yaitu 1024.

Lanjutke Mode dan Output yaitu Normal Top 0xFF dan disconnect
Karena kita hanya menggunakan timer untuk menghitung waktu dan tidak memerlukan output PWMnya jadi kita tidak perlu merubahnya.

Lanjut ke tanda conteng pada Overflow interupt, mengapa kita memerlukannya??
karena kita akan menghitung nilai persatu detik jadi kita harus mengetahui hasilnya melalui program interupsi td. Program akan mengalami interupsi saat nilai TCNT0 sudah mencapai puncak dan kembali ke nilai awal(Overflow).

Dan yang terakhir mengapa timer value kita menggunakan nilai 0x94??
Timer value adalah nilai awal dari TCNT0.
0x94 (bilangan hexa) = 148 (bilangan desimal).

Nilai tersebut didapat dari 

 0.01 = jumlah TCNT0 * periode TCNT0(0.0000925925 detik)

jumlah TCNT0 = 108. 
Banyak nilai TCNT0 agar program interupsi jalan per 0.01 detik adalah 108 kali.
Jadi nilai awal TCNT0 adalah 256 - 108 = 148 (0x94).

Selesai Penjelasannya, berikut program fullnya.



  1. #include <mega8535.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <delay.h>

  5. // Alphanumeric LCD Module functions
  6. #asm
  7.    .equ __lcd_port=0x15 ;PORTC
  8. #endasm
  9. #include <lcd.h>


  10. char buff[20];
  11. int satuperseratus,detik,menit,jam;
  12. void menu();


  13. // Timer 0 overflow interrupt service routine
  14. interrupt [TIM0_OVF] void timer0_ovf_isr(void)
  15. {
  16. // Reinitialize Timer 0 value
  17. TCNT0=0x94;
  18. // Place your code here
  19. satuperseratus++;

  20. if(satuperseratus>=100)
  21. {
  22. detik++;
  23. satuperseratus=0;
  24.     if(detik>=60)
  25.     {
  26.     menit++;
  27.     detik=0;
  28.         if(menit>=60)
  29.         {
  30.         jam++;
  31.         menit =0;
  32.             if(jam>=24)
  33.             {
  34.             jam=0;
  35.             }
  36.         }
  37.     }
  38. }

  39. }


  40. // Declare your global variables here

  41. void main(void)
  42. {

  43. PORTA=0x00;
  44. DDRA=0x00;

  45. PORTB=0xFF;
  46. DDRB=0x00;

  47. PORTC=0x00;
  48. DDRC=0x00;

  49. PORTD=0x00;
  50. DDRD=0x00;

  51. TCCR0=0x00;
  52. TCNT0=0x00;
  53. OCR0=0x00;

  54. TCCR1A=0x00;
  55. TCCR1B=0x00;
  56. TCNT1H=0x00;
  57. TCNT1L=0x00;
  58. ICR1H=0x00;
  59. ICR1L=0x00;
  60. OCR1AH=0x00;
  61. OCR1AL=0x00;
  62. OCR1BH=0x00;
  63. OCR1BL=0x00;

  64. ASSR=0x00;
  65. TCCR2=0x00;
  66. TCNT2=0x00;
  67. OCR2=0x00;

  68. // INT0: Off
  69. // INT1: Off
  70. // INT2: Off
  71. MCUCR=0x00;
  72. MCUCSR=0x00;

  73. TIMSK=0x01;

  74. ACSR=0x80;
  75. SFIOR=0x00;

  76. lcd_init(16);

  77. // Global enable interrupts
  78. #asm("sei")
  79. awal:
  80. menu();
  81. TCCR0=0x05;
  82. TCNT0=0x94;
  83. OCR0=0x00;
  84. while (1)
  85.       {
  86.       // Place your code here 
  87.       
  88.       sprintf(buff,"%d:%d:%d", jam, menit, detik);  
  89.       lcd_gotoxy(0,0);
  90.       lcd_puts(buff);   
  91.       lcd_clear();
  92.       
  93.       if(PINB.0 == 0)
  94.       {
  95.       TCCR0=0x00;
  96.       TCNT0=0x00;
  97.       goto awal;
  98.       }

  99.       };
  100. }

  101. void menu()
  102. {   
  103.     menu_awal:
  104.     while(1)
  105.     {
  106.         lcd_gotoxy(0,0);
  107.         sprintf(buff,"1. Set 2.Jam");
  108.         lcd_puts(buff);
  109.         
  110.         if(PINB.0 ==0)
  111.         {  
  112.         delay_ms(300);
  113.         goto set_detik;
  114.         } 
  115.         else if(PINB.1 ==0)
  116.         {
  117.         delay_ms(300);
  118.         goto exit;
  119.         }
  120.         else if(PINB.2==0)
  121.         {
  122.         
  123.         }
  124.         else if(PINB.3==0)
  125.         {
  126.         
  127.         }
  128.         
  129.     }
  130.     
  131.     set_detik:
  132.     lcd_clear();
  133.     while(1)
  134.     {    
  135.         lcd_gotoxy(0,0);
  136.         sprintf(buff,"detik=%d",detik);
  137.         lcd_puts(buff);  
  138.         delay_ms(50);
  139.         lcd_clear();
  140.         
  141.         if(PINB.0==0)
  142.         {    
  143.         delay_ms(300);
  144.         goto set_menit;
  145.         } 
  146.         else if(PINB.1==0)
  147.         {             
  148.         delay_ms(300);
  149.         goto menu_awal;
  150.         }
  151.         else if(PINB.2==0)
  152.         { 
  153.          delay_ms(300);
  154.          detik++;
  155.         }
  156.         else if(PINB.3==0)
  157.         {   
  158.          delay_ms(300);
  159.          detik--;
  160.         }
  161.     }  
  162.     
  163.     set_menit:
  164.     lcd_clear();
  165.     while(1)
  166.     {    
  167.     
  168.         
  169.         lcd_gotoxy(0,0);
  170.         sprintf(buff,"menit=%d",menit);
  171.         lcd_puts(buff); 
  172.         delay_ms(50);
  173.         lcd_clear();
  174.         
  175.         if(PINB.0==0)
  176.         { 
  177.         delay_ms(300);
  178.         goto set_jam;
  179.         } 
  180.         else if(PINB.1==0)
  181.         {  
  182.         delay_ms(300);
  183.         goto set_detik;
  184.         }
  185.         else if(PINB.2==0)
  186.         { 
  187.          delay_ms(300);
  188.          menit++;
  189.         }
  190.         else if(PINB.3==0)
  191.         {
  192.          delay_ms(300);
  193.          menit--;
  194.         }
  195.     } 
  196.     
  197.     set_jam: 
  198.     lcd_clear();
  199.     while(1)
  200.     {    
  201.     
  202.         
  203.         lcd_gotoxy(0,0);
  204.         sprintf(buff,"jam=%d",jam);
  205.         lcd_puts(buff); 
  206.         delay_ms(50);
  207.         lcd_clear();
  208.         
  209.         if(PINB.0==0)
  210.         {
  211.         delay_ms(300); 
  212.         goto menu_awal;
  213.         } 
  214.         else if(PINB.1==0)
  215.         {
  216.         delay_ms(300);
  217.         goto set_menit;
  218.         }
  219.         else if(PINB.2==0)
  220.         {
  221.          delay_ms(300);
  222.          jam++;
  223.         }
  224.         else if(PINB.3==0)
  225.         {
  226.          delay_ms(300);
  227.          jam--;
  228.         }
  229.     }
  230.     exit:
  231.     lcd_clear();
  232. }





Sekian tutorial mengenai jam digitalnyaa..
semoga bermanfaat..
Salam Capasitorr!!!!!!

5 comments: