Sunday, January 26, 2014

ZONA PROGRAM LIGHTNINGINO_AS51 (FREE)

;************************************
;*   PENGGUNAAN OPRASI DASAR I/O           *
;*   RUDI SETIAWAN                                                *
;*   14 MARET 2014                                                  *
;************************************
cacah equ -10000                     ;cacah nilainya sama dengan -10000
org 0h                                                           ;wajib ditulis menandakan bahwa program dimulai dari alamat 00h
mov tmod,#01h                                        ;menggunakan timer mode 1
utama:                                                          ;inisial "utama"
call tunda                                             ;memanggil sub rutin tunda
sjmp utama                                                                ;melompat ke inisial utama

tampilan1 :                                                  ;inisial "tampilan1
mov r2,#3                                            ;mengisi register r2 dengan data 3
ulang:                                                            ;inisial "ulang"
mov p1,#11111110b                        ;pengisian data pada port p1
acall tunda                                          ;memanggil sub rutin tunda
mov p1,#11111101b
acall tunda
mov p1,#11111011b
acall tunda
mov p1,#11110111b
acall tunda
mov p1,#11101111b
acall tunda
mov p1,#11011111b
acall tunda
mov p1,#10111111b
acall tunda
mov p1,#01111111b
acall tunda
djnz r2, ulang                                     ;jika nilai dari register r2 belum 0 maka melompat ke inisial ulang (mengulang sejumlah isi r2)

tampilan2 :                                                  ;inisial "tampilan2"
mov p1,#00000000b                        ;pengisian data pada port p1 menjadi 00000000 berarti LED menyala semua jika aktif low
acall tunda                                                          ;memanggil sub rutin tunda
setb p1.0                                                             ;mengeset kodisi p1.0 menjadi 1
acall tunda                                                          ;memanggil sub rutin tunda
setb p1.1                                                             ;mengeset kodisi p1.1 menjadi 1
acall tunda
setb p1.2
acall tunda
setb p1.3
acall tunda
setb p1.4
acall tunda
setb p1.5
acall tunda
setb p1.6
acall tunda
setb p1.7
acall tunda
ljmp tampilan1                                  ;melompat ke inisial tampilan1

tampilan3:                                                   ;inisial "tampilan3"
mov p1,#11111111b                        ;pengisian data pada port p1 menjadi 11111111 berarti LED mati semua jika aktif low
acall tunda                                          ;memanggil sub rutin tunda
sjmp tampilan3                                 ;melompat ke inisial tampilan3

;program penundaan waktu satu detik
tunda:                                                           : ;inisial sub rutin"tunda"
mov R1,#100                                              ;mengisi data r1 dengan nilai 100
lagi:                mov th0,#high cacah      ;mengisi th0 dengan nilai cacah (diatas tadi)
mov tl0,#low cacah                                 ;mengisi tl0 dengan nilai cacah low berarti 0
setb tr0                                                        ;mengeset kondisi tr0 berkondisi 1tunggu:          
jnb tf0,tunggu                                           ;jika tf0 belum 0 maka melompat ke tunggu jika sudah maka lanjut ke bawahnya
clr tf0                                                             ;membersihkan data pada tf0
clr tr0                                                             ;membersihkan data pada tr0
djnz R1,lagi                                                 ;mengulang sejumlah nilai r1 belum 0 maka lompat ke lagi. atau 100 kali sesuai nilai r1
jnb p2.0,tampilan1                                  ;jika p2.0 bernilai 0 maka melompat ke inisial tampilan1
jnb p2.1,tampilan3                                  ;jika p2.1 bernilai 0 maka melompat ke inisial tampilan3
ret                                                                  ;program sub rutin tunda selesai kembali ke program utama
end                                                                                ;tanda bahwa program selesai di tulis
bisa dilihat bahwa program diatas memanggil tunda berulang kali. Jika program tunda tidak di tulis dalam sub rutin maka kita harus menulisnya berulang kali, tapi disini kita cukup menulisnya selaki kemudian kita panggil seperlu kita.
Kenapa dibutuhkan penundaan ? jika tidak dilakukan penundaan maka proses akan berjalan dengan sangan cepat, dengan kecepatan 12 MHz sesuai Kristal yang terpasang. sehingga mata kita tidak mampu melihat perubahan nya.
Nah program diatas meruakan program yang sangat sederhana dengan susunan algoritma yang sanyat dederhana sehingga membutuhkan tempat yang banyak. Sekarang kita akan belajar manggunakan sedikit aritmatika sehingga akan meringkas program. Berikut ini beberapa instruksi yang digunakan namun perlu di ingat bahwa instruksi ini hanya bisa digunakan di akumularor atau register A. jadi data harus dibawa terlebih dahulu ke register ini. Perintah yang digunakan MOV adalah :
                Mov a,#11111110b                          ;mengisi register a dengan data 11111110b
                Mov a,p1                                             :mengisi register a dengan data yang ada pada port p1
