Translate

Tampilkan postingan dengan label permainan. Tampilkan semua postingan
Tampilkan postingan dengan label permainan. Tampilkan semua postingan

Antarmuka I2C Untuk Memori AT24C32/64



Pada artikel sebelumnya, penulis sudah pernah membahas mengenai memori AT24C512. Maka kali ini akan penulis bahas mengenai memori sejenis yang memiliki kapasitas lebih kecil yaitu AT24C32 dan AT24C64. Sebenarnya secara pemrograman, kedua IC memori ini hampir sama persis dengan AT24C512 hanya ada beberapa perbedaan terutama pada kapasitas; besarnya byte pada prosedur PageWrite yaitu hanya 32 saja; waktu proses penulisan tWC yang hanya 10/5 ms; dan tentunya pin alamatnya yaitu A2, A1 dan A0.

Ini adalah 2 dari produk memori keluaran dari Atmel yaitu AT24C32 yang memiliki kapasitas sebesar 32.768 bit atau 4.096 byte dalam setiap kemasannya dan AT24C64 dengan kapasitas 65.536 bit atau 8.192 byte. Memori yang dikemas cukup efisien dalam penggunaan pin dalam antarmuka dengan mikrokontroler. Dikenal dengan nama 2-wire Serial EEPROM menggunakan teknologi I2C.


Untuk antarmuka dengan mikrokontroler, AT24C32/64 memiliki 2 pin SCL (serial clock) dan SDA (serial data). Operasi antarmuka yang dijalankan menurut kaidah I2C. Memori ini juga memiliki pin untuk tujuan pengalamatan yaitu A2, A1 dan A0 sehingga memungkinkan untuk penggunaan secara paralel hingga 8 unit sekaligus. Kita dapat merakit secara paralel memori ini dengan antarmuka I2C untuk mendapatkan maksimal sebesar 32 kByte untuk AT24C32 dan 64 kByte untuk AT24C64. Memori ini juga dilengkapi dengan pengaman terjadi kesalahan prosedur yang dapat menghilangkan isinya yaitu memiliki pin WP (write protect) di mana jika pin ini dihubungkan ke catu (Vcc) maka operasi tulis akan diabaikan.

Secara internal memori AT24C32/64 memiliki alamat 1010H pada MSB yang harus ditambahkan pada saat melakukan operasi pengalamatan diikuti oleh alamat sesuai dengan pin A2, A1 dan A0. Format pengalamatan unit memori ini dapat dilihat di bawah ini.


