Dosen Pengampu :
Eka Prasetyono, S.ST,MT
Disusun oleh :
BRAMASTO ADI NUGROHO
NRP. 1310131042
I. TUJUAN
1. Mahasiswa mengerti dan dapat mengaplikasikan bahasa pemrograman C# dengan
Visual Studio
2. Mahasiswa mampu mendesain tampilan antarmuka komputer dengan Visual Studio
3. Mahasiswa mampu membuat komunikasi peer to peer via RS-232 antara PC dengan
Mikrokontroller
II. DASAR TEORI
Framework .NET adalah suatu komponen windows terintegrasi yang dibuat dengan
tujuan untuk mendukung pengembangan berbagai macam jenis aplikasi serta untuk dapat
menjalankan berbagai macam aplikasi generasi mendatang termasuk pengembangan
aplikasi Web Services XML.
Framework .NET didisain untuk dapat memenuhi beberapa tujuan berikut ini :
Untuk menyediakan lingkungan kerja yang konsisten bagi bahasa pemrograman yang
berorientasi objek ( object-oriented programming - OOP )
Untuk menyediakan lingkungan kerja di dalam mengeksekusi kode yang dapat
meminimaliasi proses software deployment dan menghindari konflik penggunaan
versi software yang dibuat.
Untuk menyediakan lingkungan kerja yang aman dalam hal pengeksekusian kode,
termasuk kode yang dibuat oleh pihak ketiga ( third party).
Untuk menyediakan lingkungan kerja yang dapat mengurangi masalah pada
persoalan performa dari kode atau dari lingkungan interpreter nya.
Ada dua komponen utama dalam .NET Framework yaitu CLR (Common Language
Runtume) dan FCL (.NET Framework Class Library).
Common Language Runtime (CLR) adalah pondasi utama dari Framework .NET.
CLR merupakan komponen yang bertanggung jawab terhadap beberapa tugas,
seperti mengatur managemen memory, melakukan eksekusi kode, melakukan
verifikasi terhadap keamanan kode, menentukan hak akses dari kode, melakukan
kompilasi kode, dan berbagai tugas lainnya. Dengan adanya komponen CLR ini, maka
aplikasi berbasis .NET biasa juga disebut dengan managed code, sedangkan aplikasi di
luar .NET disebut dengan un-managed code.
Pada .NET ada dua tahap kompilasi yang dilakukan, pertama CLR akan
melakukan kompilasi kode-kode aplikasi kita menjadi bahasa assembly MSIL
(Microsoft Intermediate Language), kedua ketika aplikasi dieksekusi compiler yang lain
yang bernama JIT (Just-in-time compiler) yang juga salah satu kompenen dalam CLR
untuk menterjemahkan MSIL kedalam bahasa mesin yang disesuaikan dengan
platformnya.
Sekilas Pemrograman C#
Pada tahun 2000 Microsoft meluncurkan bahasa pemrograman baru yang diberi
nama C# Programming Language. C# dikembangkan oleh Microsoft oleh tim yang
dipimpin oleh Anders Hejlsberg dan Scott Wiltamuth. C# memiliki kesamaan bahasa
dengan C, C++, dan Java, sehingga memudahkan developer yang sudah terbiasa
dengan bahasa C untuk menggunakannya, C# mengambil fitur-fitur terbaik dari
ketiga bahasa tersebut dan juga menambahkan fitur-fitur baru. C# adalah bahasa
pemrograman Object Oriented dan memiliki class library yang sangat lengkap yang
berisi prebuilt component sehingga memudahkan programer untuk men-develop
program lebih cepat. C# juga distandarkan oleh Ecma International pada bulan
desember 2002. Dengan C# dapat dibuat bermacam aplikasi seperti aplikasi console,
aplikasi windows form, aplikasi Web, aplikasi Web services, dan aplikasi untuk mobile
device. Jadi cukup belajar satu bahasa saja tapi sudah dapat digunakan untuk
mengembangkan berbagai macam aplikasi.
merupakan tampilan awal dari Visual Studio Express 2012. Pada halaman ini kita dapat
menemukan button-button atau link-link penting yang akan memudahkan kita untuk
memulai pekerjaan seperti link untuk membuat proyek dan solution baru, link untuk
membuka proyek yang akhir-akhir ini sedang dikerjakan, serta link untuk membuka
panduan tentang cara mengembangkan aplikasi pada Visual Studio.
USER INTERFACE
1 Solution Explorer
Kita menggunakan Solution Explorer untuk mengelola solution atau untuk
membuka bagian-bagian dari proyek yang berbeda. Untuk membuka Solution
Explorer pilih View Solution Explorer, atau tekan CTRL + ALT L, atau
ketik Solution Explorer pada jendelaQuick Launch. Solution Explorer dapat
kita gunakan untuk menambah, menyalin, atau menghapus proyek atau item pada
solution.
2 Toolbox
Toolbox menampilkan ikon untuk kontrol yang dapat kita tambahkan ke dalam proyek
Visual Studio.Untuk membuka Toolbox, klik Toolbox pada menu View.Toolbox
secara default terletak pada bagian kiri jendela Visual Studio.
5 Error List
Terletak pada bagian bawah Visual Studio terdapat Error
List. Error List memiliki fungsi menampilkan segala error &
warning yang ada pada program yang sedang dikerjakan. Untuk
menampilkannya, pilih Error List pada menu View atau dengan
menekan tombol Ctrl+W, E.
USART ON STM32F407VG
Komunikasi adalah pertukaran informasi antara dua perangkat atau lebih. Komunikasi
pada perangkat elektronik pada dasarnya dibagi menjadi dua yaitu komunikasi paralel
dan komunikasi serial. Pada modul ini dibahas tentang komunikasi serial
menggunakan mikrokontroler STM32F407VG mode asinkron (Universal
Asynchronous Receiver Transmitter/UART). Komunikasi serial adalah proses
pengiriman/penerimaan data satu bit pada satu waktu. Jika ada banyak data yang
dikirim, maka dikirimbergantian satu persatu seperti pada gambar dibawah ini.
Format USART
Format data USART ditunjukkan pada gambar 3. Setiap paket data serial yang
dikirim terdiri dari start bit, data frame, parity, dan stopbit. Wordlength dapat dipilih
diantara 8 atau 9 bit melalui pemrograman pada register USART_CR1. Pin Tx berada
pada kondisi low pada saat start bit dan high pada saat stop bit. Idle character
ditunjukkan sebagai keseluruhan frame berlogika high, termasuk stop bit, dan diikuti
start bit paket data serial selanjutnya yang berisi data. Break character ditunjukkan
oleh penerimaan logika low selama periode frame. Pada akhir break frame, pengirim
menyertakan 1 atau 2 stop bits (bit berlogika high) untuk mengetahui start bit.
Setiap karakter diproses oleh start bit yang berlogika low selama satu periode bit.
Karakter diakhiri oleh sejumlah stop bit yang dapat dikonfigurasi. Jumlah stopbits
yang disediakan oleh USART adalah 0.5, 1, 1.5 dan 2 stop bit.
Baudrate adalah kecepatan pengiriman data (bit per detik). Pengirim dan
penerima harus mempunyai baudrate yang nilainya sama agar tidak terjadi salah
penerjemahan data Nilai baudrate yang umum adalah 1200, 2400, 4800, 9600, 19200,
38400, 57600, 115200 bps.
MengirimData
Selama transmisi USART, data register digeser keluar dengan LSB pertama
melalui pin TX. Register USART_DR bertindak sebagai buffer( TDR) antara bus
internal dan transmit shift register. Bit TXE di-set oleh hardware, menunjukkan bahwa
data sudah dipindah dari TDR ke shift register dan transmisi data sudah dimulai. TDR
dikosongkan dan data berikutnya dapat ditulis ke register USART_DR tanpa menimpa
data sebelumnya. Flag ini akan membangkitkan interupsi jika bit TXEIE di-set.
Menerima Data
USART dapat menerima data 8 bit atau 9 bit tergantung dari konfigurasi bit-M
dalam register USART_CR1. Ketika sebuah karakter diterima, bit RXNE di-set. Ini
menunjukkan bahwa isi dari shift register dipindah ke RDR. Dengan kata lain, data
telah diterima dan dapat dibaca. RXNE akan otomatis di-clear ketika software
membaca register USART_DR. Flag RXNE dapat juga di-clear dengan menuliskan
nol pada bit ini. Flag ini akan membangkitkan interupsi bila bit RXNEIE di-set.
Interupsi serial
USART interrupt events terhubung pada vektor interupsi yang ditunjukkan pada
gambar dibawah. Berikut adalah even-even yang dapat memicu interupsi.
Selama transmisi data : Transmisi komplit, Clear to Send atau Transmit Data
Register Empty Interrupt.
Selama menerima data : Idle Line detection, Overrun error, Receive Data Register
Not Empty, Parity Error, LIN Break Detection, Noise Flag (hanya pada komunikasi
multi buffer) dan Framing Error (hanya pada komunikasi multi buffer)
Even memicu sebuah interupsi jika Enable Control Bit yang bersangkutan di-set. Tabel
dibawah ini menunjukkan kontrol bit yang dapat diaktifkan.
III.
IV.
V. LANGKAH PERCOBAAN
1 Hubungkan PC dengan Modul ARM STM32F407VG menggunakan kabel RS-232.
Cek pada Device Manager pengalamatan kabel tersebut, misal : COM1.
2 Buka software Pengirim yang telah dibuat sebelumnya. Contoh :
3
4
5
6
VI.
Pastikan Program yang telah diketik pada Keil sudah terdownload pada Modul Arm.
(Program Terlampir)
Pada software Pengirim, pilih Port terlebih dahulu. Misal : COM1. Klik Open.
Tekan salah satu Tombol ON yang terdapat pada Relay 1 Relay 8.
Relay yang terdapat pada Modul Mikrokontroler akan menyala. Begitu pula
sebaliknya jika tombol OFF ditekan.
PROGRAM
FORM PENGIRIM
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
namespace Pengirim
{
public partial class Form1 : Form
{
string baca;
public Array myport;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
foreach (string s in System.IO.Ports.SerialPort.GetPortNames())
{
comboBox1.Items.Add(s);
}
Close.Enabled = false;
Open.Enabled = true;
}
private void Open_Click(object sender, EventArgs e)
{
if (comboBox1.Text!="")
{
serialPort1.PortName = comboBox1.Text;
serialPort1.Open();
//timer1.Enabled = true;
Close.Enabled = true;
Open.Enabled = false;
}
else if (comboBox1.Text=="")
{
MessageBox.Show("Harap Pilih PORT!");
}
comboBox1.Enabled = false;
}
private void Close_Click(object sender, EventArgs e)
serialPort1.Close();
Close.Enabled = false;
Open.Enabled = true;
//timer1.Enabled = false;
comboBox1.Enabled = true;
}
private void send_Click(object sender, EventArgs e)
{
if (textBox1.Text!="")
{
serialPort1.Write(textBox1.Text);
}
else if (textBox1.Text=="")
{
MessageBox.Show("Format belum diisi!");
}
}
private void button1_Click(object sender,
{
if (button1.Text == "ON")
{
serialPort1.Write("*W03011#");
label4.BackColor = Color.Yellow;
button1.Text = "OFF";
}
else if (button1.Text == "OFF")
{
serialPort1.Write("*W03010#");
label4.BackColor = Color.White;
button1.Text = "ON";
}
}
private void button4_Click(object sender,
{
if (button4.Text == "ON")
{
serialPort1.Write("*W03021#");
label5.BackColor = Color.Yellow;
button4.Text = "OFF";
}
else if (button4.Text == "OFF")
{
serialPort1.Write("*W03020#");
label5.BackColor = Color.White;
button4.Text = "ON";
}
}
private void button6_Click(object sender,
{
if (button6.Text == "ON")
{
serialPort1.Write("*W03031#");
label6.BackColor = Color.Yellow;
button6.Text = "OFF";
}
else if (button6.Text == "OFF")
{
serialPort1.Write("*W03030#");
label6.BackColor = Color.White;
button6.Text = "ON";
}
}
private void button8_Click(object sender,
{
if (button8.Text == "ON")
{
serialPort1.Write("*W03041#");
label7.BackColor = Color.Yellow;
button8.Text = "OFF";
EventArgs e)
EventArgs e)
EventArgs e)
EventArgs e)
}
else if (button8.Text == "OFF")
{
serialPort1.Write("*W03040#");
label7.BackColor = Color.White;
button8.Text = "ON";
}
}
private void button16_Click(object sender,
{
if (button16.Text == "ON")
{
serialPort1.Write("*W03051#");
label11.BackColor = Color.Yellow;
button16.Text = "OFF";
}
else if (button16.Text == "OFF")
{
serialPort1.Write("*W03050#");
label11.BackColor = Color.White;
button16.Text = "ON";
}
}
private void button14_Click(object sender,
{
if(button14.Text == "ON")
{
serialPort1.Write("*W03061#");
label10.BackColor = Color.Yellow;
button14.Text = "OFF";
}
else if (button14.Text == "OFF")
{
serialPort1.Write("*W03060#");
label10.BackColor = Color.White;
button14.Text = "ON";
}
}
private void button12_Click(object sender,
{
if (button12.Text == "ON")
{
serialPort1.Write("*W03071#");
label9.BackColor = Color.Yellow;
button12.Text = "OFF";
}
else if (button12.Text == "OFF")
{
serialPort1.Write("*W03070#");
label9.BackColor = Color.White;
button12.Text = "ON";
}
}
private void button10_Click(object sender,
{
if (button10.Text == "ON")
{
serialPort1.Write("*W03081#");
label8.BackColor = Color.Yellow;
button10.Text = "OFF";
}
else if (button10.Text == "OFF")
{
serialPort1.Write("*W03080#");
label8.BackColor = Color.White;
button10.Text = "ON";
}
}
EventArgs e)
EventArgs e)
EventArgs e)
EventArgs e)
}
}
serialPort1.Close();
PROGRAM MIKROKONTROLER
#include "stm32f4xx_hal.h"
#include "lcd_character.h"
#include "stdlib.h"
#define RX_BUFFER_SIZE 16
UART_HandleTypeDef huart1;
uint8_t rx_buffer[RX_BUFFER_SIZE];
uint8_t rx_data, datasend[]={"OK\n"};
unsigned int rx_index;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1,&rx_data,1);
lcd_init(); //Inisialisasi LCD
while (1)
{
int ch, myadd,add_data;
char buffer[5];
myadd = 3;
lcd_gotoxy(0,0);
lcd_putchar(rx_buffer[0]);
lcd_putchar(rx_buffer[1]);
lcd_putchar(rx_buffer[2]);
lcd_putchar(rx_buffer[3]);
lcd_putchar(rx_buffer[4]);
lcd_putchar(rx_buffer[5]);
lcd_putchar(rx_buffer[6]);
lcd_putchar(rx_buffer[7]);
if(rx_buffer[0]=='*' && rx_buffer[7]=='#')
{
if(rx_buffer[1]=='W'||rx_buffer[1]=='w')
{
sprintf(buffer,"%c%c",rx_buffer[2],rx_buffer[3]);
add_data = atoi(buffer);
if(add_data == myadd)
{
sprintf(buffer,"%c%c", rx_buffer[4], rx_buffer[5]);
ch = atoi(buffer);
if(ch == 1)
{
if(rx_buffer[6]=='1') HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0,GPIO_PIN_SET);
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart1);
}
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__GPIOE_CLK_ENABLE();
__GPIOH_CLK_ENABLE();
__GPIOD_CLK_ENABLE();
__GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
VII.
ANALISA
*
1
0
W M M C
2 3 4 5
1 2 3 4
C
6
5
D
7
6
#
8
7
Keterangan :
M
= Address Mikrokontroler
C
= Channel
D
= Data : 1 = ON, 0 = OFF
if(rx_buffer[0]=='*' && rx_buffer[7]=='#')
Merupakan proses seleksi pertama dari format data yang diterima oleh Mikro.
Statement diatas akan mengecek apakah pada format data yang dikirim diawali dengan
tanda * (Bintang) dan diakhiri dengan tanda # (Pagar) atau tidak. Apabila bernilai
salah, maka program tidak akan melanjutkan ke instruksi selanjutnya. Statement diatas
sekaligus mengecek apakah format data yang dikirim lengkap atau tidak. Karena *
terletak pada buffer ke-0 dan # terletak pada buffer ke-7, maka banyaknya karakter
pada format data adalah 8 buah karakter.
if(rx_buffer[1]=='W'||rx_buffer[1]=='w')
Statement diatas akan mengecek apakah karakter kedua dari format data yang diterima
adalah huruf W (Kapital) atau w (Non Kapital)
sprintf(buffer,"%c%c",rx_buffer[2],rx_buffer[3]);
Statement diatas berfungsi untuk memasukkan isi dari buffer[2] dan buffer[3] ke
dalam variabel buffer Misal : Jika buffer[2] = 0 dan buffer[3] = 1, maka pada
variabel buffer berisi 1. Buffer 2 dan 3 merupakan alamar dari mikrokontroler.
add_data = atoi(buffer);
statement atoi berfungsi merubah tipe data character ke integer. Isi dari variabel buffer
adalah karakter dan hendak di masukkan ke dalam variabel add_data yang bertipe
data integer. Sehingga dalam hal ini memerlukan adanya konversi dari char ke int.
if(add_data == myadd)
Proses seleksi apakah alamat mikrokontroler yang dituju sesuai dengan
mikrokontroller yang digunakan . Jika bernilai benar, akan dilanjutkan ke statement
berikutnya.
sprintf(buffer,"%c%c", rx_buffer[4], rx_buffer[5]);
Statement diatas berfungsi untuk memasukkan isi dari buffer[4] dan buffer[5] ke
dalam variabel buffer Misal : Jika buffer[4] = 0 dan buffer[5] = 2, maka pada
variabel buffer berisi 2. Buffer 4 dan 5 merupakan channel atau nomor relay yang
digunakan.
ch = atoi(buffer);
statement atoi berfungsi merubah tipe data character ke integer. Isi dari variabel buffer
adalah karakter dan hendak di masukkan ke dalam variabel ch yang bertipe data
integer. Sehingga dalam hal ini memerlukan adanya konversi dari char ke int.
if(ch == 1)
VIII. KESIMPULAN
Salah satu tool untuk membuat User Interface adalah Visual Studio dengan
menggunakan bahasa C#
Komunikasi peer to peer antara dua hardware dapat menggunakan komunikasi serial
menggunakan RS-232. Saat pembuatan Form perlu ditambahkan serialport sebagai
syarat jika ingin menggunakan komunikasi serial.
Format data antara Software Pengirim dan program pada mikrokontroler harus sama.
Begitu pula dengan setting parameter komunikasi.