Subscribe via email

Enter your email address:

Delivered by FeedBurner

Bascom AVR, Mega16,Wavecom Fastrack M1206B, SMS

Aplikasi yang akan kita buat ini berfungsi untuk meng ON-OFF kan pin ouput microcontroller melalui SMS.

Pin-pin output yang kita gunakan adalah PORTC yang sudah terhubung ke LED. Untuk men ON-OFF kan ouput, format sms yang harus dikirm #CMD.

Isi CMD merupakan data biner 4bit, misal:

  • #1111 (PORTC.0--PORTC.3 ON semua)
  • #0001 (hanya PORTC.0 yang ON)
  •  #0111(hanya PORTC.3 yang OFF) dst.

Untuk input kita gunakan tombol yang terhubung ke PIND.2, saat tombol di tekan microcontroller akan mengirim SMS “PIND.2= ON”.

Dalam aplikasi kita akan menggunakan LCD, RS232 dan interrupt jadi sebelum mencoba artikel ini simak dahulu artikel tentang LCD dan RS232.

 

Code yang digunakan:


$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600
$lib "lcd4busy.lbx"


'***********inisialiasi PORT I/O*********

Led Alias Portc.7
Config Portc = Output

Portd.2 = 1
Config Pind.2 = Input
Config Int0 = Falling
Config Debounce = 100

'***********inisialiasai variabel2 dan subroutine untuk lcd*********

'karakter logo AVRku.com - IndoLab.net
Deflcdchar 6 , 30 , 6 , 10 , 16 , 7 , 3 , 5 , 8
'karakater u loading
Deflcdchar 0 , 32 , 32 , 32 , 31 , 31 , 31 , 32 , 32        '       '

Config Lcd = 16 * 2
Const _lcdport = Portb
Const _lcdddr = Ddrb
Const _lcdin = Pinb
Const _lcd_e = 2
Const _lcd_rw = 1
Const _lcd_rs = 0
Cursor Off


Declare Sub Loading


'***********variabel2 untuk sms*********
Dim No_hp As String * 15
Dim Data_masuk As String * 100
Dim Cmti_pos As Byte , Cmgr_pos As Byte , Index_pos As Byte , Cmd_pos As Byte       'position of CMTI, CMGR, SMS index, Command
Dim Pjg_sms_index As Byte , Pjg_data As Byte
Dim Sms_index As String * 3
Dim Cmd As String * 4
Dim Cmdbin As Byte



'***********main program*********
No_hp = "+6285646690454"
'No_hp = Quote(no_hp)
Portc = &HFF
Call Loading
Print "Connection OK"
Enable Interrupts
Enable Int0
On Int0 Kirim_sms
Do


   Input Data_masuk
   Toggle Led

   Pjg_data = Len(data_masuk)

   'periksa apakah ada data CMTI?
   Cmti_pos = Instr(data_masuk , "CMTI")
   If Cmti_pos <> 0 Then
      Index_pos = Instr(data_masuk , ",")                   ' posisi index sms yg baru masuk berada setelah koma ","
      Incr Index_pos
      Pjg_sms_index = Pjg_data - Index_pos
      Incr Pjg_sms_index

      Sms_index = Mid(data_masuk , Index_pos , Pjg_sms_index)

      Cls
      Lcd Data_masuk
      Lowerline
      Lcd Cmti_pos ; "-" ; Pjg_data ; "-" ; Index_pos ; "-" ; Pjg_sms_index ; "-" ; Sms_index
      Print "AT+CMGR=" ; Sms_index ; Chr(13) ; Chr(10)

   End If


   'periksa apakah ada karakter #

   Cmd_pos = Instr(data_masuk , "#")
   If Cmd_pos <> 0 Then
      Incr Cmd_pos
      Cmd = Mid(data_masuk , Cmd_pos , 4)
      Cmdbin = Binval(cmd)
      Portc = Not Cmdbin

      Cls
      Lcd "Command Executed"
      Lowerline
      Lcd "Cmd= " ; Cmd
      Print "AT+CMGD=" ; Sms_index ; Chr(13) ; Chr(10)
   End If



Loop


'***********subroutine*********
Sub Loading
   Local Geser As Byte , Ulang As Byte

   For Ulang = 1 To 2
      Cls
      Lcd Chr(6)
      Lcd Chr(32)
      Lcd "AVRku-IndoLab"
      Lcd Chr(6)
      Locate 2 , 1
      Lcd "loading"
      For Geser = 0 To 5
         Lcd Chr(0)
         Waitms 200
      Next Geser
   Next Ulang

End Sub


Kirim_sms:
   Print "AT+CMGS=" ; Chr(34) ; No_hp ; Chr(34) ; Chr(44) ; Chr(13) ; Chr(10)
   Print "PIND.2= ON" ; Chr(26)
   Cls
   Lcd "Kirim SMS ke:"
   Lowerline
   Lcd No_hp
   Waitms 200
   Gifr = 64
Return
End

 

VIDEO saat program udah jalan bisa di lihat di  sini

 


PEMBAHASAN CODE PROGRAM:

$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600
$lib "lcd4busy.lbx"

Inisialisasi library yang digunakan (m16def.dat dan lcd4busy.lbx)

setting crystal dan baud rate (xtal=11,059200MHz dan baud=9600bps)


 
'***********inisialiasi PORT I/O*********

