Rs232 baud ve Windows7/CCS C Terminal Sorunu

Başlatan vitruvius, 22 Nisan 2011, 15:20:45

vitruvius

Merhaba, PIC ile yapacağım ilk proje için çalışmalar yapıyordum ve CCS C ile PIC Programlama kitabını aldım. Projemde rs232 kullanacağım için orada klavyedeki değerleri lcd ekranında gösteren örneği denemek istredim fakat  "Baud rate out of range" hatasını alıyorum. İlk projem olduğunu göz önünde bulundurarak izah ederseniz sevinirim. Bu arada bu sorunu aşarsam Lm35 ile Pc arasında iletişim kurmayı yapmak istiyorum ancak bu baud'un değerini neye göre ayarlıyoruz?

Bir diğer sorun ise Windows 7 kullandığım için Hyper Terminal programı yok, alternatif gösterebilir misiniz? Forumda FxDev adlı üye http://www.fxdev.org/serial-port-terminal/  linkini vermiş fakat oradaki indirme linki Telekom tarafından engellenmiş dolayısıyla indiremiyorum. CCS C'nin içinde de bu işleri gören program varmış. Tools- Serial Port Monitor'den girmek istediğim zaman "ie_BadId - Specified comport doesn't exist" diyor. Sanırım setupla alakalı bir sorun. Ok dediğim zaman Comport Options çıkıyor fakat "Comports" seçemiyorum.

İlk paragraftaki sorunum için kodu ve devremin resmini aşağıda paylaşıyorum.

Teşekkürler.

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=400000)
#define use_portb_lcd TRUE
#include <lcd.c>
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)
char klavye[80];
#int_rda
void serihaberlesme_kesmesi ()
{
disable_interrupts(int_rda);
output_high(pin_c5);
gets(klavye);
printf("\n\rYazdiginiz Metin>  %s\n",klavye);
printf(lcd_putc,"\f%s",klavye);
output_low(pin_c5);
printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>");
}
void main ()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

output_low(pin_c5);
lcd_init();
printf("\r****Merhaba****");
printf("\n\rKlavyeden  girdiginiz bilgiler LCD'de gorunecek\n\n");
printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>");
enable_interrupts(GLOBAL);
while(1)
{enable_interrupts(int_rda);
}
}


Devre resmi:

yamak

Bir seye gore ayarlamiyoruz sen devrenin baud hizini kaca ayarlarsan bilgisayarinkiyi de ayni degere ayarlamalisin ama yine de bence 19200 u gecme gerekmedikce eger proteusta sorun yasiyosan virtual terminal tool unun baud hizini da 9600 yapmis oldugununa dikkat et ayrica normal yazan yeri inverted yapmalisin

vitruvius

Proteus dediğiniz gibi ayarlı ancak "Baud rate out of range" sorununu CCS C'de Compile ederken alıyorum. Teşekkür ederim cevabınız için.

GreeN

Merhaba
#use delay(clock=400000) //bu kısmı buraya aktarırken yanlışlık yapmadıysan sorun burada.

#use delay(clock=4000000)//4.000.000 şeklinde ayarla.
Terörü Lanetliyoruz.

dumansiz

Sen bu dereyi breadboard veya PCB ye mi kurdun mu, yoksa "Proteus"la mı deniyorsun? Vs(+) ya bağladığın 5V da işi bozuyor olabilir.Gerçek devrede karşı tarafta masaüstü PC olacaksa;  bence orası 9-12 V arasında bir değer olmalı.

Seriport terminal ve monitor:
http://www.sudt.com/download/AccessPort134.zip

tufican

arkadaslar comport toolkit programını oneriyorum gayet güzel ayrıca çalışma ekranı nı menüden dark yapıyorsunuz ve siyah zemin üzerine yeşil yazılar matrix gibi insana ilham veriyor ve cok rahat datalar seçiliyor :D
insanın gerçekten isteyipte yapamıcağı bişey oldugunu düşünmüyorum

