Selamat datang di ForSa! Forum diskusi seputar sains, teknologi dan pendidikan Indonesia.

Welcome to Forum Sains Indonesia. Please login or sign up.

Desember 06, 2024, 05:46:54 AM

Login with username, password and session length

Topik Baru

Artikel Sains

Anggota
Stats
  • Total Tulisan: 139,653
  • Total Topik: 10,405
  • Online today: 47
  • Online ever: 1,582
  • (Desember 22, 2022, 06:39:12 AM)
Pengguna Online
Users: 0
Guests: 26
Total: 26

Aku Cinta ForSa

ForSa on FB ForSa on Twitter

[ASK] Komunikasi Serial

Dimulai oleh frans3q, Agustus 02, 2009, 06:10:37 PM

« sebelumnya - berikutnya »

0 Anggota dan 1 Pengunjung sedang melihat topik ini.

frans3q

#15
nanya lagi :
1. until UDRE guna nya apa ya???

2.  program nya toopayz kalau saya teken tombol keyboard terus2an ntar uC ny ga mau ngrespon lagi knp ya? kayak yg ng hang gt.
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

frans3q

too payz :
gw coba balik, jadi kondisi nya 0x00 semua LED nyala. klo 1 mati. koq LED nya kedip2 gt ya?

kayak yg ngrefresh terus. dan response ny lambat banget.


while (1)                           
      {
      // Place your code here
      datarx = getchar();
         if (datarx=='a')        { PORTA.4=1; PORTA.5=0; PORTA.6=1; PORTA.7=0; delay_ms(1000); PORTA = 0x00;} 
         else if (datarx=='s')   { PORTA.4=0; PORTA.5=1; PORTA.6=1; PORTA.7=0; delay_ms(1000); PORTA = 0x00; }   
         else if (datarx=='d')   { PORTA.4=0; PORTA.5=1; PORTA.6=0; PORTA.7=1; delay_ms(1000); PORTA = 0x00;}
         else if (datarx=='w')   { PORTA.4=1; PORTA.5=0; PORTA.6=0; PORTA.7=1; delay_ms(1000);  PORTA = 0x00;}
     datarx ='';   
     
      };
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

Too Payz

Kutip dari: frans3q pada Agustus 08, 2009, 05:25:22 PM
too payz :
gw coba balik, jadi kondisi nya 0x00 semua LED nyala. klo 1 mati. koq LED nya kedip2 gt ya?
Kedap-kedipnya berapa lama? tiap 1 detik ?   ???
Kalo tiap 1 detik ya memang benar kan ada delaynya 1 detik trus abis 1 detik LED dimatikan lagi. Jika mau LED menyala hanya saat tombol ditekan (ada karater-nya) kemudian jika tombol dilepas barulah LED mati, cukup dengan mengurangi delaynya misalnya delay_ms(100); dan tambahkan fugsi jika bukan 'a', 's', 'd', 'w' barulah LED d matikan. yaitu tinggal tambahkan

else PORTA=0x00; // jika Katoda LED ke ground (common katode) atau
else PORTA=0xff; // jika Anoda LED ke VCC (common anode).

Btw jgn lupa PORTA=0x00 dalam if-nya ilangin dan harus tau konfigurasi LED-nya common anoda atau common katoda.

frans3q

#18
Kutip dari: micro pada Agustus 06, 2009, 06:50:14 AM
saya coba buat tp blm di coba buat silahkan dicoba...
bagian if nya di isi kenginan.,misal jika huruf a di tekan maka led pada PORTC berubah., ;D

#include <mega8535.h>
#include <stdio.h>
#include <delay.h>

// Declare your global variables here
//unsigned char datax[8],i;
unsigned char datarx;

void kirim_serial(unsigned char datatx)
{
//UART data register empty, Until UDRE = 1
UDR=datatx;             //Serial buffer content
while(!UCSRA.6);        //Until TXC = 1
UCSRA.6 = 1;            //Reset TXC with 1
}

void terima_serial()
{
//while(!UCSRA.5);   //UART data register empty, Until UDRE = 1
while(!UCSRA.7);        //Until RXC = 1
datarx=UDR;
//datax = datarx;         //Serial buffer content
delay_ms(2);
UCSRA.7 = 1;            //Reset RXC with 1
}