Untuk catatan jika melakukan pemindahan data menggunakan perintah MOV maka instruksinya adalah :
                Mov (tujuan kemana data di pindah),#(asal data yang akan dipindah)
Instruksi yang akan kita gunakan antara lain sebagai berikut :
1.       Rl  (rotate left) dan Rr (rotate right)
Instruksi Rl digunakan untuk menggeser data ke kiri satu perubahan. Untuk lebih jelasnya langsung kita ke program saja.

;**********************************
;*   PENGGUNAAN OPRASI RR dan RL         *
;*   RUDI SETIAWAN                                       *
;*   14 MARET 2014                                        *
;**********************************
cacah equ -10000                                     ;cacah nilainya sama dengan -10000
org 0h                                                           ;wajib ditulis menandakan bahwa program dimulai dari alamat 00h
mov tmod,#01h                                        ;menggunakan timer mode 1
;program utama
utama:                                                          ;inisial "utama"
call tunda                                                     ;memanggil sub rutin tunda
sjmp utama                                                                ;melompat ke inisial utama

tampilan1 :                                                  ;inisial "tampilan1
mov r2,#8                                                    ;mengisi register r2 dengan data 8
mov a,#11111110b                                  ;pengisian register a dengan data yang ada pada port p1
ulang:                                                            ;inisial "ulang"
mov p1,a                                                     ;mengisikan data yang ada pada register a ke port p1 agar bisa dilihat
acall tunda                                                  ;memanggil sub rutin tunda
rl a                                                                  ;geser kekiri satu perubahan
djnz r2, ulang                                             ;jika nilai dari register r2 belum 0 maka melompat ke inisial ulang (mengulang sejumlah isi r2)

tampilan2 :                                                  ;inisial "tampilan2"
mov r2,#8                                                    ;mengisi register r2 dengan data 8
mov p1,#01111111b                                ;pengisian data pada port p1 menjadi 00000000 berarti LED menyala semua jika aktif low
mov a,p1                                                     ;memindahkan data pada port p1 ke register a
ulang1:                                                         ;inisial "ulang1"
mov p1,a                                                     ;mengisikan data yang ada pada register a ke port p1 agar bisa dilihat
acall tunda                                                  ;memanggil sub rutin tunda
rr a                                                                 ;geser kekanan satu perubahan
djnz r2, ulang1                                           ;jika nilai dari register r2 belum 0 maka melompat ke inisial ulang (mengulang sejumlah isi r2)

ljmp tampilan1                                          ;melompat ke inisial tampilan1

tampilan3:                                                   ;inisial "tampilan3"
mov p1,#11111111b                                ;pengisian data pada port p1 menjadi 11111111 berarti LED mati semua jika aktif low
acall tunda                                                  ;memanggil sub rutin tunda
sjmp tampilan3                                         ;melompat ke inisial tampilan3

;program penundaan waktu 0.5 detik
tunda:                                                           mov R1,#50                        ;mengisi r1 dengan 50 yang tadinya 100,   menjadi setengahnya
lagi:mov th0,#high cacah                      ;mengisi th0 dengan nilai cacah (diatas tadi)
        mov tl0,#low cacah                         ;mengisi tl0 dengan nilai cacah low berarti 0
        setb tr0                                                                ;mengeset kondisi tr0 berkondisi 1
tunggu:        jnb tf0,tunggu                   ;jika tf0 belum 0 maka melompat ke tunggu jika sudah 0 maka lanjut ke bawahnya
        clr tf0                                     ;membersihkan data pada tf0
        clr tr0                                     ;membersihkan data pada tr0
