Pages

Showing posts with label Microcontroller. Show all posts
Showing posts with label Microcontroller. Show all posts

17.12.12

Program Interrupt sederhana Atmega16-Bascom



    1    $regfile = "m16def.dat"
    2    $crystal = 11059200

    3    Dim I As Byte , Kiri As Byte
    4    Config Portc = Output
    5    Kiri = $b00000001
    6    Config Int0 = Falling
    7    Enable Interrupts
    8    Enable Int0
    9    On Int0 Tes

    10  Do
    11      Portc = 255
    12  Loop

    13  Tes:
    14    For I = 1 To 8
    15       Portc = Kiri
    16       Waitms 200
    17       Rotate Kiri , Left , 1
    18     Next I
    19  Return
    20  End


Baris 1: deklarasi MCU yang digunakan, yaitu ATmega16
Baris 2: deklarasi nilai crystal yang digunakan, yaitu 11.059200 MHz
Baris 3: deklarasi variable yang digunakan dalam program
Baris 4: konfigurasi portc=output
Baris 5: mengisi variable kiri= $b00000001
Baris 6: konfigurasi sinyal masukkan pada pin int0 pada saat tepi jatuh
Baris 7: enable interrupts / mengaktifkan vector interrupt
Baris 8: enable int0 / mengaktifkan int0
Baris 9: pada saat interrupt terjadi pada int0 program beralih ke sub routine Tes
Baris 10-12: main program jika tidak ada interrupt portc=255
Baris 13-19: program subroutine Tes, yaitu nilai portc = nilai pada variable kiri, kemudian nilai variable kiri di geser sebanyak 1 bit kekiri sebanyak 8 kali, kemudian return (kembali ke main program)
Baris 20: End

Pada program interrupt  hal-hal yang perlu diperhatikan adalah seperti program diatas pada baris 6, 7, 8, dan 9. Kemudian interrupt external dihubungkan pada int0 atau int1 tergantung pada penggunaan interrupt. Pada baris ke 6 terdapat 3 pilihan yaitu: low level, falling, rising untuk config int0. Low level berarti sinyal interrupt diterima jika sinyal terhubung ke ground, falling berarti sinyal interrupt yang diterima pada posisi tepi jatuh atau 1 ke 0, sedangkan rising berarti sinyal interrupt yang diterima pada posisi tepi naik atau 0 ke 1.

Program Timer sederhana Atmega16-Bascom



      1    $regfile = "m16def.dat"
    2    $crystal = 11059200

    3    Ddrb = 255
    4    Portb = 255

    5    Config Timer0 = Timer , Prescale = 1024

    6    On Timer0 Tes

    7    Enable Timer0
    8    Enable Interrupts

    9    Do
    10  Loop

    11  Tes:
    12     Portb = Not Portb
    13  Return

    14  End

Baris 1: deklarasi MCU yang digunakan, yaitu ATmega16
Baris 2: deklarasi nilai crystal yang digunakan, yaitu 11.059200 MHz
Baris 3: konfigurasi portb=output
Baris 4: mengaktifkan semua bit pada portb
Baris 5: configurasi mode timer0 difungsikan sebagai Timer, dengan prescale = 1024
Baris 6: ketika ada interupsi pada timer0 program secara langsung pindah ke sub routine Tes
Baris 7: enable timer0 / mengaktifkan timer0
Baris 8: enable interrupts/ mengaktifkan interrupt
Baris 9-10: tidak ada program yang dijalankan
Baris 11-13: program subroutine Tes, yaitu nilai portb diinverskan, kemudian return (kembali pada program selanjutnya).
Baris 14: End

Pada program timer yang terpenting adalah pada saat menggunakan fungsi timer harus mengetahui interupsi vector yang harus di configurasi, seperti program diatas pada baris ke 5, 7 dan 8. Timer0 adalah 8 bit timer dan 10 bit prescaler . periode timer dapat dapat dihitung dengan menggunakan rumus seperti berikut:
Jika pada program diatas prescale= 1024, Frekuensi Osc= 11059200, maka waktu penundaan timer pada program diatas adalah T= 0.024 s

Program Counter sederhana ATmega16-Bascom




   1    $regfile = "m16def.dat"
    2    $crystal = 11059200

    3    Const Ticks = 5
    4    Dim Count As Byte , Kiri As Byte , I As Byte

    5    Config Timer0 = Counter , Edge = Falling
    6    Load Timer0 , Ticks

    7    On Timer0 Tes

    8    Config Portc = Output
    9    Kiri = &B00000001
    10  Reset Ddrb.0

    11  Enable Timer0
    12  Enable Interrupts

    13  Do
    14      Portc = 0
    15  Loop

    16  Tes:
    17      Load Timer0 , Ticks
    18      Gosub Main
    19  Return

    20  Main:
    21  For I = 1 To 8
    22      Portc = Kiri
    23      Waitms 200
    24      Rotate Kiri , Left , 1
    25  Next I
    26  Return

    27  End

Baris 1: deklarasi MCU yang digunakan, yaitu ATmega16
Baris 2: deklarasi nilai crystal yang digunakan, yaitu 11.059200 MHz
Baris 3: banyaknya sinyal external yang akan di hitung sebagai pencacah, yaitu 5
Baris 4: deklarasi variable yang digunakan pada program
Baris 5: configurasi mode timer0 difungsikan sebagai counter, pembacaan sinyal masukkan ketika falling atau ketika sinyal dari 1 ke 0
Baris 6: copy nilai ticks ke timer0 sebagai set value counter sampai 5
Baris 7: ketika ada interupsi pada timer0 program secara langsung pindah ke sub routine Tes
Baris 8: konfigurasi Portc sebagai output
Baris 9: mengisi variable kiri dengan $B00000001
Baris 10: reset portb.0
Baris 11: enable timer0 / mengaktifkan timer0
Baris 12: enable interrupts/ mengaktifkan interrupt
Baris 13-15: jika belum ada interrupt, program akan mengulangi secara terus menerus portc=0
Baris 16-19: program sub routine Tes, yaitu ketika sinyal yang dimasukkan telah mencapai 5 kali maka program beralih ke sub routine Main, kemudian return (kembali)
Baris 20-26: program sub routine Main yaitu setiap bit pada portc bergeser 1 bit ke kiri sebanyak 8 kali kemudian return (kembali ke program dimana program dilompati).
Baris 27: End

Pada program counter yang terpenting adalah pada saat menggunakan fungsi counter harus mengetahui interupsi vector yang harus di configurasi, seperti program diatas pada baris ke 3, 5, 6, 11, dan 12. Kemudian masukkan sinyal eksternal harus pada portb.0