cara mudah membuat sendiri jam digital atmega8

membuat jam Digital Atmega8 dengan ukuran Seven Segment 1" rasanya cocok. kebetulan stok Atmega8A SMD masih ada, bisa untuk membuat jam Digital mini yang nantinya bisa dipasang di dinding. ada juga pemikiran nantinya aku masukan ke Jam Analog Dinding yang sudah rusak.

sebelum terjun ke pembuatan yang sesungguhnya seperti biasa aku simulasikan di Proteus. setelah software berjalan dengan baik baru melangkah ke perancangan PCB. berikut hasil uji Software menggunakan Proteus

Atmega8A masih mampu mendrive langsung Seven Segment dengan ukuran 1" ini, jadi kita tidak memerlukan transistor untuk penguat. akan tetapi cukup menambahkan resistor 8 buah dengan ukuran 100 - 500 Ohm, tergantung dari kecerahan yang diinginkan. pakai saja 100 Ohm untuk kecerahan yang normal.
dalam skem diatas resistor tidak digambarkan. silahkan modifikasi sendiri. ke 8 resistor dipasang di PORTB.

MEMBUAT JAM DIGITAL ATMEGA8
skema Jam Digital Atmega8A
aku mengiginkan ukuran yang kompak dengan ukuran PCB yang menyesuaikan luas Seven Segment. mau tidak mau harus menggunakan PCB Double Layer. seperti biasa aku selalu merancang PCB memakai Proteus. berikut hasil rancanganku

MEMBUAT JAM DIGITAL ATMEGA8
Layout PCB Jam Digital Atmega8A

tentunya anda tidak harus memakai PCB double layer seperti diatas. silahkan memakai PCB single dengan konsekuensi ukuran PCB akan membengkak.

tidak juga harus memakai Atmega8A SMD, silahkan jika memakai Atmega8A yg biasa (DIP).

rasanya kurang menarik kalau hanya sebagai Jam Digital saja. untuk itu bisa ditambahkan Alarm yang bisa diprogram. untuk tanda detik memanfaatkan koma (dp) yang ada di Seven Segment. sehingga Seven Segment yang belakang harus dibalik, otomatis kaki-kaki Seven Segment polaritasnya (a,b,c,d,e,f,g,dp) harus disesuaikan juga.

MEMBUAT JAM DIGITAL ATMEGA8
tampak depan

sebaiknya dikasih soket untuk Seven Segmentnya. shingga bisa dilepas/pasang.


MEMBUAT JAM DIGITAL ATMEGA8
tampak belakang

MEMBUAT JAM DIGITAL ATMEGA8
tampak miring

MEMBUAT JAM DIGITAL ATMEGA8
dari depan

berikut kode cara merakit jam digital atmega8 dalam bahasa Basic (BascomAVR)

'jam digital
'atmega8a
'by fauzi hp

Config Timer0 = Timer , Prescale = 64
On Ovf0 Tim0_isr
Enable Timer0
Enable Interrupts

'buat PORTC & PORTD sbg output
Config Portc = Input
Config Portb = Output

Portc = &B11
Ddrd = &B10011111
Portd = &B01000000

'pengaturan kaki RTC, menyesuaikan kaki RTC dgn kaki Mikrokontroler
Config Sda = Portc.2
Config Scl = Portc.3

'alamat device RTC, setiap perangkat I2C mempunyai alamat device berbeda-beda
'kebetulan untuk IC Jam RTC alamatnya "&HD0" untuk operasi Write dan &HD1 untuk
'operasi Read
Const Ds1307w = &HD0
Const Ds1307r = &HD1

Config Clock = User

'variabel2 yg diperlukan
Dim Weekday As Byte
Dim Digit As Byte
Dim Satdetik As Byte
Dim Puldetik As Byte
Dim Satmin As Byte
Dim Pulmin As Byte
Dim Satjam As Byte
Dim Puljam As Byte
Dim M0 As Bit
Dim M1 As Bit , M2 As Bit , M3 As Bit , M4 As Bit
Dim Jam As Byte , Jams As Byte
Dim Menit As Byte , Menits As Byte
Dim Ctrbzr As Word
Dim Bzr As Bit
Dim Aljam As Byte , Almen As Byte
Dim Disp As Bit
Dim Satmintmr As Byte , Pulmintmr As Byte
Dim Satjamtmr As Byte , Puljamtmr As Byte
Dim Alrmjam As Byte , Alrmmin As Byte
Dim Aljamadr As Byte , Alminadr As Byte
Dim Kedip As Byte
Dim Kdp As Bit