djnz R1,lagi                                 ;mengulang sejumlah nilai r1 belum 0 maka lompat ke lagi. atau 100 kali sesuai nilai r1
        jnb p2.0,tampilan1          ;jika p2.0 bernilai 0 maka melompat ke inisial tampilan1
        jnb p2.1,tampilan3          ;jika p2.1 bernilai 0 maka melompat ke inisial tampilan3
        ret                                          ;program sub rutin tunda selesai kembali ke program utama
end                                                                ;tanda bahwa program selesai di tulis

Untuk catatan jika menggunakan perintah mov a,(port yang di inginkan) jangan lupa menuliskan perintah mov (port yang di inginkan), a agar data bida dilihat tapi missal data tidak perlu ditampilkan tidak ditulis juga tidak apa.

2.       ADD
Instruksi untuk melakukan operasi penjumlahan pada dua buah data yang terdapat pada alamat register yang ditunjuk oleh instruksi atau data langsung yang kita inginkan. Contoh programnya :
        mov a,#11111110b                          ;pengisian register a dengan data 11111110b
add a,#00000001b                            ;menambahkan data pada register a dengan 00000001b

maka hasil yang diperoleh adalah :
11111110b

00000001b
+
11111111b



3.       ADDC
Instruksi melakukan operasi  penjumlahan data pada dua buah data disertai penjumlahan data pada carry flag.

4.       DEC & INC
Instruksi DEC digunakan untuk menurunkan satu tingkat nilah dari register yang di inginkan. Contoh :

Mov r3,#3                   ;data register r3 adalah 3
Dec r3                           ;data register r3 sekarang menjadi 2

Sedangkan instruksi INC untuk menaikkan nilai satu tingkat.

Untuk catatan instruksi ini hanya bisa digunakan pada register saja baik r0 – r7 atau akumulator / register a


5.       DIV
Instuksi ini melakukan operasi pembagian dua buah data dan menyimpan hasilnya pada alamat data yang ditunjuk.

6.       MUL
Instruksi ini digunakan untuk melakukan operasi perkalian data antara dua buah register.

7.       SUBB
Instruksi ini melakukan operasi pengurangan data antara dua buah alamat register beserta dengan bit carry flag.
Selain itu kita juga bisa mengunakan instruksi yang berkaitan dengan gerbang logika diantaranya.
1.       ANL
Instruksi ini digunakan untuk meng AND kan 2 buah dara yang ada dalam suatu redister

2.       ORL
Instruksi ini digunakan untuk meng OR kan 2 buah dara yang ada dalam suatu redister

3.       XRL
Instruksi ini digunakan untuk meng XOR kan 2 buah dara yang ada dalam suatu redister



PENDALAMAN PROGRAM
Setelah membaca set instruksi di atas tentunya sudah ada gambaran kan. Nah sekarang langsung saja kita lakukan eksperiman. Jika pada bagian debelumnya kita gunakan LED maka kali ini kita akan menggunakan 7 segment. Perlu di ingat bahwa 7segment pada LIGHTNINGINO_as51 pada port P3.
Kita akan membuat program menghitung naik dan turun pada LIGHTNINGINO_as51 dengan tombol UP DOWN dan STOP. Program sebagai berikut
;**********************************
;*   PENGOPRASIAN 7SEGMENT                   *
;*   RUDI SETIAWAN                                        *
;*   14 MARET 2014                                        *
;**********************************

cacah equ -10000                             ;cacah nilainya sama dengan -10000
org 0h                                                   ;wajib ditulis menandakan bahwa program dimulai dari alamat 00h
mov tmod,#01h                                                ;menggunakan timer mode 1

utama:                                                  ;inisial "utama"
call tunda                                             ;memanggil sub rutin tunda
sjmp utama                                        ;melompat ke inisial utama
naik:                                                      ;inisial "naik"
mov r3,#10                                         ;mengisi register r3 dengan data 10
                mov dptr, #data_naik    ;mengisi DPTR dengan kumpulan data ber inisial data_naik
