belajar mikrokontroler

Tips Belajar Mikrokontroler dengan Mudah

Belajar Mikrokontroler – Mudah atau Sulit sich?

belajar mikrokontrolerSobat Canggih, sudah lama saya tidak update tulisan di blog ini karena kesibukan yang super padat. Nah sekarang saya ingin memberikan tips bagi siapa saja yang ingin belajar mikrokontroler dengan mudah tanpa guru alias autodidak. Saya juga dulu belajar mikrokontroler secara autodidak lho Sobat Canggih.

Mikrokontroler itu hanyalah sebuah IC yang memiliki memori (flash memory) yang dapat menyimpan intruksi-instruksi yang ditulis sebagai firmware. Mikrokontroler dapat berkomunikasi dengan dunia luar melalui port-port input/output yang ada padanya. Jumlah kapasitas memori dan jumlah port yang dimiliki mikrokontroler beragam bergantung tipenya. Beberapa jenis mikrokontroler memiliki fitur lain yang tidak dimiliki jenis yang lainnya seperti misalnya seri AVR buatan Atmel dilengkapi juga dengan memory eeprom internal selain memori RAM dan flash. Selain itu, fitur lainnya yaitu tambahan port ADC (analog to digital converter) dan PWM (Pulse Width Modulation).

Memprogram mikrokontroler adalah memberikan instruksi-instruksi yang dipahami oleh IC mikrokontroler untuk dapat membaca kondisi port inputnya dan memproses kondisi input tersebut dengan memberikan respon pada port output. Instruksi atau perintah tersebut ditulis oleh seorang programmer dengan bahasa pemrograman (aka bahasa manusiawi) yang dipahami oleh programmer itu sendiri, kemudian diterjemahkan (di-compile) oleh software compiler menjadi bahasa mesin yang dipahami oleh IC mikrokontroler. Bahasa mesin ini sebenarnya hanya terdiri dari deretan angka biner 0 atau 1 dimana dipahami oleh mesin sebagai perintah on atau off saja. Instruksi-instruksi program ini (firmware) kemudian akan di-flash (disimpan) di dalam memori flash mikrokontroler. Namun, lebih jauh ternyata instruksi sederhana ini dapat menjadi sebuah sistem kendali cerdas yang jauh dari yang dapat Sobat Canggih bayangkan.. sangat luar biasa apa yang dapat dibuat dari sebuah IC kecil bernama “mikrokontroler”.

Pada intinya belajar mikrokontroler itu sangatlah mudah jika Sobat Canggih mengenali karakteristik yang dimiliki oleh mikrokontroler yang akan diprogram dan memahami salah satu bahasa pemrograman untuk berkomunikasi dengannya. Seperti pepatah mengatakan “Tak kenal maka tak sayang, tak sayang maka tak cinta”, seperti itulah jika Sobat canggih sudah mengenali karakteristiknya dan dapat berkomunikasi dengannya maka sobat canggih akan seketika jatuh cinta dengannya sampai lupa pacar atau anak istri di rumah hehe.. ๐Ÿ˜€

Tips Belajar Mikrokontroler

belajar mikrokontrolerBeberapa hal yang menjadi catatan penting sebagai tips untuk Sobat Canggih yang ingin belajar mikrokontroler dengan mudah dapat saya sampaikan sebagai berikut:

  • Pahami karakteristik mikrokontroler yang akan sobat pelajari.
  • Pelajari salah satu bahasa pemrograman mikrokontroler, misalnya: bahasa assembly (Software MIDE-51, Keil), C (Software CodeVision AVR, AVR Studio, WinAVR/AVR GCC), Pascal (Software MikroPascal), Basic (Software Bascom), atau ada juga yang menggunakan flow chart (Software Flow Code) saja untuk lebih mudah karena hanya menggunakan gambar diagram alur tanpa menuliskan program untuk memprogram mikrokontroler.
  • Berlatihlah setiap hari atau dengan jadwal yang intensif karena memprogram mikrokontroler bukanlah sekedar cukup tahu bagaimana cara memprogram, melainkan merupakan keterampilan yang Sobat Canggih akan kuasai melalui pengalaman praktek.
  • Lihatlah referensi buku atau sumber internet untuk mendapatkan contoh-contoh program. Ikutilah grup-grup atau forum penggemar mikrokontroler lokal maupun internasional untuk membuka cakrawala ilmu mikrokontroler Sobat Canggih. Mudah-mudahan di website GuruCanggih.Com nanti bisa dibuatkan forumnya.
  • Perlengkapan wajib yang harus Sobat Canggih miliki diantaranya: laptop/PC, Programmer ISP yang bisa Sobat Canggih buat sendiri atau beli langsung di toko elektronika, minimum system/development board/trainer mikrokontroler yang juga bisa Sobat Canggih buat sendiri. Jika modalnya masih minim, sementara bisa gunakan software simulasi misalnya Proteus.
  • Motivasi yang kuat dan pantang menyerah jika menemui jalan buntu.

