Mengambil Perintah dan Parameter Setting pd AVR microcontroller melalui Komunikasi serial RS-485 (bag 2/2)

lanjutan dari artikel bagian 1

Membuat Program Untuk mengirim perintah dan nilai parameter di PC
dengan Vb6 :

Private Sub cmdSend_Click()
MSComm1.Output = Trim(txtalamatslave.Text) & ":" &_ 
Trim(txtperintah.Text) & "=" & Trim(txtnilaiParameter1.Text)_ 
& "y" & Trim(txtnilaiParameter2.Text) & "x"
End sub
tf

Form simple Master Rs-485

/*****************************************************
/*****************************************************
This program was produced by theCodeWizardAVR V1.24.8d 

Date    : 6/30/2011Author  : PCCONTROL.WORDPRESS.COM                            

Comments: PEMISAHAN PERINTAH DAN NILAI PARAMETER SETTING

Chip type           : ATmega8535
Program type        : ApplicationClock 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)

// USART Receiver buffer
#define RX_BUFFER_SIZE 30
char rx_buffer[RX_BUFFER_SIZE];
char tampung1[30];
char tampung2[30];  

unsigned char r_ready;
unsigned char rx_wr_index;

// USART Receiver interrupt service routineinterrupt [USART_RXC]
void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
 if (data != 'x')    //  contoh data dari PC  001:TINGGI=98y45x        
       {
       rx_buffer[rx_wr_index]=data;
         rx_wr_index++;
       }       
 else       
      {   
      rx_buffer[rx_wr_index]='\\o';   //akhir dari string harus '\\o' NULL
      rx_wr_index=0;  
      r_ready=1;
                 //signal cmd processor     
      UCSRB.7=0;     
      }

   };
}

// Standard Input/Output functions
char *daftar_perintah[] = {"PANJANG", "LEBAR", "TINGGI"};
#define PANJANG 0
#define LEBAR 1
#define TINGGI 2//int lebar,tinggi;

int panjang1,lebar1,tinggi1;int panjang2,lebar2,tinggi2;

// Declare your global variables here

  void ambil_parameter1();

void main(void)
{
// Declare your local variables here

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity

// 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("data diterima:");
// Global enable interrupts
#asm("sei")

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

while (1)     
     {

           if(r_ready==1)  

            {              
             lcd_clear();
             lcd_gotoxy(0,0);
             lcd_puts(rx_buffer);  //tampilkan data di baris pertama LCD
             ambil_parameter1();           
            } 

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

void ambil_parameter1() { 

   int int_param, i;

   char cmd;

   char Str_perintah[50];

   char alamat[40];
   char param1[50];
   char param2[50];

   char *batas_alamat,*batasakhir;
   char *batas1;
   char *batas2;

   int IndexBatas_alamat,jumlahcharperintah,jumlahcharpar1,jumlahcharpar2;
   int IndexBatas1, IndexBatas2; 

   if (r_ready != 1) return;

        batas_alamat=strchr(rx_buffer,':');   
     batas1 = strchr(rx_buffer,'=');   
     batas2 = strchr(rx_buffer,'y');    
     batasakhir=strchr(rx_buffer,'');   //bis juga dgn strlen

     if (batas1 != NULL)        { 

        //===485   
     IndexBatas_alamat = batas_alamat - rx_buffer;
        IndexBatas1 = batas1 - rx_buffer;        // jumlah command
       IndexBatas2 = batas2 - rx_buffer;    
    jumlahcharperintah = IndexBatas1 -  IndexBatas_alamat;  
      jumlahcharpar1 = batas2-batas1;  
      jumlahcharpar2 = batasakhir-batas2;

        strncpy(Str_perintah, rx_buffer +  IndexBatas_alamat + 1 ,jumlahcharperintah-1 );
       Str_perintah[jumlahcharperintah-1] ='';

        strncpy(alamat, rx_buffer ,IndexBatas_alamat);
        alamat[IndexBatas_alamat] ='\\o';  
       strncpy(param1, rx_buffer +  IndexBatas1 + 1 , jumlahcharpar1 - 1);
        param1[jumlahcharpar1 - 1]='\\o';  
       strcpy(param2, batas2 + 1);  
       param2[jumlahcharpar2-1]='\\o '; 

        }     
    else     
    {     
    // space not found, just copy over     
     strcpy(Str_perintah, batas_alamat + 1);

          sprintf(param1,"%i",0);
          sprintf(param2,"%i",0);
          lcd_gotoxy(12,0);
          lcd_putsf("NO P"); //PERINTAH TDK ADA PARAMETERNYA
         }

    // cmd will be -1 if no command

      cmd = -1;

      for (i = 0; i < 3; i++)       
     {        
     if (strcmp(Str_perintah, daftar_perintah[i])==0)
          {
        cmd = i;
                break;
          }
       } 

            lcd_gotoxy(0,1);
             sprintf(tampung2,"%i",cmd);
               lcd_puts(tampung2);

            switch(cmd)
             {

            case PANJANG:     //time =0           
            lcd_gotoxy(1,1);         
            lcd_putsf("p1=");  

                sscanf(param1, "%d", &panjang1);        
            sprintf(tampung1,"%i",panjang1);        
             lcd_gotoxy(4,1);         
            lcd_puts(tampung1);

                lcd_gotoxy(8,1);         
            lcd_putsf("p2=");         
            sscanf(param2, "%d", &panjang2);       
             sprintf(tampung2,"%i",panjang2);        
             lcd_gotoxy(11,1);         
            lcd_puts(tampung2);

                break;

            case LEBAR:         
            lcd_gotoxy(1,1);
                 lcd_putsf("p1=");   

                    sscanf(param1, "%d", &lebar1);
                    sprintf(tampung1,"%i",lebar1);
                  lcd_gotoxy(4,1);     
                lcd_puts(tampung1);

                lcd_gotoxy(8,1);  
                   lcd_putsf("p2=");   
                 sscanf(param2, "%d", &lebar2);   
                 sprintf(tampung2,"%i",lebar2);
                lcd_gotoxy(11,1);    
                 lcd_puts(tampung2);   
                 break;

                case TINGGI:  
                lcd_gotoxy(1,1);
                 lcd_putsf("p1=");  

                sscanf(param1, "%d", &tinggi1);
                   sprintf(tampung1,"%i",tinggi1);  
                lcd_gotoxy(4,1);
                lcd_puts(tampung1);

                lcd_gotoxy(8,1);
                lcd_putsf("p2=");

                sscanf(param2, "%d", &tinggi2);  
                  sprintf(tampung2,"%i",tinggi2);
                    lcd_gotoxy(11,1);   
                  lcd_puts(tampung2);

                   break;

        default:  
                   lcd_gotoxy(0,1);
                  lcd_putsf("perintah tdk ada");

                   } 

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

   }// end of sub

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

Jika anda tdk menggunakan VB6 dan lebih menyukai C#  
perintah mengirim data ke microcontroller sbb :

1. buka solutin / project baru:
2. drag and drop componen serial comm ke form
3. drag and drop 2 componen button dan sebuah textbox
4. buat code sbb:
private void buttonStart_Click(object sender, EventArgs e)        {            serialPort1.PortName = "COM1";            serialPort1.BaudRate = 9600;

            serialPort1.Open();            if (serialPort1.IsOpen)            {                buttonStart.Enabled = false;                buttonStop.Enabled = true;                textBox1.ReadOnly = false;            }        }

        private void buttonStop_Click(object sender, EventArgs e)        {            if (serialPort1.IsOpen)            {                serialPort1.Close();                buttonStart.Enabled = true;                buttonStop.Enabled = false;                textBox1.ReadOnly = true;            }

        }
private void button1_Click(object sender, EventArgs e)        {            serialPort1.WriteLine(txtdata.Text);         }
Advertisements

About pccontrol

Berisi Tutorial Menggunakan PC untuk mengontrol Peralatan dengan cara mudah & praktis untuk pemula.

Posted on 06/07/2011, in Menengah-3. Bookmark the permalink. Leave a comment.

Komentar ,Saran atau Pertanyaan

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: