Anda di halaman 1dari 108

Workshop

Pemrograman
Mikrokontroller (ATMEGA8535)
dengan
Bahasa C

DOKTER TECH
Sesi
Pengenalan ATMEGA8535
Hardware dan Software yang dibutuhkan
Bahasa C
Dasar I/O
LCD
ADC
Stepper and DC Motor

Konversi bilangan bin2hex dan hex2bin serta logika dasar


sudah harus dikuasai
Arsitektur ATMEGA8535

Pendahuluan
Fitur
Konfigurasi Pin
Peta Memory
Register
Bahasa Assembly
Pendahuluan
Atmel, salah satu vendor yang bergerak dibidang
mikroelektronika telah mengembangkan AVR (Alf and Vegards
Risc processor) sekitar tahun 1997.
Berbeda dengan mikrokontroler MCS51, AVR menggunakan
arsitektur RISC (Reduce Instruction Set Computer) yang
mempunyai lebar bus data 8 bit.
Perbedaan ini bisa dilihat dari frekuensi kerjanya, MCS51 memiliki
frekuensi kerja seperduabelas kali frekuensi osilator sedangkan
frekuensi kerja AVR sama dengan frekuensi osilator. Jadi dengan
frekuensi osilator yang sama kecepatan AVR dua belas kali lebih
cepat dibanding dengan MCS51.
Secara umum AVR dibagi menjadi 4 kelas, yaitu:
ATtiny, AT90Sxx, ATMega dan AT86RFxx.
Perbadaan antar tipe AVR adalah fitur-fitur yang ditawarkan,
sedangkan dari segi arsitektur dan set instruksi yang
digunakan hampir sama.
Fitur
8bit AVR berbasis RISC dengan performa tinggi dan konsumsi daya rendah.
Kecepatan maksimal 16MHz.
Memori
8KB Flash
512 byte SRAM
512 byte EEPROM
Timer/Counter
2 buah 8 bit timer/counter
1 buah 16 bit timer/counter
4 kanal PWM
8 kanal 10/8 bit ADC
Programable Serial USART
Komparator Analog
6 pilihan sleep mode untuk penghematan daya listrik
32 jalur I/O yang bisa diprogram
Konfigurasi Pin

1. Power, VCC dan GND (Ground)


2. PORTA (PORTA0-7), merupakan pin IO dua arah
dan fungsi khusus sebagai pin masukan ADC.
3. PORTB (PORTB0-7), merupakan pin IO dua arah
dan fungsi khusus sebagai pin Timer/Counter,
komparator analog dan SPI.
4. PORTC (PORTC0-7), merupakan pin IO dua arah
dan fungsi khusus sebagai
5. PORTD (PORTD0-7), merupakan pin IO dua arah
dan fungsi khusus sebagai
6. RESET adalah pin utk mereset mikrokontroler.
7. XTAL1 dan XTAL2 pin untuk exsternal clock.
8. AVCC adalah pin masukan untuk tegangan ADC.
9. AREF adalah pin masukan untuk tegangan
referensi eksternal ADC. PINOut ATmega8535
Peta Memory
FLASH MEMORY
SRAM
EEPROM
Flash Memory

8Kbytes untuk memori program. $000

Karena semua instruksi AVR menggunakan 16


atau 32 bit, maka AVR memiliki organisasi
memori 4KByte x 16bit dengan alamat dari $000 Application Flash Section

hingga $FFF.
Untuk keamanan software memori flash dibagi
menjadi dua bagian, yaitu
Bagian Boot Program dan
Bagian Application Program. Boot Flash Section
$FFF
AVR tersebut memiliki 12bit Program Counter
(PC) sehingga mampu mengalamati isi flash Memori Program AVR ATMega8535
memori.
Register File Data Address Space

SRAM R0
R1
$0000
$0001

... ...

ATMega8535 memiliki 608 alamat memori R30 $001E


R31 $001F
data yang terbagi menjadi 3 bagian, yaitu 32
buah register file, 64 buah IO register dan I/O Registers
$00 $0020
512byte internal SRAM. $01 $0021
Tampak pada peta memori data bahwa
... ...
alamat $0000-$001F ditempati oleh register
file. I/O register menempati alamat dari $3E $005E
$0020-$005F. Sedangkan sisanya sebagai $3F $005F

Internal SRAM sebesar 512byte ($0060- Internal SRAM


$025F). $0060
$0061

Peta Memori Data AVR ATMega8535 ...

$025E
$025F
EEPROM
ATMega8535 juga memiliki memori data beruka EEPROM 8bit
sebesar 512byte ($000-$1FF).
Hardware
ATMega8535 Minimum System
Downloader (kable)
Komputer (min P2 dengan port parallel)
Minimum Sistem ATMega 8535
U1 JPA
PB0 1 40 PA0 PA0 PA1
PB0 (XCT/T0) (ADC0) PA0 1 2
PB1 2 39 PA1 PA2 PA3
PB1 (T1) (ADC1) PA1 3 4
PB2 3 38 PA2 PA4 PA5
PB2 (INT2/AIN0)
(ADC2) PA2 5 6
PB3 4 37 PA3 PA6 PA7
PB3 (OC0/AIN1)
(ADC3) PA3 7 8
PB4 5 36 PA4
PB4 (SS) (ADC4) PA4 VCC 9 10
PB5 6 35 PA5
PB5 (MOSI) (ADC5) PA5
PB6 7 34 PA6 HEADER 5X2
PB6 (MISO) (ADC6) PA6
PB7 8 33 PA7
PB7 (SCK) (ADC7) PA7
JPB
9 PB0 PB1
RST RESET 1 2
32 PB2 PB3
AREF 3 4
12 PB4 PB5
X2 X2 5 6
30 PB6 PB7
AVCC 7 8
13
X1 X1 VCC 9 10
PD0 14 29 PC7 HEADER 5X2
PD0 (RXD) (TOSC2) PC7
PD1 15 28 PC6
PD1 (TXD) (TOSC1) PC6
PD2 16 27 PC5 JPC
PD2 (INT0) PC5
PD3 17 26 PC4 PC0 PC1
PD3 (INT1) PC4 1 2
PD4 18 25 PC3 PC2 PC3
PD4 (OC1B) PC3 3 4
PD5 19 24 PC2 PC4 PC5
PD5 (OC1A) PC2 5 6
PD6 20 23 PC1 PC6 PC7
PD6 (ICP1) (SDA) PC1 7 8
PD7 21 22 PC0
PD7 (OC2) (SCL) PC0 VCC 9 10
ATMEGA8535 HEADER 5X2