Itu saja tips belajar mikrokontroler dengan mudah yang dapat saya sampaikan. Mudah atau tidaknya it’s up to you guys..! Akhir kata, selamat berlatih! ๐Ÿ˜‰

lcd karakter

Pemrograman LCD Karakter 2×16 Dengan Mikrokontroler AVR

Kali ini, saya akan membahas sedikit mengenai pemrograman LCD Karakter 2ร—16 dengan mikrokontroler AVR. Mikrokontroler yang saya gunakan dalam pembahasan tulisan ini yaitu seri ATmega32.

Pada desain skematik LCD, Anda harus menghubungkan keseluruhan pin-pin data dan command LCD ke port mikrokontroler yang sama (misal Port A0-A7). Pada contoh ini, saya menggunakan metode interfacing 4-bit data (LCD_4 โ€“ LCD_7). Sehingga pemilihan pin pada mikrokontroler disesuaikan dengan CVAVR di atas menjadi seperti berikut ini.

Perhatikan PA0-PA7 pada skema rangkaian! PA1 tidak digunakan, karena R/W pada LCD kita fungsikan sebagai โ€œWriteโ€ saja sehingga cukup menghubungkan pin R/W pada LCD ke ground. Sedangkan PB3 kita gunakan sebagai pengontrol backlight pada LCD (LCD_BL).

CodeWizard akan meng-generate firmware dengan include โ€œlcd.hโ€. Nah, file ini tidak saya gunakan karena saya membuat sendiri file include โ€œlcdb.hโ€ yang saya lampirkan pada akhir tulisan ini.
lcd karakter 2x16
Berikut ini contoh firmware untuk pemrograman LCD Karakter 2ร—16.

latihan_lcd.c

#include <mega32.h>
#include <stdio.h>

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcdb.h>

char sz[40];

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

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// LCD module initialization
LCD_Init();

// Global enable interrupts
#asm(โ€œseiโ€)
//=============================================
while(1)
{

sprintf(sz, โ€ Ini Baris ke-1 \n Ini Baris ke-2 โ€œ);
LCD_printf(sz);
}
}

Berikut ini file library yang dibutuhkan oleh firmware di atas.

lcdb.c

#include <mega32.h>
#include <delay.h>
#include <stdio.h>
#include <string.h>

#define Clear_Display 0x01
#define Home 0x02
#define Entry_Mode 0x04
#define Set_Display 0x08
#define Set_Cursor 0x10
#define Function 0x20
#define Decrement 0x00
#define Increment 0x02
#define Shift_Off 0x00
#define Shift_On 0x01
#define Display_Off 0x00
#define Display_On 0x04
#define Cursor_Off 0x00
#define DCursor_On 0x02
#define Blink_Off 0x00
#define Blink_On 0x01
#define Four_Bits 0x00
#define Eight_Bits 0x10
#define One_Line 0x00
#define Two_Line 0x08
#define Font5x7 0x00
#define Font5x10 0x04

// Pins
#define LCD_pinRS 0x80 // PA0
#define PORT_LCD_pinRS PORTA
#define LCD_pinRD 0x40 // PA1
#define PORT_LCD_pinRD PORTA
#define LCD_pinEN 0x20 // PA2
#define PORT_LCD_pinEN PORTA
#define LCD_BL_CTRL 0x10 // PA3
#define PORT_LCD_BL_CTRL PORTA

// Macros
#define SET_LCD_pinRS PORT_LCD_pinRS |= LCD_pinRS
#define RES_LCD_pinRS PORT_LCD_pinRS &= ~LCD_pinRS

#define SET_LCD_pinRD PORT_LCD_pinRD |= LCD_pinRD
#define RES_LCD_pinRD PORT_LCD_pinRD &= ~LCD_pinRD

#define SET_LCD_pinEN PORT_LCD_pinEN |= LCD_pinEN
#define RES_LCD_pinEN PORT_LCD_pinEN &= ~LCD_pinEN

#define SET_LCD_BL_CTRL PORT_LCD_BL_CTRL |= LCD_BL_CTRL
#define RES_LCD_BL_CTRL PORT_LCD_BL_CTRL &= ~LCD_BL_CTRL