void main(void)
{
PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x00;

// 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=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;

ACSR=0x80;
SFIOR=0x00;

while (1)
      {
      // Place your code here
       terima_serial();
       if (datarx=di isi dengan yang diinginkan)
       {PORTC=di isi dengan keinginan}
       else
       {PORTC=di isi dengan keinginan}
      kirim_serial(datarx);
      //kirim_serial(datax);
     
      };
}



sama sekali ga k terima datanya. LED nya gw taro d PORT A. kondisi nyala nya 0. kondisi mati nya 1.

gw uda set PORT A jd output. inisiasi nya PORTA = 0x00; DDRA = 0xFF;
ini while (1) nya :
       terima_serial();
       if (datarx== 0x77) //key w
       {PORTA = 0x0A;}
       else if (datarx== 0x64) // key d
       {PORTA= 0x05;}
       else
       {PORTA = 0x00;}

yg ada semua LED nya nyala sambil blink ing cepet.
harus ny saat gw teken tombol keyboard ada bbrpa LED yg mati.



@tupai :
blink ny cepet banget.
dah gt jd ga respon sama input.
kayak ny dia ngulang2 mati in LED sama ngidupin LED terus2an, jd ga bisa nerima input.

ga ngerti common anoda ato common katoda.
inti nya klo Low Nyala klo High Mati. jadi klo 0x00 nyala semua.  klo 0xFF mati semua LED nya.

gw isi program ny :
         if (datarx=='a')        { PORTA.4=1; PORTA.5=0; PORTA.6=1; PORTA.7=0; delay_ms(1000); PORTA = 0x00;} 
         else if (datarx=='s')   { PORTA.4=0; PORTA.5=1; PORTA.6=1; PORTA.7=0; delay_ms(1000); PORTA = 0x00; }   
         else if (datarx=='d')   { PORTA.4=0; PORTA.5=1; PORTA.6=0; PORTA.7=1; delay_ms(1000); PORTA = 0x00;}
         else if (datarx=='w')   { PORTA.4=1; PORTA.5=0; PORTA.6=0; PORTA.7=1; delay_ms(1000); PORTA = 0x00;}
     datarx ='';   



kalo bole sekalian minta list perintah2 yg bisa d pakai di CV AVR buat ngirim/terima data ke Terminal.
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

Too Payz

Hmm.....   :-\   :-\
Blinknya cepet banget yaa.... aneh.. aneh...
Ini pake programmer serial AVR910 yang USB itu yaa...
Pake power supply atau supply minta dari USB.
Kalo minta dari USB wajar saja dia blink-nya cepet karena supply dari USB hanya untuk mendownload saja n g cukup tuk digunakan menyalakan LED yg banyak (8 LED).
Itu nge-blink karena sistem baru menyala sebentar trus mati lagi (mirkonya reset).

Kalo masalah perintah-perintah, coba baca Library dan HELP-nya CoViAVR dengan seksama dan searching dari internet... tar ilmunya lebih banyak dari yang diharapkan   :kribo:   :kribo:

Met berusaha aja..  ;)   ;)

frans3q

#20
gw tambah bingung.... AVR910 kan programer. klo uda beres ngprogram uC,
AVR910 nya d cabut. dah gt baru colok LED nya.

jd apa hubungan ny LED ama USB??? 2 alat itu ga pernah terhubung k uC bersamaan.




gw jg dari awal cari sana sini. google sana sini. posting sana posting sini.
gw uda baca. tapi ga ngerti baca help ny CV AVR. gw tanya d sini aja ya.

1.
misal ny yg putchar.
kan klo toopayz ngasi contoh nya : putchar(data_rx); --> prosedur
klo data_rx = getchar(); --> function

nah klo
void putchar (char c); ----> ini apaan?
knp d dpn ny pake void??? dan knp parameter ny aneh gitu??? klo data_rx kan bisa d definisi in dulu sbg unsigned char misalnya.

2. void putsf(char flash*str);
arti nya char flash*str tuh apa ya?

3. penjelasan ny bilang : output using putchar the null terminated character string str, located in FLASH.
klo yg void puts(char*str) d bilangnya located in SRAM.
bedanya located in FLASH & SRAM dalam penggunaannya gmn? apa yg d SRAM perlu perintah dulu biar k kirim?

tq too payz
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

Too Payz

