Category Archives: Menengah-3

Pengetahuan Dasar Diagram Interaksi (sequnce diagram dan kolaborasi)

Tulisan ini merupakan lanjutan dari  pengetahuan dasar uml

Diagram interaksi digunakan untuk memodelkan interaksi objek di dalam sebuah use case (proses). Diagram interaksi memperlihatkan interaksi yang memuat himpunan dari objek dan relasi yang terjadi antar objek tersebut, termasuk juga bagaimana message (pesan) mengalir diantar objek. Diagram interaksi terdiri dari dua buah diagram, yaitu diagram sekuen (sequence diagram) dan diagram kolaborasi (collaboration diagram).

Diagram sekuen menggambarkan urutan even dan waktu dari suatu pesan yang terjadi antar objek dalam sebuah use case, sedangkan diagram kolaborasi menggambarkan bagaimana objek terkoneksi secara statik (tetap) dengan penekanan pada organisasi struktural objek-objek yang mengirim dan menerima pesan.

1, Diagram sekuen.

Diagram sekuen menggambarkan  hubungan antara  objek pada use case dengan mendeskripsikan waktu hidup objek dan message yang dikirimkan dan diterima antar objek. Oleh karena itu untuk menggambar diagram sekuen maka harus diketahui objek-objek yang terlibat dalam sebuah use case beserta metode-metode yang dimiliki kelas yang diinstansiasi menjadi objek itu.

Diagram sekuen  dapat berupa sebuah  diagram sekuen  yg bersifat umum  yang menunjukkan semua skenario yang mungkin untuk semua use case, atau  terpisah pisah untuk tiap skenario tungal  di dlm  use case.

Diagram sekuen yang digunakan  pada  analisis dan tahap desain, namun  pada tahap desain , diagram sekuen sangat implementasi spesifik sering kali  objek database  atau GUI sering termasuk sebagai  komponen  kelas tertentu.

Simbol-simbol yang digunakan pada diagram sekuen:

symbol_sequence_diagram

Contoh diagram sekuen  untuk sebuah skenario  login ke sebuah system

login_sekuen

pada diagram diatas Objek user , account dan object database berinteraksi (mengirimkan pesan lewat methode) secara berurutan (sekuen) berdasar  urutan waktu. penjelasan secara berurutan dari diagram contoh diatas sbb:

methode Login()  ada   di objek  Account

methode searcUserlogin ada di objek Database

methode check()  ada di objeck Account .

jadi urutannya  (sequence) login ke system  begini:

1. objek user memanggil methode Login() yg ada di objek Account

2. objek Account memanggil methode   searcUserlogin() yg ada di objek Database. methode ini mengembalikan nilai ( berupa hasil pencarian user) ke objek account.

3.  objek Account mengecek  user hasil pencarian apakah  user tsb valid atau tdk.

4. objek account mengirim hasil  pengecekan tsb ( sebagai return dari methode Login() ).

Contoh kedua :

diagram sekuen  pembelian buku pada toko buku online implementasi dari use case “pembelian buku”

bukuonline

Advertisements

Pengetahuan Dasar mengirim-menerima SMS melalui Mikrokontroler ( dgn AT Command modem GSM)

Pengetahuan Dasar  mengirim-menerima  SMS melalui Mikrokontroler

Tujuan:

Anda bisa berkomunikasi dgn Microcontroller melalui SMS.

Alat  dan bahan :

1.  Modul microcontroller AVR

2.  Modem GSM  dgn serial Port

4.  GSM SIM CARD (XL ,simpati ,tri, dll)

5.  Software Codevision

Prinsip dan Cara kerja Mengirim SMS melalui Microcontroller

Microcontroller mengirim  data ( isi SMS dan No tujuan) ke modem GSM  melalui RS232,kemudian modem GSM mengirim  data tsb ke SMS center yang akan menyampaikan ke No Hp yg dituju.

Blok diagram mengirim-menerima SMS dgn Mikrokontroller

Perintah yang di mengerti modem  adalah “AT Command” . Disebut AT Command karena perintah2nya  didahului oleh “AT” ( Atention).

Contoh beberapa AT command  untuk Modem GSM:

AT+CPBF  : cari no telp.
AT+CPBR  : membaca buku telp.
AT+CPBW : menulis  no telp di buku telp.
AT+CMGF  : menyeting mode SMS text atau PDU
AT+CMGL : melihat semua daftar sms yg ada.
AT+CMGR : membaca sms.
AT+CMGS  : mengirim sms.
AT+CMGD  : menghapus sms.
AT+CMNS : menyeting lokasi penyimpanan ME(hp) atau SM(SIM Card)

AT+CGMI : untuk mengetahui nama atau jenis ponsel
AT+CGMM : untuk mengetahui kelas ponsel
AT+COPS? : untuk mengetahui nama provider kartu GSM
AT+CBC : untuk mengetahui level baterai
AT+CSCA : untuk mengetahui alamat SMS Center

Dalam proses pengiriman atau penerimaan SMS, terdapat  2 mode  yaitu:

1. Mode SMS  text

2. Mode SMS PDU (Protocol Data Unit).

Mode yang paling mudah digunakan yaitu mode teks (kode ASCII)

Penjelasan Beberapa AT Command

AT+CPMS : Mengeset Target lokasi memory

AT Command Respon  Modem
AT+CPMS=[Mode1],[Mode2],[Mode3] OK

Mode1],[Mode2],[Mode3]  , SM =SIM Card , ME (HP) , MT  semua storage.

-AT+CMGF : Mengeset Modem sebagai Mode text atau  PDU.

