TUTORIAL PEMROGRAMAN PERSIAPAN LKS SMK TINGKAT NASIONAL
C language using Atmel Studio 7
Farid Rinanto, SST Expert World Skills Competition (WSC) - skill Electronics Calon Instruktur Elektronika Industri Balai Besar Pengembangan Latihan Kerja (BBPLK) Bekasi/ Cevest Kementerian Ketenagakerjaan RI TERIMAKASIH BEASISWA UNGGULAN BPKLN - KEMENDIKBUD Email:
[email protected] [email protected]
website: www.inaskills-electronics.com
1
A. MEMBUAT NEW PROJECT
1. Open Atmel Studio 7
Fig 1. Atmel studio.exe
Kemudian akan muncul tampilan seperti dibawah ini
Fig 2. Tampilan Menu Awal
2. Untuk membuat file baru, Pilih -> File -> New -> Project
Fig 3. Tampilan New Project
Email:
[email protected] [email protected]
website: www.inaskills-electronics.com
2
Kemudian akan muncul tampilan baru
Fig 4. Tampilan New Project C/C++
3. Pilih -> GCC C Executable Project
Fig 5. Pilih GCC C Executable Project
Email:
[email protected] [email protected]
website: www.inaskills-electronics.com
3
Kemudian rubah nama file dengan mengganti nama di kolom nama, lihat gambar dibawah ini (nama tidak mengandung spasi)
Fig 6. Tampilan Penuisan nama project
Jika ingin merubah lokasi penyimpanan, klik tombol “Browse” dan pilih lokasi penyimpanan sesuai
keinginan.
Fig 7. Tampilan pilihan folder penyimpanan
Email:
[email protected]
website: www.inaskills-electronics.com
4
Klik “OK” Kemudian akan muncul tampilan sebagai berikut
Fig 8. Tampilan Device Selection
4. Pilih Device / IC Controller sesuai dengan tipe yang diinginkan, dalam tutorial ini menggunakan ATmega 16 sebagai contoh. Klik OK jika sudah selesai.
Fig 9. Tampilan Device Selection
Email:
[email protected]
website: www.inaskills-electronics.com
5
Kemudian akan muncul tampilan sheet program seperti gambar dibawah ini
Fig 10. Tampilan form New Project C/C++
Diatas adalah sheet untuk menuliskan program sesuai dengan keinginan kita. 5. Compile / build progr am untuk menghasilkan file .hex adalah dengan pilih menu “Build” kemudian pilih sub menu “Build solution” atau tekan F7. Lihat gambar dibawah ini
Fig 11. Tampilan New Project C/C++
Pastikan build succeeded or up tu date / no error. Bisa dilihat pada tulisan output bawah
Email:
[email protected]
website: www.inaskills-electronics.com
6
B. HAL YANG HARUS DIPERHATIKAN SEBELUM MEMBUAT PROGRAM
1. Harus mengetahui kerangka / system penulisan program.
Pemanggilan header -
#include <……………….h>
Ini memerntahkan compiler untuk membaca program / file yang telah di includekan kedalam program kita.
Penulisan variable Variable adalah tempat untuk penyimpanan dan menakses data yang mewakili memari dalam microcontroller. Variable harus dideklarasikan dengan tipe data beserta nama variable. Berikut adalah table tipe data Tipe Data Char Signed char Unsigned char int Signed int Unsigned int Long signed long Unsigned long Float Contoh penulisan variable Char a;
Byte 1 1 1 2 2 2 4 4 4 4
Bit 8 8 8 16 16 16 32 32 32 32
Minimum -128 -128 0 -32768 -32768 0 -2147483648 -2147483648 0 1.28E-38
Maximum 127 127 255 -32767 -32767 65535 2147483648 2147483648 4294967295 3.4E38
nama variable adalah a dan tipe datanya char atau mempunyai range
penyimpanan data -128 sampai 127
Fungsi utama (main) -
Inisialisasi Ini digunakan untuk mengaktifkan sebuah fungsi dalam suatu register pada microcontroller. Contoh untuk mengaktifkan PORTx menjadi input atau output. DDRx = merupakan fiungsi register yang digunakan untuk menjadikan PORTx menjadi input atau output. Dengan memberikan nilai 1 = menjadikan bit menjadi fungsi output. Dengan memberikan nilai 0 = menjadikan bit menjadi fungsi input. Contoh penulisan
DDRA=0b11111111; menjadikan PORTA dari bit 0 hingga bit 7 menjadi fungsi
output DDRA=0b00000000; menjadikan PORTA dari bit 0 hingga bit 7 menjadi fungsi
input DDRA=0b11110000; menjadikan PORTA dari bit 0 hingga bit 3 menjadi fungsi
input, menjadikan PORTA dari bit 4 hingga bit 7 menjadi fungsi Output, Keterangan tambahan, jika PORTx digunakan sebagai input akan tetapi fungsi register yang digunakan adalah sebagai output maka microcontroller tidak akan merespon masukan input yang diterima di PORTx.
Email:
[email protected]
website: www.inaskills-electronics.com
7
Dan sebaliknya Keterangan tambahan, jika PORTx digunakan sebagai output akan tetapi fungsi register yang digunakan adalah sebagai input maka microcontroller tidak akan merespon data output yang dikirim di PORTx.
Pembuatan sub program / fungsi -
Fungsi yang telah di-prototype-kan ditulis diluar main, ini untuk memudahkan programmer dalam penulisan program yang besar atau mempersingkat program jika selalu ditulis terus menerus. Contoh 1:
void tampilan (void){ PORTA=0B11110000; PORTB=0B00001111; PORTC=0B10101010; PORTD=0B01010101; }
//sub program tampilan //isi sub program //isi sub program //isi sub program //isi sub program
Contoh 2:
void tunda (void){ for (a=0; a<1000; a++){ tampil(); } }
//sub program tunda // pengulangan 1000x // pemanggilan tampil
2. mengetauhi syntax atau tata cara penulisan bahasa C avr gcc.
Algoritma pemograman Pernyataan berkondisi dan Pengulangan if else: digunakan untuk menyeleksi satu atau beberapa kondisi
if ( [persyaratan] ) { [statement1]; [statement2]; ... } else { [statement3]; [statement4]; ... } for : digunakan untuk pengulangan dengan jumlah yang sudah diketahui – berapa kali
diulang.
for ( [nilai awal] ; [syarat] ; [operasi nilai] ) { [statement1]; [statement2]; ... } Email:
[email protected]
website: www.inaskills-electronics.com
8
while: digunakan untuk pengulangan (looping) jika dan sealama memenuhi suatu
kondisi masih dipenuhi (pengulangan selama benar)
while ( [persyaratan] ) { [statement1]; [statement2]; ... } do while: digunakan untuk pengulangan jika dan selama memenuhi syarat tertentu,
namun min 1 kali
do { [statement1]; [statement2]; ... } while ([persyaratan]) switch case: digunakan untuk seleksi dengan banyak kondisi
switch ( [nama variabel] ) { case [nilai1]: [statement1]; break; case [nilai2]: [statement2]; break; ... } Operasi Logika dan Bilangan Biner
Operator Logika atau dalam perbandingan
AND: && NOT: ! OR : || Biner dalam aritmatika
AND: OR : XOR : Shift right: Shift left :
& | ^ >> <<
Lebih besar sama dengan: Lebih kecil/besar: Lebih kecil sama dengan :
Email:
[email protected]
>= <,> <=
website: www.inaskills-electronics.com
9
C. CONTOH PROGRAM TUTORIAL 1. Menyalakan LED 00001111 RV2
1
RV1
L _ D E L
U2
R _ D E L
a b c d e f g
BUZ1 BZ MOTOR_L
% 0 5
ADC2
% 6 5
ADC1
2
ADC0
330
D10
1k 3
R2
330
BUZZER VOUT
1k
MOTOR_R
R1
93.0
D9
LM35
S_S70 S_S71 S_S72 S_S73
R24 10k
U1 9
RESET
13 XTAL1 12 XTAL2 ADC0 ADC1 ADC2 LED_R LED_L BZ MOTOR_R MOTOR_L sw0 sw1 sw2 sw3 S_S70 S_S71 S_S72 S_S73
40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8
PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7 PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK
PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2 PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2
AREF AVCC
22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21
7 D E L
a b c d e f g h LED0 LED1 LED2 LED3 LED4 LED5 LED6 LED7
R20
R21
R22
R23
10k
10k
10k
10k
sw3
sw2
sw1
SW2
SW1
R5
R6
R7
220
220
220
220
6 D E L
5 D E L
4 D E L
3 D E L
2 D E L
1 D E L
0 D E L
R8
R9
R10
R11
R12
R13
R14
R15
330
330
330
330
330
330
330
330
D7
D6
D5
D4
D3
D2
D1
sw0
D8
SW3
R4
SW0
32 30
ATMEGA16
////COPY DARI SINI////////////// #include
int main(void) { DDRD=0b11111111; //lihat Hal. 7 while (1) { PORTD=0b00001111; } } ////COPY SAMPAI DISINI///////////
Email: [email protected]
website: www.inaskills-electronics.com
10
2. Menyalakan LED 01010101
RV2
RV1
L _ D E L
U2
1
R _ D E L
a b c d e f g
BUZ1 BZ MOTOR_L
% 0 5
ADC2
% 6 5
ADC1
1k
2
ADC0
330
D10
1k 3
R2
330
BUZZER VOUT
MOTOR_R
R1
93.0
D9
LM35
S_S70 S_S71 S_S72 S_S73
R24 10k
U1 9
RESET
13 XTAL1 12 XTAL2 ADC0 ADC1 ADC2 LED_R LED_L BZ MOTOR_R MOTOR_L sw0 sw1 sw2 sw3 S_S70 S_S71 S_S72 S_S73
40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8
PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7 PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK
PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2 PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2
AREF AVCC
22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21
7 D E L
a b c d e f g h LED0 LED1 LED2 LED3 LED4 LED5 LED6 LED7
R20
R21
R22
R23
10k
10k
10k
10k
sw3
sw2
sw1
SW2
SW1
R5
R6
R7
220
220
220
220
6 D E L
5 D E L
4 D E L
3 D E L
2 D E L
1 D E L
0 D E L
R8
R9
R10
R11
R12
R13
R14
R15
330
330
330
330
330
330
330
330
D7
D6
D5
D4
D3
D2
D1
sw0
D8
SW3
R4
SW0
32 30
ATMEGA16
////COPY DARI SINI////////////// #include int main(void) { DDRD=0b11111111; //Lihat Hal.7 while (1) { PORTD=0b01010101; } } ////COPY SAMPAI DISINI///////////
Email: [email protected]
website: www.inaskills-electronics.com
11
3. Menyalakan LED 01010111 secara HEXA
RV2
1
RV1
L _ D E L
U2
R _ D E L
a b c d e f g
BUZ1 BZ MOTOR_L
% 0 5
ADC2
% 6 5
ADC1
1k
2
ADC0
330
D10
1k 3
R2
330
BUZZER VOUT
MOTOR_R
R1
93.0
D9
LM35
S_S70 S_S71 S_S72 S_S73
R24 10k
U1 9
RESET
13 XTAL1 12 XTAL2 ADC0 ADC1 ADC2 LED_R LED_L BZ MOTOR_R MOTOR_L sw0 sw1 sw2 sw3 S_S70 S_S71 S_S72 S_S73
40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8
PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7
PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2
PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK
PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2
AREF AVCC
22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21
a b c d e f g h LED0 LED1 LED2 LED3 LED4 LED5 LED6 LED7
7 D E L
R20
R21
R22
R23
10k
10k
10k
10k
sw3
sw2
sw1
SW2
SW1
R5
R6
R7
220
220
220
220
6 D E L
5 D E L
4 D E L
3 D E L
2 D E L
1 D E L
0 D E L
R8
R9
R10
R11
R12
R13
R14
R15
330
330
330
330
330
330
330
330
D7
D6
D5
D4
D3
D2
D1
sw0
D8
SW3
R4
SW0
32 30
ATMEGA16
////COPY DARI SINI////////////// #include int main(void) { DDRD=0xff; //lihat Hal.7 while (1) { PORTD=0x55; } } ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
12
4. Menyalakan LED PORTD.0 Kedip 1 detik ////COPY DARI SINI////////////// #include #define F_CPU 11059200UL #include
//F_CPU = 11.059200Mhz //Panggil Header Delay
int main(void) { DDRD=0B11111111; PORTD=0B00000000;
//baca Hal.7 //LED mati pada saat start
while (1) { PORTD=0x01; _delay_ms(1000); PORTD=0x00; _delay_ms(1000); }
//delay 1000ms atau 1 detik
} ////COPY SAMPAI DISINI//////////////
5. Menyalakan LED PORTD Kedip 1 detik ////COPY DARI SINI////////////// #include #define F_CPU 11059200UL #include
//F_CPU = 11.059200Mhz //Panggil Header Delay
int main(void) { DDRD=0B11111111; PORTD=0B00000000; while (1) { PORTD=0xff; _delay_ms(1000); PORTD=0x00; _delay_ms(1000); }
//delay 1000ms atau 1 detik
} ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
13
6. Menyalakan LED Berjalan ////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay int main(void) { DDRD=0B11111111; PORTD=0B00000000; while (1) { PORTD=0b00000000; _delay_ms(500); PORTD=0b00000001; _delay_ms(500); PORTD=0b00000010; _delay_ms(500); PORTD=0b00000100; _delay_ms(500); PORTD=0b00001000; _delay_ms(500); PORTD=0b00010000; _delay_ms(500); PORTD=0b00100000; _delay_ms(500); PORTD=0b01000000; _delay_ms(500); PORTD=0b10000000; _delay_ms(500); }
//delay 1000ms atau 1 detik
} ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
14
7. Menyalakan Seven Segment angka 1 tanpa Scanning diseven segmen disatuan L _ D
RV2
RV1
U2
1
R _ D
E L
E L
a b c d e f g
BUZ1 BZ MOTOR_L
% 0 5
ADC2
% 6 5
ADC1
2
ADC0
330
D10
1k 3
R2
330
BUZZER VOUT
1k
MOTOR_R
R1
93.0
D9
LM35
S_S70 S_S71 S_S72 S_S73
R24 10k
U1 9
RESET
13 XTAL1 12 XTAL2 ADC0 ADC1 ADC2 LED_R LED_L BZ MOTOR_R MOTOR_L sw0 sw1 sw2 sw3 S_S70 S_S71 S_S72 S_S73
40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8
PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7
PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2
PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK
PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2
AREF AVCC
22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21
7 D E L
a b c d e f g h LED0 LED1 LED2 LED3 LED4 LED5 LED6 LED7
R20
R21
R22
R23
10k
10k
10k
10k
sw3
sw2
sw1
SW2
SW1
R5
R6
R7
220
220
220
220
6 D E L
5 D E L
4 D E L
3 D E L
2 D E L
1 D E L
0 D E L
R8
R9
R10
R11
R12
R13
R14
R15
330
330
330
330
330
330
330
330
D7
D6
D5
D4
D3
D2
D1
sw0
D8
SW3
R4
SW0
32 30
ATMEGA16
////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay int main(void) { DDRC=0B11111111; DDRB=0B11110000; while (1) { PORTC=0b00000110; //DATA SEVENSEGMEN angka 1 PORTB=0B01111111; //SELECTOR/SCAN SEVEN SEGMENT digit ke 1 } } ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
15
8. Menyalakan Seven Segment angka 1 tanpa Scanning diseven segmen dipuluhan L _ D
RV2
RV1
U2
1
R _ D
E L
E L
a b c d e f g
BUZ1 BZ MOTOR_L
% 0 5
ADC2
% 6 5
ADC1
2
ADC0
330
D10
1k 3
R2
330
BUZZER VOUT
1k
MOTOR_R
R1
93.0
D9
LM35
S_S70 S_S71 S_S72 S_S73
R24 10k
U1 9
RESET
13 XTAL1 12 XTAL2 ADC0 ADC1 ADC2 LED_R LED_L BZ MOTOR_R MOTOR_L sw0 sw1 sw2 sw3 S_S70 S_S71 S_S72 S_S73
40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8
PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7 PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK
PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2 PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2
AREF AVCC
22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21
7 D E L
a b c d e f g h LED0 LED1 LED2 LED3 LED4 LED5 LED6 LED7
R20
R21
R22
R23
10k
10k
10k
10k
sw3
sw2
sw1
SW2
SW1
R5
R6
R7
220
220
220
220
6 D E L
5 D E L
4 D E L
3 D E L
2 D E L
1 D E L
0 D E L
R8
R9
R10
R11
R12
R13
R14
R15
330
330
330
330
330
330
330
330
D7
D6
D5
D4
D3
D2
D1
sw0
D8
SW3
R4
SW0
32 30
ATMEGA16
////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay int main(void) { DDRC=0B11111111; DDRB=0B11110000; while (1) { PORTC=0b00000110; //DATA SEVEN SEGMENT angka 1 PORTB=0B10111111; //SELECTOR/SCAN SEVEN SEGMENT digit ke 2 } } ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
16
9. Menyalakan Seven Segment Up Counter ////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay int main(void) { DDRC=0B11111111; DDRB=0B11110000; while (1) { PORTB=0B10111111; PORTC=0b00111111;
//SELECTOR/SCAN SEVEN SEGMENT digit ke 2 //DATA SEVENSEGMENT 0
_delay_ms(500);
PORTC=0b00000110;
//DATA SEVENSEGMENT 1
_delay_ms(500);
PORTC=0b01011011;
//DATA SEVENSEGMENT 2
_delay_ms(500);
PORTC=0b01001111;
//DATA SEVENSEGMENT 3
_delay_ms(500);
PORTC=0b01100110;
//DATA SEVENSEGMENT 4
_delay_ms(500);
PORTC=0b01101101; _delay_ms(500); PORTC=0b01111101; _delay_ms(500); PORTC=0b00000111; _delay_ms(500); PORTC=0b01111111; _delay_ms(500); PORTC=0b01101111; _delay_ms(500);
//DATA SEVENSEGMENT 5 //DATA SEVENSEGMENT 6 //DATA SEVENSEGMENT 7 //DATA SEVENSEGMENT 8 //DATA SEVENSEGMENT 9
} } ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
17
10. Menyalakan Seven Segment angka 1234 (Basic scanning)
RV2
U2
1
RV1
L _ D E L
R _ D E L
a b c d e f g
BUZ1 BZ MOTOR_L
% 0 5
ADC2
% 6 5
ADC1
1k
2
ADC0
330
D10
1k 3
R2
330
BUZZER VOUT
MOTOR_R
R1
93.0
D9
LM35
S_S70 S_S71 S_S72 S_S73
R24 10k
U1 9
RESET
13 XTAL1 12 XTAL2 ADC0 ADC1 ADC2 LED_R LED_L BZ MOTOR_R MOTOR_L sw0 sw1 sw2 sw3 S_S70 S_S71 S_S72 S_S73
40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8
PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7 PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK
PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2 PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2
AREF AVCC
22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21
7 D E L
a b c d e f g h LED0 LED1 LED2 LED3 LED4 LED5 LED6 LED7
R20
R21
R22
R23
10k
10k
10k
10k
sw3
sw2
sw1
SW2
SW1
R5
R6
R7
220
220
220
220
6 D E L
5 D E L
4 D E L
3 D E L
2 D E L
1 D E L
0 D E L
R8
R9
R10
R11
R12
R13
R14
R15
330
330
330
330
330
330
330
330
D7
D6
D5
D4
D3
D2
D1
sw0
D8
SW3
R4
SW0
32 30
ATMEGA16
////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay int main(void) { DDRC=0B11111111; DDRB=0B11110000; while (1) { PORTC=0b00000110; PORTB=0B11101111; _delay_ms(5); PORTB=0B11111111;
//DATA SEVEN SEGMENT 1 //SELECTOR/SCAN DIGIT 4 //SELECTOR/SCAN OFF
PORTC=0b01011011; PORTB=0B11011111; _delay_ms(5); PORTB=0B11111111;
//DATA SEVEN SEGMENT 2 //SELECTOR/SCAN DIGIT 3
PORTC=0b01001111; PORTB=0B10111111; _delay_ms(5); PORTB=0B11111111;
//DATA SEVEN SEGMENT 3 //SELECTOR/SCAN DIGIT 2
PORTC=0b01100110; PORTB=0B01111111; _delay_ms(5); PORTB=0B11111111;
//DATA SEVEN SEGMENT 4 //SELECTOR/SCAN DIGIT 1
//SELECTOR/SCAN OFF
//SELECTOR/SCAN OFF
//SELECTOR/SCAN OFF
} } ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
18
11. Menyalakan Seven Segment angka 0168 RV2
U2
1
RV1
L _ D E L
R _ D E L
a b c d e f g
BUZ1 BZ MOTOR_L
% 0 5
ADC2
% 6 5
ADC1
1k
2
ADC0
330
D10
1k 3
R2
330
BUZZER VOUT
MOTOR_R
R1
93.0
D9
LM35
S_S70 S_S71 S_S72 S_S73
R24 10k
U1 9
RESET
PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2
13 XTAL1 12 XTAL2 ADC0 ADC1 ADC2 LED_R LED_L BZ MOTOR_R MOTOR_L sw0 sw1 sw2 sw3 S_S70 S_S71 S_S72 S_S73
40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8
PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7
PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2
PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK
AREF AVCC
22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21
7 D E L
a b c d e f g h LED0 LED1 LED2 LED3 LED4 LED5 LED6 LED7
R20
R21
R22
R23
10k
10k
10k
10k
sw3
sw2
sw1
SW2
SW1
R5
R6
R7
220
220
220
220
6 D E L
5 D E L
4 D E L
3 D E L
2 D E L
1 D E L
0 D E L
R8
R9
R10
R11
R12
R13
R14
R15
330
330
330
330
330
330
330
330
D7
D6
D5
D4
D3
D2
D1
sw0
D8
SW3
R4
SW0
32 30
ATMEGA16
////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay unsigned char segmen [10]={0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; //array int nilai;
//membuat variable nilai dengan range int
///////////SUB Program//////////////////////////////////// void display (void){ char a; for (a=0;a<250;a++){ PORTC=segmen[nilai%10]; //formula ambil data satuan PORTB=0B01111111; //SELECTOR/SCAN DIGIT satuan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF PORTC=segmen[nilai/10%10]; PORTB=0B10111111; _delay_ms(1); PORTB=0B11111111;
//formula ambil data puluhan //SELECTOR/SCAN DIGIT puluhan
PORTC=segmen[nilai/100%10]; PORTB=0B11011111; _delay_ms(1); PORTB=0B11111111;
//formula ambil data data ratusan //SELECTOR/SCAN DIGIT ratusan
//SELECTOR/SCAN OFF
//SELECTOR/SCAN OFF
PORTC=segmen[nilai/1000%10]; //formula ambil data ribuan PORTB=0B11101111; //SELECTOR/SCAN DIGIT ribuan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF } } /////////////////////////////////////////////////////////// int main(void) { DDRC=0B11111111; DDRB=0B11110000; nilai=0; while (1){ nilai=168; //nilai = 168 display(); //memanggil sub program display } } ////COPY SAMPAI DISINI////////////// Email: [email protected]
website: www.inaskills-electronics.com
19
12. Menyalakan Seven Segment angka up Counter
RV2
RV1
L _ D E L
U2
1
R _ D E L
a b c d e f g
BUZ1 BZ MOTOR_L
% 0 5
ADC2
% 6 5
ADC1
2
ADC0
330
D10
1k 3
R2
330
BUZZER VOUT
1k
MOTOR_R
R1
93.0
D9
LM35
S_S70 S_S71 S_S72 S_S73
R24 10k
U1 9
RESET
PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2
13 XTAL1 12 XTAL2 ADC0 ADC1 ADC2 LED_R LED_L BZ MOTOR_R MOTOR_L sw0 sw1 sw2 sw3 S_S70 S_S71 S_S72 S_S73
40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8
PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7
PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2
PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK
AREF AVCC
22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21
7 D E L
a b c d e f g h LED0 LED1 LED2 LED3 LED4 LED5 LED6 LED7
R20
R21
R22
R23
10k
10k
10k
10k
sw3
sw2
sw1
SW2
SW1
R5
R6
R7
220
220
220
220
6 D E L
5 D E L
4 D E L
3 D E L
2 D E L
1 D E L
0 D E L
R8
R9
R10
R11
R12
R13
R14
R15
330
330
330
330
330
330
330
330
D7
D6
D5
D4
D3
D2
D1
sw0
D8
SW3
R4
SW0
32 30
ATMEGA16
////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay unsigned char segmen [10]={0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; //array int nilai;
//membuat variable nilai dengan range int
///////////SUB Program//////////////////////////////////// void display (void){ char a; for (a=0;a<250;a++){ PORTC=segmen[nilai%10]; //formula ambil data satuan PORTB=0B01111111; //SELECTOR/SCAN DIGIT satuan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF PORTC=segmen[nilai/10%10]; PORTB=0B10111111; _delay_ms(1); PORTB=0B11111111;
//formula ambil data puluhan //SELECTOR/SCAN DIGIT puluhan
PORTC=segmen[nilai/100%10]; PORTB=0B11011111; _delay_ms(1); PORTB=0B11111111;
//formula ambil data data ratusan //SELECTOR/SCAN DIGIT ratusan
//SELECTOR/SCAN OFF
//SELECTOR/SCAN OFF
PORTC=segmen[nilai/1000%10]; //formula ambil data ribuan PORTB=0B11101111; //SELECTOR/SCAN DIGIT ribuan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF } } /////////////////////////////////////////////////////////// int main(void) { DDRC=0B11111111; DDRB=0B11110000; nilai=0; while (1){ nilai++; //nilai akan melakukan penambahan 1, bisa ditulis juga "nilai=nilai+1" display(); //memanggil sub program display } } ////COPY SAMPAI DISINI////////////// Email: [email protected]
website: www.inaskills-electronics.com
20
13. Tombol 1 on, Tombol 2 Off ////COPY DARI SINI////////////// #include #define F_CPU 11059200UL #include int main(void) { DDRD=0B11111111; DDRB=0B11110000; PORTD=0B00000000;
//F_CPU = 11.059200Mhz //Panggil Header Delay
//PORTD sebagai output //PORTB.0 sampai 3 sebagai input
while (1) { if bit_is_clear(PINB,0){ PORTD=0b00000001; } if bit_is_clear(PINB,1){ PORTD=0b00000000; } } } ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
21
14. Tombol 0-3 dan LED 0-3 ////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay int main(void) { DDRD=0B11111111; DDRB=0b11110000; PORTD=0b00000000;
//PORTD sebagai Output //PORTB.0 sampai 3 sebagai Input //Pada saat start awal, LED dimatikan
while (1) { if bit_is_clear(PINB,0){ PORTD=0b00000001; } if bit_is_clear(PINB,1){ PORTD=0b00000010; } if bit_is_clear(PINB,2){ PORTD=0b00000100; } if bit_is_clear(PINB,3){ PORTD=0b00001000; } }
//LED 0 //LED 1 //LED 2 //LED 3
} ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
22
15. Tombol 0-3 dan seven segment 0-3 RV2
RV1
L _ D E L
U2
1
R _ D E L
a b c d e f g
BUZ1 BZ MOTOR_L
% 0 5
ADC2
% 6 5
ADC1
1k
2
ADC0
330
D10
1k 3
R2
330
BUZZER VOUT
MOTOR_R
R1
93.0
D9
LM35
S_S70 S_S71 S_S72 S_S73
R24 10k
U1 9
RESET
13 XTAL1 12 XTAL2 ADC0 ADC1 ADC2 LED_R LED_L BZ MOTOR_R MOTOR_L sw0 sw1 sw2 sw3 S_S70 S_S71 S_S72 S_S73
40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8
PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7 PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK
PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2 PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2
AREF AVCC
22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21
a b c d e f g h LED0 LED1 LED2 LED3 LED4 LED5 LED6 LED7
7 D E L
R20
R21
R22
R23
10k
10k
10k
10k
sw3
sw2
sw1
SW2
SW1
R5
R6
R7
220
220
220
220
6 D E L
5 D E L
4 D E L
3 D E L
2 D E L
1 D E L
0 D E L
R8
R9
R10
R11
R12
R13
R14
R15
330
330
330
330
330
330
330
330
D7
D6
D5
D4
D3
D2
D1
sw0
D8
SW3
R4
SW0
32 30
ATMEGA16
////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay int main(void) { DDRC=0B11111111; DDRB=0b11110000; PORTC=0b00000000;
//PORTC sebagai Output //PORTB.0 sampai 3 sebagai Input //Pada saat start awal, seven segment dimatikan
while (1) { if bit_is_clear(PINB,0){ PORTC=0b00111111; } if bit_is_clear(PINB,1){ PORTC=0b00000110; } if bit_is_clear(PINB,2){ PORTC=0b01011011; } if bit_is_clear(PINB,3){ PORTC=0b01001111; } }
//seven segment 0 //seven segment 1 //seven segment 2 //seven segment 3
} ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
23
16. Kombinasi LED, SWITCH dan Seven Segment ////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay int main(void) { DDRC=0B11111111; DDRD=0b11111111; DDRB=0b11110000; PORTC=0b00000000; PORTD=0b00000000;
//PORTC sebagai Output //PORTD sebagai Output //PORTB.0 sampai 3 sebagai Input //Pada saat start awal, seven segment dimatikan //Pada saat start awal, LED dimatikan
while (1) { if bit_is_clear(PINB,0){ PORTD=0b00000001; PORTC=0b00111111; } if bit_is_clear(PINB,1){ PORTD=0b00000010; PORTC=0b00000110; } if bit_is_clear(PINB,2){ PORTD=0b00000100; PORTC=0b01011011; } if bit_is_clear(PINB,3){ PORTD=0b00001000; PORTC=0b01001111; } }
//LED 0 //seven segment 0 //LED 0 //seven segment 1 //LED 0 //seven segment 2 //LED 0 //seven segment 3
} ////COPY SAMPAI DISINI//////////////
Email: [email protected]
website: www.inaskills-electronics.com
24
17. ADC 10 bit (0-1023) ////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay unsigned char segmen [10]={0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; //array int nilai;
//membuat variable nilai dengan range int
//////Sub ADC- baca di data sheet ATmega 16////////////////// int adc(char ch) { ADMUX=ch; _delay_us(10); ADCSRA|=0x40; while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } /////////////////////////////////////////////////////////// ///////////SUB Program//////////////////////////////////// void display (void){ char a; for (a=0;a<250;a++){ PORTC=segmen[nilai%10]; //formula ambil data satuan PORTB=0B01111111; //SELECTOR/SCAN DIGIT satuan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF PORTC=segmen[nilai/10%10]; //formula ambil data puluhan PORTB=0B10111111; //SELECTOR/SCAN DIGIT puluhan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF PORTC=segmen[nilai/100%10]; //formula ambil data data ratusan PORTB=0B11011111; //SELECTOR/SCAN DIGIT ratusan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF PORTC=segmen[nilai/1000%10]; //formula ambil data ribuan PORTB=0B11101111; //SELECTOR/SCAN DIGIT ribuan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF } } /////////////////////////////////////////////////////////// int main(void) { DDRC=0B11111111; DDRB=0B11110000; ADMUX=0xE0; //baca data sheet ATmega 16 ADCSRA=0x84; //baca data sheet ATmega 16 nilai=0; while (1){ nilai=adc(1); //adc (1), 1 adalah chanel 1 atau PORTA.1 display(); //memanggil sub program display } } ////COPY SAMPAI DISINI////////////// Email: [email protected]
website: www.inaskills-electronics.com
25
18. ADC caling 0-1023 ke 0-100 ////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay unsigned char segmen [10]={0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; //array int nilai;
//membuat variable nilai dengan range int
//////Sub ADC- baca di data sheet ATmega 16////////////////// int adc(char ch) { ADMUX=ch; _delay_us(10); ADCSRA|=0x40; while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } /////////////////////////////////////////////////////////// ///////////SUB Program//////////////////////////////////// void display (void){ char a; for (a=0;a<250;a++){ PORTC=segmen[nilai%10]; //formula ambil data satuan PORTB=0B01111111; //SELECTOR/SCAN DIGIT satuan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF PORTC=segmen[nilai/10%10]; //formula ambil data puluhan PORTB=0B10111111; //SELECTOR/SCAN DIGIT puluhan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF PORTC=segmen[nilai/100%10]; //formula ambil data data ratusan PORTB=0B11011111; //SELECTOR/SCAN DIGIT ratusan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF PORTC=segmen[nilai/1000%10];//formula ambil data ribuan PORTB=0B11101111; //SELECTOR/SCAN DIGIT ribuan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF } } /////////////////////////////////////////////////////////// int main(void) { DDRC=0B11111111; DDRB=0B11110000; ADMUX=0xE0; //baca data sheet ATmega 16 ADCSRA=0x84; //baca data sheet ATmega 16 nilai=0; while (1){ nilai=(adc(1)/1023.0)*100; //scaling dari 0-1023 ke 0 -100 display(); //memanggil sub program display } } ////COPY SAMPAI DISINI////////////// Email: [email protected]
website: www.inaskills-electronics.com
26
19. ADC Suhu LM35 ////COPY DARI SINI////////////// #include #define F_CPU 11059200UL //F_CPU = 11.059200Mhz #include //Panggil Header Delay unsigned char segmen [10]={0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; //array int suhu;
//membuat variable nilai dengan range int
//////Sub ADC- baca di data sheet ATmega 16////////////////// int adc(char ch) { ADMUX=ch; _delay_us(10); ADCSRA|=0x40; while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } /////////////////////////////////////////////////////////// ///////////SUB Program//////////////////////////////////// void display (void){ char a; for (a=0;a<200;a++){ PORTC=segmen[suhu%10]; //formula ambil data satuan PORTB=0B01111111; //SELECTOR/SCAN DIGIT satuan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF PORTC=segmen[suhu/10%10]; PORTB=0B10111111; _delay_ms(1); PORTB=0B11111111;
//formula ambil data puluhan //SELECTOR/SCAN DIGIT puluhan //SELECTOR/SCAN OFF
PORTC=segmen[suhu/100%10]; //formula ambil data data ratusan PORTB=0B11011111; //SELECTOR/SCAN DIGIT ratusan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF PORTC=segmen[suhu/1000%10]; //formula ambil data ribuan PORTB=0B11101111; //SELECTOR/SCAN DIGIT ribuan _delay_ms(1); PORTB=0B11111111; //SELECTOR/SCAN OFF } } /////////////////////////////////////////////////////////// int main(void) { DDRC=0B11111111; DDRB=0B11110000; ADMUX=0xE0; //baca data sheet ATmega 16 ADCSRA=0x84; //baca data sheet ATmega 16 while (1){ suhu=(adc(0)/1023.0)*500; display(); }
//contoh formula suhu celsius LM35 //memanggil sub program display
} ////COPY SAMPAI DISINI////////////// Email: [email protected]
website: www.inaskills-electronics.com
27
Ini adalah Tutorial Basic/ dasar disusun dengan waktu yang singkat untuk membantu Latihan pemahaman pemograman persiapan LKS SMK Nasional 2016
Insya Allah jika ada kesempatan akan saya Upload versi yang lebih lengkap
Email: [email protected]
website: www.inaskills-electronics.com
28
TENTANG PENULIS Nama NIP Jenis Kelamin Tempat Tanggal Lahir Kewarganegaraan Agama Alamat Lengkap
No HP E-mail Website Pekerjaan Sekarang Institusi Jabatan Golongan Pendidikan Formal 1996-1997 1997-2003 2003-2006 2006-2009 2010-2014
: Farid Rinanto, SST : 19910309 201503 1 006 : Laki-Laki : Kudus, 09 Maret 1991 : Indonesia : Islam : Desa Bulung kulon Rt/Rw 06/02 Kec. Jekulo, Kab. Kudus, Prov. Jawa Tengah 59382. : +62 82322992336 : [email protected] : www.inaskills-electronics.com
: Balai Besar Pengembangan Latihan Kerja (BBPLK) - CEVEST BEKASI Kementerian Ketenagakerjaan RI. : CALON INSTRUKTUR PERTAMA : III/a
: TK Pertiwi Bulung Kulon, Kecamatan Jekulo, Kabupaten Kudus : SD Negeri 6 Bulung Kulon, Kecamatan Jekulo, Kabupaten Kudus : SMP Negeri 1 Jekulo, Kabupaten Kudus, Provinsi Jawa Tengah : SMK Negeri 2 Pati Teknik Audio Video, Kabupaten. Pati, Provinsi Jawa Tengah : Diploma IV Jurusan Teknik Otomasi Industri di Politeknik TEDC Bandung Beasiswa Unggulan 2010
Pendidikan Non Formal : Pelatihan pemusatan calon copetitor Asean Skill Competition (ASC) IX bidang 2011-2012 Elektronika Industri di Yayasan Pendidikan Matsushita Gobel (YPMG) PT. Panasonic Manufacturing Indonesia. Pengalaman Tenaga Pengajar (Training) freelance untuk bidang electronic applications dan industrial electronics kerjasama dengan Yayasan Matsushita Gobel (YMG), PT. Panasonic manufactruring indonesia tahun 2012 – 2014 Instruktur Asean Skills Competition X Hanoi 2014 Trade Electronics Expert Electronics World Skills Competition 43 Sao paulo 2015 Prestasi akademik 2008 Juara 2 lomba Robot Linefollower se Jawa Tengah di Universitas Sultan Agung Semarang. 2008 Juara 3 lomba Robot Linefollower se Jawa Tengah dan DIY di Politeknik Negeri Semarang. 2009 Juara 1 lomba LKS SMK (Lomba Keterampilan Siswa) tingkat Provinsi Jawa Tengah. 2009 Juara 1 (Gold Medal) Lomba LKS SMK (Lomba Keterampilan Siswa) tingkat Nasional di Jakarta. 2011 Peserta lomba Muatan Roket Indonesia (Komurindo) di Universitas Gajah Mada oleh DIKTI. 2012 Juara 1 (Gold Medal) Lomba Asean Skill Competition (ASC) IX bidang Elektronika Industri di Jakarta. 2012 Best of Nation Asean Skill Competition (ASC) IX di Jakarta. Email: [email protected]
website: www.inaskills-electronics.com
29