Led Alias Portc.7
Config Portc = Output

Portd.2 = 1
Config Pind.2 = Input
Config Int0 = Falling
Config Debounce = 100

PORTC.7 diberi nama Led (nama pengganti agar mudah diingat). Pin ini digunakan sebagai indikator data yang masuk lewat RS232, setiap ada data yang masuk maka PORTC.7 akan di on-off.

PORTC d setting sebagai output. Selain PORTC.7 kita juga akan menggunakan PORTC.0, PORTC.1, PORTC.2 dan PORTC.3

PIND.2 digunakan sebagai input, pin ini merupakan pin INTERRUPT EXTERNAL 0 jadi sekalian kita akan belajar cara memakai interrupt di BASCOM AVR.

nilai Debounce merupakan nilai delay untuk mengantisipasi bouncing saat tombol yang terhubung ke PIND.2 ditekan.


 
'***********inisialiasai variabel2 dan subroutine untuk lcd*********

'karakter logo AVRku.com - IndoLab.net
Deflcdchar 6 , 30 , 6 , 10 , 16 , 7 , 3 , 5 , 8
'karakater u loading
Deflcdchar 0 , 32 , 32 , 32 , 31 , 31 , 31 , 32 , 32        '       '

Config Lcd = 16 * 2
Const _lcdport = Portb
Const _lcdddr = Ddrb
Const _lcdin = Pinb
Const _lcd_e = 2
Const _lcd_rw = 1
Const _lcd_rs = 0
Cursor Off


Declare Sub Loading

setting untuk LCD dan men”daftar”kan sub routine “Loading” agar dikenali oleh Bascom AVR.


 
'***********variabel2 untuk sms*********
Dim No_hp As String * 15
Dim Data_masuk As String * 100
Dim Cmti_pos As Byte , Cmgr_pos As Byte , Index_pos As Byte , Cmd_pos As Byte       'position of CMTI, CMGR, SMS index, Command
Dim Pjg_sms_index As Byte , Pjg_data As Byte
Dim Sms_index As String * 3
Dim Cmd As String * 4
Dim Cmdbin As Byte

Inisialisasi variabel2 yang akan digunakan untuk sms.

No_hp = menyimpan no hp tujuan.

Data_masuk = data yang masuk ke serial dimasukkan ke variable ini

Cmti_pos =  menyimpan nilai saat proses mencari karakter “CMTI” di data_masuk. Saat ada sms baru, maka modem akan mengirim karakter “+CMTI” ke microcontroller.

Cmgr_pos = menyimpan nilai saat proses mencari karakter “CMTI” di data_masuk.  “+CMGR” akan  muncul begitu kita membaca sms.

Sms_index =  menyimpan nilai saat proses mencari posisi sms. Begitu sms diterima, maka sms tersebut oleh modem akan di simpan dengan nomer urut tertentu.

Index_pos =  menyimpan nilai saat proses mencari karakter “,” (koma).  Karakter koma berada sebelum sms_index, jadi kita harus cari dulu karakter koma setelah “CMTI” untuk menemukan sms_index.

Cmd_pos= menyimpan nilai saat proses mencari karakter “#” (pagar). Karakter pagar berada sebelum command (command ini untuk menggerakkan OUTPUT), jadi kita harus cari dulu karakter pagar saat membaca isi sms untuk menemukan command.

Cmd =  menampung command yang masuk

Cmdbin = menampung data biner hasil konversi dari Cmd. Data yang akan di keluarkan ke PORTC (output) harus dalam bentuk biner


 
No_hp = "+6285646690454"  

Nomer HP yang dituju,/ nomer HP user. Ganti sesuaikan dengan nomer HP yang anda gunakan.


 
Call Loading

Memanggil subroutine Loading.

Sub Loading
   Local Geser As Byte , Ulang As Byte

   For Ulang = 1 To 2
      Cls
      Lcd Chr(6)
      Lcd Chr(32)
      Lcd "AVRku-IndoLab"
      Lcd Chr(6)
      Locate 2 , 1
      Lcd "loading"
      For Geser = 0 To 5
         Lcd Chr(0)
         Waitms 200
      Next Geser
   Next Ulang

End Sub

Proses pada subroutine Loading hanya berupa animasi karakater pada LCD saat awal microcontroller dijalankan, just 4 fun Hot smile


 
Enable Interrupts
Enable Int0
On Int0 Kirim_sms

Mengaktifkan Interrupt. Saat terjadi Interrupt External 0 / Int0 / tombol PIND.2 ditekan, program akan menuju label Kirim sms :

Kirim_sms:
   Print "AT+CMGS=" ; Chr(34) ; No_hp ; Chr(34) ; Chr(44) ; Chr(13) ; Chr(10)
   Print "PIND.2= ON" ; Chr(26)
   Cls
   Lcd "Kirim SMS ke:"
   Lowerline
   Lcd No_hp
   Waitms 200
   Gifr = 64
Return

Dari code diatas bisa dilihat bahwa micro akan mengirim sms nomer hp user.