AT Command Respon  Modem
AT+CMGF=<mode><CR> OK

Parameter 
<mode>     0 =Mode PDU,   1 =  Mode text

<CR> = ASCII character 13

Contoh  Set  GSM modem ke  Text Mode SMS dan kirim  sms ke  No : +6285695341050.

(anda bisa mencobanya lebih dahulu pada hyperterminal)

AT+CMGF=1          <akhiri dg enter(CR) >
OK // ini respon ok dari modem 
AT+CMGS="+6285695341050"  <akhiri dg enter(CR)
> > hallo apa kabar.  <akhiri dgn CTRL-Z>
+CMGS: 324  //parameter jawaban dari modem
OK // jawaban ok dari modem
Untuk mengetahui Mode apa yang sedang aktif gunakan perintah:
AT+CMGF?

 AT+CMGL: Melihat  sms yang ada 

AT Command Respon Modem
AT+CMGL=<stat><CR> +CMGL: <index>,<stat>,<oa>,[<alpha>],[<scts>]<CR><LF><data><CR><LF>

OK

Parameter
<stat>:  Status , antara lain:

status sms  mode text  mode PDU
sms blm dibaca “REC UNREAD” 0
sms sdh dibaca “REC READ” 1
sms tak terkirim “STO UNSENT” 2
sms terkirim “STO SENT” 3
semua sms “ALL” 4

<index>: Index  pesan
<oa>: alamat Originator
<alpha>: Originator name (jika ada di phonebook)
<scts>:  waktu
<data>:  isi pesan

<CR>: ASCII character 13
<LF>: ASCII character 10

Contoh :

Settinglah   modem GSM ke  Mode SMS text,  lihat   semua sms yg ada kemudian hapus sms dari  modem GSM.

AT+CMGF=1 < tekan enter(CR) >
OK
AT+CMGL="ALL"  //(pada mode PDU(CMGF=0) gunakan AT+CMGL=4)
+CMGL: 1,"REC UNREAD","+6285695341050",,"11/01/09,10:26:26+04" pesan pertama
+CMGL: 2,"REC UNREAD","+6285695341050",,"11/01/09,10:26:49+04" pesan kedua 
OK
AT+CMGD=1 //hapus pesan pertama 
OK 
AT+CMGD=2 //hapus pesan kedua
OK
 

Jika ada sms masuk modem akan memberi pemberitahuan  :

+CMTI : “SM”,1″

artinya ada sms diimpan di indek pertama

AT+CMGD : Menghapus SMS

AT Command Response MODEM
AT+CMGD=<index><CR> OK
contoh
AT+CMGD=1 //hapus pesan urutan pertama 
OK //jawaban dari modem GSM
 

AT+CMGS : Mengirim SMS

AT Command Response modem GSM
AT+CMGS=<number><CR><message><CTRL-Z> +CMGS:<mr>
OK

Parameter
<CR> = ASCII character 13
<CTRL-Z> = ASCII character 26
<mr> = message Reference

Contoh
Menseting modem GSM ke  Mode SMS  text dan menngirim sms ke +6285695341050.

AT+CMGF=1
OK //jawaban modem
AT+CMGS="+6285695341050"  <akhiri dgn enter bukan entar :-)
> halo pc control <akhiri dgn CTRL-Z> 
+CMGS: 123 //parameter jawaban dari modem 
OK //jawaban dari modem 

demikianlah ceritanya  dasar perintah AT Command.

Perintah Microcontroller  mengirim  AT Commad  ke modem GSM

Mikrokontroller yg kita gunakan jenis AVR dgn pemrograman C codevision

Gunakan fungsi printf untuk mengirim string At command ke modem  GSM.dan  putchar  jika hanya mengirim  1 karakter.

contoh

printf(“AT+CMGF=1”);                            //menyeting modem GSM ke  mode text

putchar(13);                                                 //mengirim 1 karakter  CR / enter.

printf(“AT+CMGS=”);
putchar(‘ ” ‘);
printf(“+6285695341050″);                  //no HP  yg dituju
putchar(‘ ” ‘);
putchar(13);                                                  //kode ascii <CR>
printf(” apa kabar “);

putchar(26);                                                // kode ASCII untuk  CTRL-Z

kalau ada hal yg membingungkan atau ada pertanyaan silahkan di comment saja

referensi:

– Mobile Application Development with SMS and the SIM Toolkit

http://www.developershome.com/sms

http://www.avrku.com/2010/02/send-sms-pakai-microcontroller.html

http://www.jazi.staff.ugm.ac.id/jazi.pdf

http://electroniclib.wordpress.com/2011/01/27/at-command-gsm-modem-sim300-part-1-pengoperasian-dengan-komputer/

http://www.atmel.com/Images/doc8016.pdf

http://www.dreamfabric.com/sms/

http://u2technologies.wordpress.com/2011/04/03/sms-gateway-dengan-at89s52-c51/

Pengetahuan Dasar Membuat Laporan / Report di .NET dgn Visual C#

Report yang kita akan  buat disini adalah sebuah kesimpulan dari  data di dlm database  yang ditampilkan dalam bentuk  tabel  dan atau grafik  pada form  C# . Form tsb bisa di print  atau di rubah kedalam bentuk format ms Exel atau pdf.

Contoh  report:

Contoh report

Contoh report

Langkah Langkah Membuat report

1. Buat project C#  baru

2. Drag and drop  report viewer ke dlm form

drag and drop report viewer

3.  Buat dataset

membuat dataset

datasource1

– masukan nama server dan pilih database ,