isi:           clr a                                        ;inisial "isi" dan membersihkan register a
                movc a,@a+dptr              ;memindah data pertama pada DPTR ke register a
                mov p3,a                             ;menampilkan data dengan memindah ini a ke port P3
                inc dptr                                 ;menaikkan data pada dptr nenjadi data kedua
                acall tunda                          ;melakukan penundaan agar terlihat panggil tunda
                djnz r3,isi                             ;jika r3 belim 0 lompat ke inisial isi
                sjmp naik                             ;lompat ke inisial "naik"
               
turun:                                                   ;inisial "turun"
mov r3,#10                                         ;mengisi register r3 dengan data 10
                mov dptr, #data_turun ;mengisi DPTR dengan kumpulan data ber inisial data_turun
isi1:        clr a                                        ;inisial "isi1" dan membersihkan register a
                movc a,@a+dptr              ;memindah data pertama pada DPTR ke register a
                mov p3,a                             ;menampilkan data dengan memindah ini a ke port P3
                inc dptr                                 ;menaikkan data pada dptr nenjadi data kedua
                acall tunda                          ;melakukan penundaan agar terlihat panggil tunda
                djnz r3,isi1                           ;jika r3 belim 0 lompat ke inisial isi1
                sjmp turun                          ;lompat ke inisial "turun"
               
mati: mov p3,#0ffh                         ;mengisi port P3 dengan data ffh
                acall tunda                          ;melakukan penundaan agar terlihat panggil tunda
                sjmp mati                            ;lompat ke inisial "mati"
               
tunda:   mov R1,#50                        ;mengisi r1 dengan 50 yang tadinya 100,   menjadi setengahnya
lagi:mov th0,#high cacah              ;mengisi th0 dengan nilai cacah (diatas tadi)
                mov tl0,#low cacah         ;mengisi tl0 dengan nilai cacah low berarti 0
                setb tr0                                                ;mengeset kondisi tr0 berkondisi 1
tunggu:                jnb tf0,tunggu                   ;jika tf0 belum 0 maka melompat ke tunggu jika sudah 0 maka lanjut
                clr tf0                                     ;membersihkan data pada tf0
                clr tr0                                     ;membersihkan data pada tr0
djnz R1,lagi                                         ;mengulang sejumlah nilai r1 belum 0 maka lompat ke lagi.
                jnb p2.0,naik                      ;jika p2.0 bernilai 0 maka melompat ke inisial naik
                jnb p2.1,turun                   ;jika p2.1 bernilai 0 maka melompat ke inisial turun
                jnb p2.2,mati                     ;jika p2.1 bernilai 0 maka melompat ke inisial mati
                ret                                          ;program sub rutin tunda selesai kembali ke program utama
               
data_naik:
                db 0c0h, 0f9h, 0a4h, 0b0h, 099h, 092h, 082h, 0f8h, 080h, 090h

data_turun:
                db 090h, 080h, 0f8h, 082h, 092h, 099h, 0b0h, 0a4h, 0f9h, 0c0h       
end                                                        ;tanda bahwa program selesai di tulis

catatan, tentu anda bingung kenapa datanya tidak ditulis seperti pada awal dulu satu persatu. Kali ini kita gunakan DPTR dimana datanya ditampung dalam bentuk inisial dan ditulis memanjang. Jadi makin simple kan. Tentu bgi anda yang awam masih binung kok datanya tidak 1 dan 0. Nah begini penjelasannya.
Missal data 00001100b   jika ditulis dalam hexa decimal maka menjadi 00ch
Jika kita menggunakan data biner maka bagian belakan gharus diberi tambahan _ _ _ _ _ _ _ _b

Jika kita menggunakan data hexa decimal maka tambahan 0 didepan dan h dibelakang 0 _ _h

Kali ini kita akan membagas bagaimana cara menyalakan 4 buah segment dengan 2 port caranya dengan menyalakan bergantian dalam waktu yang cepat sehingga kita akan melihat 4 segmant menyala bersamaan padahal menyalanya bergantian. Nah kita gunakan sumulasi yang disertakan dalam CD.


IMG LOADING

Programmnya sebagai berikut kita akan menampilkan angka 0 1 2 3 sekaligus.