“Gifr=64” menset nilai bit ke enam pada register GIFR, bit ke enam pada GIFR untuk flag untuk INT0. Nilai ini perlu di set saat interrupt terjadi mencegah pemanggilan ulang interrupt ketika terjadi bouncing penekanan tombol.  Untuk latihan coba hilangkan baris code ini, lalu lihat apa yang terjadi saat tombol ditekan?


 
Input Data_masuk
Toggle Led

Data yang masuk  ditampung pada variabel Data_masuk. Setiap ada data yang masuk, maka led (PORTC.7) di ON-Off


 
Pjg_data = Len(data_masuk) 

Perintah Len untuk mengetahui jumlah data yang masuk (panjang data)


 
'periksa apakah ada data CMTI?
 Cmti_pos = Instr(data_masuk , "CMTI")

Instr digunakan untuk mengetahui posisi  string pada sebuah data. Pada contoh ini string yang kita cari adalah CMTI. 


 
If Cmti_pos <> 0 Then
      Index_pos = Instr(data_masuk , ",")                   ' posisi index sms yg baru masuk berada setelah koma ","
      Incr Index_pos
      Pjg_sms_index = Pjg_data - Index_pos
      Incr Pjg_sms_index

      Sms_index = Mid(data_masuk , Index_pos , Pjg_sms_index)

      Cls
      Lcd Data_masuk
      Lowerline
      Lcd Cmti_pos ; "-" ; Pjg_data ; "-" ; Index_pos ; "-" ; Pjg_sms_index ; "-" ; Sms_index
      Print "AT+CMGR=" ; Sms_index ; Chr(13) ; Chr(10)

End If
Saat Cmti_pos tidak sama dengan 0 berarti dalam variabel Data_masuk sudah ditemukan string CMTI yang menandakan ada sms baru.

Proses yang dilakukan pada code diatas yaitu mencari karakter koma untuk mengetahui posisi index.

Selanjutnya mencari tahu berapa digit panjang index nya, apakah 2 digit atau hanya 1 digit. Perlu di ketahui m1206b bisa menyimpan sms dari index 1 – 20. Logika yang dipakai untuk mencari panjang digit ini dengan menggunakan perintah: Pjg_sms_index = Pjg_data – Index_pos

Setelah posisi  dan panjang  didapat, sekarang waktunya memisahkan index dari variable Data_masuk  kemudian ditampung ke  variabel Sms_index menggunakan perintah: Sms_index = Mid(Data_masuk, Index_pos, Pjg_sms_index)

Data2  variabel yang sudah didapat akan ditampilkan di LCD.


 
'periksa apakah ada karakter #

   Cmd_pos = Instr(data_masuk , "#")
   If Cmd_pos <> 0 Then
      Incr Cmd_pos
      Cmd = Mid(data_masuk , Cmd_pos , 4)
      Cmdbin = Binval(cmd)
      Portc = Not Cmdbin

      Cls
      Lcd "Command Executed"
      Lowerline
      Lcd "Cmd= " ; Cmd
      Print "AT+CMGD=" ; Sms_index ; Chr(13) ; Chr(10)
   End If

Mencari karakter # (pagar) yang menandakan command untuk menggerakkan output.

Proses yang terjadi pada code di atas adalah mengambil 4 data setelah karakter pagar. 4 data ini adalah command. 4 data yang masih bertipe string ini lalu dikonversi ke tipe biner dengan perintah Binval.

Data command yang sudah bertipe biner lalu dikeluarkan ke PORTC (tapi di NOT kan dulu karena LED-LED yang terhubung ke output bersifat active-low)


 

Sebelum microcontroller dan modem dihubungkan, setting modem Wavecom Fastrack m1206b harus di sesuaikan:

  1. Baudrate. Baudrate default wavecom fastrack m1206b adalah 115200bps sedangkan dalam program d atas memakai baudrate 9600bps. Untuk merubah setting modem kita gunakan terminal ( bisa pake terminal emulator, hyperterminal, tera term dll). Buka terminal dengan baudrate 115200 bps. Ketik: AT lalu enter. jika modem sudah terkoneksi dengan benar maka akan ada reply: OK.  ketik AT+IPR=9600  lalu enter. Tutup terminal. Buka lagi tapi dengan baudrate 9600bps. Ketik: AT lalu enter, jika ada reply: OK berarti pengubahan baudrate berhasil.
  2. Echo Off, ketik ATE0 lalu enter.
  3. Untuk menyimpan perubahan konfigurasi ketik AT&W lalu  enter.
  4. Koneksi m1206b ke PC dengan koneksi m1206b ke mikrokontroller ada sedikit perbedaan, perhatikan gambar berikut:

image


 

Peralatan yang digunakan untuk  aplikasi ini:

  1. Smart AVR 16 System
  2. Wavecom Fastrack M1206B
  3. Smart LCD Display
  4. USB downloader
Selengkapnya...

Bascom AVR, RS232

YOwww kali ini kita akan bermain komunikasi RS232 antara microcontroller dengan PC, bikin si MCU (microcontroller) biar bisa “ngobrol” ama si PC.

Pertama kita harus tahu kalau MCU level tegangannya TTL 5volt, agar mcu bisa “ngobrol” ama PC, kita menggunakan converter tegangan TTL ke level tegangan RS232.

Converter yang saya gunakan disini adalah MAX232, yang sudah ada di board SmartAVR system so tinggal bikin program aja deh ak… Smile with tongue out