void LCD_Init(void)
{
DDRA = 0xff;
delay_ms(3);
LCD_CmdWrite(Function+Four_Bits+Two_Line+Font5x7);
delay_ms(3);
LCD_CmdWrite(Function+Four_Bits+Two_Line+Font5x7);
delay_ms(3);
LCD_CmdWrite(Function+Four_Bits+Two_Line+Font5x7);
delay_ms(3);
LCD_CmdWrite(Clear_Display);
delay_ms(3);
LCD_CmdWrite(Entry_Mode+Increment+Shift_Off);
delay_ms(3);
LCD_CmdWrite(0x0c); // display on, cursor off, non-blink
delay_ms(3);
LCD_CmdWrite(0x02); // cursor home

}

void LCD_CmdWrite(unsigned char uc)
{
char DL, DH;
DH=(((uc&0x80)>>7)+((uc&0x40)>>5)+((uc&0x20)>>3)+((uc&0x10)>>1));
DL=(((uc&0x08)>>3)+((uc&0x04)>>1)+((uc&0x02)<<1)+((uc&0x01)<<3));

RES_LCD_pinRS;
RES_LCD_pinRD;

SET_LCD_pinEN; // Enable LCD
PORTA &= 0xf0;
PORTA |= DH; // kirim High Nibble
RES_LCD_pinEN; // beri pulsa LCD EN
LCD_delay_5us();

SET_LCD_pinEN;
PORTA &= 0xf0;
PORTA |= DL; // kirim Low Nibble
RES_LCD_pinEN; // beri pulsa LCD EN
LCD_delay_3ms();

}

void LCD_DataWrite(unsigned char uc)
{
char DL, DH;
DH=(((uc&0x80)>>7)+((uc&0x40)>>5)+((uc&0x20)>>3)+((uc&0x10)>>1));
DL=(((uc&0x08)>>3)+((uc&0x04)>>1)+((uc&0x02)<<1)+((uc&0x01)<<3));

SET_LCD_pinRS;
RES_LCD_pinRD;

SET_LCD_pinEN; // Enable LCD
PORTA &= 0xf0;
PORTA |= DH; // kirim High Nibble
RES_LCD_pinEN; // beri pulsa LCD EN
LCD_delay_5us();

SET_LCD_pinEN;
PORTA &= 0xf0;
PORTA |= DL; // kirim Low Nibble
RES_LCD_pinEN; // beri pulsa LCD EN
LCD_delay_3ms();
}

void LCD_DataRead(unsigned char uc)
{
char DL, DH;
DH=(((uc&0x80)>>7)+((uc&0x40)>>5)+((uc&0x20)>>3)+((uc&0x10)>>1));
DL=(((uc&0x08)>>3)+((uc&0x04)>>1)+((uc&0x02)<<1)+((uc&0x01)<<3));

SET_LCD_pinRS;
SET_LCD_pinRD;

SET_LCD_pinEN; // Enable LCD
PORTA &= 0xf0;
PORTA |= DH; // kirim High Nibble
RES_LCD_pinEN; // beri pulsa LCD EN
LCD_delay_5us();

SET_LCD_pinEN;
PORTA &= 0xf0;
PORTA |= DL; // kirim Low Nibble
RES_LCD_pinEN; // beri pulsa LCD EN
LCD_delay_3ms();
}

void LCD_delay_5us(void)
{
unsigned char j;

for(j = 0; j < 5; j++);

}

void LCD_delay_3ms(void)
{
unsigned char i, j;

for(j = 0; j < 100; j++)
for(i = 0; i < 30; i++);
}

void LCD_delay_5ms(void)
{
unsigned char i, j;

for(j = 0; j < 100; j++)
for(i = 0; i < 50; i++);
}

void LCD_delay_10ms(void)
{
unsigned char i, j;

for(j = 0; j < 100; j++)
for(i = 0; i < 100; i++);
}

void LCD_printf(unsigned char *pc)
{

LCD_CmdWrite(0x80); // 1st line, 1st position

while(*pc != NULL){

if (*pc == โ€˜\nโ€™){ // next line?
LCD_CmdWrite(0xc0); // 2nd line, 1st position
}
else{
LCD_DataWrite(*pc); // put character
}

pc++;
}
}

void LCD_Blink(void)
{ unsigned char aaa;
SET_LCD_BL_CTRL;
for(aaa = 0; aaa < 100; aaa++) // delay 1s
LCD_delay_10ms();
RES_LCD_BL_CTRL;
for(aaa = 0; aaa < 50; aaa++) // delay 1s
LCD_delay_10ms();
}

void LCD_Light_On(void)
{ unsigned char aaa;
SET_LCD_BL_CTRL;
for(aaa = 0; aaa < 50; aaa++) // delay 1s
LCD_delay_10ms();
}

void LCD_Light_Off(void)
{ unsigned char aaa;
RES_LCD_BL_CTRL;
for(aaa = 0; aaa < 50; aaa++) // delay 1s
LCD_delay_10ms();
}