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

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

Oktober 07, 2022, 02:09:50 PM

Login with username, password and session length

Topik Baru

Artikel Sains

Anggota
Stats
  • Total Tulisan: 139,637
  • Total Topik: 10,394
  • Online today: 36
  • Online ever: 441
  • (Desember 17, 2011, 09:48:51 AM)
Pengguna Online
Users: 0
Guests: 23
Total: 23

Aku Cinta ForSa

ForSa on FB ForSa on Twitter

kasi tau dong dimana salahnya programku ini...

Dimulai oleh manik_ask, April 04, 2010, 01:03:03 PM

« sebelumnya - berikutnya »

0 Anggota dan 1 Pengunjung sedang melihat topik ini.

manik_ask

aku bikin program sensor suhu yang tar datanya dikirim ke PC n jika aku ngirim hex dari PC ke mikro, standar suhu buat ngidupin kipas berubah..

while (1)
      {
      // Place your code here
      dtadc0=read_adc(4);
      printf("%i",dtadc0);
      delay_ms(3000);
      if (i==0){
                x=0x14;
                kipas1();
                while ((UCSRA & (1<<RXC))){
                buffer=UDR;
                i=i++;
                sprintf(buf,"%x h",buffer);
                lcd_gotoxy(0,1);
                lcd_puts(buf);             
               }
               };
      if (i!=0) {
                x=buffer;
                kipas1();
                while ((UCSRA & (1<<RXC))){
                buffer=UDR;
                i=i++;
                sprintf(buf,"%x h",buffer);
                lcd_clear();
                lcd_gotoxy(0,1);
                lcd_puts(buf);
                };
                };

}




void kipas1()
{       
        a=x;
        b=a+0x05;
        c=b+0x05;
        if (dtadc0<a)
        {
        OCR0=0x00;
        printf(" kipas 1 off ");
        delay_ms(3000);       
        }
        else {
                if (dtadc0<b)
                {
                OCR0=0x80;
                printf(" kipas 1 on kecepatan 1 ");   
                delay_ms(3000);
                }
                else {
                        if (dtadc0<c)
                        {
                        OCR0=0xC0;
                        printf(" kipas 1 on kecepatan 2 ");   
                        delay_ms(3000);
                        }
                        else {
                                OCR0=0xFF;
                                printf(" kipas 1 on kecepatan 3 ");   
                                delay_ms(3000);
                                };
                        };
                };
     
}   


ketika aku ngirim hex 1E (30 dlm desimal) dari PC ke mikro, data hex itu bisa muncul di LCD tapi ga ngubah nilai x..
adakah yg salah dengan programku??
mohon bantuannya ya..

     

manik_ask

oya, sebelum while (1), aku udah inisialisasi i=0...

waktu di kompile, ga ada program yg eror ato warning kok..

Too Payz

