Pemrograman USART Pada Mikrokontroler AVR (AVR Studio 4)
February 2, 2011 109 Comments
Universal Asynchronous Receiver/Transmitter
Suatu waktu mungkin kita akan membutuhkan beberapa mikrokontroler untuk saling berkomunikasi atau berkomunikasi dengan dengan perangkat lain seperti PC dalam perancangan sistem elektronika. USART bisa dijadikan salah satu pilihannya.
Penggunaan USART untuk komunikasi antar mikrokontroler adalah dengan menghubungkan pin RX pada TX lawan dan pin TX pada RX lawan. Begitu pula jika mikrokontroler berkomunikasi dengan PC. Akan tetapi, karena level teganan pada PC berbeda dengan mikrokontroler maka dibutuhkan suatu rangkaian untuk menyesuaikannya. Biasanya digunakan rangkaian standar RS232.
EXAMPLE
Deklarasi library
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdint.h>
Library bisa ditambahka sesuai kebutuhan penggunaan.
___________________________________________________________________
Fungsi Inisialisasi USART
void USART_Init( )
{
// Set baud rate
// Operating Mode Asynchronous Normal mode (U2X = 0)
// Equation for Calculating UBRR Value UBRR = (fosc/16BAUD) – 1
//fosc 4MHz UBRR = 25 Desimal = 19 Hex
UBRRH=0x00;
UBRRL=0x19;
//UCSRA
// Bit 7 – RXC: USART Receive Complete 0
// Bit 6 – TXC: USART Transmit Complete 0
// Bit 5 – UDRE: USART Data Register Empty 0
// Bit 4 – FE: Frame Error 0
// Bit 3 – DOR: Data OverRun 0
// Bit 2 – PE: Parity Error 0
// Bit 1 – U2X: Double the USART transmission speed 0
// Bit 0 – MPCM: Multi-processor Communication Mode 0
UCSRA=0x00;
//UCSRB
// Bit 7 – RXCIE: RX Complete Interrupt Enable 0
// Bit 6 – TXCIE: TX Complete Interrupt Enable 0
// Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable 0
// Bit 4 – RXEN: Receiver Enable 1
// Bit 3 – TXEN: Transmitter Enable 1
// Bit 2 – UCSZ2: Character Size 0
// Bit 1 – RXB8: Receive Data Bit-8 0
// Bit 0 – TXB8: Transmit Data Bit-8 0
UCSRB=0x18;
//UCSRC
// Bit 7 – URSEL: Register Select 1
// Bit 6 – UMSEL: USART Mode Select 0 Asynchronous Operation
// Bit 5:4 – UPM1:0: Parity Mode 0|:0 Disabled
// Bit 3 – USBS: Stop Bit Select 0 1-bit
// Bit 2:1 – UCSZ1:0: Character Size 1:1 8-bit
// Bit 0 – UCPOL: Clock Polarity 0
UCSRC=0x86;
}
___________________________________________________________________________________
Fungsi USART RECEIVE
unsigned char USART_Receive( void )
{
// Wait for data to be received
while ( !(UCSRA & (1<<RXC)) );
// Get and return received data from buffer
return UDR;
}
____________________________________________________________________________________
Fungsi USART TRANSMIT
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = data;
}
____________________________________________________________________________________
Pseudo code komunikasi USART
#include library
void inisialisasi_USART(){…}
unsigned char USART_receive(){…}
void USART_transmit(){…}
int main(void)
{
…
inisialisasi_USART();
…
unsigned char data_terima = USART_receive();
…
unsigned char data_kirim;
USART_Transmit( data_kirim )
…
}
Daftar Pustaka:
Datasheet atmega8, Atmel Corporation, http://www.atmel.com.
Operating Mode
Equation for Calculating
Baud Rate(1)
Equation for Calculating
UBRR Value
Asynchronous Normal mode
(U2X = 0)
Asynchronous Double Speed
Mode (U2X = 1)
Synchronous Master Mode
BAUD
fOSC
16(UBRR + 1)
= ————————————– UBRR
fOSC
16BAUD
= ———————– – 1
BAUD
fOSC
8(UBRR + 1)
= ———————————– UBRR
fOSC
8BAUD
= ——————– – 1
BAUD
fOSC
2(UBRR + 1)
= ———————————– UBRR
fOSC
2BAUD
= ——————– – 1
Pingback: Aplikasi Komunikasi Serial pada PC Menggunakan Visual C# 2010 / Express « WanGReadY
wah bagus nih. bisa gak mas dimuat secara lengkap baik dari sisi slave mapun masternya untuk program sederhana. trims
Klo sya biasanya pke sprti ini, utk program yg terhubung dg hyperterminal PC. Mikro menerima data lalu mengirim data yg sama ke PC. Utk pengaturan master slavenya bisa disesuaikan:
#include
#include
#include
#include
void USART_Init( )
{
// Set baud rate
// Operating Mode Asynchronous Normal mode (U2X = 0)
// Equation for Calculating UBRR Value UBRR = (fosc/16BAUD) – 1
//fosc 4MHz UBRR = 25 Desimal = 19 Hex
UBRRH=0×00;
UBRRL=0×19;
//UCSRA
// Bit 7 – RXC: USART Receive Complete 0
// Bit 6 – TXC: USART Transmit Complete 0
// Bit 5 – UDRE: USART Data Register Empty 0
// Bit 4 – FE: Frame Error 0
// Bit 3 – DOR: Data OverRun 0
// Bit 2 – PE: Parity Error 0
// Bit 1 – U2X: Double the USART transmission speed 0
// Bit 0 – MPCM: Multi-processor Communication Mode 0
UCSRA=0×00;
//UCSRB
// Bit 7 – RXCIE: RX Complete Interrupt Enable 0
// Bit 6 – TXCIE: TX Complete Interrupt Enable 0
// Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable 0
// Bit 4 – RXEN: Receiver Enable 1
// Bit 3 – TXEN: Transmitter Enable 1
// Bit 2 – UCSZ2: Character Size 0
// Bit 1 – RXB8: Receive Data Bit-8 0
// Bit 0 – TXB8: Transmit Data Bit-8 0
UCSRB=0×18;
//UCSRC
// Bit 7 – URSEL: Register Select 1
// Bit 6 – UMSEL: USART Mode Select 0 Asynchronous Operation
// Bit 5:4 – UPM1:0: Parity Mode 0|:0 Disabled
// Bit 3 – USBS: Stop Bit Select 0 1-bit
// Bit 2:1 – UCSZ1:0: Character Size 1:1 8-bit
// Bit 0 – UCPOL: Clock Polarity 0
UCSRC=0×86;
}
unsigned char USART_Receive( void )
{
// Wait for data to be received
while ( !(UCSRA & (1<<RXC)) );
// Get and return received data from buffer
return UDR;
}
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = data;
}
int main(void)
{
unsigned char data_buff;
USART_Init( );
while(1)
{
data_buff = USART_Receive();
USART_Transmit(data_buff );
}
return 1;
}
mas, saya mau tanya cara membuat interface USART dengan rangkaian pengiriman data melalui transmisi inframerah gimana ya???
saya udah searching” tp masih bingung memulai codingnya dr mana???
Mohon bantuaan..
Makasih..
Klo untuk komunikasi dgn perangkat lain yg berbasis inframerah, ada baiknya awal2 diketahui dulu parameter USART-nya yang ada pada perangkat inframerah. Misal baudrate, parity bit, apakah signalnya dimodulasi atau tidak. Mungkin bisa dicoba dengan pertama-tama menangkap sinyal yang dikirim perangkat tersebut lalu dilihat pada osiloscop. Dengan begitu bisa dianalisis bentuk sinyal yang digunakan parameternya seperti apa. Mkn bisa dilihat pada site berikut tentang transmisi pada remote TV. http://www.sbprojects.com/knowledge/ir/sirc.htm
klo saya punya inputan dari keypad dan menampilkannya di LCD lalu dikirim ke PC bagaimana alurnya yaa mas??mohon pncerahan thx
Bisa dicoba alur berikut.
1.Scan keypad: kirim logic ke baris keypad, lalu scan pada kolom dengan input mikrokontroler. Lakukan pada setiap baris dan jangan lupa tambah nilai delay (kira2 300ms) sebagai nilai tunggu agar mikro tidak mendeteksi input terlalu cepat (jeda). Dengan begitu maka input tombol keypad sudah didapat. Aksi dari scan tadi bisa diapresiasikan berupa nilai tertentu pada sebuah variabel, misal tipe data int, dengan nama keypad. Jika angka 1 yang ditekan maka kita set nila keypad = 1, dst.
2.Tampilkan hasil input tadi pada LCD. Setelah kita dapatkan nilai variabel yang kita dapatkan dari scan keypad, maka data dari variabel tadi bisa kita tampilkan pada LCD. misal lcd_printf(“%d”, keypad);
3.Kirim data dari mirokontroler ke PC, bisa menggunakan UART untuk serial RS232. Data keypad tadi dikirim ke PC. misal: pintf(“%d”,keypad);. Untuk mengujinya, data yang diterima pada PC bisa dicapture menggunakan aplikasi hyperterminal.
4.Jangan lupa, agar mikrokontroler berada terus dalam kondisi pengecekkan, maka semua proses tersebut berada dalam perulangan while(1).
mas kalo kirim banyak karakter sekaligus gimana?
karakter yang diinputkan dari keypad, ditampung terlebih dahulu. kemudian dengan satu tombol, digunakan untuk mengirimkan data yang ditampung tadi.
misal sudah ada fungsi keypad nya mode interrupt dan mikro akan mengirim pada saat ditekan ‘#’…
char data[32];
int i;
.
.
.
while(1)
{
for(i=0;i<32;i++)
data[i] = 0; //clear semua data
for(i=0;i<32;i++)
{
data[i]=baca_keypad();
if(data[i]=='#')
{
data[i] = 0;
break;
}
}
puts(data);
}
kalo perintah lcd_printf() itu yang harus di”include” itu headernya apa ya???
klo sya pernah pke lcd_lib.h dari http://winavr.scienceprog.com
untuk AVR Studio 4, AVR GCC, WinAVR mungkin link ini bisa membantu.
http://winavr.scienceprog.com/example-avr-projects/simplified-avr-lcd-routines.html
http://winavr.scienceprog.com/example-avr-projects/avr-gcc-4-bit-and-8-bit-lcd-library.html
http://winavr.scienceprog.com/example-avr-projects/avr-4-bit-lcd-interface-library.html
tapi jika pake compiler CodeVisionAVR klo pake CodeWizardAVR semuanya di set dengan gui lalu digenerate jadi program sama compilernya
tolong dong tampilin 1 program sederhana yang memakai perintah lcd_printf()…!!! Misalnya buat nampilin hasil dari 7 dibagi 3…. Makasih
#include “lcd_lib.h”
#include <stdio.h
int main(void)
{
uint8_t buff[33],a =7,b =3;
double c;
LCDinit();
c = (double)a/(double)b;
sprintf(buff,"c = %.5f",c);
LCDstring(buff,33);
while(1);
return 0;
}
MAS ,,, Mw tanya … hehe ..
Sya buat sistem parkir sederhana menggunakan kamera dan barrier gate (motor servo) dengan ATmega16…
KASUS :
Sya udah buat GUI dengan VC# 2008 dan saya ingin eksekusi semua perintah (capture image kamera Real Time, pengenalan pola dan save to DB) dari tombol fisik yang ada di mikrokontroler …
Untuk image hasil capture cam selanjutnya akan saya proses untuk pengenalan pola plat kendaraan dan jenis kendaraan dan hasilnya ditampilkan pada sebuah LABEL di form yang sama…
Apabila semua hasil sudah di tampilkan maka akan di simpan dalam database (sql server 2005 ED) …
ALUR KERJA SISTEM :
TOMBOL FISIK (push) –> MIKRO –> PC ( eksekusi GUI event – capture camera, recognition & save to DB) –> MIKRO –> SERVO (Barrier Gate – open gate)
PERTANYAAN SAYA :
1. Bagaimana cara untuk mengEKSEKUSIi semua TASK di GUI tsb dari mikro oleh sebuah TOMBOL FISIK ??
2. Tapi sebelum semua eksekusi perintah si GUI terpenuhi (picture box, texbox, etc = not null), maka GUI TIDAK AKAN mengirim perintah kembali ke mikro untuk membuka barrier gate (servo) !!!
3. Bagaimana cara MENGIRIM perintah ke mikro untuk mengGERAKkan servo (open gate), setelah semua terpenuhi ???
Mohon bantuannya Mas …
Boleh juga bila ada SOURCE CODE + Alur Kerjanya (step by step tutorial) …
Klo’ tidak merepotkan minta tolong di kirim ke e-Mail saya (riand.saputra@gmail.com) ya Mas …
Makasih atas perhatiannya Mas …
mngkin artikel berikut bisa membantu https://wangready.wordpress.com/2011/02/12/aplikasi-komunikasi-serial-pada-pc-menggunakan-visual-c-2010-express/.
jawab:
1. PC menerima data. data tersebut dicek saja menggunakan aplikasi timer. mungkin bisa diset untuk memeriksa buffer data yg datang tiap 100ms. Semua proses bisa disimpan di bagian timer saja.
2. bagian membuka gate, bisa ditaro di akhir kode yg disimpan di bagian timer.
3. perintah bisa berupa kode saja. lebarnya kalo tidak salah cuma bisa 7 bit dari PC. coba saja misal, kirim huruf ‘a’ untuk buka dan ‘b’ untuk tutup, nanti berarti yg diterima di mikro adalah bilangan ascii nya yaitu 97=0x61=’a’ dan 98=0x62=’b’, nanti oleh mikro diterjemahkan lagi untuk mengirim pwm ke servo (jika servo analog).
semoga bisa membantu…
mau tanya ni mas,,,
saya bikin program dgn komunikasi usart,,
gimana ya mas caranya saat saya tekan huruf “a” di keyboard saya beri comand ke mikro untuk mengambil data sensor suhu menggunakan port ADC mikro.
lalu saat saya tekan tombol keyboard “b”, pengiriman melalui USART berhenti, tidak lagi mengirim.
saya udah coba ambil data sensornya, tapi belum bisa memberi perintah “berhenti” untuk mengambil data suhu nya…
mohon bantuanya mas….
triima kasih baanyaak….
klo agan pake CodevisionAVR mungkin bisa dicoba kode berikut.
unsigned char data_receive; //deklarasi kan variabel ini
.
.
.
while(1)
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
{
if(data_receive == 'a')putchar(read_adc(0));//jika 'a' kirim data dari adc 0
else if(data_receive == 'b');//jika 'b' diam
}
data_receive=UDR;/* Get received data from buffer */
}
kode ini bersumber dari datasheet ATmega8535, url atmel.com/Images/doc2502.pdf, di halaman 155…
agan2 mohon bantuannya yah..saya mw bikin program buat kompresi citra digital yg formatnya bmp pk algoritma huffman..stelah dkompresi, citra digital itu nantinya akan disteganografikan dgn data suhu dgn metode LSB..saya pake mikon atmega 8535..agan2 ada yg tau source code buat code vision avr nya gak??atau mungkin agan2 ad yg punya cara yg lbh gmpg utk pengaplikasiannya??kyk pk arduino atau ap gt??mohon saran nya..makasih..
mikon atmega nya cuman buat ngambil data suhu aja ya buat dikirim ke PC?
biasanya kalo sensor suhu pake LM35. koneksinya pake ADC. cuman setau saya responnya lambat. yg cepet mah bisa pake Thermal Array TPA81. koneksinya pake I2C.
mas contoh di atas untuk mengirim data dg hyperterminal PC. Mikro menerima data lalu mengirim data yg sama ke PC,.
bila saya menggunakan 2 mikro,.
mikro 1 membaca data adc,.
mikro 2 menampilkan data adc pada lcd karakter,.
2 mikro tersebut memanfaatkan uart untuk berkomunikasi,.
yang sudah saya lakukan, pada penerima tidak mau menampilkan data adc,.
bisa kasih contoh code untuk uart berkomunikasi data adc,. sehingga bisa tampil pada lcd karakter,.
thanks,.
pastikan konfigurasi uart nya gk ketuker, Tx1 ke Rx2, Tx2 ke Rx1, disilang…
kalo pake kompiler codevisionAVR, misal:
mikro 1:
while(1)
{
putchar(read_adc(0));//kirim nilai ADC0 melalui serial
delay_ms(500);//menunggu mikro 2 mengeksekusi data dan LCD
}
mikro 2:
while(1)
{
sprintf(kata,”adc= %d”,getchar());//membuat data string
lcd_clear();//bersihkan layar lcd
lcd_gotoxy(0,0);//set koordinat
lcd_puts(kata);//kirim karakter ke LCD
}
mas saya mau nanyak,,kalau saya mau mengirim 2 data dari mikro ke PC secara bersamaan gmn ya cara nya??
misal saya mau mengirim data yang berasal dari ADC0 dan ADC1 dimana kedua data ini berbeda tapi saya mau mengirim nya secara bersamaan dan nanti nya dapat saya tampilkan hasil konversi data nya di kolom(combo box) yang berbeda pada software saya??? kebetulan saya pakai VB.6 dan saya ingin menggunakan USB sebagai media pengiriman data nya
mohon bantuan dan pencerahan nya mas
thanks
kirimnya perpaket aja mas, coba liat postingan ini https://wangready.wordpress.com/2012/06/25/transmit-data-paket/ , trus nanti pas nerima di PC nya baru diuraikan kembali datanya, klo saya biasanya intinya datanya diberi kepala data, baru kemudian data yang penting mengikuti, misal data ke-1 buat ADC0 dan ke-2 berikutnya ADC1…
atau bisa juga dibuat sekali kirim, caranya ADC0 dan ADC1 datanya yang diambil hanya 4 bit MSB(most significant bit), mengurangi sedikit resolusi data, kemudian digabung, baru setelah diterima PC diuraikan lagi….
misal mengirim dari mikro…
data = (read_adc(1)&0xF0)|((read_adc(0)&0xF0)>>4);
putchar(data);
dan nanti data di PC diolah lg…
data_adc0 = (data_receive&0x0F)<<4;
data_adc1 = data_receive&0xF0;
dengan catatan semua data adalah uint8 atau unsigned char, 8 bit….
mas, saya mau nanya, rencana nya data ATmega 16 sy mw kirim k kmputer dengan wireless, apa beda coding nya dengn d atas???? dan bgmn cara mngecekny d komputer kl sdh terhubung k kmputer??? mksh mas.
kalo dari kodingan nya sepertinya sama saja, cuma yang dimodif kan media transfer datanya dari kabel jadi radio, jadi itu berkaitan dengan hardware…..kecuali kalau pake modul elektronik lain yang punya protokol data yang berbeda, biasanya punya format setting khusus yang dijelaskan di datasheet…kalau mas pake codevision code USART nya bisa digenerate otomatis, kalo yang di atas pake software AVR Studio 4, AVR GCC, harus diketik manual…untuk mengecek data yang masuk port serial di komputer bisa pake aplikasi hyperterminal, bisa juga dicek aja pake osiloskop di pin USART nya…
mas… saya ada problem dengan problem dengan program yang saya buat, mohon dikoreksi dmna letak kesalahan n solusinya.
program yg saya buat fungsinya untuk mengirim dan menerima data antar mikro pake sensor YS-1020UA sebagai kominikasi antar mikronya. aplikasinya gini mas :
robot A dihidupkan, program seperti kompas, jarak,dll terkeksekusi dengan baik. begitu juga saat mengirimkan data A ke robot B, tanpa ada masalah. namun pada robot B, ketika dihidupkan untuk pertama kalinya, program lain seperti kompas, jrk, dll nggak bsa berjalan. saat robot B menerima data dari robot A, dapat diterima dgn baik oleh robot B namun tetap nggak bsa jalankan program lain setelah menerima data tersebut; listingnya kyk gini mas :
Robot A
while(1)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“welcome”);
for(a=0;a<5;a++)
{
buzzer=1;
delay_ms(100);
buzzer=0;
delay_ms(100);
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("A");
delay_ms(500);
putchar('A');
start :
baca_kompas();
sensor_jarak();
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(kata);
lcd_gotoxy(0,1);
lcd_putsf(kata2);
delay_ms(50);
maju(255,255);
goto start;
};
}
Robot B :
while(1)
{
cd_clear();
lcd_gotoxy(0,0);
lcd_putsf("welcome");
for(a=0;a<5;a++)
{
buzzer=1;
delay_ms(100);
buzzer=0;
delay_ms(100);
}
start :
baca_kompas();
sensor_jarak();
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(kata);
lcd_gotoxy(0,1);
lcd_putsf(kata2);
delay_ms(50);
maju(255,255);
if(getchar()=='A')
{
buzzer=1;
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("A");
delay_ms(1000);
buzzer=0;
delay_ms(500);
}
goto start;
};
}
nah, mohon koreksinya mas…
mas, programnya mas saya gk ngerti soalnya yang transmit sama receive nya cuma ada putchar(“A”) sama getchar(“A”) sedangkan fungsi yg lainnya mas gk posting, kalo kasus robot B gk bisa jalan itu karena robot B menunggu data yang dikirim dari robot A, dikarenakan mas sepertinya pake fungsi UART receive interupt jadi robot B tidak akan menjalankan program lain sebelum data diterima, dan proses ini terus berulang dengan interval waktu (sela waktu transmit robot A + waktu delay getchar di robot B) kira2 seperti itu analisa saya, atau klo gk mas langsung aja ngambil data di register UDR nya jd gk usah pake mode UART receive interupt…
saran saya, mas ngirim data nya pake protokol, terserah protokolnya apa aja, biar datanya gk tertukar, kalo yang saya udah buat, mas bisa pake ini https://wangready.wordpress.com/2012/06/25/transmit-data-paket/ tinggal panggil aja fungsinya…trus saran lain, kalo bisa program nya dibuat seperti multitasking gtu, biar fungsi kontrol gk terganggu dengan fungsi komunikasi, yg fungsi kontrol bisa disimpan pada fungsi timer interupt overflow, kalo yg komunikasi bisa disimpan di while(1) di main program, metode itu saya dapat dari program modul kontrol posisi HB25 punya parallax klo gk salah….
iya mas…program yang saya buat memang seperti itu, program tersebut saya buat berdasarkan contoh program yg hanya berfungsi mengirim dan mnerima karakter dari mikro A ke mikro B yg di tampilkan pada LCD. di situ hanya dibuat sperti ini mas :
– Tombol di PORTD.2 jika ditekan maka alat 1 mengirim karakter X
– Jika alat 2 menerima huruf X maka akan menyalakan relai di PORTC.0
mikro A:
#include
#include
void main(void)
{
unsigned char input;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x00;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;
while (1)
{
input=getchar();
if(input==’X’) {
PORTC.0=1;
}
}
}
mikro B:
#include
#include
void main(void)
{
PORTD=0x00;
DDRD=0x00;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;
while (1)
{
if(PIND.2==0) {
putchar(‘X’);
}
}
}
namun sebenarnya saya ingin membuat program yg bisa mengendalikan robot A atau B, tapi pada saat belum terima data dari robot A atau B, masing2 robot tetap jalankan programnya sendiri. yang mau sya kirimkan data pada komunikasi dua robot ini adalah data kompas dan sensor jarak mas. nah klo mas tadi bilang fungsi lain nggak saya posting saya kurang paham hehe, soalnya memang hanya seperti itu program yg saya buat. klo fungsi USARTnya saya nggak pake interrupt,jd pd settingan di codevision hnya mencentang receiver n transmitter aja. tlg mas bagaimana cara memprogramnya agar kontrol kedua robot nggak terganggu dengan komunkasinya. yg sederhana aja mas msalnya robot A mengirimkan karakter ‘C’ ke robot B, maka robot B akan berbelok ke kanan, begitu juga sebaliknya. namun jika kedua robot belum saling berkomunikasi, maka tetap jalan sesuai programnya masing2…. makasih mas sebelumnya
mas, ini metode yang saya dapat dari kontroller HB-25 untuk membagi tugas kontrol dan komunikasi, kode di bawah ini hanya contoh aja untuk mengaktifkan LED via serial menggunakan karakter A,B,C. saya menggunakan fungsi UART interupt, timer0 interupt overflow. selebihnya mungkin mas bisa modifikasi sesuai kebutuhan.
Salam Kenal…
Saya ingin membuat interface antara pc dengan mikon ATMEGA 8535, saya belum mengetahui untuk proses pengambilan data dengan banyaknya data lebih dari 1 byte…
contoh kasus:
1. Saya ingin mengambil data dari pc untuk diproses di mikon (2 byte data), 1 byte full saya gunakan di PORT C, 1 byte lg saya hanya memerlukan 2 bit terendah untuk diproses.. kira-kira alur proses pemrogramannya seperti apa, dan kalau boleh disertakan dengan contoh program di cvAVR…
terima kasih sebelumnya
mas kirim aja pake data string, nanti diubah/diolah lg pake mikro. selain itu, bisa juga buat alamat. jadi misal untuk data pertama diawali huruf ‘a’, data kedua diawali huruf ‘b’.
misal,akan menerima data dengan lebar uint8, perhatikan tabel ASCII, dan gunakan receive interrupt setting:
kirim data dari pc: ‘a252b1′ maka, di mikro data_PORTC=252 dan data_proses_lain=1; dengan catatan data dikirim berulang dari PC dengan interval waktu menggunakan timer kira2 1 ms
unsigned char data_buffer[3];
unsigned char data_PORTC,data_proses_lain;
while(getchar()!=’a’);
data_buffer[0] = getchar();
data_buffer[1] = getchar();
if((data_buffer[1]>57)&&(data_buffer[1]57)&&(data_buffer[1]57)&&(data_buffer[1]57)&&(data_buffer[1]<48))
{
data_buffer[2] = data_buffer[1];
data_buffer[1] = data_buffer[0];
data_buffer[0] = '0';
goto next2_data;
}
next2_data:
data_proses_lain = ((data_buffer[0]-48)*100) + ((data_buffer[1]-48)*10) + (data_buffer[2]-48);
mas, saya mau nanya, rencana nya data ATmega saya mw ditampilkan ke layar Monitor tapi dari pc ke mikronya pake wireless….
bisa bantu ngga’ gimana programnya..
pake ini aja gan WiFi Shield V2.1 For Arduino (802.11 g/n), di digi-ware ada….cara programnya ada di http://www.dfrobot.com/image/data/TEL0047/WiFi%20shield%20v21%20Tutorial%20v01.pdf
mas,,, gmna cara memprogram dua buah USART kyk di mega128? USART0 untuk ngambil data GPS dan USART1 untuk komunikasi dengan wireless? Yang USART0 hanya pake fungsi getchar-nya saja, sedangkan USART1 pake dua2nya yaitu getchar n putchar… kalo bisa di codevision aja mas, listingnya yg sederhana aja hanya sebagai contoh mas…!
truzs bagaimana cara mengirim dan menerima data seperti kompas d gps secara wireless mas?
bagaimana cara kirim data ‘Z’ tapi nggak trus menerus, cuman sekali aja pengiriman data ‘Z’ tadi?
mohon pencerahannya….
maaf sudah mengganggu dan ngerepoti mas ,,,, hehe
agan pake wirelessnya apa, kalo yg mempunyai output serial tentu enak buat pemrogramannya…
mas tinggal setting aja pada saat bikin new project di code wizard, setting USART0 dan satunya pake interupt, nanti akan otomatis ter-generate code/fungsi USART nya. Jadinya putchar() –> untuk mengirim Tx0, getchar() –> untuk menerima Rx0, putchar1() –> untuk mengirim Tx1, getchar1() –> untuk menerima Rx1. misal:
mengirim–>
data = 255;
putchar(data);
atau
data = ‘A’
putchar(data);
atau khusus untuk USART0 kita bisa pake printf,
data = 125;
printf(“data_sensor=%d”,data);
untuk menerima–>
data = getchar();
sebenarnya kalo agan pengen ngirim data banyak dalam sekali kirim agan bisa gabung dalam 8 bit, tapi resiko resolusi dataya ter-reduksi, misal tiap data kita ambil MSB nya
data_sensor1 = 156;
data_sensor2 = 243;
data_kirim = (data_sensor1 & 0xF0)|((data_sensor2 & 0xF0)>>4);
putchar(data_kirim);
kalo cuma sekali ngirim berarti prinsipnya buat seperti master dan slave. perangkat slave memberi data ketika master meminta (request).
makasih mas, cukup menginspirasi pikiran infonya….
mau tanya
Kalo ngirim kalimat misalnya “tes LCD” dari mikro 1 ke mikro 2, terus mikro 2 nampilin ke LCD kalimat “tes LCD” gimana kodenya?
kalo di mikro agan gk ada program lain agan bisa coba lewat serial:
mikro1:
printf(“tes LCD”);
mikro2:
lcd_gotoxy(0,0);
while(1)
{
lcd_putchar(getchar());
}
makasih
mas, mohon bantuannya.
saya ingin ON/OFF beberapa LED misal ada 2 led dg mengirim data tombol keyboard dr pc menggunakan komunikasi serial USART. bila dikirim data ‘a/b’ utk on/off led1 dan data ‘c/d’ utk ‘on/off’ led2. juga bagai mana cara menggerakkan putar SERVO jika diberi masukan misal tombol 90 maka servo akan bergerak 90 derajat.
maturnuwun sebelumnya.
cara sederhana untuk mengolah data terima LED tinggal buat switch case aja gan…
untuk servo, nilai yang dikirim dibuat selalu ditambah 100. hal ini dimaksudkan agar format pengiriman data menjadi default 3 karakter. jadi jika ingin mengirim 90 ke mikro, yang dikirim adalah 100 + 90, jadi diketik 190.
saya menggunakan komunikasi serial antar bluetooth dr laptop ke rangkaian alatnya, bagai mana set utk inisialisasi komunikasi serial nya mas.
haturnuwun atas jawabannya mas.
inisialisasi dimananya gan, d mikro? jika agan menggunakan CodevisionAVR agan gunakan saja codewizard, jadi langsung tergenerate…
mas,, ,mau tanya nih. saya kan ada modul gps yang serial intterfacenya pake ttl.utk di interface dengan atmega128L
nah apa bisa langsung saya colokin ke port yang memliki RX dan TX nya,
kebetulan saya pake codevision avr, apa uart ttl tsb bisa di settng pada code wizardnya tanpa inisialisasi tambahan?
terus saya udah bikin program untuk baca string gps dan baca lattitude sama longitudenya, kemudian mau saya tampilin ke hyperterminal. kira2 untuk menampilkan pada hyperterminalya tsb perlu program tambahan lain gak ?
setau saya gan atmega128L masih bisa beroperasi di 5V dgn xtal max 8MHz, jadi bisa langsung colokin aja keknya…
kalo komunikasi UART nya bisa pake code wizard, jadi langsung tergenerate otomatis. cuma kalo soal protokol komunikasi data nya tetap harus bikin sendiri, mungkin itu bisa dilihat di datasheet GPS untuk format datanya nya gan, soalnya saya sndiri blum prnah ngoprek GPS.
oke makasih mas infonya ,,,
🙂
mas..,,mau nanya..,,punya contoh program enkripsi data di mikro gk? terima kasih
gk punya gan….
mas mau minta tlg nih,, ada contoh program enkripsi data adc pembacaan sensor di mikrokontroler. terima kasih.
gk punya gan….
mas saya mau tanya nih, kalau mau bikin program untuk hubungin RFID ke ATmega 16 trus d tampilin d LCD kira2 programnya kyak gimana?? setahu saya apa harus d hubungin perantara MAX232 ya?? mohon bantuanya..
kalo agan pake CVAVR kurang lebih programnya bisa seperti ini
unsigned char kata[16];
while(1)
{
data = getchar();
lcd_clear();
lcd_gotoxy(0,0);
sprintf(kata,”%d”,data);
lcd_puts(kata); //nampilin dalam bentuk desimal
}
tergantung data yang agan kirim sih, itu tergantung perancangan komunikasi agan, pake angka atau text…
kalo MAX232 itu untuk komunikasi RS232, tegangan -12 sampai +12 Volt. Kalo untuk TTL 0-5V cukup langsung sambung saja…
mas ada contoh program untuk mengirimkan data dr sismin ke laptop menggunakan bluetooth? soalnya saya sudah mencoba yg dr generate di cvavr tidak terkirim datanya. pdhal bluetooth nya oke.hardware ok. thx
programnya sama aja. Bluetooth yg serial kan? coba cek lg, mungkin CVAVR yg agan gunakan versi evaluation yg menyebabkan tidak bisa tercompile fitur serialnya…
misi mas…mau nanya…saya mau kirim data menggunakan KYL 1020U dari laptop ke mikro atmega8535..jadi ketka saya tekan dilaptop “->” maka data yang terkirim adalah 2…..dan data 2 diolah dimikro sehinggal mengeluarkan output di PORTA…trimd
ya di aplikasi di PC nya bikin deteksi keyboard, habis itu masukan ke send serial. baru di mikro bisa pake scanf atau getchar
misi mas..mohon bantuanya..
bagaimana melakukan istruksi untuk mengirim perintah serial dari pc(opencv++) ke arduino.?
ni sya membuat alat deteksi kantuk pada pengemudi dengan kamera
yang di pc = jika telah ditemukan kantuk (“alarm active”) maka..
yang di arduino (hardware)
1 = bazer akan hidup
2 = putaran roda semula aktiv menjadi mati (motor dc)
3 = nampil tulisan lcd “bahaya”
dngan sangat bertrimakasih jika ada agan yang mau membantu..makasi
saya gk bgitu familiar dgn arduino dan openCV gan, tp kalo agan pake Visual C++ buat bikin kodingnya disitu udah tersedia toolbox serial namanya comport kalo gk salah. kalo buat di mikrokontroler nya buat nerima data saya biasa pake fungsi scanf.
gan saya mau tanya dong kalo mau ngirim data dari mikro ke pc lebih dari 1 digit/kata secara bersamaan gmn??
contoh : printf(“12”);
kemudian saya cek data yg masuk pake aplikasi vb yg ane buat ternyata data yg masuk bukan 12 secara bersamaan tapi 1-2-1-2-1-2…mohon pencerahan nya gan..
kalo pake VB saya belum nyoba tp kalo pake C# bisa dilihat contohnya di post ini https://wangready.wordpress.com/2013/06/22/membuat-virtual-joystik-c/
bagian receive event nya
string kata;
string[] buff_kata = new string[8];
//—Event handler untuk DataReceived event—
private void DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
kata = serialPort.ReadLine();
buff_kata = SplitWords(kata);
if (kata != string.Empty)
{
//txtDataReceived.Text = kata;
txtDataReceived.BeginInvoke(new myDelegate(updateTextBox));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
cara ngambil bagian2 datanya yang variabel array buff_kata[] seperti di bawah ini
buff_val_y = Convert.ToInt32(buff_kata[1]);
buff_val_x = Convert.ToInt32(buff_kata[2]);
val_z = Convert.ToInt32(buff_kata[3]);
wah @wangready bener” dewa bgt, mudah”an ilmunya berkah,amin.
mau nanya deh mas, problem saya yaitu :
Saya mau menghubungkan secara komunikasi serial antara RFID reader dengan ATmega8535.
Data yang ada di kartu(tag) RFID berupa data ASCII 12 digit, ex : 4D00D5CB5506
Bagaimana list program untuk menginstruksikan, ketika ATmega menerima data dari kartu RFID(12 digit tersebut), maka ATmega akan menghidupkan suatu pin.
Minta pencerahannya ya mas.
pake getchar aja gan, pake for, masukin ke data array, buat compare datanya pake fungsi strcmpf, misal
char huruf[12];//buffer data 12x8bit
for (i=0;i<12;i++)
{
huruf[i] = getchar();
}
if (!(strcmpf(huruf,"4D00D5CB5506")))
{
PORTA.0 = 1;
}
else
{
PORTA.0 = 0;
}
oke,saya coba dulu ya gan.
maaf nih gan mau nanya lg.
Maklum masih beginner,hehe.
Fungsi strcmpf-nya kok undefined ya? apa ada yg harus saya tambahkan di list programnya?
Boleh minta list program yg lengkapnya gan? Soalnya saya bingung kalo dikasih list sepenggal gitu.
Makasih byk ya gan.
tambahin
gan….Fungsi strcmpf-nya ada di lib itu…
contoh pemakaiannya kayak gini gan…
Thanks gan, sukses trus buat agan.
#include
#include
#define USART_H
#ifndef STRING_H
#define STRING_H
#define F_CPU 8000000UL
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU/(USART_BAUDRATE*8UL)))-1)
#endif /*STRING_H*/
void usart_init();
void getcard_id(void);
unsigned int usart_getch();
unsigned char i, card[12];
void usart_init(){
UCSRA = (1<<U2X);
UCSRB = (1<<RXEN) | (1<<TXEN);
UCSRC = (1<<URSEL) | (1<<USBS) | (1<<UCSZ0) | (1<<UCSZ1) |
(0<>8);
UBRRL = BAUD_PRESCALE;
}
void getcard_id(void){
for(i=0;i<12;i++)
{
card[i]=usart_getch();
}
return;
}
unsigned int usart_getch(){
while ((UCSRA&(1<<RXC))==0);
return UDR;
}
int main(void)
{
usart_init();
uint8_t card[i];
DDRB = 0xff;
while(1){
if (!(strcmpf(card,"4D00D5CB5506")))
{
PORTB = 0x0f;
}
if (!(strcmpf(card,"4D00C6A6607")))
{
PORTB = 0xf0;
}
};
return 0;
}
Masih ada 2 error, dgn comment yg sama yaitu: undefine reference to ' strcmpf '.
Mohon koreksinya gan.
sory gan, saya kira pake CV AVR…
kalo AVR Studio 4 keknya pake ‘strcmp’ sesuai sama http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#gaedb0e7bb7333d6122472acddb5df20ac
#include (avr/io.h)
#include (string.h)
gan mau tanya dong,,kalo dari mikro mau ngirim data ke pc 2 digit ato lebih gmn..
soalnya saya nyoba ngirim data “A1” ketika di cek data yg dikirim satu persatu jadi A dulu terus 1 gitu selanjutnya..saya ingin nya data yg terkirim k pc A1 bersamaan,,
program di pc saya menggunakan vb 6..yg harus diubah program di mikro nya ato di pc nya gan? mohon pencerahan nya..
kalo dari mikro nya kirim aja langsung pake fungsi printf jg bisa gan…
kalo mau kirim 2 data yang berbeda bisa dipisah pake spasi…jadi tiap data dipisah bedasar spasi yang terdeteksi, kalo saya biasanya pake kepala data dulu berupa kata tertentu yang menandakan awal data, supaya lebih mudah mendeteksi kalo error…
kalo pake VB saya belum nyoba tp kalo pake C# bisa dilihat contohnya di post ini https://wangready.wordpress.com/2013/06/22/membuat-virtual-joystik-c/
bagian receive event nya,
cara ngambil bagian2 datanya yang variabel array buff_kata[] seperti di bawah ini
buff_val_y = Convert.ToInt32(buff_kata[1]);
buff_val_x = Convert.ToInt32(buff_kata[2]);
val_z = Convert.ToInt32(buff_kata[3]);
salam kenal gan. saya lagi buat tugas komunikasi antara 2 buah mikrontroller atmega 8535, dimana mikrokontroller tersebut saling komunikasi untuk deteksi data string, untuk baca data serial saya gunakan perintah getchar dan ini sudah bisa deteksi data namun hanya sebatas karakter, untuk data string gak bisa jalan gan. nanya ni gan, Bagaimana deteksi data string menggunakan bahasa c code vision avr atau bagaimana modifikasi programnya sehingga bisa tampilkan data dari transmiter. Trim gan
sistemnya dibuat master sama slave gan. jadi si mikro slave hanya mengirim data jika diminta oleh master. untuk komunikasi data format string bisa liat postingan ini gan https://wangready.wordpress.com/2012/12/30/receive-data-uart-menggunakan-scanf-codevisionavr/
ngirim datanya pake printf
Malam gan, mau naya nih gan.
Ada problem, saya mau menginstruksiin mikro untuk menerima sebuah data ASCII dan stelah itu menghidupkan suatu pin.
Bijimane ye gan list programnya? program buat array dan untuk compare nya gimana gan?
Mohon pencerahannya, trima ksih gan.
problemnya gmananya gan?
ngirim pake printf, kalo nerima pake scanf. yg scanf ada di postingan sebelumnya https://wangready.wordpress.com/2012/12/30/receive-data-uart-menggunakan-scanf-codevisionavr/
Saya ada data ASCII 6 digit(43AB07) dan sebuah ATmega8535.
Kemudian saya ingin menginstruksikan untuk ATmega8535 menerima data ASCII 6 digit tersebut kemudian setelah menerima data ASCII tersebut ATmega8535 menghidupkan suatu pin, katakanlah pinA.
Sedikit yg saya ketahui, itu menggunakan fungsi ARRAY dan meng-comparenya, jadi bagaimana list program untuk fungsi array dan compare-nya, gan? kemudian bagaimana list program untuk ATmega8535 menerima data ASCII tersebut kemudian menghisupkan pin A?
Mohon pencerahannnya gan.
klo menurut saya, data yg dikirim string aja gan, semisal printf(“HEAD PORTA_ON”) ngirim pake printf
jadi nanti nerima datanya scanf(“HEAD %s”, data_terima)
data HEAD adalah kepala data untuk memudahkan memilah data, klo saya biasanya sperti itu…
mas mau tanya, kalo ngirim data adc ke pc itu list program cvavrnya gmana ya, output sensor saya ditampilkan di lcd dan dikirim ke pc (pake visual basic),..tapi saya baru bisa nampilin data adcnya di lcd..
klo ngirim data mikro pake printf.
klo nerima data di PC saya biasanya pake C#, kodenya
contohnya disini https://wangready.wordpress.com/2013/06/22/membuat-virtual-joystik-c/
maap gan sebelumnya, mau tanya bisa gak ya setting RTC pake keyboard ps/2 di tiny2313 tp displaynya pake 4 seven-segment?
gk tau gan belum pernah nyoba. keknya bisa2 aja…
selamat siang prof,
saya sedang bikin program transfer data LCD menggunakan dua mikro atmega16, LCD1 ke LCD 2 , dimana lcd 1 akan mentransfer data ke lcd 2, dengan input keypad, bagaimana codung nya ya?
mohon pencerahan.. terimakasih sebelumnya
klo pake codevisionAVR komunikasi serialnya bisa pake printf sama scanf https://wangready.wordpress.com/2012/12/30/receive-data-uart-menggunakan-scanf-codevisionavr/
coding LCD nya ada di bagian help softwarenya….
mas mau tanya …
kalo kirim karakter dari keyboard pc ke lcd bagaimana list program untuk ATmega8535 nya gan?
gk tau gan, keyboar konektor PS2 kan?
kalo cuma memenfatkan serial bisa gak gan,,,enggak pake ps2?
yang seperti ini gan,,,, ini link nya gan…itu lising programing nya gmnya ya gan?
keknya bisa pake scanf https://wangready.wordpress.com/2012/12/30/receive-data-uart-menggunakan-scanf-codevisionavr/ atau pake getchar jg bisa
mas mau tanya lg….
cara nya mikrokontroler bisa komunikasi dengan scda (wonderware) gimana ya mas?
trimakasih
klo format komunikasi scada, saya gk ngerti gan…emang yg agan pake apa? RS232? Ethernet? CAN?
RS232 gan….
coba aja gan di tap pake osiloscop biar ketahuan formatnya…
gan mo tanya kl ane transmit 5 data hex dari komp misal
{0x24,0x11,0x01,0x02,0x03} ke uC, nah d uC data itu mau d bagi per array pake interrupt
jadi pengenya data[0]=0x24, data[1]=0x11……..data[4]=0x03……kr2 gmn ya mas routinnya? dan apa si bedanya Usart regular sama yg pake interrupt?..mksi gan
pake for aja gan
tapi biar gk miss datanya pake header, misal data yang dikirim selalu diawali hex 0x85 dua kali….tambahin aja pake if di awalnya…
klo beda yg reguler sama yang interrupt sya jg gk tau persis, pengalaman saya klo yg interrupt itu dia nunggu data masuk, klo data masuk baru lanjut ke rutin bawah. klo yg biasa saya biasanya ngecek di register UDR nya langsung, data=UDR, discan aja UDR nya…klo saya sih biasanya gitu…
mas tolong kasih code untuk pembacaan data RFID pada mikro dan tampil di lcd. mohon bantuannya mas
formatnya datanya gimana gan? saya belum pernah ngoprek RFID soalnya…
maaf mz mau nanyak kalau mau membaca data yang di krim lewat bluetooth tu gimana caranya?
ama cara mengkomunikasikan modul bluetooth hc-05 dengan mikrokontroller atmega16 gmna caranya mz?
gk tau gan, blm pernah nyoba kalo tipe itu…
Mas mau nanya kalo mensinkronkan ATmega 16 dengan mod/ul bluetooth supaya sinyal string dari bluetooth terbaca oleh mikronya caranya gemana ya mas
sinkronkan gmana gan?
data string bisa jd kumpulan array data char gan…
pake getchar disimpen di char *data, atau pake scanf jg bisa keknya…
ini posingan yg pake scanf gan https://wangready.wordpress.com/2012/12/30/receive-data-uart-menggunakan-scanf-codevisionavr/
Mas saya mau tanya, jadi saya niatnya mau scan respon modem wave com yang pake AT command, singkatnya misalnya kalau di hyperterminal kan kalau ketik “AT” maka modem wavecom kan bakal bales “ok”
nah disini saya nyoba itu di mikro dengan ngetik otomatis perintah AT command dan melihat respon modem di lcd, dengan kondisi:
usart0=modem
nah saya mrogram kok ga keluar apa” ya di lcd nya mas
berikut perintahnya :
void scan(void)
{
char data[32];
int i;
for (i=0;i<32;i++)
data[i]=0; //bersihkan variabel
for (i=0;i<32;i++)
{
data[i] = getchar();
if(data[i]==0x0A)//char enter
break;
}
lcd_clear();
lcd_puts(data);
}
void main(void)
{
char data[32];
int i;
lcd_clear();
lcd_putsf("M hasmi baih hakim");
delay_ms(3000);
putchar1(27);
putchar(13);
delay_ms(3000);
putchar1(63);
putchar(13);
delay_ms(3000);
putchar(13);
delay_ms(10000);
lcd_clear();
printf("AT");
putchar(13);
scan();
lcd_clear();
lcd_putsf("ATTACH GPRS");
printf("AT+CGATT=1");
putchar(13);
scan();
delay_ms(5000);
lcd_clear();
lcd_putsf("CONNECT TO OPERATOR CELLULAR");
printf("AT+CSTT=\"AXIS\"");
putchar(13);
scan();
delay_ms(5000);
lcd_clear();
lcd_putsf("Wireless Connection");
printf("AT+CIICR");
putchar(13);
scan();
delay_ms(5000);
lcd_clear();
lcd_putsf("REQEST IP ADDRESS");
printf("AT+CIFSR");
putchar(13);
scan();
delay_ms(5000);
}
ini yang salah dimananya ya gan?
thanks
inisialisasi serial nya udah di cek belum gan? baudrate?… coba tes pake syntax simple biar ketahuan eror nya dimana, simisal nerima karakter ‘A’ LED menyala…kalo dari kode agan di atas sih keknya harusnya jalan…
mas, saya lg ngerjain proyek akhir saya, pakai easy VR sebagai pengenal suaranya, dan atmega 8535 sebagai slave nya tp saya blum ngerti cara buat program usartnya, saya pakai code visio avr bisa tlg dibantu mas,
saya belum pernah make easy VR gan…
mas saya mau tanya,, saya kan punya project menggunakan RFID dan mikon.a atmega8535 terus saya ingin menghubungkan dengan interface delphi menggunakan serial db9,, itu kira-kira program pengiriman id cardnya gimna ya buat mikonnya..
makasih mas sebelumnya,,
Permisi Mas saya mau bertanya,saya mau berencana membuat alat pengirim data dari mikro atmega 32 ke mobile android
namun saya tidak menggunakan interrupt,mungkin mas bisa bantu memberikan penjelasan tentang tahapan dari interrupt,sepert UDR itu apa UCSRA ,B,C itu apa,dan RXc itu apa?
mohon bantuan nya mas,terima kasih sebelum nya
mas, mau tanya, misal saya mau ngirim data dari sensor ping, anggap saja nilainya 300, sedangkan kalau mau pakai fungsi putchar kan maksimal cuma 200 an, itu solusinya gimana ya mas ? dibagi 2 dulu lalu dikirim atau ? tolong pencerahannya mas
Sore mas,, saya baru dalam dunia mikrokontroler. Saya ada tugas untuk melakukan koneksi antara camera berbasis OV528 (RS232) dengan AT128. AT128 diharapkan mengirim data hexa ke camera (mis : 52 00 26 00) dan camera akan merespon (72 00 10 00). nah.. untuk respon tersebut dibaca melalui hyper terminal… bisa dibantu untuk programnya?? terima kasih.
Salam kenal, saya tertarik dengan artikel diatas.
saya ada tugas untuk membaca data sensor flow water, kemudian datanya ditampilkan pada LCD dan selanjutnya mengirim data ke PC melalui serial. sampai sekarang saya masih belum berhasil. mungkin sodara bisa membantu. tugas saya ini sama persis seperti yang ada pada tutorial ini http://www.seeedstudio.com/wiki/G1/2_Water_Flow_sensor. namun disitu contohnya dalam bahasa arduino. saya tunggu balasannya. terimakasih
mas,saya mau tanya dong,saya buat program mengunakan bluetooth HC-05,dan saya koneksikan dengan MCU atmega8 ini contoh program nya…
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 04-Feb-2015
Author : Rui
Company : Richi Studio
Comments:
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include
#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)
// USART Receiver buffer
#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
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
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) rx_buffer_overflow=1;
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
}
#endif
}
}
#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_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
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE <= 256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
–tx_counter;
UDR=tx_buffer[tx_rd_index++];
#if TX_BUFFER_SIZE != 256
if (tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
#endif
}
}
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index++]=c;
#if TX_BUFFER_SIZE != 256
if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
#endif
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
// Standard Input/Output functions
#include
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// 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
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// 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;
// 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=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Global enable interrupts
#asm(“sei”)
while (1)
{
if(getchar()==’a’){ PORTB.0=0;}
else if(getchar()==’b’){PORTB.0=1;}
else {PORTB=1;}
}
}
saya ingin menyalakan led pada PORTB.0 dengan mengunakan HP android yg telah di program untuk mengirimkan kode char sesuai kode di atas,tetapi tidak berfungsi sama sekali
Nah,yang mau saya tanyakan adalah apakah code diatas sudah benar?
kalo bisa tolong di koreksi ya mas…
terima kasih sebelumnya….