– pilih database name . Pada contoh ini kita pilih database  produksi  pada ms sql server yg sudah kita buat sebelumnya . anda bisa mengggunakan ms access atau mysql atau database lainnya.

data-source2

data-source3

4. Kembali ke Form Utama , klik komponen reportviewer

form

– mendesain form report

datasetwizard1

-pilih database

datasetwizard2

– klik Next sampai Finish , sampai tampil hasil form report sbb :

hasil-report

– Kembali ke form Utama , dan pilih file report yg sudah dibuat spt tampak pd panah merah di gambar berikut

form

5.  Klik menu run untuk melihat hasil

hasil

selesai.

pada hasil report diatas tampak hasil  data kosong , karena memang datbase belum ada datanya :-).

 

Pengetahuan Dasar Pemrograman SPI (serial Pheriperal Interface) pada AVR dengan AVR Studio

Pada artikel ini saya  akan membahas pemrograman SPI dengan AVR Studio , setelah pada artikel  lain saya sudah bahas SPI dgn CodeVision bisa  anda baca disini 

Transfer data dengan SPI digunakan antara Master ( Microcontroller) dgn slave (microcontroller atau SPI device  spt MMC card, SPI ADC , dll)  dalam jarak dekat dan kecepatan cukup tinggi.

Komunikasi serial data antara master dan slave pada SPI diatur melalui 4 buah pin yang terdiri dari SCLK, MOSI, MISO, dan SS  sbb:

  • SCLK dari master ke slave yang berfungsi sebagai clock
  • MOSI jalur data dari master dan masuk ke dalam slave
  • MISO jalur data keluar dari slave dan masuk ke dalam master
  • SS (slave select) merupakan pin yang berfungsi untuk mengaktifkan slave

SPI Diagram

Transfer data SPI

Pin / kaki SS (slave select) merupakan pin yang berfungsi untuk mengaktifkan slave sehingga pengiriman data hanya dapat dilakukan jika slave dalam keadaan aktif (active low). Dari gambar diagram SPi diatas anda sudah bisa membayangkan bagaimana cara SPI mentransfer data antara Master dan slave. Intinya ada di  register geser 8 bit.  Tiap clock dari SCK akan mempertukarkan 1 bit data , jadi untuk mempertukarkan register di master dan slave perlu 8 kali clock. contoh konkritnya begini: data di register geser master adalah 1111  1111 data di register gaser slave adalah  0000 0000

keadaan awal

kemudian pada clock pertama dan kedua  isi register berpindah sbb:

Setelah 8 kali clok data berpindah:

Jalur SPI pada AVR Atmega8535

Jalur SPI pada Atmega8535

Register yang terkait dgn SPI:

Sebelum kita memprogram SPI dengan AVR Studio kita perlu mengetahui 3 buah regsiter yg terkait dgn SPI yaitu:

.

1. Register Control SPI  ( SPCR )

bit SPIF diset =  1 ,  menyebabkan interupsi SPI .

bit SPE  di set =1  : untuk mengaktifkan fungsi SPI

bit MSTR diset =1 menjadikan microcontroller sbg Master SPI, artinya menjadi sumber pengendali.

bit DORD diset 1 maka bit yg dikirim  pertama LSB, jikaDORD= 0 bit yg pertama dikirim MSB
kombinasi Bit SPI2X, SPR1, dan SPR0 untuk menentukan sumber clock

000: SCK = system clock/4
001: SCK = system clock/16
010: SCK = system clock/64
011: SCK = system clock/1284
100: SCK = system clock/2
101: SCK = system clock/8
110: SCK = system clock/32
111: SCK = system clock/64

2. Register Status SPI (SPSR)
bit SPIF otomatis di set 1 ketika delapan bit data telah ditransfer dari master ke slave.
SPSR ini juga berisi bit SPI2X digunakan untuk mengatur frekuensi SCK
3. Register Data (SPDR)
Register ini berisi data yg akan ditulis atau dibaca.

Contoh Code inisialisasi dan baca-tulis SPI dengan AVR Studio
void inisialisasi_spi(unsigned char control)
{
DDRB = 0xA0; //Set SCK (PB7), MOSI (PB5) sbg output,

//konfigurasi Register Control (SPCR)
SPCR = 0x53; //SPIE:0,SPE:1,DORD:0,MSTR:1,CPOL:0,CPHA:0,SPR:1,SPR0:1
}

void menulis_databyte(unsigned char databyte)
{
SPDR = databyte;
while (!(SPSR & 0x80));  //tunggu sampai data selesai di transfer
}

unsigned char membaca_databyte(void)
{
while (!(SPSR & 0x80));  //tunggu sampai data selesai di terima
return SPDR;
}

Master  dapat dihubungkan dengan banyak slave

Master dihubungkan dengan banyak slave dengan cara berantai/ cascade

SPI_daisy_chained

Contoh aplikasi SPI lainnya bisa anda baca disini:
https://pccontrol.wordpress.com/2011/09/15/pemrograman-display-7-segment-dengan-spi-max7221/

referensi :

Contoh Code Slave Modbus dengan Microcontroller AVR Atmega8535 dgn bahasa C codevision

Pada Artikel ini saya mencoba  membuat Slave  untuk protokol Modbus dengan microcontroller Atmega8535 dengan bahasa C CodeVision.  Saya berharap bagi anda yang sudah mengerti atau  pernah membuat , bisa memberikan masukannya demi kemajuan kita semua.

Untuk mengerti  tentang modbus RTU atau ASCII anda sebaiknya sudah mengerti pemrograman RS232 /  RS485 . anda bisa baca pada artikel lainya pada blog ini.

