Nama
: Fiqi Amalia
No
: 10
NIM
: 1331130038
Kelas
: TT-2A
Mata kuliah
BAB I
PENDAHULUAN
1.1
Tujuan
1) mampu membuat dan memahami pemrograman komunikasi serial pada
mikrokontroller, baik sebagai penerima atau pengirim data.
2) mampu membuat aplikasi interface sederhana dengan program Code Vision
AVR, Proteus, dan Hercules sebagai penghubung antara mikrokontroller
dengan PC secara komuikasi serial .
1.2
1 buah
1 buah
1 buah
3 buah
1 buah
2 buah
1 buah
1 buah
1 buah
1 buah
1 buah
7 buah
2 buah
1 buah
15) Max232
1 buah
16) IC 7025
1 buah
5 buah
1 buah
1 buah
1 buah
1 buah
4 buah
4 buah
2 buah
2 buah
1 buah
4 buah
BAB II
TEORI DASAR
2.1 Atmega16
Mikrokontroler adalah sebuah sistem komputer lengkap dalam satu
serpih(chip). Mikrokontroler lebih dari sekedar sebuah mikroprosesor karena
sudah terdapat atau berisikan ROM (Read-Only Memory), RAM (Read-Write
Memory),beberapa Port masukan maupun keluaran, dan beberapa peripheral
seperti pencacah/pewaktu, ADC (Analog to Digital converter), DAC (Digital to
Analog converter) dan serial komunikasi.
a. Arsitektur ATMEGA16
Mikrokontroler ini menggunakan arsitektur Harvard yang memisahkan
memori program dari memori data, baik bus alamat maupun bus data, sehingga
pengaksesan
program
dan
data
dapat
dilakukan
secara
bersamaan
.
c. Deskripsi Mikrokontroller Atmega16
VCC (Power Supply) dan GND(Ground)
Port A (PA7..PA0)
Port A berfungsi sebagai input analog pada konverter A/D. Port A juga
sebagai suatu Port I/O 8-bit dua arah, jika A/D konverter tidak digunakan.
Pena - pena Port dapat menyediakan resistor internal pull-up (yang dipilih
untuk masing-masing bit). Port A output buffer mempunyai karakteristik
b. Cara kerja
Layar tujuh segmen berbasis LED menampilkan 16 digit HEX Layar
tujuh segmen ini terdiri dari 7 buah LED yang membentuk angka 8 dan 1 LED
untuk titik/DP. Angka yang ditampilkan di seven segmen ini dari 0-9. Cara kerja
dari seven segmen disesuaikan dengan LED. LED merupakan komponen diode
yang dapat memancarkan cahaya. kondisi dalam keadaan ON jika sisi anode
mendapatkan sumber positif dari Vcc dan katode mendapatkan sumber negatif
dari ground.
Berdasarkan cara kerjanya, tujuh segmen dibagi menjadi 2 bagian:
common katode
Cara kerja dari seven segmen common katode akan aktif pada kondisi high "1"
dan akan off pada kondisi low "0".
ANGKA
hgf edCba
HEXA
001111 11
3FH
000001 10
06H
010110 11
5BH
010011 11
4FH
011001 10
66H
011011 01
6DH
011111 01
7DH
000001 11
07H
011111 11
7FH
011011 11
6FH
common anode
Cara kerja dari seven segmen common anode akan aktif pada kondisi
low "0" dan akan off pada kondisi high "1".
ANGKA
h g f e d c b a HEXA
1 1 0 0 0 0 0 0 C0H
1 1 1 1 1 0 0 1 F9H
1 0 1 0 0 1 0 0 A4H
1 0 1 1 0 0 0 0 B0H
1 0 0 1 1 0 0 1 99H
1 0 0 1 0 0 1 0 EDH
1 0 0 0 0 0 1 0 12H
1 1 1 1 1 0 0 0 F8H
1 0 0 0 0 0 0 0 10H
1 0 0 1 0 0 0 0 90H
2.3 Potensiometer
Interface introduction
GND: GND
Connection
USB TTL
ATmega16
BAB III
PEMBAHASAN
3.1 Flowchart
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
unsigned char data,i,pot,ldr,rat,pul,sat,a,b,c;
unsigned seg[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
unsigned char nama[5]={0X8e,0xf9,0x98,0xf9,0xf7} ;
unsigned char nim[10]={0xF9,0xB0,0xB0,0xF9,0XF9,0xB0,0xC0,0xC0,0xb0,0x80};
unsigned char tgl[10]={0xA4,0x92,0xBF,0xc0,0x92,0xBF,0xF9,0x90,0x90,0x92};
unsignedchar no hp[12] = {0xC0, 0x80, c0x92, 0xf8, 0xb0, 0xb0, 0x99, 0xb0, 0x92, 0x92,
0xc0, 0x82};
unsigned kls[8]={0xf9,0xc0,0xbf,0x87,0x87,0xbf,0xa4,0x88};
unsigned char gelap[5]={0x90,0x86,0xc7,0x88,0x8c};
unsigned char redup[5]={0xce,0x86,0xa1,0xc1,0x8c};
unsigned char terang[6]={0x87,0x86,0xce,0x88,0xc8,0x90};
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256
// special case for receiver buffer size=256
if (++rx_counter == 0)
{
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
#endif
rx_buffer_overflow=1;
}}}
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used#endif
#include <stdio.h>
#define ADC_VREF_TYPE 0x60
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0xFF;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x4D;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
SPCR=0x00;
TWCR=0x00;
#asm("sei")
while (1)
{
data=getchar();
delay_ms(100);
//memasukan data
pot= read_adc(0);
ldr = read_adc (1);
rat= pot/100;
pul=(pot%100)/10;
sat=(pot%10);
//membaca ADC POT dan LDR
if(data=='A'){puts("Fiqi");
for (i=0;i<4;i++){
PORTC=nama[i];
delay_ms (500);
PORTC=0xff;
delay_ms (500);}}
else if(data=='B'){puts("Jombang, 25-05-1995");
for(i=0;i<10;i++){
PORTC=tgl[i];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
}}
else if(data=='3'){puts("1331130038");
for(i=0;i<10;i++){
PORTC=nim[i];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
}}
else if(data=='4'){puts("085733435506");
for(i=0;i<12;i++){
PORTC=nohp[i];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
}}
else if(data=='5'){puts("10-tt-2a");
for(i=0;i<8;i++){
PORTC=kls[i];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
}}
a=rat+0x30;
b=pul+0x30;
c=sat+0x30;
if(data=='C'){putchar(a);putchar(b);putchar(c);puts("");
PORTC=seg[rat];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
PORTC=seg[pul];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
PORTC=seg[sat];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
}
if(data=='D'){
if (ldr<75){puts("terang");
for (i=0;i<=5;i++){
PORTC=terang[i];
delay_ms (500);
PORTC=0xff;
delay_ms (500);}}
else if (ldr<150){puts("redup");
for (i=0;i<=4;i++){
PORTC=redup[i];
delay_ms (500);
PORTC=0xff;
delay_ms (500);}}
else if (ldr<255){puts("gelap");
for (i=0;i<=4;i++){
PORTC=gelap[i];
delay_ms (500);
PORTC=0xff;
delay_ms (500);
} }}
}
}
3.3 Pembahasan
a) Program 1
#include <mega16.h>
#include <delay.h>
unsigned char i;
unsigned char nama[5] = {0xcf, 0xab, 0xa1, 0xce, 0x20};
Pada program diatas terdapat #include<mega16.h> yang merupakan file
header untuk komponen atmega 16.Dan file header #include<delay.h> digunakan
untuk waktu display pada seven segment. Program unsigned char merupakan tipe
data, i merupakan variable tipe data dari unsigned char. unsigned nama[20]
merupakan tipe data, nama adalah variabel dan 20 adalah banyaknya data array yang di
pesan. Setelah itu data array di konversi menjadi data heksa. Misalnya kita ingin
mendisplaykan angka 1 pada 7segment maka data hasil konversi adalah 0x09.
Beri logika nol pada huruf led yang ingin di nyalakan, dan lainnya di beri
logika satu agar mati. Beri 0x untuk awalan data hasil konversi. Berikut
adalah data hasil konversi.
1.1 Tabel hasil konversi
Kaki 7 Segment
Data
Output 7 segment
Hexsa
0xcf
0xab
0xa1
0xce
a.
0x20
b) Program 2
data=getchar();
delay_ms(100);
pot= read_adc(0);
ldr = read_adc (1);
rat= pot/100;
pul=(pot%100)/10;
sat=(pot%10);
Fungsi getchar(); adalah untuk memasukan karekter dari komputer ke
ATmega16 sehingga variabel data bernilai data input dari komputer. Scrip
pot=read_adc(0); berfungsi untuk membaca ADC dan (0) digunakan untuk
memilih chanel dikaki ATmega 16 pada port A.
Scrip RATUSAN=pot/100;
else if(data=='2'){puts("20-02-1995.");
for(i=0;i<10;i++){
PORTC=tgl[i];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
}}
else if(data=='3'){puts("1331130027.");
for(i=0;i<10;i++){
PORTC=nim[i];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
}}
else if(data=='4'){puts("087859521890.");
for(i=0;i<12;i++){
PORTC=nohp[i];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
}}
else if(data=='5'){puts("14-tt-2b.");
for(i=0;i<8;i++){
PORTC=kls[i];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
}}
Dan Scrip berikut adalah scrip untuk menampilkan hasil ADC dari potensio dan
sensor cahaya (LDR) :
a=rat+0x30;
b=pul+0x30;
c=sat+0x30;
if(data=='6'){putchar(a);putchar(b);putchar(c);puts("");
PORTC=seg[rat];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
PORTC=seg[pul];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
PORTC=seg[sat];
delay_ms(500);
PORTC=0xff;
delay_ms(500);
}
if(data=='7'){
if (ldr<125){puts("terang");
for (i=0;i<=5;i++){
PORTC=terang[i];
delay_ms (500);
PORTC=0xff;
delay_ms (500);}}
else if (ldr<200){puts("redup");
for (i=0;i<=4;i++){
PORTC=redup[i];
delay_ms (500);
PORTC=0xff;
delay_ms (500);}}
else if (ldr<255){puts("gelap");
for (i=0;i<=4;i++){
PORTC=gelap[i];
delay_ms (500);
PORTC=0xff;
delay_ms (500);
} }}
Penjelasan untuk script ADC :
Agar
PC
mampu
menampilkan
nilai
ADC
maka
ditambah
scrip
for(i=0;i<=4;i++)
BAB IV
PENUTUP
4.1 Kesimpulan
Pada praktikum Komunikasi Serial pada ATmega16 Menggunakan Metode USART
dapat diambil kesimpulan :
1) Ketelitian pada program atmega16 harus baik.
2) Kerapian penyolderan harus lebih ditingkatkan.
3) Atmega16 akan berfungsi jika diberi program terlebih dahulu.
4) Atmega16 mempunyai 4 port, setiap port terdiri dari 8 pin.
5) 4 port tersebut dapat difungsikan sebagai input atau output.
6) 7segmen Common Anoda agar menyala diberi input 0.
7) Potensiometer dapat diubah nilainya, dan nilai tersebut dapat mempengaruhi nilai
ADC dari atmega16.
8) Nilai minimum potensiometer (0) maka nilai ADCnya adalah 000. Nilai
maksimal potensiometer (10k) maka nilai ADCnya adalah 255.
9) Kepekaan LDR dapat disetting dengan menggunakan resistor.
10) Rx/Tx terletak pada port ke 4 dikanal 0 dan 1.
11) ATmega16 bisa mengirim data ke komputer dan komputer bisa mengirim ke
ATmega16
LAMPIRAN