JPD
PD0 PD1
VCC 1 2
PD2 PD3
3 4
PD4 PD5
5 6
PD6 PD7
R1 7 8
4K7 VCC 9 10
SW-PB
HEADER 5X2
SW1A
RST
2

C2 22p
X2
C1 XT1
10nF 11.0592MHz
C3 22p
X1
1

VCC JPOWER +5V


1
2
R2
JDOWNLOAD 3
220
1 CON3
VCC 2 C7
PB5 (MOSI) 100n
PB5 3
PB6 (MISO) LED1
PB6 4
PB7 (SCK) LED
PB7 5
RST 6
CON6
Power Supply

U2
Dari Trafo CT LM7805CT VCC
D1
JTR 1 3
Vin +5V
1 IN4001
2

GND
3 D2
+ C4 + C5 + C6
CON3

2
IN4001 2200F/25V 100F/25V 1000F/25V
Kabel Downloader
LPT Ke Modul Mikro ATMega
13 JPDL
25
1
12
VCC 2
24 PB5 (MOSI)
PB5 3
11 PB6 (MISO)
PB6 4
23 PB7 (SCK)
PB7 5
10
LPT10 RST 6
22
9 CON6
LPT9
21
8
20 U1
7 2 18
LPT7 PB5 A0 B0 LPT7
19 3 17
RST A1 B1 LPT9
6 4 16
LPT6 PB7 A2 B2 LPT6
18 5 15
LPT10 A3 B3 PB6
5 LPT5 6 14
A4 B4
17 7 13
A5 B5
4 LPT4 8 12
A6 B6
16 VCC 9 11
A7 B7
3
15 19
E
2 R2 R1 1
DIR
14 470 10k
1 74ALS245
DB25
LED1
Software (tools)
OS min Win98
AVRStudio4 (or higher)
CodeVision AVR (CVAVR)
PonyProg2000 (optional)
AVRStudio
AVR Studio adalah suatu program bantu yang teri
ntegrasi untuk menulis sekaligus debug.
Aplikasi AVR bekerja dengan operating sistem Win
dows 9x/Me/NT/2000/XP.
AVRStudio4 diperlukan karena
Code Vision AVR-Eval memerlukan source
code dari AVR Studio untuk kompilasi.
AVR Studio 4 dapat diperoleh di
http://www.atmel.com/avr.
Installasi AVRStudio
File yang diperlukan:
Studio4b460.exe (versi 4). Gunakan yang te
rbaru jika sudah tersedia.
Klik dua kali file tersebut untuk memulai ins
talasi.
Ikuti petunjuk, ubah jika dianggap perlu.
Restart Windows.
Tampilam AVRStudio
CVAVR
Code Vision AVR C Compiler (CVAVR) merupakan
compiler bahasa C untuk AVR. Compiler ini cukup
memadai untuk belajar AVR, selain mudah dalam
penggunaan juga di dukung fitur-fitur yang sangat
membantu dalam pembuatan software untuk keperluan
pemrograman AVR.
CVAVR ini dapat berjalan dibawah sistem operasi
Windows 9x, Me, NT 4, 2000 dan XP. CVAVR ini dpt
mengimplementasikan hampir semua instruksi bahasa C
yang sesuai dengan arsitektur AVR, bahkan terdapat
beberapa keunggulan tambahan untuk memenuhi
keunggulan spesifik dari AVR. Hasil kompilasi objek
CVAVR bisa digunakan sebagai source debug dengan
AVR Studio debugger dari ATMEL.
CVAVR dapat diperoleh dari:
http://www.hpinfotech.ro.
Fitur CVAVR
Mendukung hampir semua library standart bahasa C
Terdapat library tambahan dari CVAVR yang mendukung dalam pemrograman AVR,
yaitu:
Alphanumeric LCD modules
Philips I2C bus
National Semiconductor LM75 Temperature Sensor
Philips PCF8563, PCF8583, Maxim/Dallas Semiconductor DS1302 and
DS1307 Real Time Clocks
Maxim/Dallas Semiconductor 1 Wire protocol
Maxim/Dallas Semiconductor DS1820, DS18S20, DS18B20 Temperature
Sensors
Maxim/Dallas Semiconductor DS1621 Thermometer/Thermostat
Maxim/Dallas Semiconductor DS2430 and DS2433 EEPROMs
SPI
Power management
Delays
Gray code conversion
Memiliki Program Generator yang memungkinkan kita
membuat program dengan cepat.
Installasi CVAVR
File yang diperlukan:
cvavre.exe (versi 1.25.1 Evaluasi).
Gunakan yang terbaru jika sudah tersedia.
Klik dua kali file tersebut untuk memulai
instalasi.
Ikuti petunjuk, ubah jika perlu.
Selesai.
Installasi PonyProg2000
Optional
(lihat lampiran)
Bahasa C
STRUKTUR PEMROGRAMAN C

Struktur penulisan bahasa C secara


umum tersusun atas empat blok, yaitu:
Header
Deklarasi Global Konstanta dan atau
Variabel
Fungsi dan atau Procedur (bisa dibawah pr
og utama)
Program Utama
Secara umum pemrograman C paling sederhana hanya men
uliskan program utamanya saja yaitu:

void main (void)


{
//
}
Secara utuh adalah sebagai berikut:
/* HEADER untuk memanggil library yang akan digunakan */
#include <mega8535.h>
#include <stdio.h>
/*Deklarasi konstanta dan atau variabel global */
unsigned char dt, xx;
char buf[33];
/*Deklarasi fungsi dan atau prosedur */
unsigned char lampu(unsigned char bitn)
{
PORTA=bitn & 0x3C;
}
/*Program Utama */
void main (void);
/*Deklarasi konstanta dan atau variabel lokal */
char data;
PORTA=0x00;
DDRA=0xF0;
while (1)
{
//. . .
};
}
HEADER

Berisikan include file (.hex), yaitu library yang akan digu


nakan dalam pemrograman.

Contoh
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
TIPE DATA
Type Size (Bits) Range

bit 1 0,1
char 8 -128 to 127
unsigned char 8 0 to 255
signed char 8 -128 to 127
int 16 -32768 to 32767
short int 16 -32768 to 32767
unsigned int 16 0 to 65535
signed int 16 -32768 to 32767
long int 32 -2147483648 to 2147483647
unsigned long int 32 0 to 4294967295
signed long int 32 -2147483648 to 2147483647
float 32 1.175e-38 to 3.402e38
double 32 1.175e-38 to 3.402e38