Kita akan membuat  Slave dengan function Code 03 dan 04 yaitu   fungsi untuk membaca data (register)  pada slave ,  sebagai masternya  adalah program di PC dengan C# .

Untuk versi awal ini saya tidak menggunakan timeout spt yg dipersyaratkan oleh Modbus , untuk menghindari kerumitan.

Konsep dasar  modbus RTU.

master-slave-modbus

master-slave-modbus function code 03 atau 04

Program Master Pada PC

Slave Modbus hanya bersifat menungu perintah dari master , maka  sebelumnya kita harus membuat program sbagai Master  pada PC untk mengirim query /perintah. Perintah master disebut query dan jawaban slave disebut respon.

Program pd PC akan kita buat dgn C#, program ini  akan berfungsi:

1. Mengirim Perintah (query)  ke Slave.

2. Menerima Respon dari Slave.

Berikut ini contoh kode program mengirim perintah/query dengan C# :

pembahasan contoh  master RTU lengkapnya bisa baca di artikel ini

private SerialPort serialcomm1 = new SerialPort();

private void open_com_Click()
{
                serialcomm1.PortName = "COM1";
                serialcomm1.BaudRate = 9600;
                serialcomm1.DataBits = 8;
                serialcomm1.Parity = Parity.None;
                serialcomm1.StopBits = StopBits.One;

                serialcomm1.ReadTimeout = 1000;
                serialcomm1.WriteTimeout = 1000;
                serialcomm1.Open();
}
private void KirimPerintah(ref byte[] framedata)
        {

            byte[] CRC = new byte[2];
            ushort alamat _awal = Convert.ToUInt16(txtAlamat_Awal_Register.Text)
            ushort jumlah_register = Convert.ToUInt16(txtJumlah_Register.Text);
                //Clear  buffers:
                serialcomm1.DiscardOutBuffer();
                serialcomm1.DiscardInBuffer();
                //Perintah Function Code 03 selalu  8 byte:
                byte[] framedata = new byte[8];

            framedata[0] =Convert.ToByte(txtAlamatSlave.Text);
            framedata[1] = 0x03 ; //FuctionCode
            framedata[2] = (byte)(alamat_awal >> 8);    // MSB starting address
            framedata[3] = (byte)alamat_awal;           // LSB
            framedata[4] = (byte)(jumlah_register >> 8);  //MSB
            framedata[5] = (byte)jumlah_register;         //LSB
            GetCRC(framedata, ref CRC);
            framedata[framedata.Length - 2] = CRC[0];
            framedata[framedata.Length - 1] = CRC[1];

             //kirim perintah/query  ke slave
                    serialcomm1.Write(framedata, 0, framedata.Length);

            }

//fungsi menghitung Error Check ( CRC16 )
 private void GetCRC(byte[] framedata, ref byte[] CRC)
        {

            ushort CRCFull = 0xFFFF;
            byte CRCHigh = 0xFF, CRCLow = 0xFF;
            char CRCLSB;

            for (int i = 0; i < (message.Length) - 2; i++)
            {
                CRCFull = (ushort)(CRCFull ^ message[i]);

                for (int j = 0; j < 8; j++)
                {
                    CRCLSB = (char)(CRCFull & 0x0001);
                    CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);

                    if (CRCLSB == 1)
                        CRCFull = (ushort)(CRCFull ^ 0xA001);
                }
            }
            CRC[1] = CRCHigh = (byte)((CRCFull >> 8) & 0xFF);
            CRC[0] = CRCLow = (byte)(CRCFull & 0xFF);
        }

Anda bisa juga membuat program mengirim data tetap buat testing saja
contoh data :

  • 01 05 00 01 00 02 CB  1D    //data ini a kan memberi memberi fuction eror
  • 01 03 00 01 00 02   CB 95  // data yg ok FC=03

data data tsb akan ditampilkan di LCD2x16 dlm bentuk desimal.

private void button2_Click(object sender, EventArgs e)       
 {

            byte[] message = new byte[9]; 

            message[0] = 0x01; //address;
            message[1] = 0x03;//FC03;

            message[2] = 0x00;//START ADRESS MSB ;
            message[3] = 0x01;  //START ADRESS LSB;

            message[4] = 0x00;  //QTY REGISTER MSB;
            message[5] = 0x02;  //QTY REGISTER LSB;

            message[6] = 0x95; //   CRC LOW             
            message[7] = 0xCB; //   CRC High

           serialcomm1.Write(message, 0, message.Length);
                    }

Berikut ini contoh program untuk Microcontroller Atmega8535 dgn C codevision:  (maaf  belum selesai)