AT24C32/64 memiliki prosedur yang dapat dijalankan untuk operasi baca maupun tulis. Pada operasi menulis sendiri disediakan 2 mode yaitu Byte Write atau penulisan isi memori per-byte dan Page Write yaitu penulisan memori secara perhalaman dengan jumlah data perhalaman adalah 32 byte. Pada penulisan WordAddress yang terdiri dari 2 byte maka pada AT24C64, bit yang bertanda (*) adalah diabaikan karena memori jenis ini hanya memiliki alamat memori dari 0000H sampai 1FFFH. Sementara untuk AT24C32, bit yang bertanda (#) juga diabaikan karena memori jenis ini hanya memiliki alamat memori dari 0000H sampai 0FFFH saja.


Untuk melakukan prosedur baca tulis pada memori AT24C32/64 maka diperlukan program seperti di bawah ini. Isi dari program sama persis dengan AT24C512 yang sudah dibahas pada artikel sebelumnya. Karena sebab tersebut maka penulis melakukan sedikit perubahan pada beberapa bagian yaitu angka 512 untuk AT24C512 diganti 32 untuk AT24C32 dan 64 untuk AT24C64 dan beberapa catatan tentang apa saja yang perlu diubah dari list program di bawah ini.

Kita mulai pembahasan dengan subrutin AT24C32_Write yang dijalankan untuk menulis dalam mode single byte maupun page write. Untuk itu ada beberapa register yang harus ditetapkan. Register B diperlukan untuk menentukan alamat unit, karena AT24C32/64 memiliki alamat unit 2 bit (A2, A1 dan A0) maka nilai B bisa berisi antara 00H sampai 07H. Register akumulator (ACC) digunakan untuk menentukan banyaknya byte yang akan ditulis. Register R0 digunakan untuk menunjukkan data yang akan disimpan. Dan register DPTR untuk menentukan alamat memori dari AT24C32/64.

AT24C32_Write:

;     Input : B    > Unit Address
;             ACC  > Length Data, max 32 byte
;             R0   > Buffer Data
;             DPTR > Memory Address

Catatan:

Untuk memori AT24C64 subrutin AT24C32_Write di atas bisa diganti dengan AT24C64_Write.

Rutin AT24C32_Write selanjutnya akan menjalankan program dengan menyimpan banyaknya data yang akan ditulis dari akumulator ke register R7. Kemudian register B akan dimanipulasi ke akumulator dengan menambahkan nibel MSB dari AT24C32/64 yaitu 1010H. Karena proses menulis maka bit 0 akan dinolkan. Proses selanjutnya adalah mengirim Device Address dan Word Address di mana panjang word address adalah 2 byte. Setiap pengiriman byte data maka nilai bit FACK akan senantiasa diperiksa untuk memeriksa kesalahan unit memori.

      push  07h
      push  06h
      push  05h
      mov   r7, a
      acall I2C_Start_Con
      mov   a, b
      orl   a, #10100000b
      acall Master_Tx
      jnb   FACK, EndC32Write
      mov   a, dph
      acall Master_Tx
      jnb   FACK, EndC32Write
      mov   a, dpl
      acall Master_Tx
      jnb   FACK, EndC32Write

Sekarang memori AT24C32/64 siap untuk menerima data yang berasal dari register R0. Banyaknya data yang ditulis ditentukan oleh nilai register R7. Pada setiap byte yang ditulis, unit memori membutuhkan waktu (tWR) untuk proses penyimpanan selama kurang lebih 5 ms. Setelah seluruh data selesai ditulis maka akan diakhiri dengan memanggil subrutin I2C_Stop_Con.

      PageWrite:
            mov   a, @r0
            inc   r0
            acall Master_Tx
            jnb   FACK, EndPageWrite
            acall AT24C32_WriteDelay
            djnz  r7, PageWrite

            EndC32Write:
                  acall I2C_Stop_Con
                  pop   05h
                  pop   06h
                  pop   07h
                  ret

Untuk memberikan waktu bagi AT24C32/64 memproses penyimpana data maka diperlukan penundaan tWR selama kurang lebih 5 ms dengan subrutin penunda AT24C32_WriteDelay berikut.

            AT24C32_WriteDelay:
                  mov   r6, #10    

                  WriteDelay:
                        mov   r5, #250
                        djnz  r5, $
                        djnz  r6, WriteDelay
                        ret

Catatan:

Untuk penggunaan catu daya bagi memori dengan tegangan 1,8 volt maka sesuai referensi dari datasheet maka waktu tWR setidaknya 10 ms. Untuk itu nilai register R6 harus 20.

Nah, selanjutnya kita akan membahas mengenai pembacaan isi memori AT24C32/64. Register yang digunakan masih sama hanya saja fungsi register R0 di sini digunakan untuk menyimpan data dari memori. Prosedur berikutnya masih sama dengan proses menulis untuk pengiriman Device Address dan 2 byte WordAddress.

AT24C32_Read:

;     Input : B    > Unit Address
;             ACC  > Length Data, max buffer size
;             DPTR > Memory Address
;     Output      : R0   < Buffer Data

      push  07h
      mov   r7, a
      acall I2C_Start_Con
      mov   a, b
      orl   a, #10100000b
      acall Master_Tx
      jnb   FACK, EndC32Read
      mov   a, dph
      acall Master_Tx
      jnb   FACK, EndC32Read
      mov   a, dpl
      acall Master_Tx
      jnb   FACK, EndC32Read

Untuk proses membaca, kita perlu mengirimkan kembali perintah I2C_Start_Con dilanjutkan dengan mengirin DeviceAddress. Pada prosedur pembacaan maka nilai bit FLB (flag last bit) digunakan untuk menentukan proses karena pada setelah pembacaan byte terakhir, tidak akan mengirimkan sinyak Acknowledge.

      acall I2C_Start_Con
      mov   a, b
      orl   a, #10100001b
      acall Master_Tx
      jnb   FACK, EndC32Read
      clr   FLB

      SequentialRead:
            djnz  r7, SeqRead
            setb  FLB

            SeqRead:
                  acall Master_Rx
                  mov   @r0, a
                  inc   r0
                  jb    FLB, EndC32Read
                  ajmp  SequentialRead

      EndC32Read:
            acall I2C_Stop_Con
            pop   07h
            ret

Berikut adalah subrutin yang digunakan untuk me-reset memori pada beberapa kondisi seperti setelah protokol interupsi, power loss atau reset sistem. Prosedur reset hanyalah memberikan pulsa clock SCL sebanyak 9 kali dengan kondisi SDA tinggi. Dalam beberapa penerapan, penulis jarang menggunakan subrutin ini tapi untuk mengikuti prosedur sebaiknya digunakan.

AT24C32_Reset:
      push  07h
      push  06h
      setb  SDA
      mov   r7, #9

      Reset512:
            clr   SCL
            mov   r6, #2
            djnz  r6, $
            setb  SCL
            mov   r6, #2
            djnz  r6, $
            djnz  r7, Reset32
            jb    SDA, End512Reset
;           setb  Fail

      End32Reset:
            pop   06h
            pop   07h
            ret

Program di atas penulis masukkan dalam file bernama AT24C32.TXT untuk modul subrutin AT24C32 dan AT24C64.TXT untuk AT24C64 dengan atau tanpa perubahan agar dapat digunakan pada aplikasi lainnya.

Agar Sobat tidak bingung, aku lampirkan list program untuk I2C.TXT yang sudah pernah kutulis pada artikel “Antarmuka Dengan Protokol I2C” sebelumnya dapat dilihat berikut ini:

I2C_Check_Con:
      jb    SCL, SlaveReady
      clr   FSRDY
      ret

      SlaveReady:
            setb  FSRDY
            ret

I2C_Start_Con:
      clr   SCL
      setb  SDA
      setb  SCL
      clr   SDA
      acall Delay5us
      ret

I2C_Stop_Con:
      clr   SCL
      CLR   SDA
      acall Delay3us
      setb  SCL
      setb  SDA
      nop

Delay5us:
      nop

Delay3us:
      ret

Master_Tx:

;     Input : ACC > Data

      push  07h
      push  acc
      mov   r7, #8

      TxD_High:
            clr   SCL
            rlc   a
            jnc   TxD_Low
            setb  SDA
            ajmp  TxD_Pulse

      TxD_Low:
            clr   SDA

            TxD_Pulse:
                  setb  SCL
                  acall Delay3us
                  djnz  r7, TxD_High
                  clr   SCL
                  setb  SDA
                  acall Delay3us
                  setb  SCL
                  jnb   SDA, TxD_Ack
                  clr   FACK
                  ajmp  MTx_End

            TxD_Ack:
                  setb  FACK

      MTx_End:
            pop   acc
            pop   07h
            ret

Master_Rx:

;     Input  : FLB > 1/0     
;     Output : ACC < Data

      push  07h
      mov   r7, #8
      clr   c

      Next_RxD:
            clr   SCL
            setb  SDA
            acall Delay3us
            setb  SCL
            jnb   SDA, Rxd_Low
            setb  c
            ajmp  Save_RxD
      RxD_Low:
            clr   c

            Save_RxD:
                  rlc   a
                  djnz  r7, Next_Rxd
                  clr   SCL
                  jb    FLB, No_Ack
                  clr   SDA
                  ajmp  Ack_Pulse

            No_Ack:
                  setb  SDA

      Ack_Pulse:
            setb  SCL
            pop   07h
            ret



Sudah ya, terima kasih sudah membaca artikel ini. Semoga apa yang penulis sampaikan bermanfaat dan bisa diterapkan oleh sobat semua.

Salam....


Antarmuka I2C Untuk Memori AT24C512



Ini adalah salah satu produk memori keluaran dari Atmel yang memiliki kapasitas sebesar 524.288 bit atau 65.536 byte dalam setiap kemasannya. Memori yang dikemas cukup efisien dalam penggunaan pin dalam antarmuka dengan mikrokontroler. Dikenal dengan nama 2-wire Serial EEPROM menggunakan teknologi I2C.

  
Untuk antarmuka dengan mikrokontroler, AT24C512 memiliki 2 pin SCL (serial clock) dan SDA (serial data). Operasi antarmuka yang dijalankan menurut kaidah I2C. Memori ini juga memiliki pin untuk tujuan pengalamatan yaitu A1 dan A0 sehingga memungkinkan untuk penggunaan secara paralel hingga 4 unit sekaligus. Kita dapat merakit secara paralel memori ini dengan antarmuka I2C untuk mendapatkan maksimal sebesar 256 kByte. Memori ini juga dilengkapi dengan pengaman terjadi kesalahan prosedur yang dapat menghilangkan isinya yaitu memiliki pin WP (write protect) di mana jika pin ini dihubungkan ke catu (Vcc) maka operasi tulis akan diabaikan.

Secara internal memori AT24C512 memiliki alamat 1010H pada MSB yang harus ditambahkan pada saat melakukan operasi pengalamatan diikuti oleh alamat sesuai dengan pin A1 dan A0. Format pengalamatan unit memori ini dapat dilihat di bawah ini.


AT24C512 memiliki prosedur yang dapat dijalankan untuk operasi baca maupun tulis. Pada operasi menulis sendiri disediakan 2 mode yaitu Byte Write atau penulisan isi memori per-byte dan Page Write yaitu penulisan memori secara perhalaman dengan jumlah data perhalaman adalah 128 byte.

Catatan:

Jika Sobat menggunakan mikrokontroler Seri AT89, sepertinya untuk panjang data sebanyak 128 tidaklah mungkin. Untuk itu perlu sedikit modifikasi aplikasi. Mengenai hal ini mungkin akan kita bahas pada pembuatan sistem pengisi memori seri AT24C yang akan datang.


Untuk melakukan prosedur baca tulis pada memori AT24C512 maka diperlukan program seperti di bawah ini. Kita mulai pembahasan dengan subrutin AT24C512_Write yang dijalankan untuk menulis dalam mode single byte maupun page write. Untuk itu ada beberapa register yang harus ditetapkan. Register B diperlukan untuk menentukan alamat unit, karena AT24C512 memiliki alamat unit 2 bit (A1 dan A0) maka nilai B bisa berisi antara 00H sampai 03H. Register akumulator (ACC) digunakan untuk menentukan banyaknya byte yang akan ditulis. Register R0 digunakan untuk menunjukkan data yang akan disimpan. Dan register DPTR untuk menentukan alamat memori dari AT24C512.

AT24C512_Write:

;     Input : B    > Unit Address
;             ACC  > Length Data, max 128 byte
;             R0   > Buffer Data
;             DPTR > Memory Address

Rutin AT24C512_Write selanjutnya akan menjalankan program dengan menyimpan banyaknya data yang akan ditulis dari akumulator ke register R7. Kemudian register B akan dimanipulasi ke akumulator dengan menambahkan nibel MSB dari AT24C512 yaitu 1010H. Karena proses menulis maka bit 0 akan dinolkan. Proses selanjutnya adalah mengirim Device Address dan Word Address di mana panjang word address adalah 2 byte. Setiap pengiriman byte data maka nilai bit FACK akan senantiasa diperiksa untuk memeriksa kesalahan unit memori.

      push  07h
      push  06h
      push  05h
      mov   r7, a
      acall I2C_Start_Con
      mov   a, b
      orl   a, #10100000b
      acall Master_Tx
      jnb   FACK, EndC512Write
      mov   a, dph
      acall Master_Tx
      jnb   FACK, EndC512Write
      mov   a, dpl
      acall Master_Tx
      jnb   FACK, EndC512Write

Sekarang memori AT24C512 siap untuk menerima data yang berasal dari register R0. Banyaknya data yang ditulis ditentukan oleh nilai register R7. Pada setiap byte yang ditulis, unit memori membutuhkan waktu (tWR) untuk proses penyimpanan selama kurang lebih 10 ms. Setelah seluruh data selesai ditulis maka akan diakhiri dengan memanggil subrutin I2C_Stop_Con.

      PageWrite:
            mov   a, @r0
            inc   r0
            acall Master_Tx
            jnb   FACK, EndPageWrite
            acall AT24C512_WriteDelay
            djnz  r7, PageWrite

            EndC512Write:
                  acall I2C_Stop_Con
                  pop   05h
                  pop   06h
                  pop   07h
                  ret

Untuk memberikan waktu bagi AT24C512 memproses penyimpana data maka diperlukan penundaan tWR selama kurang lebih 10 ms dengan subrutin penunda AT24C512_WriteDelay berikut.

            AT24C512_WriteDelay:
                  mov   r6, #20    

                  WriteDelay:
                        mov   r5, #250
                        djnz  r5, $
                        djnz  r6, WriteDelay
                        ret

Catatan:

Untuk penggunaan catu daya bagi memori dengan tegangan 1,8 volt maka sesuai referensi dari datasheet maka waktu tWR setidaknya 20 ms. Untuk itu nilai register R6 harus 40.

Nah, selanjutnya kita akan membahas mengenai pembacaan isi memori AT24C512. Register yang digunakan masih sama hanya saja fungsi register R0 di sini digunakan untuk menyimpan data dari memori. Prosedur berikutnya masih sama dengan proses menulis untuk pengiriman Device Address dan 2 byte WordAddress.

AT24C512_Read:

;     Input : B    > Unit Address
;             ACC  > Length Data, max buffer size
;             DPTR > Memory Address
;     Output      : R0   < Buffer Data

      push  07h
      mov   r7, a
      acall I2C_Start_Con
      mov   a, b
      orl   a, #10100000b
      acall Master_Tx
      jnb   FACK, EndC512Read
      mov   a, dph
      acall Master_Tx
      jnb   FACK, EndC512Read
      mov   a, dpl
      acall Master_Tx
      jnb   FACK, EndC512Read

Untuk proses membaca, kita perlu mengirimkan kembali perintah I2C_Start_Con dilanjutkan dengan mengirin DeviceAddress. Pada prosedur pembacaan maka nilai bit FLB (flag last bit) digunakan untuk menentukan proses karena pada setelah pembacaan byte terakhir, tidak akan mengirimkan sinyak Acknowledge.

      acall I2C_Start_Con
      mov   a, b
      orl   a, #10100001b
      acall Master_Tx
      jnb   FACK, EndC512Read
      clr   FLB

      SequentialRead:
            djnz  r7, SeqRead
            setb  FLB

            SeqRead:
                  acall Master_Rx
                  mov   @r0, a
                  inc   r0
                  jb    FLB, EndC512Read
                  ajmp  SequentialRead

      EndC512Read:
            acall I2C_Stop_Con
            pop   07h
            ret

Berikut adalah subrutin yang digunakan untuk me-reset memori pada beberapa kondisi seperti setelah protokol interupsi, power loss atau reset sistem. Prosedur reset hanyalah memberikan pulsa clock SCL sebanyak 9 kali dengan kondisi SDA tinggi. Dalam beberapa penerapan, penulis jarang menggunakan subrutin ini tapi untuk mengikuti prosedur sebaiknya digunakan.

AT24C512_Reset:
      push  07h
      push  06h
      setb  SDA
      mov   r7, #9

      Reset512:
            clr   SCL
            mov   r6, #2
            djnz  r6, $
            setb  SCL
            mov   r6, #2
            djnz  r6, $
            djnz  r7, Reset512
            jb    SDA, End512Reset
;           setb  Fail

      End512Reset:
            pop   06h
            pop   07h
            ret

Program di atas penulis masukkan dalam file bernama AT24C512.TXT untuk menjadi modul pada aplikasi lainnya.

Agar Sobat tidak bingung, aku lampirkan list program untuk I2C.TXT yang sudah pernah kutulis pada artikel “Antarmuka Dengan Protokol I2C” sebelumnya dapat dilihat berikut ini:

I2C_Check_Con:
      jb    SCL, SlaveReady
      clr   FSRDY
      ret

      SlaveReady:
            setb  FSRDY
            ret

I2C_Start_Con:
      clr   SCL
      setb  SDA
      setb  SCL
      clr   SDA
      acall Delay5us
      ret

I2C_Stop_Con:
      clr   SCL
      CLR   SDA
      acall Delay3us
      setb  SCL
      setb  SDA
      nop

Delay5us:
      nop

Delay3us:
      ret

Master_Tx:

;     Input : ACC > Data

      push  07h
      push  acc
      mov   r7, #8

      TxD_High:
            clr   SCL
            rlc   a
            jnc   TxD_Low
            setb  SDA
            ajmp  TxD_Pulse

      TxD_Low:
            clr   SDA

            TxD_Pulse:
                  setb  SCL
                  acall Delay3us
                  djnz  r7, TxD_High
                  clr   SCL
                  setb  SDA
                  acall Delay3us
                  setb  SCL
                  jnb   SDA, TxD_Ack
                  clr   FACK
                  ajmp  MTx_End

            TxD_Ack:
                  setb  FACK

      MTx_End:
            pop   acc
            pop   07h
            ret

Master_Rx:

;     Input  : FLB > 1/0     
;     Output : ACC < Data

      push  07h
      mov   r7, #8
      clr   c

      Next_RxD:
            clr   SCL
            setb  SDA
            acall Delay3us
            setb  SCL
            jnb   SDA, Rxd_Low
            setb  c
            ajmp  Save_RxD
      RxD_Low:
            clr   c

            Save_RxD:
                  rlc   a
                  djnz  r7, Next_Rxd
                  clr   SCL
                  jb    FLB, No_Ack
                  clr   SDA
                  ajmp  Ack_Pulse

            No_Ack:
                  setb  SDA

      Ack_Pulse:
            setb  SCL
            pop   07h
            ret



Sudah ya, terima kasih sudah membaca artikel ini. Semoga apa yang penulis sampaikan bermanfaat dan bisa diterapkan oleh sobat semua.

Salam....


Dadu Elektronik Kembar Dengan AT89


Terima kasih kepada Sobat yang sudah membaca artikel yang aku buat.

Aku pernah menulis sebuah artikel mengenai “Membuat Dadu Elektronik Mengenang Masa Lalu” dan ternyata ada beberapa yang merespon tulisan tersebut.

Pada artikel ini, sengaja penulis membahas lagi mengenai pembuatan penampil dadu tetapi akan menampilkan sebanyak 2 buah dadu atau kembar. Tentu saja tidak menggunakan komponen IC TTL atau CMOS standar seperti terdahulu tetapi menggunakan mikrokontroler seri AT89.

Nah, mungkin di antara Sobat lainnya ada yang belum membaca artikel sebelumnya maka berikut sedikit ulasan mengenai apa dan bagaimana dadu elektronik tersebut.

Sebuah kubus dadu memiliki 6 sisi yang masing-masing merepresentasikan angka 1 sampai 6 dalam bentuk noktak seperti gambar berikut ini:

Dari tampilan kubus dadu tersebut secara elektronik hanya ada 4 noktah yang berubah-ubah sesuai penunjukkan nilai dadu yaitu noktah untuk 1, 2, 4 dan 6 sehingga diagram pewaktuannya untuk urutan nilai dadu adalah sebagai berikut:



Diagram pewaktuan tersebutlah yang menjadi dasar dalam pembuatan sebuah penampil dadu elektronik. Setiap peraga dadu membutuhkan sekitar 4 bit. Jadi jika kita ingin membuat beberapa peraga adalah kelipatan jumlah bit-bit yang dibutuhkan. Karena kita akan membuat 2 buah maka yang dibutuhkan adalah 8 bit atau 1 byte saja.

Berikut adalah gambar rangkaian untuk peraga dadu kembar menggunakan AT89C2051. Keluaran peraga dadu menggunakan Port 1 yang terbagi dalam 2 nibel yaitu dadu pertama dengan LSB dan dadu kedua MSB. Port 3.7 digunakan untuk tombol START di mana saat ditekan maka secara internal pencacah akan berjalan dan menampilkan hasil akhir cacahan pada keluarannya saat dilepaskan.



Untuk aplikasi program yang harus dijalankan pada mikrokontroler AT89C2015 dapat Sobat lihat pada daftar program di bawah ini:

                       1    $mod51
0000                   2    org     0

Setelah menetap mode kompilasi untuk MCS-51 dan alamat awal di mana program akan dimulai maka hal pertama adalah menetapkan isi akumulator dengan #00010001B. Merujuk pada diagram pewaktuan di atas maka nilai akumulator akan merepresentasikan keluarah kubus dadu masing-masing dengan menunjukkan angka 1. Nilai akumulator ini harus dikomplemen terlebih dahulu sebelum dipindahkan ke Port 1 untuk ditampilkan karena keluaran dari gerbang ini adalah aktif rendah pada LED.

0000 7488              3            mov     a, #00010001b
0002                   4    Tampilan:
0002 F4                5            cpl     a
0003 F590              6            mov     p1, a

Selanjutnya program menunggu nilai Port 3.7 menjadi rendah atau tombol START ditekan. Jika Port 3.7 rendah maka isi Port 1 akan dipindahkan ke akumulator untuk kemudian dikomplemen dan Port 1 sendiri diisi dengan nilai 0 untuk membuat seluruh LED menyala. Namun jika diinginkan beroperasi menggunakan batere maka saran penulis lebih baik nilai tersebut diganti #255 agar seluruh LED padam sehingga menghemat batere.

0005 20B7FD            7            jb      p3.7, $
0008 E590              8            mov     a, p1
000A F4                9            cpl     a
000B 759000           10            mov     p1, #0

Sebelum melakukan proses pencacahan angka dadu, aplikasi kembali memeriksa nilai Port 3.7 untuk memastikan posisi tombol START, kemudian baru memeriksa Noktah 1 dari dadu pertama yaitu bit ACC.0. Kita anggap nilai akumulator seperti di atas yaitu 00010001B maka program akan melompat ke alamat Dadu12 di mana LSB mewakili nilai dadu pertama 1.

Jika ACC.0 bukan 1 maka program terlebih dahulu memeriksa nilai ACC.3 yaitu noktah 6. Jika ACC.3 bernilai 1 maka berarti nilai dadu pertama sudah menunjuk pada angka 6 dan program akan menuju ke Dadu21. Sementara jika ACC.3 rendah di mana kemungkinan dadu menunjukkan angka 2 atau 4 maka ACC.0 akan diset untuk menunjuk ke angka 3 atau 5.

000E 20B7FD           11    Dadu11: jb      p3.7, $
0011 20E007           12            jb      acc.0, Dadu12
0014 20E318           13            jb      acc.3, Dadu21
0017 D2E0             14            setb    acc.0
0019 010E             15            ajmp    Dadu11

Pada Dadu12 selanjutnya program akan memeriksa ACC.1 atau noktah 2. Jika masih rendah atau berarti angka dadu pertama adalah 1 maka ACC.1 akan diset dan program melompat ke alamat Dadu1 untuk menunjuk angka 2.

001B 20E104           16    Dadu12: jb      acc.1, Dadu14
001E D2E1             17            setb    acc.1
0020 012B             18            ajmp    Dadu1

Sama halnya dengan alamat Dadu14 dan Dadu16 yang menjalankan perintah untuk menampilkan angka dadu pertama menjadi 4 dan 6.

0022 20E204           19    Dadu14: jb      acc.2, Dadu16
0025 D2E2             20            setb    acc.2
0027 012B             21            ajmp    Dadu1
0029 D2E3             22    Dadu16: setb    acc.3
002B C2E0             23    Dadu1:  clr     acc.0
002D 010E             24            ajmp    Dadu11

Program yang diawali oleh Dadu21 akan mereset nilai LSB akumulator dengan nilai 1. Program selanjutnya adalah sama dengan di atas namun untuk memproses nilai dadu kedua yang ditunjuk oleh MSB.

002F 54F0             25    Dadu21: anl     a, #11110000b
0031 4401             26            orl     a, #00000001b
0033 20E407           27            jb      acc.4, Dadu22
0036 20E718           28            jb      acc.7, Reset
0039 D2E4             29            setb    acc.4
003B 010E             30            ajmp    Dadu11
003D 20E504           31    Dadu22: jb      acc.5, Dadu24
0040 D2E5             32            setb    acc.5
0042 014D             33            ajmp    Dadu2
0044 20E604           34    Dadu24: jb      acc.6, Dadu26
0047 D2E6             35            setb    acc.6
0049 014D             36            ajmp    Dadu2
004B D2E7             37    Dadu26: setb    acc.7
004D C2E4             38    Dadu2:  clr     acc.4
004F 010E             39            ajmp    Dadu11
0051 7411             40    Reset:  mov     a, #00010001b
0053 010E             41            ajmp    Dadu11
                      42    end

Rangkaian dadu di atas dapat bekerja pada tegangan 3 volt sehingga bisa dicatu menggunakan 2 buah batere jenis AA, AAA. Jika Sobat menggunakan AT89C2051 maka akan menarik arus sekitar 5,5 mA sementara jika menggunakan AT89S2051 hanya membutuhkan 3,5 mA. Untuk masing-masing LED membutuhkan arus sekitar 3 mA dan beban tertinggi adalah saat menampilkan nilai dadu 6 sebanyak 12 LED sehingga beban untuk LED menjadi 36 mA.

Nah, Sobat bisa menempatkannya pada kotak sehingga mudah dibawa kemana-mana.



Udah ya, makasih udah baca postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan oleh sobat semua.

Salam....