;**********************************
;* menyalakan 4x 7segment C anoda         *
;*   rudi setiawan                                            *
;*   14 maret 2014                                          *
;**********************************
org 0h
mulai: mov p3,#0c0h                      ;keluarkan data angka 0
clr p0.4                                                  ;hidupkan common 1
call delay                                              ;tunda sebentar
setb p0.4                                             ;matikan common
call delay                                              ;tunda sebentar
mov p3,#0f9h                                    ;keluarkan data angka 1
clr p0.5
call delay
setb p0.5
call delay
mov p3,#0a4h                                   ;keluarkan data angka 2
clr p0.6
call delay
setb p0.6
call delay
mov p3,#0b0h                                   ;keluarkan data angka 3
clr p0.7
call delay
setb p0.7
call delay
ajmp mulai
delay:                                                    ;tunda ini digunakan agar 7segment kelihatan
mov r1,#1                                            ;menyala bersamaan
delay1:
djnz r0,$
djnz r1,delay1
ret
end

sebagian tidak saya tulis penjelasannya karena telah dijelaskan pada program sebelumnya. Nah program ini bisa di aplikasikan untuk membuat jam digitall dan running teks. Selamat mencoba.                     

Selanjutnya kita akan melakukan eksperimen untuk mengontrol motor dengan emnggunakan tombol untuk perintah maju mundur dan stop. Nah untuk pengembangannya bisa digunakan untuk membuat robor line follower dan robit lain yang menggunakan system gerak motor langsung aja kita ke program. Sebelumnya kita gunakan simulasi LIGHTNINGINO_AS51 atau kalau ingin langsung ke board LIGHTNINGIINO_AS51 juga bisa. Langsung 

IMG LOADING

Program sebagai berikut dengan output yang dipakai p3.0 dan p3.1 dan tombol p2.0,mundur ; p2.1,maju ; p2.2,mati
;*************************************
;* MOTOR MAJU MUNDUR DENGAN TOMBOL*
;*   rudi setiawan                                                        *
;*   14 maret 2014                                                       *
;*************************************
cacah equ -10000                             ;cacah nilainya sama dengan -10000
org 0h                                                   ;wajib ditulis menandakan bahwa program dimulai dari alamat 00h
mov tmod,#01h                                                ;menggunakan timer mode 1

utama:                                                  ;inisial "utama"
call tunda                                             ;memanggil sub rutin tunda
sjmp utama                                        ;melompat ke inisial utama

maju:                                                    ;inisial "maju"
                mov p3,#11111101b        ;yang digunakan 2 digit terakhir mengaktifkan transistor
                mov p1,#11111101b        ;menampilkan data pada LED port p1
                acall tunda                          ;melakukan penundaan agar terlihat panggil tunda
                sjmp maju                           ;lompat ke inisial "maju"
               
mundur:                                              ;inisial "mundur"
                mov p3,#11111110b        ;yang digunakan 2 digit terakhir mengaktifkan transistor
                mov p1,#11111110b        ;menampilkan data pada LED port p1
                acall tunda                          ;melakukan penundaan agar terlihat panggil tunda
                sjmp mundur                     ;lompat ke inisial "mundur"
               
mati: mov p3,#0ffh                         ;mengisi port P3 dengan data ffh motor mati
                acall tunda                          ;melakukan penundaan agar terlihat panggil tunda
                sjmp mati                            ;lompat ke inisial "mati"
               
tunda:   mov R1,#10                        ;mengisi r1 dengan 10 SEKEDAR MEMBERI TUNDA
lagi:mov th0,#high cacah              ;mengisi th0 dengan nilai cacah (diatas tadi)
                mov tl0,#low cacah         ;mengisi tl0 dengan nilai cacah low berarti 0
                setb tr0                                                ;mengeset kondisi tr0 berkondisi 1
tunggu:                jnb tf0,tunggu                   ;jika tf0 belum 0 maka melompat ke tunggu jika sudah 0 maka lanjut       clr tf0                                     ;membersihkan data pada tf0
                clr tr0                                     ;membersihkan data pada tr0