Langsung aja bikin file baru di BASCOM AVR: FILE--->NEW atau CTRL+N

Tulis program berikut,

CONTOH RS232-1:

$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600



Do
   Print "connection ok"
   Waitms 1000
Loop

End

Buka Terminal Emulator, klik TOOLS--->TERMINAL EMULATOR atau tekan CTRL+T

Hubungkan kabel RS232 dari mcu ke port serial RS232 PC, port ini berbentuk DB9.

image

Jika berhasil pada Terminal Emulator akan muncul tulisan “connection ok”.

image

Program pada CONTOH RS232-1, digunakan untuk mengirim tulisan “connection ok” ke PC. Karena ada waitms 1000 =  delay 1detik, maka tulisan “connection ok” dikirim tiap 1 detik.

Error yang biasa terjadi karena salah setting Terminal EMulator. Berikut ini setting yang saya gunakan:

image

Com Port: port serial yang digunakan, disini saya gunakan port COM2 (lihat di device manager, com port yang tersedia di PC anda)

Baudrate: kecepatan transfer data antara mcu dengan PC. Pada mcu nilai baudrate di set pada baris program $baud = 9600


Jika tadi yang “ngomong” hanya si MCU sedangkan si PC cuman dengerin, sekarang kita akan buat program agar si MCU dan si PC bisa ngobrol 2 arah.

Contoh RS232-2:

$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600

Dim Angka As Integer


Input "masukin angka lalu tekan Enter..." , Angka
Print "yg loe ketik angka: " ; Angka

Do
   Input "ketik lagi, jangan lupa d Enter..." , Angka
   Print "yg loe ketik angka: " ; Angka
Loop

End

Tampilan Terminal Emulator  saat program dah running di MCU

image

 

Dari program CONTOH2, yang perlu dibahas mungkin baris yang ada kata “input”

Input "masukin angka lalu tekan Enter..." , Angka
Print "yg loe ketik angka: " ; Angka

Command “Input” berarti MCU akan memasukkan nilai yang masuk lewat serial RS232, dalam contoh ini nilai yg masuk adalah angka-angka yang diketik di Terminal Emulator. Nilai yang diketik dianggap valid saat ENTER ditekan.

Nilainya masuk kemana????

Angka-angka yang diketik akan masuk ke variabel “Angka”, variabel ini terlebih dahulu di”daftar”kan diawal program yaitu

Dim Angka As Integer

Untuk latian silahkan di utak atik baris-baris program diatas.  Hapus/ganti salah satu huruf atau tanda baca(koma, petik, titikkoma) untuk lebih memahami fungsi masing2 code program Nerd smile

 

Peralatan yang digunakan dalam latian ini:

  1. Smart AVR System
  2. USB Downloader
  3. USBtoRS232 (konverter port USB menjadi port RS232 karena saya pake laptop yang nggak ada port serial RS232 nya)
Selengkapnya...

BASCOM-AVR, MEGA16, LCD 16*2

Kita akan mencoba menampilkan karakter di LCD 16*2 dan menggunakan LCD designer untuk menampilkan karakter2 unik buatan kita sendiri Flirt male. Pada bagian akhir kita juga akan berlatih membuat program yang lebih effisien dengan memanfaatkan perulangan FOR-NEXT.

Untuk menampilkan karakter di LCD, tuliskan code program berikut:

Program LCD1

 

$crystal = 11059200
$lib "lcd4busy.lbx"

Config Lcd = 16 * 2
Const _lcdport = Portb
Const _lcdddr = Ddrb
Const _lcdin = Pinb
Const _lcd_e = 2
Const _lcd_rw = 1
Const _lcd_rs = 0
Cursor Blink

Do
   Cls
   Waitms 500
   Lcd "   AVRku.com   "
   Lowerline
   Lcd "  INDOLAB.net  "
   Waitms 10000

Loop
End

Gambar tampilan hasil program diatas seperti ini:

image

Pembahasan program LCD1:

$regfile = "m16def.dat"     ' menentukan chip AVR yang kita gunakan, disini menggunakan ATmega16
 
$crystal = 11059200   'menentukan frekuensi xtal yang digunakan, kita gunakan xtal 11,0592MHz
 
$lib "lcd4busy.lbx"   'library untuk LCD
 
Config Lcd = 16 * 2   'menentukan jenis LCD yang digunakan, dalam hal ini LCD 16*2
 
Const _lcdport = Portb   'LCD dihubungkan dengan PORTB 
Const _lcdddr = Ddrb
Const _lcdin = Pinb
 
Const _lcd_e = 2 ' pin Enable LCD dihubungkan ke PORTB.2 
 
Const _lcd_rw = 1   'pin RW LCD dihubungkan ke PORTB.1
 
Const _lcd_rs = 0  'pin RW LCD dihubungkan ke PORTB.0
 
Cursor Blink   'membuat cursor LCD berkedip
 
Do
 
   Cls   'Clear LCD Screen
 
   Waitms 500
 
   Lcd "   AVRku.com   "   'menampilkan tulisan AVRku.com di LCD
 
   Lowerline   'menuju baris bawah LCD
 
   Lcd "  INDOLAB.net  "    'menampilkan tulisan INDOLAB.net
 
   Waitms 10000
 
Loop   'perintah untuk mengulangi program setelah "Do"
End