Khusus untuk tipe data bit hanya bisa di deklarasikan untuk


global variabel.
Konstanta
Penulisan konstanta adalah sebagai berikut:
Integer atau long integer dapat ditulis dengan format desimal (contoh
1234), biner dengan awalan 0b (contoh 0b101001), hexadesimal
dengan awalan 0x (contoh 0xff) atau oktal dengan awalan 0 (contoh
0777).
Unsigned integer ditulis dengan diakhiri U (contoh 10000U).
Long integer ditulis dengan diakhiri L (contoh 99L).
Unsigned long integer ditulis dengan diakhiri UL (contoh 99UL).
Floating point ditulis dengan diakhiri F (contoh 1.234F).
Penulisan karakter konstanta harus dalam tanda kutip
(contoh a). Sedangkan konstanta string harus dalam tanda kutip dua
(contoh "Saya Belajar C").
LABEL, VARIABEL, FUNCTION

Identifikasi label, variabel dan fungsi dapat berupa


huruf (A...Z, a...z) dan angka (0...9), juga karakter
underscore (_). Meskipun begitu identifikasi hanya
bisa dimulai dengan huruf atau karakter underscore,
dan yang lebih penting lagi identifikasi ini
Case is significant yaitu huruf besar dan kecil
berbeda. Misal variable1 tidak sama Variable1.
Identifikasi bisa memuat karakter sebanyak 32 karakter.
KOMENTAR

Komentar diawali dengan tanda /* dan diakhir dengan */ .


Contoh:

/* Ini komentar */
/* Ini Komentar
Multi baris */
Sedangkan komentar satu baris bisa dengan tanda // .
Contoh:
// Ini juga komentar
RESERVED KEYWORDS*

break flash signed


bit float sizeof
case for sfrb
char funcused sfrw
const goto static
continue if struct
default inline switch
do int typedef
double interrupt union
eeprom long unsigned
else register void
enum return volatile
extern short while

*Kata baku yang tidak bisa dipakai


Operator
Suatu instruksi pasti terdapat operator dan operand. Operand adalah variabel a
tau konstanta yang merupakan bagian pernyataan sedangkan operator adalah s
uatu simbol yang menyatakan operasi manakah yang akan dilakukan oleh oper
and tersebut. Contoh:
c = a + b;
Ada tiga operand (a, b dan c) dan dua operator (= dan +).

Operator dalam C dibagi menjadi 3 kelompok yaitu:


Unary
Operator yang beroperasi pada satu operand, misal: -n.
Binary
Operator yang beroperasi pada dua operand, misal: a n.
Ternary
Operator yang memerlukan tiga atau lebih operand, misal: a = (b*c)+d.
Operator Aritmetika
Simbol Contoh Aritmetika
+ c=a+b Penjumlahan
n=n+2
- c=a-b Pengurangan
n=n-2
++ ++i Kenaikan (Increment), sama dengan i = i + 1
-- --i Penurunan (Decrement), sama dengan i = i - 1
* c=a*b Perkalian
n=n*2
/ c=a/b Pembagian
n=n/2
% sisa=a % b Menghasilkan sisa dari pembagian. a dan b bil. bulat
= a=b Pemberian nilai
+= a += 2 Penambahan suatu nilai pada suatu variabel yang sudah ada sebelumnya.
Sama dengan a = a + 2
-= a -= 2 Pengurangan suatu nilai pada suatu variabel yang sudah ada sebelumnya.
Sama dengan a = a - 2
*= a *= 2 Pengalian suatu nilai pada suatu variabel yang sudah ada sebelumnya.
Sama dengan a = a * 2
/= a /= 2 Pembagian dari suatu nilai pada suatu variabel yang sudah ada sebelumnya.
Sama dengan a = a / 2
%= a /= 2 Sisa dari suatu nilai pada suatu variabel yang sudah ada
sebelumnya yang dibagi oleh nilai atau variabel lain.
Sama dengan a = a / 2
* *pointer Menunjukan isi dari pointer
Operator Logika
Simbol Contoh Logika Pembanding
== if (a == b) Logika sama dengan, digunakan untuk pembanding.
Menghasilkan nilai true jika a=b.
!= if (a != b) Tidak sama dengan. Menghasilkan nilai true jika a b.
< if (a < b) Logika lebih kecil dari. Menghasilkan nilai true jika a < b.

<= if (a <= b) Logika lebih kecil sama dengan dari.


Menghasilkan nilai true jika a b.
> if (a > b) Logika lebih besar dari. Menghasilkan nilai true jika a > b.
>= if (a >= b) Logika lebih besar sama dengan dari.
Menghasilkan nilai true jika a b.
! if (!a) NOT
&& if (a==b && a==c) AND
|| if (a==b || a==c) OR
Operator Manipulasi Bit
~ a = ~b Complement.
b = 1100; a = 0011.

& c=a&b AND untuk manipulasi bit.


a=1100; b=1001; maka c=1000.

| c=a|b OR untuk manipulasi bit.


a=1100; b=1001; maka c=1101.

^ c=a^b XOR untuk manipilasi bit.


a=1100; b=1001; maka c=0101.

<< c = a << n Shift Left, manipulasi bit menggeser ke kiri


sejauh n bit.
a=1101; n=2; maka c=110100.

>> c = a >> n Shift Right, manipulasi bit menggeser ke kiri


sejauh n bit.
a=11010; n=2; maka c=0110.
PERCABANGAN