djnz R1,lagi                                         ;mengulang sejumlah nilai r1 belum 0 maka lompat ke lagi. atau 100 kali sesuai nilai r1
                jnb p2.0,mundur              ;jika p2.0 bernilai 0 maka melompat ke inisial maju
                jnb p2.1,maju                    ;jika p2.1 bernilai 0 maka melompat ke inisial mati
                jnb p2.2,mati
                ret                                          ;program sub rutin tunda selesai kembali ke program utama            
end                                                        ;tanda bahwa program selesai di tulis

wah lanjutin lagi ya eksperimennya sekarang kita coba untuk buat simulasi lampu perempatan yang pernah saya buat juga waktu ujian UKK SMK. Kita gunakan p2.0 sebagai start dan p2.1 sebagai SPOT. Gambar rangkaian dan simulasinya sebagai berikut, tetap menggunakan simulasi yang sama. Atau jika menggunakan LIGHTNINGINO_AS51 bisa langsung dilihat hasilnya.


IMG LOADING


;*************************************
;* MOTOR MAJU MUNDUR DENGAN TOMBOL*
;*   rudi setiawan                                                        *
;*   14 maret 2014                                                       *
;*************************************

ratusan equ 10
cacah equ -10000
org 0h
mov tmod,#01h
;############siap menerima instruksi#####
SIAP:
call tunda
sjmp siap

;#######program utama penambilan data####
start:
mov p1,#11110110b
mov p3,#11110110b
mov p1,#11110011b
call tunda_hijau
mov p1,#11110101b
call tunda_kuning
mov p1,#11110110b
call tunda_merah
mov p1,#11011110b
call tunda_hijau
mov p1,#11101110b
call tunda_kuning
mov p1,#11110110b
call tunda_merah
mov p3,#11011110b
call tunda_hijau
mov p3,#11101110b
call tunda_kuning
mov p3,#11110110b
call tunda_merah
mov p3,#11110011b
call tunda_hijau
mov p3,#11110101b
call tunda_kuning
mov p3,#11110110b
call tunda_merah
sjmp start

;######program pengunci untuk stop#####
stop:
mov p1,#0ffh
mov p3,#0ffh
acall tunda
mov p1,#00h
mov p3,#00h
acall tunda
sjmp stop

;#########program penundaan waktu######
tunda:   mov r2,#10
bounching:         mov R1,#ratusan
lagi:        mov th0,#high cacah
                mov tl0,#low cacah
                setb tr0
tunggu:                jnb tf0,tunggu
                clr tf0
                clr tr0
                djnz R1,lagi
                jnb p2.1,stop
                jnb p2.0,start
                mov p2,#0ffh
                djnz r2,bounching
                ret
               
                tunda_hijau:
                mov r3,#5
ulang1: acall tunda
                djnz r3,ulang1
                ret
tunda_kuning:
                mov r3,#2
ulang2: acall tunda
                djnz r3,ulang2
                ret
tunda_merah:
                mov r3,#2
ulang3: acall tunda
                djnz r3,ulang3
                ret

                end


untuk program saya kira sudah tidak perlu dijelaskan lagi kan. ini mengunakan instruksi dasar semua. Selamat mencoba. Nah ini bisa ditambahkan dengan penghitung waktu mundur dengan memanfaatkan segment yang ada pada LIGHTNINGINO_AS51.

Sampai disini dulu sahabat kalau mau gak galau silahkan kunjungi kami di WWW.lightningplayen.blogspot.com

KIT LIGHTNINGINO AS_51 bisa didapatkan di
                www.facebook.com/elektroshop
                rudi => 089 679 132 022

0 komentar:

http://www.resepkuekeringku.com/2014/11/resep-donat-empuk-ala-dunkin-donut.html http://www.resepkuekeringku.com/2015/03/resep-kue-cubit-coklat-enak-dan-sederhana.html http://www.resepkuekeringku.com/2014/10/resep-donat-kentang-empuk-lembut-dan-enak.html http://www.resepkuekeringku.com/2014/07/resep-es-krim-goreng-coklat-kriuk-mudah-dan-sederhana-dengan-saus-strawberry.html http://www.resepkuekeringku.com/2014/06/resep-kue-es-krim-goreng-enak-dan-mudah.html http://www.resepkuekeringku.com/2014/09/resep-bolu-karamel-panggang-sarang-semut-lembut.html