Selanjutnya kita akan menggunakan LCD designer untuk membuat karakter2 unik dan menampilkannya di LCD.

Tekan CTRL+L ata u klik Tool—>LCD Designer

 

image

Klik Ok, akan menghasilkan baris program seperti berikut:

Deflcdchar ?,32,4,4,31,4,4,32,32' replace ? with number (0-7)

Rubah “?” menjadi  angka antara 0 sampai 7. Ini untuk memberi “nama”  karakter yang telah kita buat sehingga memudahkan saat kita akan menggunakan karakter tersebut. Misalnya:

Deflcdchar 0,32,4,4,31,4,4,32,32

Angka “0” merupakan nama yang kita berikan untuk karakter. Jika ingin menampilkannya di LCD kita cukup menulis:

 LCD Chr(0)

Karakter2 yang akan saya gunakan sebagai berikut:

'karakter bintang berputar
Deflcdchar 0 , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32
Deflcdchar 1 , 32 , 2 , 20 , 14 , 5 , 8 , 32 , 32
Deflcdchar 2 , 32 , 2 , 26 , 4 , 11 , 8 , 32 , 32
Deflcdchar 3 , 32 , 17 , 10 , 4 , 10 , 17 , 32 , 32
Deflcdchar 4 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32
Deflcdchar 5 , 32 , 8 , 5 , 14 , 20 , 2 , 32 , 32


'karakter logo AVRku.com - IndoLab.net
Deflcdchar 6 , 30 , 6 , 10 , 16 , 7 , 3 , 5 , 8

Untuk menampilkannya di LCD, kita perlu menuliskan program berikut:

Program LCD2

$regfile = "m16def.dat"
$crystal = 11059200
$lib "lcd4busy.lbx"


'karakter bintang berputar
Deflcdchar 0 , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32
Deflcdchar 1 , 32 , 2 , 20 , 14 , 5 , 8 , 32 , 32
Deflcdchar 2 , 32 , 2 , 26 , 4 , 11 , 8 , 32 , 32
Deflcdchar 3 , 32 , 17 , 10 , 4 , 10 , 17 , 32 , 32
Deflcdchar 4 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32
Deflcdchar 5 , 32 , 8 , 5 , 14 , 20 , 2 , 32 , 32


'karakter logo AVRku.com - IndoLab.net
Deflcdchar 6 , 30 , 6 , 10 , 16 , 7 , 3 , 5 , 8

Config Lcd = 16 * 2
Const _lcdport = Portb
Const _lcdddr = Ddrb
Const _lcdin = Pinb
Const _lcd_e = 2
Const _lcd_rw = 1
Const _lcd_rs = 0
Cursor Off



Do
   Cls
   Lcd Chr(6)
   Lcd Chr(32)
   Lcd "AVRku-IndoLab"
   Lcd Chr(6)

   Locate 2 , 6
   Lcd Chr(0)
   Lcd Chr(0)
   Lcd Chr(0)
   Lcd Chr(0)
   Waitms 100

   Locate 2 , 6
   Lcd Chr(1)
   Lcd Chr(1)
   Lcd Chr(1)
   Lcd Chr(1)
   Waitms 100

   Locate 2 , 6
   Lcd Chr(2)
   Lcd Chr(2)
   Lcd Chr(2)
   Lcd Chr(2)
   Waitms 100

   Locate 2 , 6
   Lcd Chr(3)
   Lcd Chr(3)
   Lcd Chr(3)
   Lcd Chr(3)
   Waitms 100

   Locate 2 , 6
   Lcd Chr(4)
   Lcd Chr(4)
   Lcd Chr(4)
   Lcd Chr(4)
   Waitms 100

   Locate 2 , 6
   Lcd Chr(5)
   Lcd Chr(5)
   Lcd Chr(5)
   Lcd Chr(5)
   Waitms 100


Loop
End

Hasil tampilannya:

image

Ini videonya:

http://www.youtube.com/watch?v=Z9XGiYB0-_4


Program LCD2 di atas bisa di tulis lebih simple seperti ini:

 

Program LCD3

$regfile = "m16def.dat"
$crystal = 11059200
$lib "lcd4busy.lbx"


'karakter bintang berputar
Deflcdchar 0 , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32
Deflcdchar 1 , 32 , 2 , 20 , 14 , 5 , 8 , 32 , 32
Deflcdchar 2 , 32 , 2 , 26 , 4 , 11 , 8 , 32 , 32
Deflcdchar 3 , 32 , 17 , 10 , 4 , 10 , 17 , 32 , 32
Deflcdchar 4 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32
Deflcdchar 5 , 32 , 8 , 5 , 14 , 20 , 2 , 32 , 32


'karakter logo AVRku.com - IndoLab.net
Deflcdchar 6 , 30 , 6 , 10 , 16 , 7 , 3 , 5 , 8

Config Lcd = 16 * 2
Const _lcdport = Portb
Const _lcdddr = Ddrb
Const _lcdin = Pinb
Const _lcd_e = 2
Const _lcd_rw = 1
Const _lcd_rs = 0
Cursor Off


Declare Sub Putar_bintang

Do
   Cls
   Lcd Chr(6)
   Lcd Chr(32)
   Lcd "AVRku-IndoLab"
   Lcd Chr(6)
   Call Putar_bintang



