İki Tane 16f628a 'nın rs232 haberleşme sorunu ( CCS C )

Başlatan muhendis.NT, 26 Şubat 2017, 20:48:17

muhendis.NT

Arkadaşlar 2 adet 16f628a yı rs232 ile seri haberleştirmek istiyorum.  Alıcı ve verici kodları ve devrenin proteus hali aşağıdadır. Simülasyonda gayet güzel çalışan devre breadboard'ta çalışmamaktadır.  Zaten kodları bu sitede bulmuştum. Aynı kodları 16f877a 'da deniyorum. Gerçek olarak breadboard üzerinde ve sistem çalışıyor. Ama 16f628a da çalışmıyor. Nedeni nedir lütfen yardım edin. Birde herhangi bir sigorta ayarı yapmadım.

Verici Kodları :
#include <verici.h>                                                              //"<" ile "Rx_haberlesme.h>" arasında boşluk bırakmayınız.
#use delay(clock=20Mhz)
#use rs232 (baud=9600, xmit=pin_B2, rcv=pin_B1, parity=N, stop=1)   //seri haberleşme işleminin başlangıcı için tanımlamız gereken yerdir.Baud hızı 9600,4800,2400,1200,300 vb. şekilde seçilebilir. xmit=MikroDenetleyicimizdeki Tx ucunun yeridir. rcv=MikroDenetleyicideki Rx ucunun yeridir.
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

void main()
{
set_tris_a(0xff);                                                                              //A portu giriş olarak ayarlandı.

while(TRUE)
{

if(input(PIN_A1) == 1) {
delay_ms(100);
while(input(PIN_A1)){
}
putc('a');
}



if(input(PIN_A0) == 1) {
delay_ms(100);
while(input(PIN_A0)){
}            
putc('b');             //6                                                                        //"a" karakterini yolla


}


}
}



Alıcı Kodları :
#include <alici.h>
#use delay(clock=20Mhz)
#use rs232 (baud=9600, xmit=pin_B2, rcv=pin_B1, parity=N, stop=1)
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection


void main()
{  
set_tris_a(0x00);

while(TRUE)
{

char gelen=getchar();                                      // gelen veriler char adındaki gelen adlı değişkene kaydediliyor


if(gelen=='a'){
output_high(PIN_A1);
delay_ms(500);
output_low(PIN_A1);  
delay_ms(500);                            // gelen karakter "a" ise LED i yak
}


if(gelen=='b'){                                              //gelen karakter "b " olduğunun da LED YAK ve 500 ms sonra söndür.
output_high(PIN_B6);
delay_ms(500);
output_low(PIN_B6);
delay_ms(500); 
}}}




vitruvius

Devreyi bu şekilde mi kurdun?
Sigorta ayarı neden yapmadın?
Kodunda a karakterini gönder deyip b karakterini gönderdiğinin farkında mısın?
Portların I/O ayarını yapmamışsın. Bu durumda standart olarak #use STANDARD_IO(Port) komutu işler ve set_tris_x() komutu bir etkide bulunmaz.
#INT_RDA kesmesini kullan seri iletişimde.

muhendis.NT

Alıntı yapılan: vitruvius - 26 Şubat 2017, 21:18:36
Devreyi bu şekilde mi kurdun?
Sigorta ayarı neden yapmadın?
Kodunda a karakterini gönder deyip b karakterini gönderdiğinin farkında mısın?
Portların I/O ayarını yapmamışsın. Bu durumda standart olarak #use STANDARD_IO(Port) komutu işler ve set_tris_x() komutu bir etkide bulunmaz.
#INT_RDA kesmesini kullan seri iletişimde.

Hocam gerçek devreyi aynen bu şekilde kurdum. Tabi besleme ve kristal felan var. İki pic'ide led yak söndür ile test ettim. Besleme ve osilatörler doğru yani.
Sigorta ayarlarını şimdi bildiğim şekliyle yaptım. Kodu güncelledim.
O dediğiniz kısmı da düzelttim. a gönder deyip a gönderiyor şimdi.
vericide a portu çıkış , alıcıda a portu giriş ayarladım. b portunu ellemedim.  haberleşme var diye.
16f877 'de rda kesmesi olmadan kullandım . Bu yüzden burada da rda kesmesi kullanmadan  yapmak istiyorum öteki türlü biraz karışık oluyor . Daha amatörüm.