Dim Satsuhu As Byte , Pulsuhu As Byte , Suhu As Byte
Dim Temp As Single
Dim Vadc As Word
Dim Tamp As Bit
Dim Dlytemp As Word
Dim Jamsuhu As Word
Dim Komsuh As Byte
Dim Satkom As Byte , Pulkom As Byte

Alminadr = 1
Aljamadr = 2

If Pinc.0 = 0 Then
   Time$ = "14:01:59"
   Date$ = "12-10-15"
End If

'aktifkan detik di RTC
I2cstart
I2cwbyte Ds1307w
I2cwbyte 7
I2cwbyte &B00010000
I2cstop

Readeeprom Aljam , Aljamadr
Readeeprom Almen , Alminadr

Do

Loop

End

Tim0_isr:
   'pemanggilan subrutin baca RTC
   Gosub Getdatetime
   'ambil nilai satuan & puluhan detik
   Satdetik = _sec And &B00001111
   Rotate _sec , Right , 4
   Puldetik = _sec And &B00001111

   'ambil nilai satuan & puluhan menit
   Satmin = _min And &B00001111
   Rotate _min , Right , 4
   Pulmin = _min And &B00001111

   'ambil nilai satuan & puluhan jam
   Satjam = _hour And &B00001111
   Rotate _hour , Right , 4
   Puljam = _hour And &B00001111

   'konversi data alarm jam ke bcd untuk ditampilkan di 7S
   Alrmjam = Makebcd(aljam)
   Satjamtmr = Alrmjam And &B00001111
   Rotate Alrmjam , Right , 4
   Puljamtmr = Alrmjam And &B00001111
   'konversi data alarm menit ke bcd untuk ditampilkan di 7S
   Alrmmin = Makebcd(almen)
   Satmintmr = Alrmmin And &B00001111
   Rotate Alrmmin , Right , 4
   Pulmintmr = Alrmmin And &B00001111

   'alarm 1
   If Jam = Aljam Then
   If Menit = Almen Then
      Incr Ctrbzr
      If Ctrbzr = 128 Then
         Ctrbzr = 0
         Toggle Bzr
      End If
      'bagian yg menyalakan buzer
      If Bzr = 1 Then
      Set Portd.7
         Else
            Reset Portd.7
      End If
   End If
   End If

   'mencocokan jam, menggunakan tombol yg terpasang di PORTB.0
   If Disp = 0 Then
   If Pinc.0 = 0 Then
      If M0 = 0 Then
         M0 = 1
         Tamp = 0
         Incr Jam
         If Jam = 24 Then
            Jam = 0
         End If

         'karena format data di RTC adalah BCD, maka ubah dulu ke BCD
         Jams = Makebcd(jam)

         'kemudian kirim data tersebut menggunakan protokol I2C (SCL & SDA)
         I2cstart
         I2cwbyte Ds1307w
         I2cwbyte 2                                         'alamat jam di RTC
         I2cwbyte Jams
         I2cstop
      End If
         Else
            M0 = 0
   End If
   End If

   'mencocokan menit, menggunakan tombol yg terpasang di PORTB.1
   If Disp = 0 Then
   If Pinc.1 = 0 Then
      If M1 = 0 Then
         Tamp = 0
         M1 = 1
         Incr Menit
         If Menit = 60 Then
            Menit = 0
         End If

         'karena format data di RTC adalah BCD, maka ubah dulu ke BCD
         Menits = Makebcd(menit)

         'kemudian kirim data tersebut menggunakan protokol I2C (SCL & SDA)
         I2cstart
         I2cwbyte Ds1307w
         I2cwbyte 1                                         'alamat menit di RTC
         I2cwbyte Menits
         I2cstop
      End If
          Else
            M1 = 0
   End If
   End If

   'menaikan timer
   If Disp = 1 Then
   If Pinc.0 = 0 Then
      If M3 = 0 Then
         M3 = 1
         Incr Aljam
         If Aljam = 24 Then
            Aljam = 0
         End If
         Writeeeprom Aljam , Aljamadr
      End If
         Else
            M3 = 0
   End If
   End If

   'menurunkan timer
   If Disp = 1 Then
   If Pinc.1 = 0 Then
      If M4 = 0 Then
         M4 = 1
         Incr Almen
         If Almen = 60 Then
            Almen = 0
         End If
         Writeeeprom Almen , Alminadr
      End If
          Else
            M4 = 0
   End If
   End If

   'tobol memilih jam/set timer
   If Pind.6 = 0 Then
      If M2 = 0 Then
         M2 = 1
         Toggle Disp
      End If
         Else
            M2 = 0
   End If

   Incr Jamsuhu
   If Jamsuhu = 2500 Then
      'Toggle Tamp
      If Tamp = 1 Then
         Jamsuhu = 1800
            Else
               Jamsuhu = 0
      End If
   End If

   'reset port scaning 7 segmen, biar tampilan halus/benar
   Reset Portd.0
   Reset Portd.1
   Reset Portd.2
   Reset Portd.3

   'bagian yang menampilkan jam/menit/detik & suhu
   If Disp = 0 Then
   If Tamp = 0 Then
         Select Case Digit
            Case 0:
               If Puljam = 0 Then
                  Portb = &B11111111
                     Else
                        Portb = Lookup(puljam , 7seg)
               End If

               Set Portd.0
            Case 1:
               Portb = Lookup(satjam , 7seg)
               If Pinc.4 = 1 Then
                  Reset Portb.7
                     Else
                        Set Portb.7
               End If
               Set Portd.1
            Case 2:
               Portb = Lookup(pulmin , 7seg)
               If Pinc.4 = 1 Then
                  Reset Portb.7
                     Else
                        Set Portb.7
               End If
               Set Portd.2
            Case 3:
               Portb = Lookup(satmin , 7seg)
               Set Portd.3
         End Select
   End If

   If Tamp = 1 Then
         Select Case Digit
            Case 0:
               Portb = Lookup(pulsuhu , 7seg)
               Set Portd.0
            Case 1:
               Portb = Lookup(satsuhu , 7seg)
               Reset Portb.7
               Set Portd.1
            Case 2:
               Portb = Lookup(satkom , 7seg)
               Set Portd.2
            Case 3:
               Portb = &B00100111
               Set Portd.3
         End Select
   End If
   End If

   'bagian yg menampilkan data alarm ketika menseting alarm
   If Disp = 1 Then
   Select Case Digit
      Case 0:
         Portb = Lookup(pulmintmr , 7seg)
         Set Portd.0
      Case 1:
         Portb = Lookup(satmintmr , 7seg)
         Set Portd.1
      Case 2:
         Portb = Lookup(puljamtmr , 7seg)
         Set Portd.2
      Case 3:
         Portb = Lookup(satjamtmr , 7seg)
         Set Portd.3
   End Select
   End If

   'naikan digit,akan tetapi dibatasi sampai 4 Saja(sesuai Jumlah 7 Seg)
   Incr Digit
   If Digit = 4 Then
      Digit = 0
   End If