Kutip
gw tambah bingung.... AVR910 kan programer. klo uda beres ngprogram uC,
AVR910 nya d cabut. dah gt baru colok LED nya.
jd apa hubungan ny LED ama USB??? 2 alat itu ga pernah terhubung k uC bersamaan.
Ow kirain bersamaan, karena umumnya kalo masih coba" program, downloader USB-nya g d cabut.
Kutip
kan klo toopayz ngasi contoh nya : putchar(data_rx); --> prosedur
putchar(data_tx);
Kutip
nah klo
void putchar (char c); ----> ini apaan?
knp d dpn ny pake void??? dan knp parameter ny aneh gitu??? klo data_rx kan bisa d definisi in dulu sbg unsigned char misalnya.
Micro membuat fungsi sendiri dengan nama putchar dan tidak ada return value makanya parameternya void (hampa / kosong).
Parameter terserah programmernya selama dia memahami program-nya tersebut. Tetapi usahakan sesederhana mungkin, sesuai, dan tepat dengan kebutuhan.
Kutip
2. void putsf(char flash*str);
arti nya char flash*str tuh apa ya?

3. penjelasan ny bilang : output using putchar the null terminated character string str, located in FLASH.
Artinya tipe data char dengan nama variabel str dan disimpan flash memori mikrokontroler. Kalo * saya kurang paham tetapi seperti array yang fleksibel banyaknya tergantung nilai str-nya hingga menemukan nilai null. Jika tidak terdapat data (null) pada str-nya maka akhir data str dan fungsi putsf() selesai, kalo dalam bahasa C seperti menulis if (str[*)==null) break; (nb : harusnya kurung tutup kotak tapi g bisa.)

Misal ditulis putsf("test USART");
nah *str nilainya yaitu
str[0]='t', str[1]='e', str[2]='s', str[3]='t', str[4]=' ',
str[5]='U', str[6]='S', str[7]='A', str[8]='R', dan str[9]='T'.
Kutip
klo yg void puts(char*str) d bilangnya located in SRAM.
bedanya located in FLASH & SRAM dalam penggunaannya gmn? apa yg d SRAM perlu perintah dulu biar k kirim?
Bedanya  apa yaa?? lom pelajari sih..  ???
Tapi ini sebagai informasi ke programmer saja dan kita hanya perlu tahu cara menggunakannya saja dulu. Kalau mau lebih jauh lagi ... ??
Hmmm...... :-\   :-\

Btw kalo tau kabarin yak.  ;D
Oiya program yang kutulis ud kucoba n g masalah tuh..

frans3q

#22
berarti masalah nya. d uC gw.... T.T

tq Too Payz. skr uC gw ngadat lagi. mo d erase dulu pake STK 500. ntar gw coba lagi.

nanya lagi :
1. klo yg dikim dari HyperTerminal tuh berupa apa sih?

misal ny teken tombol keyboard 1, LED 1 nyala. tombol angka 2 LED 2 nyala.
nantinya tetep d perlakuin sbagai char ato sbagai angka d program nya?

if (datarx=='1') atau
if (datarx==1)


2. trus gmn cara nya klo qt pe ngen ngirim byte dari PC k uC. misal ny pengen ngirim 0000 1111
hex ny 0x0F. cara ngirim ny gmn ya?
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

Too Payz

Kutip
nanya lagi :
1. klo yg dikim dari HyperTerminal tuh berupa apa sih?
berupa ASCII coba search tentang ASCII.
Kutip
misal ny teken tombol keyboard 1, LED 1 nyala. tombol angka 2 LED 2 nyala.
nantinya tetep d perlakuin sbagai char ato sbagai angka d program nya?

if (datarx=='1') atau
if (datarx==1)
sebagai ASCII karena tombol keyboard nilainya adalah ASCII maka karakter '1' = 0x31 heksadesimal sedangkan nilai 1 = 0x01 heksadesimal.
Kutip
2. trus gmn cara nya klo qt pe ngen ngirim byte dari PC k uC. misal ny pengen ngirim 0000 1111
hex ny 0x0F. cara ngirim ny gmn ya?
Bisa saja anda kirim nilai 0x0F tersebut tetapi programmingnya (dengan DELPHI, Visual C, BASIC, dll) akan sedikit membingungkan.
Agar program anda fleksibel dan bisa d pahami anda ataupun orang lain (misalkan ada yg mo ngembangin nantinya) usahakan komunikasi data dengan komputer berupa ASCII juga

Jadi kalo datanya 0000 1111 dan anda membutuhkan kedua data tersebut terpisah maka konfersi dulu ke ASCII yaitu dibagi menjadi 2 kali pengiriman pengiriman pertama nible atas kemudian nible bawah.