Loop

Sub Putar_bintang
   Local Putar As Byte , Jumlah As Byte

   For Putar = 0 To 5
      Locate 2 , 6
      For Jumlah = 1 To 4
         Lcd Chr(putar)
      Next
      Waitms 100
   Next

End Sub

End

Dalam program LCD3, kita menggunakan subrutin yang diberi nama Putar_bintang. Di dalam subrutin ini, command untuk menulis karakter ke LCD –>Lcd Chr(…), dipanggil beberapa kali menggunakan perulangan FOR-NEXT.  Baris program yang ada diantara  FOR dan NEXT akan diulang sesuai pernyataan yang dibentuk oleh TO.

Contoh perulangan1:

      For Jumlah = 1 To 4
         Lcd Chr(putar)
      Next

Baris program yang diulang  yaitu Lcd Chr(putar). Berapa kali baris ini diulang?

Liat baris program FOR Jumlah = 1 TO 4.

Artikan baris program ini secara harfiah.

FOR Jumlah=1 to 4 –> Untuk Jumlah sama dengan 1 sampai 4.

Nilai Jumlah ditambah, mulai dari 1 sampai menuju 4. Setiap  Jumlah berubah nilai maka baris program Lcd Chr (putar) dikerjakan.

Dari 1 sampai 4 berarti  1—>2—>3—>4  sama dengan ada  4 kali pengulangan.

 

Contoh perulangan2:

   For Putar = 0 To 5
      Locate 2 , 6
      For Jumlah = 1 To 4
         Lcd Chr(putar)
      Next
      Waitms 100
   Next

Untuk perulangan FOR Putar = 0 To 5, terjadi 6 kali pengulangan mulai dari 0—>1—>2—>3—>4—>5

yang diulang adalah baris program:

      Locate 2 , 6
      For Jumlah = 1 To 4
         Lcd Chr(putar)
      Next
      Waitms 100

Dalam perulangan Contoh1, Lcd Chr(putar) diulang 4 kali.

Pada Contoh2, baris program untuk contoh1 di ulang 6 kali.

Berarti Lcd Chr(putar) diulang sebanyak 4*6 = 24 kali.

 

Lihat lagi program LCD2, untuk menampilkan karakter bintang{karakter-karakter DefLcdChr (0—>5)}, perintah Lcd Chr(0—>5) kita tulis berulang-ulang  satupersatu. Hayoo coba dihitung berapa kali? Flirt male

Selengkapnya...