Hmmm....   :(    :(
Kesalahan umum (seperti masa lalu)
Coba flowchart-nya dulu atau state chartnya...
Samakan persepsi baru coding bisa dibuat..

Protokol komunikasi bagaimana PC ke MCU dan MCU ke mikro..
Dan komunikasi jangan nilai Heksadesimal..
Agak susah dipahami.. pakai karakter ASCII aja...

gara-gara perintah ini programmu bisa nyangkut karena menunggu "perintah" dari PC.
Ga ada perintah maka program berhenti.
while ((UCSRA & (1<<RXC))){
                buffer=UDR;
                i=i++;
                sprintf(buf,"%x h",buffer);
                lcd_gotoxy(0,1);
                lcd_puts(buf);             
               }

dan kurung kurawalnya sepertinya salah posisinya, juga perintahnya kayaknya seperti ini :
while ( !(UCSRA & (1<<RXC)) ) { buffer=UDR;  }
                i=i++;
                sprintf(buf,"%x h",buffer);
                lcd_gotoxy(0,1);
                lcd_puts(buf);


Btw pembacaan suhunya setiap 3 detik ??
Sistem yang dimonitor suhunya berubah cepat atau lambat..
Kalau cepat,. 3 detik menurutku kelamaan..  :-\    :-\

manik_ask

mmmm....
maaf.., kalo banyak salahnya..
maklum newbie..

pertanyaanku:
1. state chart itu apa??
2. aku tu pengen bikin sistem monitoring suhu ruangan gitu. setiap beberapa detik sekali data suhu dan kondisi kipas dikirim ke PC secara terus menerus tanpa berhenti. makanya untuk awal aku bikin default batas suhu kipas idup(variabel a,b,c). maunya, jika suatu saat orang yg memonitoring lewat PC itu pengen batas suhu kipas idup itu berubah, dia ngirim sesuatu lagi (dalam programku itu ngirim batas suhu bentuk hex) buat ngubah variabel a,b,c di prosedur kipas.. 
trus gimana dong???
3. apa artinya while ((UCSRA & (1<<RXC))) sama while ( !(UCSRA & (1<<RXC)) ) sekalian jelasin?? apa efek terhadap program utama yg aku bikin sama program didalam kurung kurawal setelah while itu?? bukannya kalo hanya ngubah sesekali pake yg while ((UCSRA & (1<<RXC)))?? tolong dikoreksi ya kalo salah..
4. perlu interupt lagi ga, kalo komunikasi yg aku bikin itu dua arah?? (dlm sistem yg aku bikin itu, satunya terus menerus ngirim, lainnya cuma sesekali)
5. ngaruh ga besarnya delay yg aku kasi terhadap komunikasi 2 arah itu?? (berhubung aku komunikasi serialnya itu pake wireless, bwt mngantisipasi jarak yg jauh, makanya delaynya aku tambah )
6. oya, klo pake ascii, gimana ngprogram di mikronya?? maksudnya bentuk variabel a,b,c nya itu apa?? kan klo di program yg aku bikin di atas itu bentuknya hex.. trus, aku kan pake access port di PC nya, buat ngakses ascii caranya gimana?? (dlm access port kan data yg dikirim dlm bentuk char(text) n hex aja)..

maaf ya banyak banget nanyanya..
mohon bimbingannya lagi..
makasi..

manik_ask

eh nanya lagi..
protokol komunikasi itu maksudnya apa??

aduwh.. maaf ya banyak nanyanya..

kuin

intuksi yang aneh itu adalah intruksi menunggu perintah dari serial. sama halnya jika pakai intruksi getchar();

supaya gak berhenti kamu harus pakai interup serial dan setting buffer sebanyak 1 saja biar data lama bisa di terus di timpa sehingga kita dapat update terbaru terus. masalah ngambil data tinggal akses rx_buffer[0] aja. untuk tiap detik atau enggak terserah kamu bisa atur sendiri. di dalam program whilenya. tp usahakan untuk tiap detiknya juga menggunakan interrup timer counter. sehingga data akan di kopikan ke variable lain setiap interrup timer tersebut bekerja.

capek ni.....panjang deh pokoknya....coba interrup serial dulu aja.

manik_ask

interupt serial??
cara ngprogramnya gimana??

tapi btw, program yg aku bikin udah jalan kok..
aku rombak abis2an programnya..
udah beres sebenarnya..
hehehe..

eh, aku masih penasaran sama interupt serial, caranya gimana??
kayak INT0, INT1 gitu ya??

kuin

Kutip dari: manik_ask pada April 22, 2010, 11:05:49 AM
interupt serial??
cara ngprogramnya gimana??

tapi btw, program yg aku bikin udah jalan kok..
aku rombak abis2an programnya..
udah beres sebenarnya..
hehehe..

eh, aku masih penasaran sama interupt serial, caranya gimana??
kayak INT0, INT1 gitu ya??


iya....mirip seperti itu. dasar kosepnya sama seperti interup biasa. jadi data yang diterima dari serial selalu di tamung di buffer tidak ada satupun yang lost karena setiap ada data yang mau masuk maka pogram i interupt dulu untuk mengerjakan penyimpanan data. baru selanjutnya akan di lanjutkan lagi.

dengan menggunakan interupt ini kita gak harus nunggu data itu ada atau tidak jadi program gak terhenti seperti pada program yang biasa dengan intruksi aneh atau bisa diganti dengan getchar().

program akan jalan terus dan jika ada data masuk maka disimpan di buffer. jika butuh data dari serial tersebut tinggal panggil aja dari buffernya.

kalo pakai codevision AVR udah ada pilihannya di tab setting USART tinggal centang aja kok.