MIKROKONTROLER ATMEGA BERBASIS CODEVISION AVR (SERIAL U(S)ART)
dins
DEPOK INSTRUMENTS
Teori U(S)ART
U(S)ART = Universal (Syncronous) Asyncronous Rx Tx adalah standar komunikasi serial Serial vs Parallel:
Fitur U(S)ART µC. ATmega16A
PIND.0 = RXD PORTD.1 = TXD RS232 = Protokol standar tegangan untuk komunikasi berjarak sedang. USB TO RS232 = Konverter komunikasi USB ke RS232.
DI-Smart AVR.16 System (Sistem Plus µC. ATmega16A) RP1 D0
L6 PC2
L7 PC1
L8 PC0
VCC
JP3 LED CONNECTED
VCC
C11 1uF
2 6 16
C10 1uF
DB1 SERIAL
+ C12 1uF
+
+
1 2 3 4 5 6 7 8
PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7
14 15 16 17 18 19 20 21
X2 X1
12 13
PB0 (T0) PB1 (T1) PB2 (AIN0) PB3 (AIN1) PB4 (SS) PB5 (MOSI) PB6 (MISO) PB7 (SCK)
PA0 (ADC0) PA1 (ADC1) PA2 (ADC2) PA3 (ADC3) PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7)
PD0 (RXD) PD1 (TDX) PD2 (INT0) PD3 (INT1) PD4 (OC1B) PD5 (OC1A) PD6 (ICP ) PD7 (OC2)
(TOSC2) PC7 (TOSC1) PC6 PC5 PC4 PC3 PC2 PC1 PC0
1
40 39 38 37 36 35 34 33
PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7
29 28 27 26 25 24 23 22
PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
VCC PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7
V+ VVCC GND
7
15
MAX232CPE
12 9 14 7 4 5
RXD SERIAL
X2 X1
RST
9
RESET
C13 1uF
X1
VCC
2
20pF C2
3
1K
POWER 9-12VDC
C3 RXD SERIAL PD0 RXD ISP
VCC + C5 10uF
S2
VCC 3
3
PD2
C7 + C6 100nF 100nF
PD2 S3 PD3
1 2 3 4 5 6 7 8 9 10
VCC
2 4 6 8 10
RXD ISP TXD ISP
4
RST
100nf
PD3 C4 470uF
2
+
+5V
PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7
9 6
JP1
JP2
1 2 3
1 2 3
TXD SERIAL PD1 TXD ISP
VR1 2
5
1 2 3 4 5 6 7 8 9 10 P3 PORTD
VCC
1 3 5 7 9
RST
W
AREF 2
1
Vin
GND
1
LM7805CT
PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7
P4 ISP PROG PB5 LED RST PB7 PB6
SW1
VCC
1 2 3 4 5 6 7 8 9 10
VCC
R1
20pF D1 4002
30
AVCC
C1
VCC PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7
31
AGND
Y1 11059200 X2
U0
32 AREF
AREF
10K 1
C9 1uF
R1 OUT R2 OUT T1 OUT T2 OUT C2+ C2 -
+
R1 IN R2 IN T1 IN T2 IN C1+ C1 -
1 2 3 4 5 6 7 8 9 10
P1 PORTB
P2 PORTC
U2 13 8 11 10 1 3
+
5 9 4 8 3 7 2 6 1
TXD SERIAL
PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7
P0 PORTA
AT MEGA
IC1
PC0
PC1
PC2
PC3
PC4
PC5
8
L5 PC3
D1
L4 PC4
D2
L3 PC5
D3
D4
L2 PC6 PC6
PC7
2 1
L1 PC7
D5
D0 D1 D2 D3 D4 D5 D6 D7
D6
D7
1 2 3 4 5 6 7 8 9
C17 100nF
POWER
R3
L10
2K2
VCC
DI-Smart AVR.16 System 1. 2. 3. 4. 5. 6. 7. 8. 9.
ATmega16A Crystal Reset ISP Power Vref ADC RS232 LED Array Push Button
3 4 1
Serial RS232
7 2 5
6 PD0=RX PD1=TX
9
8
Pemrograman U(S)ART pada CVAVR
Inisialisasi “Wizard” Aktivasi “Receiver” Aktivasi “Transmitter” Pemilihan “Baud Rate” yang akan digunakan Pemilihan “Communication Parameters” “Mode” Serial
Pemrograman U(S)ART (Setup “Wizard”) 1
3
2
Pemrograman U(S)ART (Inisialisasi U(S)ART Hasil “Wizard”) Inisialisasi USART sesuai dengan yang diinputkan saat Wizard.
Pemrograman U(S)ART (Sintaks Program U(S)ART - RX)
getchar(void); //Membaca buffer serial penerima.
scanf(char flash *fmtstr,...); //Membaca buffer serial penerima.
unsigned char char_data; void main(void) {char_data = getchar()} unsigned char char_data; void main(void) {scanf("%d",&char_data);}
char_data = Alamat di RAM yang dialokasikan untuk menyimpan data sementara.
Pemrograman U(S)ART (Sintaks Program U(S)ART - TX)
putchar([char]); //= Put Char-Byte (0-255).
putsf([string]); //= Put String on Flash.
putchar(‘A’); //= putchar(0x41) putsf(“-SELAMAT DATANG-”);
puts([*RAM]); // Lihat berikutnya. printf([char flash *fmtstr [ , arg1, arg2, ...]]); //Lihat berikutnya.
Pemrograman U(S)ART (Sintaks “sprintf”)
sprintf([char *str, char flash *fmtstr [ , arg1, arg2, ...]]);
#include <stdio.h> //Library serial dan konversi karakter
unsigned char cdata=0, cstr[16];
void main(void) { sprintf(cstr,"Nilai Data: %04d",cdata++); puts(cstr); }
cdata = Alamat di RAM yang dialokasikan untuk menyimpan data sementara.
cstr[16] = Alamat di RAM yang tersusun secara berurutan yang dialokasikan sebagai hasil konversi dari sintaks “sprintf”.
%d = Decimal; %x = Hexadesimal; %c = Character; %s = Strings
Pemrograman U(S)ART (Sintaks “printf”)
printf([char flash *fmtstr [ , arg1, arg2, ...]]);
#include <stdio.h> //Library serial dan konversi karakter
unsigned char cdata=0, cstr[16];
void main(void) { Printf("Nilai Data: %04d",cdata++); }
cdata = Alamat di RAM yang dialokasikan untuk menyimpan data sementara.
cstr[16] = Alamat di RAM yang tersusun secara berurutan yang dialokasikan sebagai hasil konversi dari sintaks “sprintf”.
%d = Decimal; %x = Hexadesimal; %c = Character; %s = Strings
Pemrograman U(S)ART (Echo)
#include <mega16.h>
#include <stdio.h>
unsigned char char_data;
void main(void)
{
// USART initialization
// 8D-1S-NoParity; RX: On; TX: On; Async; 9600 BPS
UCSRA=0x00; UCSRB=0x18; UCSRC=0x86;
UBRRH=0x00; UBRRL=0x47;
while (1) { char_data = getchar(); //Receive putchar(char_data); //Transmit }
}
Aplikasi U(S)ART “Data Logger Temperatur berbasis LM35DZ”
LM35DZ adalah sensor temperatur analog ekonomis namun cukup baik dalam mengukur temperatur. Jangkauan: 0 – 100 oC Sensitivitas: 10 mV/ oC Operasional: 4 – 30 V
Fungsi Transfer Sensor LM35DZ
Tinjau-ulang dasar ADC: Data_ADC = (Vin/Vref)*(Maksimal_Data_Bit) Data_ADC
= Hasil konversi ADC internal ATmega16A Vin = Tegangan LM35 Vref = Sesuai pengaturan di “Wizard” CVAVR = 5V Maksimal_Data_Bit = 10 Bit = 1023
Sensitivitas LM35 = 10 mV/ oC Temperatur terukur (T): T = (Vin/10 mV) oC T = ((Data_ADC*5V/1023)/10 mV) oC
“Data Logger Temperatur berbasis LM35DZ” (Setup “Wizard”) [1/2] 1
2
“Data Logger Temperatur berbasis LM35DZ” (Setup “Wizard”) [2/2] 3
5
4
“Data Logger berbasis Sensor LM35DZ” (Skrip Program CVAVR) [1/3]
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#define ADC_VREF_TYPE 0x00
unsigned int 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 ADCW;
}
“Data Logger berbasis Sensor LM35DZ” (Skrip Program CVAVR) [2/3]
unsigned char T; //T = Temperatur
unsigned int idata;
float fdata; //Nilai pecahan agar perhitungan baik.
void main(void)
{
UCSRA=0x00; UCSRB=0x18; UCSRC=0x86;
UBRRH=0x00; UBRRL=0x47;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0xA6; SFIOR&=0x1F;
while (1) { idata = read_adc(0); Printf("Data ADC: %04d",idata);
“Data Logger berbasis Sensor LM35DZ” (Skrip Program CVAVR) [3/3]
}
fdata = (((float)idata*5)/1023)/0.01; T = (char)fdata; Printf("Temperatur: %02d C",T); delay_ms(250); }