if then
Bentuk umum dari percabangan ini adalah:
if (kondisi) {
// pernyataan
};
Artinya adalah pernyataan akan dijalankan jika kondisi terpenuhi.
Contoh:
if (a<0x50) {
PORTC=0x55;
};
Dalam contoh ini PORTC akan dikirim data 0x55 (ingat mode hex)
jika nilai a lebih kecil dari 0x50.
if then else
Bentuk umum dari percabangan ini adalah:
If (kondisi) {
// pernyataan a
}
else {
// pernyataan b
};
Artinya adalah pernyataan a akan dijalankan jika kondisi terpenuhi dan
pernyataan b akan dijalankan jika kondisi tidak terpenuhi.
Contoh:
if (a<0x50) {
PORTC=0x55;
}
else {
PORTC=0xAA;
};
PORTC akan dikirim data 0x55 jika nilai a < 0x50 dan
PORTC akan dikirim data 0xAA jika a0x50.
switch case
Pernyataan switch case digunakan jika terjadi banyak percabangan.
Struktur penulisan pernyataan ini adalah sebagai berikut:
Contoh:
... ...
switch (ekspresi) { switch (a) {
case konstanta1: case 1:
pernyataan1 PORTC=0x01;
break; break;
case konstanta2: case 2:
pernyataan2 PORTC=0x02;
break; break;
... case 3:
case konstantaN: PORTC=0x04;
pernyataanN break;
break; }
} ...
...
PORTC akan dikirim data 0x01 jika nilai a=1, PORTC akan dikirim data 0x02 jika nilai
a=2 dan PORTC akan dikirim data 0x04 jika nilai a=3;
Switch case default
Pernyataan switch case default hampir sama dengan switch case, yang membedakan
adalah dengan adanya default. Jika tidak terdapat kondisi case yang sesuai dengan ekspresi
switch maka akan menuju pernyataan yang terdapat di bagian default. Struktur penulisan
pernyataan ini adalah sebagai berikut:
Contoh:
...
switch (ekspresi) { switch (a) {
case konstanta1: case 1:
pernyataan1 PORTC=0x01;
break; break;
case konstanta2: case 2:
pernyataan2 PORTC=0x02;
break; break;
... case 3:
case konstantaN: PORTC=0x04;
pernyataanN break;
break; Default:
default: PORTC=0xFF;
pernyataan-pernyataan; }
} ...
...
PORTC akan dikirim data 0x01 jika nilai a=1,
PORTC akan dikirim data 0x02 jika nilai a=2 dan
PORTC akan dikirim data 0x04 jika nilai a=3 dan jika kondisi
case tidak sesuai dengan ekspresi maka pernyataan di default
PERULANGAN
For
Pernyataan for akan melakukan perulangan berapa kali sesuai yang diinginkan. Struktur penulisan
perulangan for adalah sebagai berikut:
...
for (mulai; kondisi; penambahan atau pengurangan) {
pernyataan-pernyataan;
};
...
Mulai adalah pemberian nilai awal, kemudian kondisi adalah pengkondisi dalam for yaitu jika kondisi
bernilai true maka pernyataan dalam for akan dijalankan, penambahan atau pengurangan adalah
penambahan atau pengurangan terhadap nilai awal.
Contoh:
...
a=1;
for (i=1; i<50; i++) {
a=a*2;
PORTC=a;;
};
...
Contoh diatas akan melakukan perulangan 50 kali, yaitu dari 1 hingga 50 dengan penambahan 1 (i++,
lihat operator aritmetik). Hasilnya PORTC akan dikirim data 1, kemudian data 2, 4, 8.
While - Do
Bentuk dari perulangan ini adalah sebagai berikut:

while (kondisi) {
Pernyataan Pernyataan;
}

Jika kondisi memenuhi (bernilai true) maka pernyataan-pernyataan
dibawahnya akan dijalankan hingga selesai, kemudian akan menguji kembali
kondisi di atas.
Contoh:
...
i=1;
a=1; Bandingkan dengan
while (i<50) {
a=a*2;
perulangan for dan while-do.
PORTC=a;;
i++ ;
};
...
Do While
Pentuk perulangan ini kebalikan dari while do, yaitu pernyataan dilakukan
terlebih dahulu kemudian diuji kondisinya.
...
do {
pernyataan-pernyataan;
}
while (kondisi);
...
Contoh:
...
i=1;
a=1;
do { Bandingkan dengan
a=a*2;
PORTC=a;; perulangan for dan while-do
i++ ; dan do-while.
}
while (i<50);
...
KONVERSI POLA (%)
Karakter %... dipakai sebagai operator konversi pola.
Konversi pola sangat berguna nantinya pada saat kita
menampilkan hasil ke LCD.
%d menampilkan bilangan bulat positif.
Contoh:
sprintf(buf,"Angka %d",14);
%o menampilkan bilangan oktal bulat.
%x menampilkan bilangan hexadesimal bulat.
%u menampilkan bilangan desimal tanpa tanda.
%f menampilkan bilangan pecahan.
%i menampilkan bilangan integer.
%c menampilkan karakter yang ditunjukkan bilangan ASCI
I.
PROSEDUR DAN FUNGSI
Prosedur adalah suatu kumpulan instruksi untuk mengerjakan suatu keperluan
tertentu tanpa mengembalikan suatu nilai.
...
viod nama_prosedur (parameter1, parametar2, parameterN) {
Pernyataan-pernyataan;
}
...

Contoh:
...
void delay(unsigned char i) {
while (i--) {
/* penulisan untuk bahasa assembly akan dibahas tersendiri */
#asm
nop
nop
#endasm
};
}
...
Fungsi adalah suatu kumpulan instruksi untuk mengerjakan suatu keperluan
tertentu dengan hasil akhir pengembalian nilai dari keperluan tersebut.
...
Type data nama_fungsi (parameter1, parametar2, parameterN) {
Pernyataan-pernyataan;
return variable_hasil;
}
...
Contoh:
...
int luas(int pj, int lb) {
luas = pj*lb;
return luas;
}
...

Pemanggilan prosedur atau fungsi langsung ditulis prosedur atau fungsinya.


Contoh:
...
delay(150); // cara memanggil prosedur
dt = luas(5,10); // cara menggunakan fungsi
}
...
MEMASUKKAN
BAHASA ASSEMBLY
Atau kita sebut sebagai in-line assembly.
Dalam pemrograman dengan bahasa C ini, kita masih dapat memasukkan
bahasa assembly ke dalam program C. Struktur penulisannyapun juga mudah,
yaitu:
...
#asm // dimulai dengan #asm
nop // blok bahasa assembly
nop //
#endasm // diakhiri dengan #endasm
...
Atau, jika hanya beberapa instruksi bisa dengan cara:
...
#asm("nop\nop\nop")
...
PERNYATAAN KENDALI L
AINNYA
Break
Pernyataan ini akan menghentikan atau keluar dari suatu
blok program.
Continue
Pernyataan ini akan menyebabkan kendali melakukan
kembali proses perulangan dari awal.
Goto Label
Pernyataan ini akan melakukan loncat ke label yang
dituju.
(tidak disarankan menggunaan pernyataan ini).

Disarankan untuk mempelajari bahasa C dari buku yang


