Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

rs232 ile pic haberleşme sorunu

Başlatan engineer42, 25 Nisan 2012, 01:45:12

engineer42

iyi geceler arkadaşlar...
bi sorun var bi de sorum var... 16f628 ile max232 entegresinin haberleşmesinde problem var yazılım biraz acemi hatta gayet acemi oldu bağlantılarda da bi sorun yok sanırım... kodu buraya veriyorum...
#include<16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#byte port_b=6
#use delay (clock=4000000)

#use fast_io(a)
#use fast_io(b)
 
#define port_b0 g1
#define port_b1 g2
#define port_b3 g3
#define port_b4 g4
#define port_b5 g5
#define port_b6 g6
#define port_b7 g7

#use rs232 (baud=9600, xmit=pin_b2,parity=N,stop=1)

int g1,d1,g2,d2,g3,d3,g4,d4,g5,d5,g6,d6,g7,d7;

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
    
   while(1)
   {
   printf("\r*************MERHABA********\r\n");
   
  
if(input(port_b0))
d1=1;
else
d1=0;
if(input(port_b1))
d2=1;
else
d2=0;
if(input(port_b3))
d3=1;
else
d3=0;
if(input(port_b4))
d4=1;
else
d4=0;
if(input(port_b5))
d5=1;
else
d5=0;
if(input(port_b6))
d6=1;
else
d6=0;
if(input(port_b7))
d7=1;
else
d7=0;

printf("\n gelen veri degeri %d",d1);
puts(d2); 
puts(d3);
puts(d4);
puts(d5);
puts(d6);
puts(d7);
}
}


birde ben dip switclerden gelen veriyi bilgisayardan görmek istiyorum... projenin aslında 16f877 ve 4 tane 7 çıkışlı dip switch kullanacam sadece denemek için bu programı yazdım.. bu programda g1,g2... ve d1,d2... değerlerini daha kısa ve basit nasıl yazabilirim ? şimdiden teşekkür ederim herkese....

skara1214

siz transmit bacağını tanımlamıssınız rcv bacağı yok ama receive kesmesi yapmışsınız.Ayrıca g serisi değişkenleri tanımlamışsınız ama hiç değişmiyorlar ne ile test ediyorsunuz?getch yada gets komutu yok ortalıkta?Tam olarak ne yapmak istediniz bu kodla?
Herkes ölür ama herkes gerçekten yaşamaz

engineer42

tam olarak dip switchin bilgilerini bilgisayarda görmem gerekiyor.. burda sadece 7 tane veri girişi var ama projenin orjinalinde 28 tane..  ilk olarak böyle bi program yazdım bi kaç hatamı da düzelttim... ama kesme  olayına tam hakim değilim açıkcası

skara1214

hocam kesmeden önce bilgisayarla haberleşme yapın kesmeyi sonra halledersiniz bunun içinde internette rs232 ccs c diye araştırın bulursunuz nasıl kullanıldığını.Bir diğer konuda  g değişkenlerini algılama oda input(g1) diye algılama yapacaksınız direk g1 diye olmaz.Define port_b0 diye birşey tanımlamıssınız bu tanımlamayı yapamassınız.İlk önce define x 0x05 gibi o portun hangi adresten başladığını tanıtacaksınız.daha sonra g1 v.s gibi tanımlama yapacaksınız.Bence ilk önce en basitinden led yakıp söndürün.Daha sonra biraz daha ilerlersiniz.(Dalga geçtiğimi düşünmeyin led yakıp söndürmek pici kontrol edebildiğinizi gösterir)
Herkes ölür ama herkes gerçekten yaşamaz

engineer42

yok hocam dalga geçtiğinizi düşünmem sonuçta bu işi kimse doğar doğmaz öğrenmedi ayrıca burda bildiğim kadarı ile paylaşımlar gönül rızası ile yapılıyor... pic ile led yakıp söndürebiliyorum bir kaç proje daha yaptım daha öncesinde ancak elimde serdar çiçek in kitabı var ordan birşeylere bakarak onları kendi projeme uygulayarak yazıyorum sürekli o yüzden biraz karışık olmuş olabilir... kesme demişiniz bu konuyu biraz daha açabilir misiniz?

engineer42