Nible atas 0000 = dikonversi jadi '0' = 0x30;
Nible bawah 1111 = dikonversi jadi 'F' = 0x46;

OK... ;D   ;D

frans3q

1. i see. klo ASCII gw ngrti.

2. mksd ny gini. misal ny buat driver motor dc. misal ada 2 motor DC kiri ama kanan.
00 = stop; 01 = CW; 10 = CCW;
berarti perlu 4bit kan? (1motor 2bit, x2 motor).
misal ny mo bikin RC sederhana. jadi perintah dari PC --> uC --> Motor DC.

dari pada bikin program d mikro pake if() ato pake switch() trus d masuk in bnyk2 k FLASH uC, lebih efisien kalo dari PC nya ngirim data byte format 4bit kan? ntar tinggal d atur 4bit nya jdi MSB ato LSB d PORT X.



Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

Too Payz

Kutip
2. mksd ny gini. misal ny buat driver motor dc. misal ada 2 motor DC kiri ama kanan.
00 = stop; 01 = CW; 10 = CCW;
berarti perlu 4bit kan? (1motor 2bit, x2 motor).
misal ny mo bikin RC sederhana. jadi perintah dari PC --> uC --> Motor DC.

dari pada bikin program d mikro pake if() ato pake switch() trus d masuk in bnyk2 k FLASH uC, lebih efisien kalo dari PC nya ngirim data byte format 4bit kan? ntar tinggal d atur 4bit nya jdi MSB ato LSB d PORT X.
Nah terus kira-kira gmana codingnya...
:-\  :-\

frans3q

nah itu yg bikin gw bingung. ???

klo d uC ny tinggal PORTX = Datarx;
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

frans3q

#27
balik lagi k sample program yg buat ngatur LED dari keyboard PC.

gw masi stuck sampe skr. too payz, source code lengkap ny bole d share d sini? katanya uda berhasil ya?

gw bingung LED ny blink cepet banget. mirip klo jalan in perintah gini :
while (1) {PORTA =0x00; PORTA = 0xFF}
krn ga ada delay jadi ny blink cepet.

dan ga mau nerima perintah dari keyboard.
gw coba jalan in pake ext XTAL High Freq. d set nya jalan di 11MHz. ngaruh ga ya?

hyper terminal ny uda d cek baud rate, parity dll. mode di board AVR ny juga uda d set UART RS232, bukan yg TTL.
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

Too Payz

#28
Ya udah coba secara bertahap g usa buru".
Kutip
gw bingung LED ny blink cepet banget. mirip klo jalan in perintah gini :
while (1) {PORTA =0x00; PORTA = 0xFF}
krn ga ada delay jadi ny blink cepet.
Kalo nyalain LED tiap 1 detik udah bisa kan.

Kutip
hyper terminal ny uda d cek baud rate, parity dll. mode di board AVR ny juga uda d set UART RS232, bukan yg TTL.
Coba buat program terima dan kirim kembali, siapa tau tidak terjadi komunikasi data.
MIsal keyboard ditekan 'A' diterima mikro trus mikro balasnya 'A'+1 atau = 'B'.
Jika dikomputer ada tampilan balasan berarti komunikasi terjadi. Harusnya udah g salah lg tuh.

test 1 => coba LED on off 1 detik
test 2 => komunikasi serial
while(1)
{
   dataRX = getchar();
   putchar(dataRX+1);
}
test 3 => penggabungan
while(1)
{
   dataRX = getchar();
   PORTB = dataRX;      // posisi PORT LED
}

frans3q

#29
nanya lagi nih,
1. nemu istilah aneh.
DCD - Data Carrier Detect
DSR - Data Set Ready
DTR - Data Terminal Ready
RTS - Request to Send
CTS - Clear To Send
ada yg tau arti ny apa?

2. ada yg tau cara pake putsf(). puts() dan printf() buat ngirim data pake UART? gw coba gagal semua, yg berhasil cuma pake putchar();

@Too Payz
gw coba bikin program isi nya cuma :
datarx = terima();
putchar(datarx);
delay_ms(50);

harus nya apa yg d ketik dari keyboard d kirim ulang kan? tapi itu ga ke kirim apa2. gmn caranya ngecek kalo data yg d kirim dari PC uda k terima sama uC nya ya?
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D