Return


'data konversi BCD to 7 segmen harus diletakan di ROM/FLASH Memory, untuk itu data
'ini ditulis diluar code utama
7seg:
Data &B11000000                                             'angka 0
Data &B11111001                                             'angka 1
Data &B10100100                                             'angka 2
Data &B10110000                                             'angka 3
Data &B10011001                                             'angka 4
Data &B10010010                                             'angka 5
Data &B10000010                                             'angka 6
Data &B11111000                                             'angka 7
Data &B10000000                                             'angka 8
Data &B10010000                                             'angka 9

'subrutin dibawah ini untuk pembacaan RTC, di tempatkan disini untuk kemudahan
'dan pemahaman program
Getdatetime:
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0

  I2cstart
  I2cwbyte Ds1307r
  I2crbyte _sec , Ack
  I2crbyte _min , Ack
  I2crbyte _hour , Ack
  I2crbyte Weekday , Ack
  I2crbyte _day , Ack
  I2crbyte _month , Ack
  I2crbyte _year , Nack
  I2cstop
  Jam = Makedec(_hour)
  Menit = Makedec(_min)
  '_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  '_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cwbyte _sec
  I2cwbyte _min
  I2cwbyte _hour
  I2cstop
Return

'-------------------------------------------------------------------------------
silahkan anda copas kode MEMBUAT JAM DIGITAL ATMEGA8 , masukan ke BascomAVR. jangan lupa diseting mikrokontrolernya ke Atmega8. karena secara default BascomAVR menggunakan Attiny2313.