Pengenalan BASCOM AVR

    Dalam contoh ini kita akan berlatih merubah kongifurasi BASCOM AVR sesuai dengan minsys AVR yang kita gunakan dan membuat program sederhana untuk menyalakan LED, menggeser nyala LED dan

    membaca penekanan tombol.

    1. Membuat Project Baru:
     Klik File—>New2.Menentukan konfigurasi sistem(chip, baudrate, I/O dll.):

    A. Options—> Compiler

    clip_image002

    B. Chip: menentukan chip AVR yang digunakan, karena saya memakai DI-Smart AVR 16 maka saya gunakan m16def.dat clip_image004

    C.Options—>Programmer: menentukan jenis programmer/downloader yang digunakan. Di sini saya menggunakan usb downloader dengan firmware AVR910.

    clip_image006

    3. Test setting programmer:

    untuk mengetahui settning programmer udah sesuai apa belum klik Program—>Send to Chip—> Manual Program

    clip_image008

    Pilih Chip—>Identify. Jika setting sudah benar maka akan tampil jenis chip yang kita gunakan dan propertiesnya

    clip_image010

    clip_image012

     

     

    4. Membuat code program untuk menggeser nyala LED ke kanan:

    $regfile = "m16def.dat"
    
    $crystal = 11059200
    
    Config Portc = Output
    
    Portc = &B1111_1110
    
    Do
    
    Rotate Portc , Right , 1
    
    Waitms 500
    
    Loop
    
    End
    Tekan F7 untuk men COMPILE.

    Jika tidak ada ERROR tekan F4, lalu pilih ERASE and PROGRAM CHIP

    clip_image014

    clip_image016

    Gambar di atas adalah tampilan program saat di running.

    A. Pembahasan program:

    $regfile = "m16def.dat"

    Menentukan chip AVR yang kita gunakan, saya menggunakan ATMEGA16. Menggunakan chip AVR yang lain harus merubah baris ini dan juga konfigurasi compiler yang dibahas pada point 2.B.

    Misal kita menggunakan ATMEGA8 maka kita tulis $regfile = "m8def.dat"

    $crystal = 11059200

    Nilai yang diisikan disini sesuai crystal/ xtal yang dipakai. Saya menggunakan crystal 11,0592MHz.

    Config Portc = Output

    PORTC di gunakan sebagai output. Saya menggunakan PORTC sebagai output karena LED-LED di board SMART AVR 16 SYSTEM terhubung ke PORTC

    Portc = &B1111_1110

    Nilai PORTC di set ke 1111 1110. Ini berarti PORTC.7—PORTC.1 nilainya = 1=high=5volt.

    Sedangkan POTC.0 nilainya = 0 = low = 0 volt.

    Berarti LED yang terhubung ke PORTC.0 akan menyala. Perlu diketahui LED-LED pada board Smart AVR System dirangkai active low artinya jika di beri Logic Low / teg. 0 volt maka LED akan active/menyala.

    Do

    Rotate Portc , Right , 1

    Waitms 500

    Loop

    End

    Baris-baris program yang berada di antara Do --- Loop merupakan baris –baris program utama/ main program yang akan di kerjakan terus menerus.

    Rotate Portc , Right , 1

    Menggeser nilai pada PORTC ke KANAN sebanyak 1kali. Di awal program nilai PORTC di set ke 1111_1110 jika digeser kekanan 1 kali maka nilainya menjai 0111_1111 berarti PORTC.7 =Low= 0 volt sehingga LED yang terhubung ke port ini akan menyala.

    Waitms 500

    Delay 500ms, selama waktu ini microcontroller tidak melakukan apa2.

    Loop

    Perintah untuk mengulang program ke baris DO, sehingga program untuk menggeser LED akan dijalankan terus.

     

    5. Membuat code program untuk membaca tombol

    Program ini bertujuan untuk membaca penekanan tombol untuk merubah nyala led.

    Pada board Smart AVR System Tombol 1 terhubung ke PIND.2, Tombol 2 terhubung ke PIND.3

    Jika tombol 1 ditekan maka nyala LED akan begeser ke kanan.

    Jika tombol 2 ditekan maka nyala LED akan bergeser ke ke kiri

    $regfile = "m16def.dat"
    
    $crystal = 11059200
    
    Config Portd.2 = Input 
    
    Config Portd.3 = Input
    
    Portd.2 = 1
    
    Portd.3 = 1
    
    Config Portc = Output
    
    Portc = &B1111_1110
    
    Do
    
    If Pind.2 = 0 Then Rotate Portc , Right , 1
    
    If Pind.3 = 0 Then Rotate Portc , Left , 1
    
    Waitms 500
    
    Loop
    
    End
    Tekan F7 untuk men COMPILE.

    Jika tidak ada ERROR tekan F4, lalu pilih ERASE and PROGRAM CHIP

    A. Pembahasan program:

    Config Portd.2 = Input

    Config Portd.3 = Input

    PORTD.2 dan PORTD.3 di setting sebagai input

    Portd.2 = 1

    Portd.3 = 1

    Memberi nilai 1/ high pada PORTD.2 dan PORTD.3, karena sebelumnya port-port ini disetting sebagai input maka baris program ini akan mengaktifkan internal pull up. Jika internal pull up tidak diaktfikan maka kondisi port input akan mengambang menyebabkan nilai pembacaan kacau.

    If Pind.2 = 0 Then Rotate Portc , Right , 1

    Jika PIND.2 = 0 maka PORTC akan di geser ke kanan 1kali. PIND.2 akan bernilai 0 jika tombol 1 ditekan.

    If Pind.3 = 0 Then Rotate Portc , Left , 1

    Jika PIND.3 = 0 maka PORTC akan di geser ke kiri 1kali. PIND.3 akan bernilai 0 jika tombol 2 ditekan.

Selengkapnya...

anti noise ATmega8 Circuit

Sering pas kita2 bikin project pake MCU (*baca:Microcontroller) trus nge drive peralatan 380/220VAC macam motor, selenoid  dll. Tuh MCU ngadat kayak bajai… program HANG…kadang sama sekali gak mau jalan,  kadang reset sendiri program nya and then Temen2 langsung kompak bilang “programnya tuh gannnn ndak beresss  ….” dalam hati gua bilang:marah “Dammmnnn kenapa harus program(*baca:programmer) yang selalu jadi kambing hitam”. Tidak terima dengan perilaku diskriminatif ini Smile with tongue out , gua langsung browsing n ketemu ama document2 dari ATMEL Corp. doc910: Microcontroller in a Harsh Environment dan doc1619: EMC Design Considerations. Setelah gua baca2, dalam mendesign sebuah circuit kita harus memperhatikan EMC(electromagnetic compatibility) yang mencakup 2 hal:

• How the environment may affect the design (immunity).
• How the design may affect the environment (emission).

Affect from Environment dalam hal ini bisa diartikan noise yang dapat berasal dari RF frequency, switching powersupply dll. Bagian digital dari MCU juga sangat berpotensi membuat noise terhadap bagian analog MCU

image

image

Gambar di atas menunjukkan cara penempatan decoupling capacitor.

Current can only flow in loops. This is true for signals as well as for power supply current. Unfortunately, a current loop will emit noise, and the larger the loop, the larger the noise. Noise also increases with current and with frequency. A large loop is also more likely to receive noise. Loops should therefore be kept as small as possible. This means that every line that may emit or receive noise should have a return path to ground as close to the line as possible.

Intinya: semakin besar sebuah Loop semakin rentan terhadap noise jadi buat grounding sedekat mungkin.

Point penting juga untuk masalah grounding yaitu: 

Note that for a high frequency signal, the return path in a ground plane will be exactlyunder the track, even if this path is longer than the direct route. This is because the return path will always be the path of least impedance, and for a high-frequency signal, this is the path with the smallest loop, not the path that has lowest DC resistance.
For circuits that include both digital and analog circuits, the ground plane may be divided into an analog ground plane and a digital ground plane. This will reduce the interference between the analog and digital parts of the system.

image