/*

fungsi usart_rx_isr()   -> untuk menerima data dan simpan di rx_buffer

fungsi kirim_data_isr()   -> untuk mengirim data array di tx_buffer

fungsi main()    -> fungsi  utama terus menerus mengecek data rx_buffer yg datang.

fungsi  checkframedata()   -> fungsi  yg  memeriksa  alamat , fungsi 03 dan crc

fungsi baca_register()   -> fungsi untuk membaca  alamat  register yg dituju

fungi get_crc();    -> fungsi untuk menghitung nilai CRC dari frame datang atau yg akan dikirim.

/*****************************************************

Date    : 6/30/2011
Author  : PCCONTROL.WORDPRESS.COM
Company :
Comments: Slave Modbus RTU 

Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega8535.h>
#include <math.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
#include <string.h>
#include <stdio.h>

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

unsigned char	sendBuf[32],localAddr = 0x1;
// USART Receiver buffer
#define RX_BUFFER_SIZE 30
unsigned char rx_buffer[RX_BUFFER_SIZE],rx_counter;

//char tampung3[16]; 

unsigned char CRC[2],CRCLow,CRCHigh;
unsigned char tampung1[10];
unsigned char tampung2[10];
unsigned char tampung3[10];
unsigned char data0[10];
unsigned char data1[10];
unsigned char data2[10];
unsigned char data3[10];
unsigned char data4[10];
unsigned char data5[10];
unsigned char data6[10];
unsigned char data7[10];
//unsigned char data8[10];

unsigned char r_ready; 

void GetCRC(char message[], char panjangdata);
unsigned char rx_wr_index,tx_wr_index;

void checkframedata();
void readRegisters();
int getRegisterVal(int addr,int *tempData);
int testRegister; 

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
      if(rx_wr_index <= 7)  // 0 sampai 7
      {  

      rx_buffer[rx_wr_index]=data;
      rx_wr_index++;
      }
      else
      {
       lcd_clear();
       sprintf(tampung3,"%i",rx_wr_index);
       lcd_gotoxy(15,1);
       lcd_puts(tampung3); 

       GetCRC(rx_buffer,rx_wr_index-2);

       rx_wr_index=0;
       r_ready=1;
       UCSRB.7=0;
      }

   };
}

void main(void)
{

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("MODBUS SLAVE FC3");
// Global enable interrupts
#asm("sei")

 r_ready=0;
 rx_wr_index=0;
 UCSRB.7=1;  

while (1)
      {
      // Place your code here

        //ambil parameter
        if(r_ready==1)  //==============
           {  

             checkframedata(); 

           } 

      }; //end of while(1)
}     //end of main

        void GetCRC(char message[], char panjangdata)
       // unsigned  int GetCRC(char message[], char panjangdata)
        {
            //Function expects a modbus message of any length as well as a 2 byte CRC array in which to
            //return the CRC values:
           unsigned char i,j;
            unsigned int  CRCFull = 0xFFFF;
         //  unsigned char CRCHigh = 0xFF, CRCLow = 0xFF;
           unsigned  char CRCLSB;

            for (i = 0; i < (panjangdata) ; i++)
            {
                CRCFull = (CRCFull ^ message[i]);

                for ( j = 0; j < 8; j++)
                {
                    CRCLSB = (CRCFull & 0x0001);   //ambil LSB
                    CRCFull = ((CRCFull >> 1) & 0x7FFF);  // geser 

                    if (CRCLSB == 1)
                        CRCFull = CRCFull ^ 0xA001;
                }
            }
            CRC[1] = CRCHigh = ((CRCFull >> 8) & 0xFF);
            CRC[0] = CRCLow = (CRCFull & 0xFF); 

           return ;//0 ; //CRCFull;
        }

  void checkframedata()
  {  

      //untuk mendebug tampilkan Data di baris pertama dan CRC di baris ke dua  LCD 2x16
        sprintf(data0,"%i",rx_buffer[0]); //01
        lcd_gotoxy(0,0);
        lcd_puts(data0); 

        sprintf(data1,"%i",rx_buffer[1]); //03
        lcd_gotoxy(3,0);
        lcd_puts(data1);

        sprintf(data2,"%i",rx_buffer[2]); //00
        lcd_gotoxy(6,0);
        lcd_puts(data2);

        sprintf(data3,"%i",rx_buffer[3]); //01
        lcd_gotoxy(9,0);
        lcd_puts(data3);

        sprintf(data4,"%i",rx_buffer[4]); //00
        lcd_gotoxy(12,0);
        lcd_puts(data4);

        sprintf(data5,"%i",rx_buffer[5]); //02
        lcd_gotoxy(14,0);
        lcd_puts(data5);
        // tampilkan nilai CRC kiriman dari PC

        sprintf(data6,"%i",rx_buffer[6]); //123
        lcd_gotoxy(0,1);
        lcd_puts(data6);

        sprintf(data6,"%i",rx_buffer[7]); //123
        lcd_gotoxy(3,1);
        lcd_puts(data6);

        //Tampilkan Nilai CRC hasil hitungan Microcontroller
        sprintf(tampung1,"%i",CRC[1]);
        lcd_gotoxy(7,1);
        lcd_puts(tampung1);  

        sprintf(tampung2,"%i",CRC[0]);
        lcd_gotoxy(10,1);
        lcd_puts(tampung2);  

	if(rx_buffer[0]==0x01)  // alamat slave ini = 01
	 {
	  if(CRC[1] == rx_buffer[7] && CRC[0]==rx_buffer[6])
	{
	  	if(rx_buffer[1] == 0x03)
	  	{
	  	 lcd_gotoxy(14,1);
	         lcd_putsf("ok");
	        readRegisters();
		}
		 else if(rx_buffer[1] != 3)
		 {
		 lcd_gotoxy(0,1);
		 lcd_putsf("Fuction Error ");
		 }
	  }
         else
          {
          lcd_gotoxy(0,1);
	  lcd_putsf("CRC error    ");
          }

         }											

   r_ready=0;
   rx_wr_index=0;
   UCSRB.7=1;
  }       

void readRegisters(void)
{
	unsigned char addr;
	unsigned char tempAddr;

	unsigned int crcData;
	unsigned char readCount;
	unsigned char byteCount;

	unsigned int i;
	unsigned int tempData = 0;	

	//addr = (receBuf[2]<<8) + receBuf[3];
	//tempAddr = addr & 0xfff;
	addr = rx_buffer[3];
	tempAddr = addr;

	//readCount = (receBuf[4]<<8) + receBuf[5];	//?????
	readCount = rx_buffer[5];

	byteCount = readCount * 2;

	for(i=0;i<byteCount;i++)
	{     tempAddr++;
		getRegisterVal(tempAddr,&tempData);
		sendBuf[2*i+3] = tempData >> 8;
		sendBuf[2*i+4] = tempData & 0xff;
	}

	sendBuf[0] = localAddr;
	sendBuf[1] = 3;
	sendBuf[2] = byteCount;
	byteCount = byteCount + 3;
	GetCRC(sendBuf,byteCount);;
	sendBuf[byteCount] = crcData >> 8;
	byteCount++;
	sendBuf[byteCount] = crcData & 0xff;

	tx_wr_index = byteCount + 1;
	//beginSend();
}//void readRegisters(void)

int getRegisterVal(int addr,int *tempData)
{
	 int result = 0;

	switch(addr & 0xff)
	{
		case 0:
		        	*tempData = testRegister;
				break;
		case 1:
				break;

		default:
				break;
	}

	return result;
}

tobe continue….

referensi:

http://chinahack.com

http://www.modbus.pl/Microchip.html

Pengaturan Daya Listrik Bolak Balik ( AC ) oleh Microcontroller menggunakan TRIAC

Pengaturan daya listrik  bolak balik / AC  dapat dilakukan dengan menggunakan  TRIAC .

.

Arus Gate hanya diperlukan untuk menghubungkan MT1 dan MT2, setelah itu MT1 akan tetap terhubung ke MT2 meskipun sudah tidak ada arus gate lagi. Pemberian arus gate sesaat untuk menghubungkan MT1 dan MT2 dikatakan sebagai penyulutan / men-triger TRIAC.  Pada saat  arus beban menjadi lebih kecil dari arus triger TRIAC , TRIAC akan menjadi OFF yaitu   ketika sinyal AC pada posisi 0.

Pengaturan daya dilakukan dengan cara merubah besaran phase listrik AC. dengan cara mengatur waktu penyulutan TRIAC oleh microcontroller.

waktu triger Triac diatur oleh microcontroller

Zero crossing Detektor untuk  menentukan titik  nol sinyal Ac untuk memulai delay ,  ia akan  menginterupsi  microcontroller  saat sinyal AC pada posisi 0.  misal yg kita pakai INT0 (interup ekternal 0).

Jadi tahapanya sebagai berikut:

1.  Pada saat sinyal Ac  menuju titik o  , maka zero crosing detektor memberi sinyal interupsi ke pin INT0 microcontroller.

2.  Microcontroller mejalankan  program interupt servis rutin INT0.

Program servis rutin  INT0 berisi  delay dan output untuk men triger gate TRIAC. Besarnya nilai delay menentukan daya yg disalurkan oleh TRIAC. Contoh dibawah ini  besarnya delay 5 ms. artinya setelah 5 ms micon akan mentriger TRIAC .

Beberapa gambaran hasil pengaturan daya listrik bolak balik / AC :

 

Beberapa hasil output pengaturan daya dgn TRIAC

 

ini salah satu contoh aplikasi  :

http://www.avrprojects.info/avr-projects/digital-dimmer-using-atmega8/

referensi:

MICROCONTROLLER AND TRIACS 

Dimming AC Incandescent Lamps Using A PIC10F200

Pengetahuan Dasar Pemrograman SPI (serial Pheriperal Interface) pada AVR dengan Codevision

Transfer data dengan SPI digunakan antara Master ( Microcontroller) dgn slave (microcontroller atau SPI device  spt MMC card, SPI ADC , dll)  dalam jarak dekat dan kecepatan cukup tinggi.

Komunikasi serial data antara master dan slave pada SPI diatur melalui 4 buah pin yang terdiri dari SCLK, MOSI, MISO, dan SS  sbb:

  • SCLK dari master ke slave yang berfungsi sebagai clock
  • MOSI jalur data dari master dan masuk ke dalam slave
  • MISO jalur data keluar dari slave dan masuk ke dalam master
  • SS (slave select) merupakan pin yang berfungsi untuk mengaktifkan slave

SPI Diagram

Transfer data SPI

Master  dapat dihubungkan dengan banyak slave

Pin / kaki SS (slave select) merupakan pin yang berfungsi untuk mengaktifkan slave sehingga pengiriman data hanya dapat dilakukan jika slave dalam keadaan aktif (active low). Dari gambar diagram SPi diatas anda sudah bisa membayangkan bagaimana cara SPI mentransfer data antara Master dan slave. Intinya ada di  register geser 8 bit.  Tiap clock dari SCK akan mempertukarkan 1 bit data , jadi untuk mempertukarkan register di master dan slave perlu 8 kali clock. contoh konkritnya begini: data di register geser master adalah 1111  1111 data di register gaser slave adalah  0000 0000

keadaan awal

kemudian pada clock pertama dan kedua  isi register berpindah sbb:

Setelah 8 kali clok data berpindah:

Jalur SPI pada AVR Atmega8535

Jalur SPI pada Atmega8535

Pemrograman AVR SPI dengan Codevision

Buka projeck baru, gunakan codewizard

set micon sebagai master

Fungsi Mengirim data: SPI(char data)

Menerima data: char hasil = SPI(0)

Contoh Program membuat Voltmeter dgn SPI ADC   AD7896  12 bit   :

Rangkaian Koneksi SPI   ADC dan AVR Code Program

/* 

   Digital voltmeter using an

   Analog Devices AD7896 ADC 12 bit

   using the SPI bus

#asm

    .equ __lcd_port=0x15

#endasm

#include <lcd.h> // LCD driver routines

#include <spi.h> // SPI driver routine

#include <mega8535.h>

#include <stdio.h>

#include <delay.h>

// AD7896 reference voltage [mV]

#define VREF 5000L

// AD7896 control signals PORTB bit allocation

#define ADC_BUSY PINB.0

#define NCONVST PORTB.1

// LCD display buffer

char lcd_buffer[33];

unsigned read_adc(void)

{

unsigned result;

// start conversion in mode 1

// (high sampling performance)

NCONVST=0;

NCONVST=1;

while (ADC_BUSY);    // tunggu konversi sampai selesai 

// baca byte MSB
result=(unsigned) spi(0)<<8;

//baca byte LSB , lalu gabungkan dengan  MSB

result= result | spi(0);

// konversi hasil pembacaan ADC , menjadi nilai Volt

result=(unsigned) (((unsigned long) result*VREF)/4096L);

return result;

}

void main(void)

{

// initialize PORTB

// PB.0 input from AD7896 BUSY

// PB.1 output to AD7896 /CONVST

// PB.2 & PB.3 inputs

// PB.4 output (SPI /SS pin)

// PB.5 input

// PB.6 input (SPI MISO)

// PB.7 output to AD7896 SCLK

DDRB=0x92;

// initialize the SPI 
// master mode

// no interrupts, MSB first, clock phase negative

// SCK low when idle, clock phase=0

// SCK=fxtal/4

SPCR=0x54;

// the AD7896 will work in mode 1

// (high sampling performance)

// /CONVST=1, SCLK=0

PORTB=2;

// initialize the LCD

lcd_init(16);

lcd_putsf("AD7896 SPI bus\nVoltmeter");

delay_ms(2000);

lcd_clear();

// baca input dan tampilkan ADC ke LCD

while (1)

      {

      sprintf(lcd_buffer,"Uadc=%4umV",read_adc());
      lcd_clear();
      lcd_puts(lcd_buffer);
      delay_ms(100);

      };

}

referensi :

Mengirim Data Respon dari Slave (Microcontroller) ke Master ( PC )

Pada Artikel artikel  sebelum sebelumnyakita sudah membahas pengiriman perintah  dan parameter ke Slave , pada artikel kali ini saya akan mejelaskan tentang pengiriman data dari slave ke master  atas permintaan dari master , master bisa berupa PC atau microcontroller juga.

Permintaan Master dan Respon Slave

Contoh konkrit  Aplikasi  yang membutuhkan  respon Slave kpd Master :

  • Sebuah PC (Master)  mengumpulkan data  output produksi dari beberapa mesin atau line produksi. Maka PC  tiap interval tertentu menanyakan ke slave jumlah aktual hasil output produksi dan Slave harus menjawabnya. Contohnya sbb : PC mengirim “01:output”   ,artinya menanyakan jumlah output produksi slave1, kemudian slave1 (microcontroller)  menjawab  “01:ABCD=500:3 ” ,  artinya model= ABCD, slave1, output ok= 500 , output NG= 3
  • Sebuah PC (master) mengumpulkan data Temperatur dan humidity dari beberapa slave microcontroler dengan cara menanyakan ke slave dan slave harus memeberi jawaban/respon.
  • Sebuah PC diguanakan untuk  menghidupkan dan mematikan alat dari jarak jauh maka jika PC   ingin tahu apakah berhasil menyalakan  atau mematikan alat tsb dgn cara menanyakan ke slave.
  • dsb.
Cara pengiriman data serial dari microcontroller ada 2 cara:
1. Mengirim data serial dengan interupsi jika interupsi di aktifkan otomatis isi buffer pengiriman (tx_buffer) akan dikirim. langkah-langkah pengiriman dgn cvara interupsi: – isi tx_buffer dengan data yg akan kita kirim – aktifkan interupsi serial transmiter – jika sudah semua data dikirim matikan kembali serial transmiter.
contoh: mengirim data (diakhiri CR,LF)

    char data1=0x8;
    char data2=0x6;
    char data3=0x2;
    //simpan data ke tx_buffer
    sprintf(tx_buffer, "%ld,%ldf,\n\r",data1,data2,data3);
    UCSRB.5=1;  aktifkan interupsi serial transmiter

2. Mengirim tanpa interupsi pengiriman dengan perintah putchar(char) contoh:

putchar('a');

perintah ini akan mengirim karakter ASCII ‘a’.

bersambung

Mengontrol Input dan Output Paralel Port dengan C#

contoh Input Output melalui LPT

 

Pin No  SPP Signal Direction In/out Register.bit
1* nStrobe In/Out Control.0
2 Data 0 In/Out Data.0
3 Data 1 In/Out Data.1
4 Data 2 In/Out Data.2
5 Data 3 In/Out Data.3
6 Data 4 In/Out Data.4
7 Data 5 In/Out Data.5
8 Data 6 In/Out Data.6
9 Data 7 In/Out Data.7
10 nAck In Status.6
11* Busy In Status.7
12 Paper-Out / Paper-End In Status.5
13 Select In Status.4
14* nAuto-Linefeed In/Out Control.1
15 nError / nFault In Status.3
16 nInitialize In/Out Control.2
17* nSelect-Printer/ nSelect-In In/Out Control.3
18 – 25 Ground Gnd

Alamat Register2 paralel port:

Register Alamat
Data register (Base Address + 0) 0x378
Status register (Base Address + 1) 0x379
Control register (Base Address + 2) 0x37a

Sebelum memprogram Paralel port anda harus mendowload  file

inpout32.dll  kemudian simpan di direktory system di windows anda.

1. Buat Project baru

2. Drag and drop 2 tombol dan 2 text box

3. buat class baru  , beri nama LPT

membuat Form dan Class baru

//untuk class LPT isinya sbb:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication2
{
    class LPT
    {
        [DllImport("inpout32.dll", EntryPoint = "Out32")]
        public static extern void Output(int adress, int value);
        [DllImport("inpout32.dll", EntryPoint = "Inp32")]
        public static extern int Input(int adress);
    }
}

Untuk di form utama isi code nya spt ini:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnKirimKeLPT_Click(object sender, EventArgs e)
        {
            LPT.Output(0x378, Int32.Parse(txtdataOut.Text));
        }

        private void btnBacaLPT_Click(object sender, EventArgs e)
        {

            txtdataIn.Text   =   Convert.ToString(LPT.Input(0x378));
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

Mengirim Data berbentuk Array Byte pada Komunikasi Serial RS232 / RS-485 dgn C#

Pada komunikasi serial Rs232 atau rs485 data dapat dikirim dalam 2 type data yaitu:

  1.  Text (karakter ASCII) .  contoh  mengirim  13, data aktual yg dikirim 31H,33H (lihat tabel ASCII)
  2.  Byte ( hexa).  contoh   mengirim   13 ,  data aktual yg dikirim   0DH

Pada penggunaan umum( yang lebih mudah)  kita mengirim data  menggunakan bentuk text ASCII. Tapi pada penggunaan tertentu lebih diutamakan pengiriman dalam bentuk byte.

Dalam komunikasi protokol modbus  terdapat 2 buah tipe pengiriman data yaitu

  1.  Pengiriman data dalam bentuk  text atau disebut modbus ASCII.
  2.  Pengiriman data dalam bentuk byte atau disebut modbus RTU.
Pada kesempatan ini saya akan menjelaskan pengiriman data melalui PC ke microcontroller via RS232 dalam bentuk array type data Byte /hex menggunakan bahasa pemrograman  C#.
Tahapannya:
  1. Jika data lebih kecil dari 256 rubah ke byte langsung, jika  data text  > 255   rubah data text ke ke   Integer
  2. Konversi type Integer ke type byte
  3. Simpan ke dlm array
  4. Kirim data ke rs232 (TX buffer)
Karena type data   byte hanya 8 bit :  0 sampai 255 (0xFFH) maka jika data integer 16 bit disimpan ke dalam 2 byte contoh:
misal txtRegister.text = 4000 (0F A0 Hexa) ,  MSB nya = 0x0F
LSB nya = 0xA0
Cara merubah text ASCII ke integer:
ushort start = Convert.ToUInt16(txtRegister.Text);
Cara merubah data integer 16 bit ke byte dan menyimpan ke dlm array message:
message[i] = (byte)(start >> 8);    // MSB
message[i+1] = (byte) start;          //   LSB
Contoh : mengirim nilai  register pada modbus function code 16 (FC 16)
Format data pengiriman modbus function 16 menulis ke beberapa register 16 bit :
Contoh Kode Program mengirim perintah Function Code-16 pd Modbus RTU:

{
byte address = Convert.ToByte(txtSlaveID.Text);
ushort start = Convert.ToUInt16(txtWriteRegister.Text);
short[] value = new short[1];
value[0] = Convert.ToInt16(txtWriteValue.Text);
ushort registers = 1;
//Array untuk  byte CRC :
byte[] CRC = new byte[2];
//Message = 1 byte alamat slave + 1 function code + 2 byte  start register
//          2 byte register +  2 byte * nilai reg  + 2 byte CRC
byte[] message = new byte[9 + 2 * registers]; // 1 register 2 byte
byte jenisFC = 16;

 //============================================================================

SerialPort Rs232_ku = new SerialPort();      
message[0] = address;                //
message[1] = jenisFC;                   //
message[2] = (byte)(start >> 8);     // alamat reg awal msb
message[3] = (byte) start;           // alamat reg awal lsb
message[4] = (byte)(registers >> 8); // jumlah reg  msb
message[5] = (byte) registers;       // jumlah reg  lsb
message[6] = (byte)(registers * 2);   //n byte mengikuti (jumlah byte total dari register , 1 register) = 2byte

//nilai yg akan di kirim
for (int i = 0; i < registers; i++)
{                                               // i =     0      1      2
message[7 + 2 * i] = (byte)(values[i] >> 8);    // message[7]    [9 ]   [11]
message[8 + 2 * i] = (byte)(values[i]) ;        // message[8]    [10]   [12]
}

GetCRC(message, ref CRC);
message[message.Length - 2] = CRC[0];
message[message.Length - 1] = CRC[1];

//kirim message ke Serial Port:
Rs232_ku.Write(message, 0, message.Length);
}

private void GetCRC(byte[] message, ref byte[] CRC)
        {

            ushort CRCFull = 0xFFFF;
            byte CRCHigh = 0xFF, CRCLow = 0xFF;
            char CRCLSB;

            for (int i = 0; i < (message.Length) - 2; i++)
            {
                CRCFull = (ushort)(CRCFull ^ message[i]);

                for (int j = 0; j < 8; j++)
                {
                    CRCLSB = (char)(CRCFull & 0x0001);
                    CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);

                    if (CRCLSB == 1)
                        CRCFull = (ushort)(CRCFull ^ 0xA001);
                }
            }
            CRC[1] = CRCHigh = (byte)((CRCFull >> 8) & 0xFF);
            CRC[0] = CRCLow = (byte)(CRCFull & 0xFF);
        }

Referensi :

  • Modbus.pl
  • Modbus.org