(Baca Juga : MEMBUAT JAM SHOLAT MINI)

(Baca Juga : MEMBUAT JAM DIGITAL LCD 16X2)

pada skema atau foto Jam Digital diatas menggunakan Seven segment ukuran 1" dengan tegangan 5V. jika anda hendak menggunakan seven segment ukuran besar dengan tegangan sevent segment yang lebih besar, maka anda harus menambahkan transistor penguat/buffer untuk mengendalikan sevent segmen. dan berikut skema penambahan jika menggunakan seven segmen besar>



pada gambar diatas adalah skema untuk Commond Anode. dengan rangkaian ini anda bisa mengendalikan seven segment yang lebih besar.


pada gambar diatas adalah skema untuk Pin Out seven segment dari a.....dp

pada kesempatan yang lain Jam Digital ini akan di update dengan fitur menampilkan suhu. sehingga display akan berganti2. menampilkan Jam & suhu bergantian, dengan waktu ganti yang bisa diubah-ubah.

jika ada pertanyaan silahkan komentar dibawah. terima kasih

Artikel Terkait

cara mudah membuat sendiri jam digital atmega8
4/ 5

14 komentar

13 Agustus 2016 pukul 19.47 delete

Ijin copy paste pak...
boleh...?
somoga menjadi amal jariyah pak

Reply
avatar
Anonim
21 Desember 2016 pukul 09.52 delete

kang minta file hex nyA

Reply
avatar
21 Desember 2016 pukul 21.37 delete

itu diatas malah saya kasih kodenya, tinggal kamu kompile di bascom-avr sdh jadi .hex, klo belum tahu caranya kompile di bascom bisa buka disini http://www.hobyfauzi.tk/2016/05/pemrograman-mikrokontroler-untuk-pemula.html

Reply
avatar
10 Januari 2017 pukul 14.02 delete

Salam Bascom pak.
saya mau tanya gimana cara penulisan di bascom untuk led kedip melalui Rtcds 1307 dan atmega 8 ?
maturnuon.

Reply
avatar
10 Januari 2017 pukul 21.26 delete

sediakan sebuah port, seting sbg input. hubungkan port trsbt ke pin7 RTC DS13O7. deteksi pin tersebut menggunakan IF..then. tinggal ambil keputusan di dalam if then tersebut jika pinX adalah 1 dan sebaliknya. kemudian bisa ditampilkan ke LCD ataupun LED sbg tanda detik

Reply
avatar
11 Januari 2017 pukul 13.45 delete

Terima kasih bapak Fauzi HP atas penjelasannya.

Reply
avatar
16 Januari 2017 pukul 18.13 delete

makasih pak simulasi pakai proteusnya berhasil

Reply
avatar
17 Januari 2017 pukul 13.03 delete

Pak Fauzi, saya tanya lagi bagaimana cara penulisan input data 11001100 pada shift register di basiccompiler?.

Reply
avatar
17 Januari 2017 pukul 18.12 delete

Pak Fauzi.
Bagaimana cara bikin komponen seven segmen ukuran 1 inchi di proteus. saya cari cari komponen package nya kok nggak ada. mohon pencerahannya.
terima kasih.

Reply
avatar
18 Januari 2017 pukul 21.00 delete

untuk shift register bisa memakai "SHIFTOUT" dan "SHIFTIN". coba lihat dimenu help bascom-AVR

Reply
avatar
18 Januari 2017 pukul 21.04 delete

harus membuat library sendiri. caranya siapkan 7 segmen 1" ukur jarak kaki2 kemudian gambarkan pola pinoutnya di proteus. blok semua lalu tekan tombol mouse kanan pilih package. isi data2 yg diminta

Reply
avatar
Anonim
3 Maret 2018 pukul 13.47 delete

Bang fauzi. Blh tanya soal penguatnya.

Reply
avatar
7 Maret 2018 pukul 09.05 delete

Skema Penguat ada di artikel kok...coba discrool ke bawah

Reply
avatar