khusus mengulas tentang bahasa C.
Pengalaman Pertama Me
nggunakan CVAVR
MENU
File
Didalam menu File terdapat submenu-submenu untuk bekerja dengan file maupun project.
Edit
Didalam menu Edit terdapat tools untuk pengeditan dalam mode kerja pemrograman.
View
Untuk menampilkan atau tidak toolbar, Navigasi dan pesan compiler.
Project
Berisi submenu untuk kompilasi, cek instruksi dan setting project.
Tools
Berisikan tools untuk program generator, debugger, programmer dan setting debug.
Setting
Berisi beberapa setting untuk tampilan CVAVR, pemrograman dan koneksi.
Windows
Untuk pengaturan window/jendela kerja.
Help
Berisi help dan tentu saja keterangan dari CVAVR
Toolbar
Toolbar ini berisikan ikon-ikon yang nantinya sangat membantu dalam pemrograman.
Navigator, Code Templates dan Clipboard History
Jendela ini berisikan informasi file dan project yang terbuka, kode-kode bahasa C yang bisa
langsung dipakai dan perekaman clipboard.
Messages
Jendela ini menampilkan informasi saat kompilasi, ini sangat penting terutama informasi tentang
kesalahan yang kita buat.
Lembar Kerja
Lembar kerja adalah lembar dimana kita bekerja untuk membuat program.
Setting Programer

Klik menu Setting, pilih Programmer.


Tampak kotak dialog
Programmer Setting, dan lakukan
perubahan menjadi seperti disamping:
Klik OK.

PENTING !!!
Rangkaian downloader yang kita gunakan kompatibel terhadap STK20
0+/300.
Setting ini cukup dilakukan sekali saja.
Membuat Project Baru
1. Pastikan tidak terdapat file/project yang terbuka, jika
ada yang terbuka tutup dahulu
(Klik Menu File, Pilih Close Project).
2. Klik Menu File, kemudian pilih New, maka selanjutnya
akan tampak dialog disamping:
3. Pilih Project, kemudian Klik tombol OK.
4. Tampak Dialog untuk konfirmasi menggunakan Progr
am Generator atau manual. Klik tombol Yes maka tamp
ak wizard dialog spt disamping:
5. Ubah bagian tab Chip, pilih ATmega8535L (karena kita
menggunakan ATmega8535L). Beberapa nantinya akan
kita ubah sesuai dengan kebutuhan terutama clock.
6. Klik File, pilih Generate, Save and Exit. Simpan masin
g-masing dengan nama input.C (untuk file source C), in
put.prj (untuk file Project) dan input.cwp (untuk file Co
de Wizard Project).
7. Maka pada bagian navigasi akan tampak seperti pada
gambar berikut.

Anda telah mempunyai satu file project. Per


hatikan yang sudah tertulis di lembar kerja
anda.
8. Klik menu Project dan pilih Configure atau klik
icon , maka tampak kotak Dialog Pr
oject Configure
9. Pilih tab After Make.
10. Beri tanda [] Cek pada Program the Chip.
11. Untuk keperluan yang lain bisa anda ubah sesu
ai kebutuhan, misal untuk proteksi.
12. Klik OK

PENTING !!!
Harap 7 langkah diatas dipahami betul.
Penggunaan 7 langkah diatas memudahkan dalam setting register AVR
Langkah ke 5 merupakan salah satu keunggulan memprogram ATmega
dengan bahasa C terutama dengan CodeVision AVR karena device ATmega yang
dipakai tidak banyak berpengaruh pada program yang kita buat,
hanya perlu perubahan/penyesuaian sedikit saja kita bisa menggunakan ATmega
seri yang lain.
Abaikan langkah 8-12 jika anda berkeinginan menggunakan PonyProg2000 untuk
download ke AVR.
Compile (Kompilasi) dan D
ownload ke AVR
Klik menu Project, pilih Make atau shortcut [shift+F9] atau klik ikon
. Selanjutnya akan nampak dialog hasil kompilasi, baca jika tidak t
erjadi kesalahan dapat dilanjukkan untuk proses download (Langka
h 6).
Jika terjadi kesalahan baca keterangan di jendela Messages atau d
i Navigator.
Koreksi kesalahan dan kompilasi lagi.
Jika tidak terjadi kesalahan maka akan tampak kotak dialog beriku
t:
Jika tidak ada kesalahan bisa langsung program ke AVR (untuk wa
rning biasanya menampilkan beberapa variabel yang telah di dekla
rasikan namun tidak digunakan).
Klik tombol Program the chip untuk download ke AVR, maka akan t
ampak progress bar berikut:
Jika terdapat kesalahan cek ulang hardware anda, terutama kabel
downloadernya.
AVR telah diprogram.
Dasar I/O
Konfigurasi Pengaturan Register untuk Input Output
DDR bit = 1 DDR bit = 0
PORT bit = 1 Output ; High Input ; R pull-up

PORT bit = 0 Output ; Low Input ; Floating

Misal:

PORTA=0xCC;
DDRA=0x0F;

Printah Dasar
Dasar I/O
Output
PORTX = data;
Yaitu untuk mengirim data byte ke PortX (X= A, B, C, D).
Perintah ini sama dengan out dalam bahasa assembly ATmega8535.
Input
data_in = PINX;
Yaitu mengambil data byte dari PINX (X= A, B, C, D) yang kemudian
disimpan ke variable data_in.
Perintah ini sama dengan in dalam bahasa assembly ATmega8535.
Rangkaian Dasar I/O
Output
Buat Program dengan langkah seperti pada bagian
membuat projek baru hingga nampak dialog berikut:
Untuk bagian PORT, pilih Port C.
1. Port C disetting sebagai Output dan Value Low (lihat
gambar).
2. Kemudian klik File >> Generate, Save and Exit
3. Ikuti petunjuk penyimpanan file (bila diperlukan ganti
folder penyimpanan).
4. Simpan dengan nama output1.c, output1.prj dan
output.cwp.
Coba perhatikan baris berikut:

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

Setting Register Port untuk Port C adalah sebagai Output dengan


kondisi Low.
Compile, download ke ATmega8535 dan amati LED nya.
Kenapa?...

lihat rangkaian, ingat rangkaian output terdiri dari 4 bit


output active low, 4 bit output active high .
Sekarang coba geser ke baris bagian berikut:

while (1)
{
// Place your code here
};
}

Ubah menjadi:

while (1)
{
// Place your code here
PORTC = 0xA5;
};
}

Input Output
Hubungkan rangkaian Output ke PORTB dan rangkaian Input ke
PORTC. Kembali kita buat projek baru, setting Chip dan clock
kemudian setting PORT seperti pada gambar berikut:

Kemudian Generate file, save and exit. Simpan dng nam


a file in_out.c, in_out.prj dan in_out.cwp.
Buat deklarasi variable data di bagian berikut:

void main(void)
{
// Declare your local variables here
unsigned char data; // lokal variable

Tambahkan instruksi sehingga nampak seperti berikut:

while (1)
{
// Place your code here
data = PINC; // tambahkan instruksi ini
PORTB = data; //
};
}