hocam bi kaç hata mı daha gördüm :) benim kesme ile herhangi bir işim yok o yüzden programdan kaldırdım...daha sonra if kontrolünde input fonksiyonunu kullandım.. şimdi seri porta göndermek için putc() fonksiyonumu kullanmalıyım yoksa diğerlerinden birini mi?( hataları kendim bulunca daha kalıcı oluyor  :))

skara1214

Alıntı yapılan: engineer42 - 25 Nisan 2012, 22:06:47
hataları kendim bulunca daha kalıcı oluyor  :))
iyi hiç yardım etmeyelim o zaman  :)  .Putc komutu tek bir karakter gönderir eğer bir string yollamak istiyorsanız printf() komutu kullanmanız gerekiyor.
Herkes ölür ama herkes gerçekten yaşamaz

engineer42

hocam ben şimdi bitin durumunu kontrol etmiş oluyorum bilgisayara gönderdiğim veri karakter oluyor galiba... bide yukarıda ki kodu da yeniledim en son şekli ile orda... fakat proteus dasimülasyon yaparken max232 nin tx pininde hiçbir hareketlilik yok... :(

skara1214

en kısa sürede bakıp size örnek bir isis ve kod yollarım
Herkes ölür ama herkes gerçekten yaşamaz

skara1214

Serdar Çicek hocanın kitabından rs232 örneği...

/******************************************************
      PIC16F877 ile RS232 Seri Ä°letiÅŸim Uygulaması
PIC PROG/DEKA     : Port B jumper'ı LCD konumunda olmalı
*******************************************************/

#include <16f877.h>     // Kullanılacak denetleyicinin baÅŸlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#define use_portb_lcd TRUE   // LCD B portuna baÄŸlı

#include <lcd.c>   // lcd.c dosyası tanıtılıyor

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 protokolünün 9600 bit/sn baud hızında olacağını ve
                                                                  // TX,RX uçlarının hangi pinler olacağını tanımlıyor
                                                                  // parity bitinin olmadığını, stop bitinin 1 bit olacağı belirtiliyor

char   klavye[80];  // klavye isminde 80 üyeli bir dizi tanımlanıyor

#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap
   output_high(pin_c5);  // RC5 çıkışı lojik-1
   gets(klavye); // String ifadeyi al ve "klavye" adlı dizi deÄŸiÅŸkenine aktar.
   printf("\n\rYazdiginiz Metin>  %s\n",klavye); // Satır atla, yeni satır,RS232 üzerinden klavye string ifadesini gönder,satır atla
   printf(lcd_putc,"\f%s",klavye);  //LCD'yi temizle ve klavye string ifadesini LCD'de göster
   output_low(pin_c5); // RC5 çıkışı lojik-0
   printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder
}

/********* ANA PROGRAM FONKSÄ°YONU********/

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriÅŸ yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   output_low(pin_c5); // RC5 çıkışı ilk anda sıfırlanıyor
   lcd_init();   // LCD'yi hazırla

   printf("\r**************** Merhaba *********************"); // Yeni satır, RS232 üzerinden belirtilen metni gönder ve satır atla.
   printf("\n\rKlavyeden girdiginiz bilgiler LCD'de gorunecektir\n\n"); // Satır atla, yeni satır, RS232 üzerinden belirtilen metni gönder
   printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder

   enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver

   while(1) // Sonsuz döngü
   {
      enable_interrupts(int_rda); // int_rda kesmesi aktif
   }
}


Herkes ölür ama herkes gerçekten yaşamaz

engineer42

hocam bu programa göre bilgisayara veri gidiyor ve bilgisayardan veri alınıyor. alınan veri de lcd de gösteriliyor.. o kesme de bilgisayardan veri gelince oluşan kesme galiba.. birde char diye birşey tanımlanmış bunu da anlamadım...cevaplarsanız sevinirim...

skara1214

char karakter tanımlamalarında kullanılır.Siz bilgisayardan verileri string olarak(yani char dizisi) olarak alırsınız o yüzden bilgisayardan birşey okurken char tipinde stringlere atamanız gerekli.Bunun dışında anlamadığınız hangi nokta vr
Herkes ölür ama herkes gerçekten yaşamaz