Gambar diatas menunjukkan penambahan induktor L yang berupa ferrite beads, sehingga terbentuk sebuah rangkaian filter. Spesifikasi L yang bisa digunakan adalah:

image

Karena sulit nyari ferrite beads yg sama persis kayak itu akhirnya gua ganti pake BLM31PG121

Rangkaian yang gua buat terdiri dari ATmega8, Port untuk LCD, MAX232, ULN2003 untuk driver relay, passive low pass filter untuk LM35. Penampakannya kayak gini:

image

Such an ugly design heughh!!! capekkeliatan ribet , mbulet coz gua musti bikin loop sekecil mungkin,, ndak boleh asal connect jalurnya… saat uji coba gua pake relay 12volt yang biasa di pake di panel2 listrik. Bebannya gua ganti2 mulai dari kipas angin, setrika, blender, pokoknya beban 220VAC yang ada dirumah.  Setelah uji coba ternyata lumayan juga ndak pernah Hang, setidaknya ada peningkatan, dulu gua gerakin kipas 220VAC yang  kecill   aja dah ngadat MCUnya…senang

 

Advantage dari design ini:

  • Relatif tahan noise
  • LowPass filter 50Hz buat LM35 dengan mengatur nilai R multiturn menjadi 3100 – 3200 ohm. Hasilnya pergerakan nilai read ADC hanya 1-2bit. Lumayan oke lahh, kagak perlu utak atik program biar nilai LM35 nya stabil.
  • Ada port buat LCD sekalian VR buat ngatur background contrast LCD
  • ULN 2003 buat driver 3 relay
  • MAX232 buat komunikasi serial RS232
  • Pake 7808 jadi  gak panas saat dikasih supply 12VDC

Disadvantage:

  • Design terlalu gedhe buat chip sekelas ATmega8.
  • double layer, lebih mahal n ribet bikin pcb nya
  • Untuk PORT I/O belum dilengkapi VCC & Ground jadi kalo butuh musti ambil dari terminal power.
  • Transistror power yang bisa digunakan footprintnya TIP31 kapasitas arus cuman 3A.
  • Waktu trial cuman pake beban Home Appliance jadi belum bener2 terukur kemampuannya, buat agan2 yg mau coba pake beban yang lebih gedhe, monggo dipersilahkan tapi resiko ditanggung penumpang hehehehehehheee
  • Belum dicoba di tempat dengan RF noise gedhe DOWNLOAD FILE PCB NYA KLIK DISINI
    atikel ini dibikin dengan cara kurang seksama dan dalam tempo sesingkat2nya. sanggahan, saran, arahan  send to [email protected]
Selengkapnya...

Detektor beban 220 Volt AC (2)

Ini lanjutan dari artikel Detektor Beban 220Volt AC beberapa waktu lalu. Di artikel itu iika ada perubahan keadaan Lampu, maka nilai R dari LDR juga berubah. Ternyata banyak yang bingung gimana cara interface perubahan  R dari LDR  ke microcontroller?bingung (termasuk gua sendiri :-p)

hmm ….  LOGIC yang diminta adalah:

 

  • saat Lampu mati, logic sensor HIGH
  • jika Lampu  nyala, logic sensor LOW
    Ide pertama yg terpikir: LDR di Pull Up pake R 2k2. Saat Lampu masih mati kondisi logic yg diperoleh HIGH(5 volt) , ini dah sesuai ama yg diinginkan. Tapi saat Lampu dah nyala ternyata tegangan sensornya 2,3Volt. Klo tegangan segini masih ke detect HIGH oleh microcontrollermumet

Mumet Mode: ON.

 

Akhirnya bongkar pasang rangkaian, nyoba pake PC817 blum bisa. Pake transistor masih lum bisa juga.. aihhh…….{kepaksa buka buku lagi dech… ElkaDasar  :-p LOL  }

Di buku di jelasin klo mau pake transistor untuk switching, kaki Basis logicnya gak boleh ngambang jadi musti di pull up atau pull down. Karena make Transistor NPN maka kaki Basis nya ak pull down.

Gambar Rangkaian seperti berikut:

image Pada gambar diatas tampak Transistor C9014, sohib2 gak harus make Transistor ini. Bisa diganti ama BD139, C9013 ato pake jenis NPN yang laen.

R 1k pada kaki basis di pake untuk Pull Down, agar Transistor baru terbias saat nilai resistansi LDR udah kecil.

R 2k2 pada kaki collector di gunakan untuk Pull Up, supaya tegangan ke kaki micro  bisa mencapai +5 volt saat Lampu off.

 

INGAT!!! LED (D5) dan LDR harus ditutup( di dalam Heatshrink Tube atau di isolasi) agar tidak terpengaruh cahaya dari luar.

 

Component List:

D1,D2,D3,D4 = dioda IN4002

D5= LED 5mm

LDR1=LDR

Transistor C9014

Led

R 2K2

R 1K

R 380

Oh iya… biar gak kebalik waktu pasang Transistor C9014, berikut ane sertain gambar kaki-kaki transistor C9014 dilihat dari bawah

image 

 

Let’s share…  ide /saran/kritik kirim aja ke [email protected]

Copyright  ©  AVRku.blogspot.com

Selengkapnya...

Search

Entri Populer

 
Diberdayakan oleh Blogger.