avatar_Mayhoş

PIC16F877 ile RS232 Bağlantı Hakkında Yardım

Başlatan Mayhoş, 11 Aralık 2019, 11:57:11

Mayhoş

#include <16F877.h>

#fuses XT,NOWDT,NOPROTECT

#use delay(clock=4000000)

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N)

#byte port_d = 8  
#byte port_b = 6

main() {

   int b0, b1, b2, b3, b4, b5, b6, b7, d0, d1, d2, d3, d4, d5, d6, d7;
   
   set_tris_b(11111111);  
   set_tris_d(11111111);  
   
   
   while (TRUE)
   {
     b0 = input_state(pin_b0);
     b1 = input_state(pin_b1);
     b2 = input_state(pin_b2);
     b3 = input_state(pin_b3);
     b4 = input_state(pin_b4);
     b5 = input_state(pin_b5);
     b6 = input_state(pin_b6);
     b7 = input_state(pin_b7);
     d0 = input_state(pin_d0);
     d1 = input_state(pin_d1);
     d2 = input_state(pin_d2);
     d3 = input_state(pin_d3);
     d4 = input_state(pin_d4);
     d5 = input_state(pin_d5);
     d6 = input_state(pin_d6);
     d7 = input_state(pin_d7);
           
     printf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d\n\r", b0, b1, b2, b3, b4, b5, b6, b7, d0, d1, d2, d3, d4, d5, d6, d7);
   
     delay_ms(200);
   }
}





Merhaba,

Yukarıda ki kodu pic'e yüklediğimde ve görseldeki bağlantıları yaptığımda terminalde portumdaki bilgileri sırasıyla görebiliyorum.

Fakat kafamda birkaç soru var;
1- Terminalde 10010111...101 şeklinde gördüğüm bilgiyi rs232 ile gönderdiğimde nasıl bir veri gidecek?
 
2- Aslında bunu ilk başta böyle tek tek aktarmak yerine port_b ve port_d deki tüm bilgiyi göndermiştim fakat 128'den üstü görünmüyordu ekranda ve son pini "1" yapınca -128 görünüyordu. Benim 16 bitlik veriyi rs232 ile almam ve okumam lazım. Bunu programda ne değişiklik yaparak sağlayabilirim? Mevcut hali işimi görecek midir?

ete

Portları bit bit okuduğunu sanıyorum. C dili ile aram pek iyi değil o nedenle net konuşamıyorum ama sanki bana kolay işi zor yoldan hallediyormuşsun gibi geliyor.
RS232 sistemi 8 bitlik veri kullanır daima. 16 bit iki ayrı 8 bit olarak (HighByte ve LowByte olarak) gönderilir. Basicde 16 bitlik SAYI değişkeni, SAYI.Byte0 ve SAYI.Byte1 şeklinde iki ayrı byte şeklinde ayrılıp yollanabiliyor. C dilinde direk bu şekilde komut yok ise en azından BIR=SAYI/256(Bu high Byte kısmı) ve SIFIR=SAYI-(BIR*256) (buda LOW byte kısmı) şeklinde iki byte şeklinde ayırabilirsin.
Portları da SAYI=(PORTB)<<8 + PORTC şeklinde bir araya getirebilirsin. Yada hiç getirmeden direk BIR=PORTB, SIFIR=PORTC şeklinde okuyup RS232 den yollayabilirsin.
PORTB yi 6 bit kullanmak yerine 8 bit kullan ana AND mask kullanarak 6 bitini ayrısan daha rahat çalışırsın. BIR=PORTB şeklinde aldığın bilgiyi sonunda BIR=PORTB AND %00111111 şeklinde 6 biti ayıklayabilirsin.
Bu bilgileri pratik bilgini artırmak için yazdım. Kullanabildiklerini kullanmanı öneririm.

Ete

Mayhoş

Alıntı yapılan: ete - 11 Aralık 2019, 12:26:13Portları bit bit okuduğunu sanıyorum. C dili ile aram pek iyi değil o nedenle net konuşamıyorum ama sanki bana kolay işi zor yoldan hallediyormuşsun gibi geliyor.
RS232 sistemi 8 bitlik veri kullanır daima. 16 bit iki ayrı 8 bit olarak (HighByte ve LowByte olarak) gönderilir. Basicde 16 bitlik SAYI değişkeni, SAYI.Byte0 ve SAYI.Byte1 şeklinde iki ayrı byte şeklinde ayrılıp yollanabiliyor. C dilinde direk bu şekilde komut yok ise en azından BIR=SAYI/256(Bu high Byte kısmı) ve SIFIR=SAYI-(BIR*256) (buda LOW byte kısmı) şeklinde iki byte şeklinde ayırabilirsin.
Portları da SAYI=(PORTB)<<8 + PORTC şeklinde bir araya getirebilirsin. Yada hiç getirmeden direk BIR=PORTB, SIFIR=PORTC şeklinde okuyup RS232 den yollayabilirsin.
PORTB yi 6 bit kullanmak yerine 8 bit kullan ana AND mask kullanarak 6 bitini ayrısan daha rahat çalışırsın. BIR=PORTB şeklinde aldığın bilgiyi sonunda BIR=PORTB AND %00111111 şeklinde 6 biti ayıklayabilirsin.
Bu bilgileri pratik bilgini artırmak için yazdım. Kullanabildiklerini kullanmanı öneririm.

Ete


Çok teşekkür ederim. Fakat C'de bu ayrımı yapamadım bir türlü.

#include <16F877.h>

#fuses XT,NOWDT,NOPROTECT

#use delay(clock=4000000)

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N)

#byte port_b = 6  
#byte port_d = 8 

main() {

  int16 data;

  set_tris_b(11111111);  
  
  set_tris_d(11111111);  
  
  while (TRUE)
  {
    data = port_b+port_d; 
    printf("%ld\n\r", data);
    delay_ms(500);
  }
}



Mesela yukarıdaki kod ile 254 sayısına kadar çıkabildim ancak yine B ve D portlarının son bitini 1 yapınca -128 işlemi uyguluyor. Dediklerinize göre araştırdım ama C'de yapamayacağım galiba. Başka dillere de hiç hakim değilim.

Sayın ETE; eğer çok uğraştıracak bir kod değil ise bunu başka dilde çözümleyebilecek bir kod yazma imkanınız var mı?

Ya da başka arkadaşlar C'de bu B ve D portunun son pininin 1 olması durumunda -128 işlemini yapması durumunu nasıl aşabilirim örnek bir kod yazma şansınız var mı?

ete

#3
Değişkeninizi unsigned tanımlarsanız o sorun çözülür gibi geliyor bana.
Signed sayılarda SAYI=%11111111 ($FF) ise o sayı -1 dir. Sorun signed değişken kullanmanızdan kaynaklanıyor.

Ete

Powered by EzPortal