vitruvius

Cevaplar için çok teşekkür ediyorum. GreeN arkadaşımızın dediği gibi gözümden kaçmış o kısım. Düzeltince sorun giderildi. Şimdiki sorun da simulasyonu ilk denediğimde (Proteus'ta) Virtual Terminal bir pencere açmıştı, incelediğim örneklerde de açılmıştı. Şu an o pencere açılmıyor, lcd de boş ekran gözüküyor. Onun sebebi nedir acaba?

Teşekkürler.

vitruvius

Sorunu çözdüm Virtual Terminal'i x işareti ile kaptınca sağ tıkalyıp açmak gerekiyormuş.

hoca

arkadaşlar ccs c dilinde 16f877a ile rf ile haberleşme ile uğraşıyorum.8 butonla 8 ledi kontrol edebiliyorum.sonra butona basarak karşı taraftaki lcd deki rakamları arttırmaya çalıştım ancak bi sorun çıktı.ben tuşa basmadan rakamlar kendi kendine artıyor.hata nerde olabilir iştan anlayan yardımcı olacak arkadaş varmı?

vitruvius

Yapabileceğimden değil ama yapabilecek olanlar için de yazdığınız kodu ve devrenizi koymanızda fayda var.

hoca

vericide c portuna butonları bağladım c0 a bağlı butona basılınca alıcıdaki lcdnin 5 er 5 er artmasını istiyorum alıcıda kullandığım yazılım şöyle;
#define use_portb_lcd TRUE
#include <lcd.c>
long int x;
int al=0;
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

x=0;
lcd_init();
while(1)
{
al=getch();
printf(lcd_putc,"\f  %Lu cm ",x);
delay_ms(200);
if(al==1)
{
x=x+5;
delay_ms(400);
printf(lcd_putc,"\f  %Lu cm ",x);
delay_ms(100);
}

}
}

hoca

yokmu şu işten anlayan birisi ya devre kurulu bekliyom öyle kaç gündür

GreeN

Vericiden 1. butona bastığında 1 verisinimi gönderiyorsun?

int al=0;
yerine tanımla,
char al; //8 bit char değişkeni alır.

if(al=='1')
{
x=x+5;
delay_ms(400);
printf(lcd_putc,"\f  %Lu cm ",x);
delay_ms(100);}
Terörü Lanetliyoruz.

hoca

#13
kardeş allah razı olsun cevap yazmışsın vericinin komutları aşağıda .alıcıda dediğini yaptım bu seferde sadece 0 gösteriyo artmıyo tekrar yardımcı olursan sevinirim cevabını bekliyorum

int ver;
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
while(1)
{
ver=input_c();

putc(ver);
}}
devrede butonu c0 pinine bağladım verici pinini d0 alıcı pinini de d1 yaptım baud oranıda 2400 ayarladım

hoca

çok teşekkür ederim herşey için devre çalıştı gibi vericide c1 e basınca lcd de H karakteri çıktığını gördüm o üzden komutu
if(al=='H') diye değiştirince çalıştı anlamadığım şey verici pikin c portlarına buton bağlayıp alıcı pikin c portlarına led leri bağlayınca aynı komutlarla hangi butona bassam o led yanıyordu şimdi olmadı neyse
şimdi merak ettiğim bi konu var 16f877a ile dışarıdan kristal osilatör bağlamadan kendi içindeki osilatörle çalıştırabilirmiyim ve nasıl?çünkü servo motor çalıştırıcam ve 50 hz lik sinyal lazım ama 4 MHZ lik kristallerle 50 hZ E İNMİYO 800 KHZLİK KRİSTAL LAZIM O DA PİYASADA YOK KOMUTLARLLA BU FREKANSI ELDE EDİYOM AMA PWM İLE SERVOYU ÇALIŞTIRMAK İSTİYORUM YARDIM EDENLERE ŞİMDİDEN TEŞEKKÜR EDİYORUM