dursuncemal

interrup kulanmayacagim diyorsan veriyi su sekilde almayi denermisin.?


    char gelen = 0;

    while( gelen!= 'a'){ gelen =  getchar(); }
:=

muhendis.NT

#4
Alıntı yapılan: dursuncemal - 27 Şubat 2017, 00:05:13
interrup kulanmayacagim diyorsan veriyi su sekilde almayi denermisin.?


    char gelen = 0;

    while( gelen!= 'a'){ gelen =  getchar(); }
Hocam dediğinizi deneyeceğim.  Alıcıyı yeni bir kodla denedim. Kesme kullandım. Yine olmadı. Bu örneklerle ilgili basic'de örnekler var. En son ccs c yi bırakıp  basic'e başlayacağım.

#include <alici.h>
#use delay(clock=20Mhz)
#use rs232 (baud=9600, xmit=pin_B2, rcv=pin_B1, parity=N, stop=1)

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT, NOCPD



#int_rda   
void serihaberlesme_kesmesi (){

disable_interrupts(int_rda); 
char gelen=getchar(); 
if(gelen=='a'){
output_high(PIN_A1);
delay_ms(500);
output_low(PIN_A1);  
delay_ms(500);                            // gelen karakter "a" ise LED i yak
}


if(gelen=='b'){                                              //gelen karakter "b " olduğunun da LED YAK ve 500 ms sonra söndür.
output_high(PIN_a0);
delay_ms(500);
output_low(PIN_a0);
delay_ms(500); 
}
 
}
 


void main()  
{  

 
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_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
 
          // CCP2 birimi devre dışı

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

set_tris_a(0x00);
set_tris_b(0b00000010);
output_a(0x00);
while(TRUE)
{
enable_interrupts(int_rda);

}}

ferdem


muhendis.NT

Alıntı yapılan: ferdem - 27 Şubat 2017, 23:04:15
Şuradaki kodla deneyin:
https://www.picproje.org/index.php/topic,37533.msg272978.html#msg272978

Kesme içinde delay kullanmayın.

Hocam Allah razı olsun senden senden. Sayende sorun çözüldü. Çalışıyor. Demek ki 16f628 'de haberleşme yapacaksa rda kesmesi kullanmak gerekiyor.  Peki bir haberleşme projesinde pic'in dahili osilatörünü kullanmamda ve mclr kullanmamamda sıkıntı olur mu ?

ferdem

Eyvallah, amin, cümlemizden. MCLR reset görevi görüyor, kullanmak şart değil, kullanılmadığında doğru voltaj değerinde tutulduğundan emin olunsun yeter(pull-up). Harici, dahili osilatörlerin farkı zaman kritik uygulamalarda ortaya çıkar. Hariçten bağlanan kristaller dahili RC tip osilatörlere göre daha doğru ve daha kararlı olur. Örneğin tam bir saniye zaman tutmak istiyorsunuz, tipik 4 MHz bir kristal ile +-5 us ye kadar doğruluk elde etmek mümkün, ppm özellğine bakılır. Bir de dahili osilatörle deneyin daha kötü bir hassasiyet çıkar ve zamanla değişme ihtimali de yüksek.
9600 baud da haberleşmek için harici, dahili fark etmez diye düşünüyorum.

muhendis.NT

Eyvallah hocam. Bluetooth ile haberleşen bir devre kuruyorum.  Beslemede lm2576 kullanıyorum yani kararlı bir voltajım olacak. Şimdi devreyi sizin önerdiğiniz kodla yaptım. Birde harici kristal osilatör kullanarakta deneyeceğim. Eğer o şekilde de olursa harici kullanacağım. Çünkü pcb si hazır hariciye göre.  Muazzam hassas zamanlamaya ihtiyacım yok.  Yardımlarınız için çook teşekkür ediyorum gerçekten.