Kompile, download dan perhatikan hasilnya (sambil tekan tombol).


Jika hasil input dari PORTC ingin langsung dikeluarkan tanpa proses.
Dua instruksi diatas bisa langsung diganti dengan
PORTB = PINC;
KONTROL PORT I/O PER BIT
Output

PORTX.bitn = data;

Yaitu untuk mengirim data bit (0 atau 1) ke


PortX bit ke n. (X= A, B, C, D)
Perintah ini setara dengan sbi dalam bahasa assembly.

Contoh:

PORTB.3=1;

Artinya adalah bit 3 PORTB di beri nilai 1.
KONTROL PORT I/O PER BIT
Input

data_in = PINX.bitn;

Yaitu mengambil data bit dari PINX (X= A, B, C, D) bit ke n


kemudian disimpan ke variable data_in.
Perintah ini setara dengan cbi dalam bahasa assembly.

Contoh:

da ta_n= PORTB.3;

Artinya adalah, ATmega8535 mengambil data bit pada PORTB


bit ke 3. Nilai dari perintah ini hanya 0 atau 1.
Untuk lebih jelasnya buka kembali file in_out.c, kemudian lakukan
perubahan berikut:

while (1)
{
// Place your code here
//data = PINC; // mula-mula file inout1.c
//PORTB = data; //
//diganti instruksi berikut :
data = PINC.5; // ambil data bit 5 PORTC
PORTB.5 = data; //outputkan data ke PORTB bit ke 5
};
}

Compile, download dan perhatikan hasilnya (sambil tekan tombol bit 5).
Jika hasil input dari PORTC ingin langsung dikeluarkan tanpa proses
dua instruksi diatas bisa langsung diganti dengan PORTB.5 = PINC.5;
Latihan
Jika tombol 0 ditekan maka led 4 akan menyala.
Jika tombol 1 ditekan maka led 7 akan menyala.
Jika tombol 2 ditekan maka led akan menyala dengan konfigurasi
ON - OFF - ON - OFF - ON - OFF - ON OFF.
Jika tombol 3 ditekan maka led akan menyala dengan konfigurasi
OFF - ON - OFF - ON - OFF - ON OFF - ON.
Jika tombol 4 dan 5 ditekan maka led menyala semua.
Tombol lainnya, led mati.

Petunjuk:
Lihat kembali rangkaian output, ada yang aktif low ada juga yang aktif
high. Gunakan pernyataan if then (lihat kembali bahasan Bahasa
C tentang percabangan).
Tunda
Tunda atau delay akan sering kita gunakan,
contoh sederhana saat memutar motor stepper maka
pemberian bit ke motor stepper harus ditunda karena
jika tidak diberi tundaan motor tidak bisa berputar.
Ada dua cara memberikan tundaan yaitu
Tunda yang kita buat sendiri dan
Tundaan yang sudah disediakan oleh CVAVR.
Membuat Tunda Sendiri
Buka file output1.c, kemudian buat prosedur tunda berikut:
#include <mega8535.h> // blok header

