1. Tujuan [kembali]
a. Merangkai dan menguji output pada mikrokontroller AVR (winvision)
b. Merangkai dan menguji input pada mikrokontroller AVR (winvision)
c. Merangkai dan menguji I/O pada mikrokontroller AVR (winvision)
2. Dasar Teori [kembali]
A. Mikrokontroller AVR (codevision)
CodeVisionAVR adalah sebuah compiler C yang telah dilengkapi dengan fasilitas Integrated Development Environment (IDE) dan didesain agar dapat menghasilkan kode program secara otomatis untuk mikrokontroler Atmel AVR.Pada CodeVisionAVR terdapat kumpulan pustaka (library) untuk:
- Modul LCD Alphanumeric
- Philips I2C bus
- National Semiconductor Sensor Temperatur LM75
- Philips PCF8563, PCF8583, dan Maxim/Dallas Semiconductor Real Time Clock DS1302 dan DS1307
- Maxim/Dallas Semiconductor 1 wire protocol
- Maxim/Dallas Semiconductor Sensor Temperatur DS1820, DS18S20, dan DS18B20
- Maxim/Dallas Semiconductor Termometer/Thermostat DS1621
- Maxim/Dallas Semiconductor EEPROMs DS2430 dan DS2433
- SPI
- Power Management
- Delays
- Gray Code Conversion
- MMC/SD/SD HC Flash memory cards low level access
- Akses FAT pada MMC/SD/SD HC Flash memory card
CodeVisionAVR dapat menghasilkan kode program secara otomatis melalui fasilitas CodeWizardAVR Automatic Program Generator. Dengan adanya fasilitas ini maka penulisan program dapat dilakukan dengan cepat dan lebih efisien. Seluruh kode dapat diimplementasikan dengan fungsi sebagai berikut:
- Identifikasi sumber reset
- Mengatur akses memori eksternal
- Inisialisasi port input/output
- Inisialisasi interupsi eksternal
- Inisialisasi timer/counter dan watchdog timer
- Inisialisasi USART dan interupsi buffer untuk komunikasi serial
- Inisialisasi komparator analog dan ADC
- Inisialisasi interface SPI dan two wire interface (TWI)
- Inisialisasi interface CAN
- Inisialisasi I2C Bus, sensor suhu LM75, thermometer/thermostat DS1621, dan real time clock PCF8563, PCF8583, DS1302, DS1307
- Inisialisasi 1 wire bus dan sensor suhu DS1820/DS18S20
- Inisialisasi modul LCD
Membuat Project dengan CodeVisionAVR.
Jalankan aplikasi CodeVisionAVR dengan cara melakukan klik ganda pada shortcut ikon CodeVisionAVR yang ada pada Desktop atau klik START MENU cari file exe CodeVisionAVR.
Gambar 1 Ikon CodeVisionAVR pada Desktop
Sebuah Splash Screen akan muncul seperti ditunjukkan oleh Gambar 2. Informasi tentang versi yang dipakai dan keterangan evaluation akan terlihat.
Gambar 2. Tampilan Splash Screen
Beberapa detik kemudian aplikasi CodeVisionAVR akan muncul seperti yang ditunjukkan oleh Gambar 3.
Untuk memulai membuat project baru, pada menubar, pilih File → New, seperti yang ditunjukkan oleh Gambar 4a selain itu kita juga dapat membuka dengan cara klik icon seperti ditunjukkan pada gambar 4b yang berada pada Toolbar.
Gambar 4a. Membuat file baru
Anda harus membuat sebuah project sebagai induk desain dengan memilih Project, lalu klik tombol OK seperti pada Gambar 5.
Berikutnya Anda akan ditanya apakah akan menggunakan CodeWizardAVR. Tentu saja lebih menyenangkan bila Anda memilih jawaban “ya” dengan cara menekan tombol Yes seperti pada Gambar 6.
Tampilan CodeWizardAVR yang sederhana namun lengkap ditunjukkan oleh Gambar 7. Pilih Chip dengan IC yang Anda gunakan. Sebagai contoh Anda memilih Chip ATmega8535. Tab-tab pada CodeWizardAVR menunjukkan fasilitas yang dimiliki oleh chip yang Anda pilih. Cocokkan pula frekuensi kristal yang Anda gunakan pada bagian Clock. Pengisian frekuensi clock digunakan oleh software untuk menghitung rutin-rutin seperti delay agar diperoleh perhitungan yang cukup akurat.
Selanjutnya merupakan inisialisasi dari PORT YANG DITUNJUKKAN OLEH Gambar 8. Terdapat 4 PORT, yaitu PORT A, PORT B, PORT C, dan PORT D. kita bisa menginisialisasi port-port ini sebagai INPUT ataupun sebagai OUTPUT. Selain itu kita dapat memilih aktif HIGH (1) atau aktif LOW (0) untuk OUTPUT ataupun INPUT.
Untuk selanjutnya yaitu merupakan inisialisasi LCD (Liquid Crystal Display). LCD alphanumeric yang dihubungkan dengan Port C haruslah mempunyai pengkawatan seperti yang ditunjukkan oleh Gambar 9. Pada tab LCD, pilihlah Port C.
Selanjutnya yaitu inisialisasi pada USART (Komunikasi Serial). Pertama pilih/centang pada bagian “Receiver “ dan ” Transmiter”, apabila menginginkan interupsi pada USART maka beri centang pula pada “Rx_Interrupt” dan “Tx_Interrupt”. Untuk Baud Rate pilih “9600”. Dan untuk Communication Parameters pilih “8 Data, 1 Stop, No Pariti. Ini merupakan seting sederhana dari USART. Seperti tampak pada gambar 10.
Selanjutnya yaitu seting ADC (Analog to Digital Converter). Pertama centang pada bagian “ADC Enabled" dan untuk "Use 8 bits” apa bila kita centang berarti kita menggunakan ADC 8 bit, apabila tidak kita centang maka kita menggunakan 10 bit. Kemudian kita pilih Volt Ref, yaitu tegangan referensi dari ADC kita. Disini terdapat 3 pilihan yaitu dari PIN AREF, PIN AVCC, dan Int., Cap. On AREF. Untuk clock pilih 86.400 KHz.
Setelah setting yang kita inginkan dari mikrokontroler selesai, maka seting CodeWizardAVR siap disimpan dalam file. Pada menu CodeWizardAVR, pilih File → Generate, Save and Exit, seperti yang ditunjukkan oleh Gambar 12.
Agar file yang dihasilkan tidak berantakan, buatlah sebuah folder baru, untuk nama terserah dari anda.
Kemudian masuk kedalam folder tersebut untuk menyimpan file-file yang dihasilkan oleh CodeWizardAVR. Yang pertama Anda diminta untuk memberikan nama file C yang dihasilkan. Misalnya beri nama “coba2”, lalu klik tombol Save. Lebih jelas pada Gambar 14. File tersebut nantinya akan mempunyai akhiran .C.
Yang kedua Anda diminta untuk memberikan nama file project yang dihasilkan. Misalnya beri nama “coba2”, lalu klik tombol Save. Lebih jelas pada Gambar 15. File tersebut nantinya akan mempunyai akhiran .prj.
Gambar 15. Menyimpan file kedua
Yang terakhir Anda diminta untuk memberikan nama file project CodeWizard yang dihasilkan. Misalnya beri nama “coba”, lalu klik tombol Save. Lebih jelas pada Gambar 16. File tersebut nantinya akan mempunyai akhiran .cwp.
Setelah ketiga file disimpan maka akan muncul lembar kerja kita. Pada bagian atas merupakan nama dari projek kita. Selanjut pada bagian bawah dari nama projek yaitu merupakan program bahasa C yang merupakan program yang telah kita setting pada langkah awal (pada form inisialisasi). Jadi dari program “#include sampai // LCD module initialization lcd_init(16);” merupakan program yang telah kita setting pada langkah awal (pada form inisialisasi) yang ditunjukkan oleh Gambar 17-18.
Sekarang Anda coba untuk menyisipkan instruksi utama. Instruksi ini ditambahkan pada badan program file coba.c, dibawah instruksi “while” seperti yang ditunjukkan oleh Gambar 18.
Setelah program utama telah ditambahkan, kemudian pilih menu Project → Compile untuk melakukan kompilasi seperti yang ditunjukkan oleh Gambar 19a, atau dengan klik icon seperti pada Gambar 19b pada menu Toolbar. Lalu kotak dialog seperti ditunjukkan Gambar 20 akan muncul. Klik tombol OK.
Setelah kita kompail dan tidak ada informasi error (apabila terdapat informasi warning program kita masih dapat dijalankan/tidak apa-apa) pada program kita, selanjutnya klik tombol OK yang berada pada kanan bawah.
Setelah itu kita buka file tempat dimana kita menyimpan projek kita tadi. Kemudian buka file folder bernama ‘Exe’ seperti ditunjukkan pada Gambar 21.
Setelah itu akan muncul file ber-extensi ‘hex’. File inilah yang nantinya akan kita downloadkan ke dalam mikrokontroler kita.
B. Serial
Transfer data komputer dilakukan dengan dua cara: parallel dan serial. Dalam transfer data parallel, 8 buah (atau lebih) saluran (kabel) bersama-sama digunakan untuk men-transfer data ke peralatan lain, yang jaraknya hanya beberapa centimeter. Contoh tranfer data parallel adalah printer jarum (kuno) dan harddisk (IDE/PATA) yang mana menggunakan kabel yang berisi beberapa kabel di dalamnya. Namun, hubungan parallel jenis ini walaupun dapat mentransfer data dengan cepat, jarak menjadi masalah karena tidak mungkin menggunakannya dengan jarak yang panjang atau jauh. Dan untuk mentransfer data dengan jarak yang sangat jauh, maka metode serial kemudian digunakan. Dalam komunikasi serial ini, data dikirim bit demi bit.
Mikrokontroler
bekerja dengan frekuensi kristal 11,0592MHz dengan baudrate 9600 bps
untuk komunikasi serialnya, program saya tulis menggunakan bahasa C.
Jika mikrokontroler menerima data karakter yang ada di bawah ini dari
port serial, maka mikrokontroler akan melakukan aksi yang telah
ditentukan dalam program. Berikut daftar perintah untuk mikrokontroler
dari port serial PC:
- ‘a’, untuk menyalakan semua led, pada contoh ini led berada dalam konfigurasi aktif low.
- ‘b’, untuk mematikan semua led.
- ‘c’,untuk menghidupkan led pada P1 bit 0.
- ‘d’,untuk menghidupkan led pada P1 bit 1.
- ‘e’,untuk menghidupkan led pada P1 bit 2.
- ‘f’,untuk menghidupkan led pada P1 bit 3.
- ‘g’,untuk menghidupkan led pada P1 bit 4.
- ‘h’,untuk menghidupkan led pada P1 bit 5.
- ‘i’,untuk menghidupkan led pada P1 bit 6.
- ‘j’,untuk menghidupkan led pada P1 bit 7.
3. Rangkaian [kembali]
4. Flowchart [kembali]
5. Listing Program [kembali]
- Program Untuk Transmitter
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x20
// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
// Declare your global variables here
int a,b,c;
char ag[20];
void rutin(void)
{
while(1)
{
a=150;
b=200;
c=50;
if(PINB.0==0&&PINB.1==1&&PINB.2==1)
{
lcd_clear();
lcd_gotoxy(0,1);
sprintf(ag, "%d",a);
lcd_puts(ag);
putchar (a);
}
if(PINB.0==1&&PINB.1==0&&PINB.2==1)
{
lcd_clear();
lcd_gotoxy(0,1);
sprintf(ag, "%d",b);
lcd_puts(ag);
putchar(b);
}
if(PINB.0==1&&PINB.1==1&&PINB.2==0)
{
lcd_clear();
lcd_gotoxy(0,1);
sprintf(ag, "%d",c);
lcd_puts(ag);
putchar(c);
}
}
}
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=0xFF;
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;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x4D;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
// LCD module initialization
lcd_init(16);
while (1)
{
// Place your code here
rutin();
};
}
- Program Untuk Receiver
#include <mega32.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>
char data;
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 2
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
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
int data1, data2, data3, data4, data5;
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
if(data == 0 )rx_wr_index=0;
else
{
rx_buffer[rx_wr_index++]=data;
data1 = rx_buffer[0]; //
data2 = rx_buffer[1]; //
// data3 = rx_buffer[2];
// data4 = rx_buffer[3];
// data5 = rx_buffer[4]; //
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
}
}
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer---
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
int b;
char screen[20];
void tampil(void)
{
lcd_clear();
lcd_gotoxy(3,0);
sprintf(screen, "TEST");
lcd_puts(screen);
lcd_gotoxy(0,1);
sprintf(screen, "%3d", data1);
lcd_puts(screen);
lcd_gotoxy(4,1);
sprintf(screen, "%3d", data2);
lcd_puts(screen);
lcd_gotoxy(4,3);
}
void gabung_data()
{
int a;
a=data1<<8;
b=a|data2;
tampil();
}
void rutine(void)
{
gabung_data();
}
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=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x4D;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
rutine();
};
}
0 komentar:
Posting Komentar