// prosedur tunda
void tunda(unsigned char k) {
unsigned char j,i;
j=0;
i=5;
while (j<k) { void wait(void){
j=j+1; unsigned char i,j;
while (i--) {
#asm for(i=0;i<255;i++)
nop for(j=0;j<255;j++);
#endasm }
};
};
}
...
Kemudian ubah instruksi berikut:

void main(void)
{

while (1)
{
// Place your code here
PORTC=0x0F; // ingat rangkaian led dihubungkan
tunda(5); // ke port C
PORTC=0xF0;
tunda(5);
};
}

Kompile, download dan jalankan perhatikan keadaan led.


MENGGUNAKAN LIBRARY DELAY
Buat project baru lagi, set PORTC sebagai output kemudian simpan dng nama
delay2.c, delay2.prj dan delay 2.cwp.
Tambahkan library delay di bagian header,

#include <mega8535.h> // blok header


#include <delay.h> // tambahkan library delay disini

void main(void)
{

while (1)
{
// Place your code here
#asm("cli")
PORTC=0x5a; // ingat rangkaian led dihubungkan
delay_ms(100); // memanggil delay dari library delay
PORTC=0xa5;
delay_ms(100);
#asm("sei")
};
}
Kompile dan download, perhatikan keadaan led.
Instruksi-Instruksi di Library Delay

delay_us(unsigned int n)
Menghasilkan tundaan selama n mikro detik, n harus konstanta.

delay_ms(unsigned int n)
Menghasilkan tundaan selama mili ditik.

Fungsi-fungsi ini secara otomatis akan me-reset kondisi timer


watchdog setiap 1ms dengan cara membangkitkan instruksi wdr.
Ada dua instruksi tambahan yang harus disertakan pada saat
memanggil fungsi delay yaitu:

#asm(cli), untuk me-nonaktifkan semua interupsi


#asm(sei), untuk mengaktifkan semua interupsi

Jika hal ini tidak dilakukan maka delay akan bisa menjadi lebih
lama dari yang diharapkan.
Untuk mempelajari library delay bisa dilihat di
file delay.h, yang berada di subdirektori ..\INC.
LCD
Penampil ke LCD sangat membantu dlm memprogram, hal in
i dikarenakan kita tidak menggunakan program
debug sehingga perlu menampilkan hasil perhitungan,
isi variabel atau keperluan debug yang lain ke LCD.
LCD juga bisa untuk menampilkan hasil pengambilan
data dari sensor bahkan bisa untuk interaksi antara
mikrokontroller dengan manusia.
LCD yang digunakan adalah tipe M1632 yang secara fisik
adalah sebagai berikut:
Pin LCD
No. Pin Function
1 Vss 0V (GND)
2 Vcc 5V
3 VLC LCD Contras Voltage
4 RS
Register Select; H: Data Input; L:Instruction Input
5 RD H: Read; L: Write
6 EN Enable Signal
7 D0
8 D1
9 D2
10 D3
Data Bus
11 D4
12 D5
13 D6
14 D7
15 V+ BL Positif Backlight Voltage (4-4,2 V; 50-200mA)
16 V- BL Negatif Backlight Voltage (0V; GND)
PortX[0..7]

VCC

5k
VR

JLCD
Pin LCD
1
2
3
PORTX.0
4
PORTX.1
5
PORTX.2
6
7
8
9
10
PORTX.4
11 PORTX.5
12
PORTX.6
13
PORTX.7
14
15
16
Rangkaian Interface LCD
Project LCD
Kembali buat projek baru. Jangan lupa setting chip dan clock.
Kemudian setting bagian LCD seperti gambar berikut:

Kemudian
Generate file, save and exit.
Simpan dengan nama file
LCD1.c, LCD1.prj dan LCD1.cwp.
Kemudian coba anda lakukan perubahan berikut:

// LCD module initialization


lcd_init(16); //inisialisasi LCD 16x2
lcd_gotoxy(0,0); //menempatkan posisi di 0,0
//kolom 0, baris 0
lcd_putsf("Halo"); //menampilkan string Halo
lcd_gotoxy(0,1); //menempatkan posisi
//kolom 0, baris 1
lcd_putsf("Saya Ary"); //menampilkan string

while (1)

Kemudian Compile, download dan perhatikan hasilnya.


Coba dengan string dan posisi kolom-baris yang berbeda-beda.
Instruksi-Instruksi di Library LCD
unsigned char lcd_init(unsigned char lcd_columns)
Intruksi ini berfungsi untuk inisialisasi LCD kemudian dilanjutkan meng
hapus tampilan LCD dan menempatkan posisi kursor di
kolom 0 baris 0. Lcd_columns harus bernilai sesuai tipe LCD,
misal 16. Fungsi ini akan memberikan nilai 1 jika LCD ditemukan dan 0
jika tidak ditemukan. Fungsi ini harus di panggil pertama
kali sebelum memanggil fungsi-fungsi lcd yang lain.

Contoh:
lcd_init(16);
unsigned char lcd_read_byte(unsigned char addr);
Instruksi ini membaca karakter dari RAM LCD.
Contoh:
ch=lcd_read_byte(0x10);

void lcd_clear(void)
Instruksi ini akan menghapus tampilan LCD dan menempatkan posisi
kursor di kolom 0 baris 0.
Contoh:
lcd_clear();

void lc.d_gotoxy(unsigned char x, unsigned char y)


Instruksi ini men-setting posisi kursor pada kolom x dan baris y.
Contoh:
lcd_gotoxy(4,1); // menempatkan kursor pada kolom 4 baris 1

void lcd_putchar(char c)
Instruksi ini berfungsi menampilkan karakter c pada posisi kursor saat itu.
Contoh:
lcd_gotoxy(5,0); // menempatkan kursor pada kolom 5 baris 0
lccd_putchar(0x41); // menampilkan karakter A
// lihat table karakter lcd
void lcd_putsf(char flash *str)
Instruksi ini berfungsi menampilkan string pada posisi kursor saat itu.
Contoh:
lcd_gotoxy(0,1); //menempatkan pada posisi kolom 0 baris 1
lcd_putsf("Saya Ary"); //menampilkan string Saya Ary

void lcd_puts(char *str)


Instruksi ini berfungsi menampilkan string yang sebelumnya disimpan di SR
AM. Sebelum memanggil instruksi ini sebelumnya harus
menempatkan string di SRAM. Instruksi ini memerlukan library
stdio.hex.
Buka kembali program lcd1.c, tambah dan ubah seperti berikut.
Deklarasikan variable berikut:

#include <mega8535.h>
#include <stdio.h> //tambahkan library stdio.h
//kita memerlukan suatu instruksi
//untuk menyimpan string ke SRAM

// Declare your global variables here


char buf[33]; //deklarasi variabel buf untuk menyimpan
//string yang akan ditampilkan ke lcd
//di SRAM

// LCD module initialization


lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Menampilkan");
lcd_gotoxy(0,1);
sprintf(buf,Angka %x",14); //menyimpan string ke SRAM
lcd_puts(buf); //menampilkan ke LCD
while (1) {

Compile, download dan perhatikan hasilnya.


Ingat kembali tentang konversi pola di bab bahasa C.
Karakter yang ditampilkan ke LCD adalah e, yaitu bilangan
hexadesimal dari angka 14 desimal. Untuk menampilkan
angka dalam pola yang lain coba anda ganti %x
dengan %d (lihat kembali BAB Bahasa C tentang Konversi
Pola).
Karakte
Khusus LCD

Untuk menampilkan karakter


khusus ini cukup dengan
memberikan instrusksi berikut:

sprintf(buf,Angka %d \xf4",50);

Instruksi diatas akan menyimpan


Angka 50 ke memori LCD
dan selanjutnya bisa ditampilkan
ADC
Penggunaan ADC ini sangat banyak, terutama dalam
bidang pengukuran. Banyak keluaran sensor yang
berupa masih analog yang harus dikonversi ke digital
agar dapat di olah mikrokontroller.

Input ADC adalah di PORTA

Fitur dari ADC ATMega8535 adalah sebagai berikut:


Resolusi 10 bit
Waktu konversi 65 260 s
8 ch input
0-Vcc input ADC
3 Mode pemiligan Tegangan referensi
Rangkaian Pembagi Tegangan
VCC

Dengan dasar pembagi tegangan kita bisa memb


eri tegangan yang bervariasi ke ADC.
PORTA.n

R2 VR
VOUT Vcc 50k
R1 R2

Ada beberapa register yang harus diatur jika akan menggunakan ADC, nam
un sekali lagi kita sangat terbantu dengan wizzard dari Code Vision AVR
Project ADC
Buat project baru, jangan lupa setting chip dan clock. Kem
udian setting bagian ADC seperti gambar berikut:
Anda bisa menggunakan 10 bit jika diperlukan dan menggunakan VRE
F dari luar. Untuk contoh ini digunakan konversi 8 bit denganVREF=Vc
c (lihat bagian Volt Ref).

Hubungkan rangkaian pembagi tegangan (gambar 8.1) ke salah satu


pin pada PORTA (untuk contoh ini dihubungkan ke PINA.0). Untuk sett
ing LED dan LCD samakan dengan keypad yaitu LED
ke PORTB dan LCD ke PORTC.

Generate file, save and exit.

Simpan dengan nama file ADC1.c, ADC1.prj dan ADC1.cwp.


START

Inisialisasi :
PORTA >> ADC, 8bit,

FlowChart Vref=Vcc
PORTB >> Output, Logika 0
PORTC >> LCD

Baca ADC ch0

PORTB=dt_adc

Tampilkan ke LCD
Listing
#include <stdio.h> //tambahkan library stdio.h

// Declare your global variables here


char buf[33]; //deklarasi variabel buf untuk LCD

void main(void)
// Declare your local variables here
unsigned char dtadc; // deklarasi variabel data ADC

// LCD module initialization


lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Data ADC ch.0:");
while (1)
{
// Place your code here
dtadc=read_adc(0); // baca data ADC dari ch.0;
PORTB=dtadc;
lcd_gotoxy(0,1);
sprintf(buf,"%x h %i d",dtadc,dtadc); //menyimpan string ke SRAM
lcd_puts(buf); //menampilkan ke LCD
};
}
Compile, download dan perhatikan hasilnya dengan me
mutar-mutar potensiometer.

Untuk pembacaan ADC chanel yang lain cukup mengubah instr


uksi menjadi berikut:

dtadc=read_adc(3) ; // membaca data ADC di chanel 3


Motor Stepper
Motor stepper atau motor langkah adalah motor listrik yang
dirancang untuk penggunaan pada sistem
kontrol digital langsung (Direct Digital Control), di
mana sinyal yang dihasilkan berasal dari sistem digital, sep
erti mikrokontroler.
Motor Stepper berputar dengan bertahap (step) yang tetap
dari satu posisi ke posisi yang lain.
Besar pergeseran step tergantung dari konstruksi motor.
Besar step ini disebut dengan derajat/step atau step angle
(SA), angka ini berkisar : 1,8 2,5 3,75 7,5 15 dan 30
.
Tipe-tipe motor Stepper
Electrical Type
DM Type
- Simple Type : Large HP Large Angle
- Hybrid DM Type : Small HP Small Angle
VR Type : Middle HP Small Angle
Combination Type
Electrical + DC Motor : Large HP Small Angle
Electrical +Oil Pressure Motor : Large HP Small Angle
Prinsip Kerja
Untuk mempermudah memahami prinsip kerja motor stepper, anggap rotor me
miliki 2 kutub dan stator 4 kutub.
Prinsip utama berbagai tipe motor stepper pada umunya sama, dan
prinsip kerjanya dapat dianalisa dengan bantuan gambar berikut.
Stator I Stator I

N
II S N IV II IV

S
(b
(a)
III III )

Stator I Stator I

II N S IV II IV
N

(c) (d)
III III
Rangkaian Driver +12V

D1
IN4001

Q1
R1 9013
1K2
Q2
TIP31
+12V
R2
100 M1
D3 MOTOR STEPPER
IN4001
PORTX.0

Q3
R3 9013
1K2 +12V
Q4
PORTX.1

TIP31

PORTX[0..3]
R4
+12V 100

D5
IN4001
PORTX.2

Q5
R5 9013
PORTX.3

1K2
Q6
TIP31
+12V
R6
100
D7
IN4001

Q7
R7 9013
1K2
Q8
TIP31

R8
100
Project Stepper
Buat projek baru, hubungkan rangkaian driver motor stepper ke PORTC dan
dasar IO (input) ke PORTA. Setting PORT seperti gambar berikut:
START

FlowChart
Inisialisasi :
PORTA >> Input, R-PullUp
PORTC0-3 >> Output, Logika 0
PORTC4-7 >> Input, Float
dir=0

Baca PINA

PINA.0=0 t PINA.1=0 t
? ?

y y

dir=1 dir=2

dir=1 t dir=2 t
? ?

y y

Stepp_l Stepp_r
Software
#include <mega8535.h>
void tunda(unsigned char i); // deklarasi prosedur tunda
void step_l(void); // deklarasi prosedur putar kiri
void step_r(void); // deklarasi prosedur putar kanan

// Declare your global variables here


unsigned char w_tunda;

void main(void)
{
// Declare your local variables here
char dir=0;

// prosedur putar kiri


void step_l(void)
{
PORTC=0x01; tunda(w_tunda);
PORTC=0x02; tunda(w_tunda);
PORTC=0x04; tunda(w_tunda); // prosedur tunda
PORTC=0x08; tunda(w_tunda); void tunda(unsigned char k) {
} unsigned char j,i;
// prosedur putar kanan j=0;
void step_r(void) i=5;
{ while (j<k) {
PORTC=0x08; tunda(w_tunda); j=j+1;
PORTC=0x04; tunda(w_tunda); while (i--) {
PORTC=0x02; tunda(w_tunda); #asm
PORTC=0x01; tunda(w_tunda); nop
} nop
#endasm
};
};
}

w_tunda=10;
while (1)
{
// Place your code here
if (PINA.0==0) {dir=1;};
if (PINA.1==0) {dir=2;};
switch (dir) {
case 1:
step_l();
break;
case 2:
step_r(); Compile, download kemudian
break; perhatikan hasilnya dengan
}; menekan tombol
};
}
w_tunda=10;
while (1)
{
// Place your code here
if (PINA.0==0) {dir=1;};
if (PINA.1==0) {dir=2;};
if (PINA.2==0) {w_tunda=w_tunda+10;
if (w_tunda>100) {w_tunda=100;}
};
if (PINA.3==0) {w_tunda=w_tunda-10;
if (w_tunda<10) {w_tunda=10;}
};
if (PINA.7==0) {dir=0;};
switch (dir) {
Ubah program menjadi seperti
case 1:
step_l(); disamping.
break; Compile, download kemudian
case 2: perhatikan hasilnya dengan
step_r(); menekan tombol
break;
};
};
}
SHL (<<) dan SHR (>>)


// prosedur putar kiri // Declare your global variables here
void step_l(void) unsigned char w_tunda;
{ char dt=1;
dt=dt << 1;
if (dt>0x08) {dt=0x01;}
}
// prosedur putar kanan
void step_r(void)
{
dt=dt >> 1;
if (dt==0) {dt=0x08;}
}


while (1)
{
// Place your code here
PORTC=dt;
if (PINA.0==0) {dir=1;};
if (PINA.1==0) {dir=2;};
if (PINA.2==0) {w_tunda=w_tunda+10;
if (w_tunda>100) {w_tunda=100;}
};
if (PINA.3==0) {w_tunda=w_tunda-10;
if (w_tunda<10) {w_tunda=10;}
};
if (PINA.7==0) {dir=0;};
switch (dir) {
case 1: Ubah program menjadi seperti
step_l(); disamping.
tunda(w_tunda); Compile, download kemudian
break; perhatikan hasilnya dengan
case 2:
step_r(); menekan tombol
tunda(w_tunda);
break;
};
};
MOTOR DC
START FlowChart

Inisialisasi :
PORTA >> Input, R-PullUp
PORTC0-3 >> Output, Logika 0
PORTC4-7 >> Input, Float

Baca PINA

PINA.0=0 t PINA.1=0 t
? ?

y y

PORTC=0x01 PORTC=0x00

Anda mungkin juga menyukai