Python ile RS232 üzerinden string gönderme

Başlatan Yeniüye1234, 08 Haziran 2022, 22:20:22

fide

#30
İlk önce adım adım gidelim.

1)Python kodunun çalıştığı pc/laptop Pic seri porta ne ile bağlı?
Olası seçenekler: rs232 +max232, USB-seri çevirici

USB - seri çevirici kullandığınızı varsayarak devam edelim.

2)Pythonda doğru seri port, baudrate seçili mi?

3)Pc tarafındaki USB-seri çeviricinin Rx ve tx uçları kısadevre yapınca Python ile gönderdiğiniz veriyi yine Python ile okuyabiliyor musun?

4)Picden gönderdiğiniz herhangi bir stringi Python ile okuyabiliyor  musunuz? Aynı baudrate ve pic tarafında doğru comm şortu seçili mi? 25k22,26k22 gibi çiplerde çift seri port var.

5)Bütün bu sorulara cevabın evet ise
Seri port kesme oluşturup kesme meydana gelince veri almak için kesme rutini hazırladın mı?

Eğer veriyi kesme rutini içinde almıyorsan (ki öyle görünüyor) veri kaybı yaşayabilirsin. Bu yüzden de verileri düzgün alamayabilirsin.
Bu işlemleri yap. Doğruluklarını kontrol et. Eğer hala hata var ise tekrar düşünelim.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

Yeniüye1234

Alıntı yapılan: fide - 11 Haziran 2022, 22:01:56İlk önce adım adım gidelim.

1)Python kodunun çalıştığı pc/laptop Pic seri porta ne ile bağlı?
Olası seçenekler: rs232 +max232, USB-seri çevirici

USB - seri çevirici kullandığınızı varsayarak devam edelim.

2)Pythonda doğru seri port, baudrate seçili mi?

3)Pc tarafındaki USB-seri çeviricinin Rx ve tx uçları kısadevre yapınca Python ile gönderdiğiniz veriyi yine Python ile okuyabiliyor musun?

4)Picden gönderdiğiniz herhangi bir stringi Python ile okuyabiliyor  musunuz? Aynı baudrate ve pic tarafında doğru comm şortu seçili mi? 25k22,26k22 gibi çiplerde çift seri port var.

5)Bütün bu sorulara cevabın evet ise
Seri port kesme oluşturup kesme meydana gelince veri almak için kesme rutini hazırladın mı?

Eğer veriyi kesme rutini içinde almıyorsan (ki öyle görünüyor) veri kaybı yaşayabilirsin. Bu yüzden de verileri düzgün alamayabilirsin.
Bu işlemleri yap. Doğruluklarını kontrol et. Eğer hala hata var ise tekrar düşünelim.

USB kullanıyorum, baudrate comport falan hepsi doğru sıkıntı yok. PIC' ten Python' a string gönderiyorum. Python' dan PIC' e karakter gönderiyorum. Bunlarda hiçbir sorun yok. Sorun Python' dan PIC' e string göndermek. Mesela RD2' ye led bağladım. 300 ms aralıklarla yanıp sönüyor. Pythondan string gönderdiğimde RD0' ın yanmasını RD2'nin sönmesini istiyorum ancak string gönderdiğim anda RD2 ledi sabit yanar vaziyette kalıyor RD0 yanmıyor.

mehmet

#32
Karakter dizisini yollarken,
başlık karakteri yada başlık
dizisi yolluyor musunuz?

Mesela:
"eskasd\n" yollayın. "esk"
dizisi geldikten sonra "asd"
gelirse öyle işlem yapın.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

fide

#33
Uart interrupt kullanmayı deneyin.
Alıntı yapılan: eskişehir26 - 11 Haziran 2022, 23:02:31USB kullanıyorum, baudrate comport falan hepsi doğru sıkıntı yok. PIC' ten Python' a string gönderiyorum. Python' dan PIC' e karakter gönderiyorum. Bunlarda hiçbir sorun yok. Sorun Python' dan PIC' e string göndermek. Mesela RD2' ye led bağladım. 300 ms aralıklarla yanıp sönüyor. Pythondan string gönderdiğimde RD0' ın yanmasını RD2'nin sönmesini istiyorum ancak string gönderdiğim anda RD2 ledi sabit yanar vaziyette kalıyor RD0 yanmıyor.

Rd2 ledin yanık kalması gets() komutunun enter karakterini beklediği anlamına gelir. Ya enter gönderilmiyor yada pic bunu alamıyor.
İlk ihtimal daha kuvvetli.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

Yeniüye1234

#34
Alıntı yapılan: fide - 12 Haziran 2022, 10:22:14Uart interrupt kullanmayı deneyin.
Rd2 ledin yanık kalması gets() komutunun enter karakterini beklediği anlamına gelir. Ya enter gönderilmiyor yada pic bunu alamıyor.
İlk ihtimal daha kuvvetli.

Kesme kullanarak yapıyorum. ...write("asd\n".encode( )) yazdığımda yukarıdaki durum oluyor. Onun dışındaki durumlarda bir tepki olmuyor.


char gelen[10];
char veri="asd";
char data="567";


#int_rda             
void kesme ( )
{
disable_interrupts (int_rda);  // bu komutun yazılıp yazılmaması da bir şey değiştirmiyor. 
             gets(gelen);   

                  if (strcmp(gelen,veri)==0)   
                   {
                      output_high (pin_d0);
                      output_toggle (pin_d2);
                    }

                     
                   if (strcmp(gelen,data)==0)   
                     {output_high (pin_d1);
                     output_toggle (pin_d2);
                     }
}

CCS C kodu da bu. Yani nasıl yapılacağını deneme amaçlı olarak basit şekilde string gönderme işlemi yapmaya çalışıyorum.

kudretuzuner

#35
Merhaba, yine ustaların arasında laf söylemek bana düşmez ama yine bildiklerimi yazayım. PIC string algılamaz. Sadece gelen stringin tek tek hex değerleri algılar o da sadece sekiz pinli bir portu buna tahsis etmeniz gerekir. Siz, string ile PIC'te bir eylem yapmak istiyorsanız PIC'e gelen stringin her karakterlerini tek tek kontrol etmeniz gerekir. Bu da yazılım ile olacaktır. Yazdığım gibi CCS C sintaksını bilmediğim için kod veremiyeceğim. İsterseniz örnek olması bakımından assembly olarak klavye "a12"  yolladığınız zaman PIC'in algılamasını sağlayacak kodu vereyim.
TEST00
MOVLW B'01100001' BU DEĞERİ W YA "a" NIN HEX KODUNU YÜKLERİZ
XORWF PORTA,W  BURADA PIC'in PORTA SINA "a" GELİP GELMEDİĞİNİ KARŞILAŞTIRIR
BTFSS STATUS,2
GOTO TEST01
BSF PORTB,7  BURADA DA "a" nın geldiğini ve PORTB NİN 7 NOLU PİN ÇIKIŞ VERİR


TEST01
MOVLW B'00000001'
XORWF PORTA,W
BTFSS STATUS,2
GOTO TEST02
BSF PORTD,0

TEST02
MOVLW B'00000010'
XORWF PORTA,W
BTFSS STATUS,2
GOTO TEST03
BSF PORTD,1

isis şemasını bilmediğim için portlar rastgele seçilmiştir. Özet olarak PIC'e bir port atayacaksınız Bu porta stringin tek tek hex kodlarını göndereceksiniz gönderilen her hex kodu yazılımda bulunan değerler ile karşılaştırılıp eşit olup olmadıklarını kontrol edecek eşit ise ona göre PIC'e eylem yaptıracaksınız.Fikir vermesi bakımından belki işinize yarar.

Yaşlandık galiba, (13.06.2022)
Yukarıda yazdığım bilgiler doğru fakat sorunun yanıtı değil. Ben dış ortamdan PORT'  a giren 8 bitlik datayı karşılaştırmışım. Soru ise PIC' in RX' sine gelen dataların ayıklanmasıdır. RX' e  gelen her bir hex kodunu RCREG registerini MOVLW B'01100001' BU DEĞERİ W YA "a" NIN HEX KODUNU YÜKLERİZ XORWF RCREG  BURADA PIC'in RX PİNİNE "a" GELİP GELMEDİĞİNİ karşılaştırabiliriz. Şablon kod parçacıklarını da vereyim.


TEST00
MOVLW B'01100001' BU DEĞERİ W YA "a" NIN HEX KODUNU YÜKLERİZ
XORWF RCREG  BURADA PIC'in RX PİNİNE "a" GELİP GELMEDİĞİNİ KARŞILAŞTIRIR
BTFSS STATUS,2
GOTO TEST01
BSF PORTB,7  BURADA DA "a" nın geldiğini ve PORTB NİN 7 NOLU PİN ÇIKIŞ VERİR


TEST01
MOVLW B'00000001'
XORWF RCREG
BTFSS STATUS,2
GOTO TEST02
BSF PORTD,0

TEST02
MOVLW B'00000010'
XORWF RCREG
BTFSS STATUS,2
GOTO TEST03
BSF PORTD,1
Amatör

fide

#36
Alıntı yapılan: eskişehir26 - 12 Haziran 2022, 11:21:11Kesme kullanarak yapıyorum. ...write("asd\n".encode( )) yazdığımda yukarıdaki durum oluyor. Onun dışındaki durumlarda bir tepki olmuyor.


char gelen[10];
char veri="asd";
char data="567";


#int_rda           
void kesme ( )
{
disable_interrupts (int_rda);  // bu komutun yazılıp yazılmaması da bir şey değiştirmiyor. 
            gets(gelen); 

                  if (strcmp(gelen,veri)==0) 
                  {
                      output_high (pin_d0);
                      output_toggle (pin_d2);
                    }

                     
                  if (strcmp(gelen,data)==0) 
                    {output_high (pin_d1);
                    output_toggle (pin_d2);
                    }
}

CCS C kodu da bu. Yani nasıl yapılacağını deneme amaçlı olarak basit şekilde string gönderme işlemi yapmaya çalışıyorum.
write("asd\n".encode( ))

Öncelikle bu kısmı düzeltelim.
text="asd\r".encode("utf-8") 
serial.write(text)

disable_interrupts (int_rda);  // bu komutun yazılıp yazılmaması da bir şey değiştirmiyor.
Bu komut şimdilik dursun  burada.
while bloğu içinde {'den sonra
enable_interrupts (int_rda); 
komutu yoksa ekle. İnterrupt içindeyken tekrar int gelmesi durumunda bunu görmezden gel anlamında kullanılır. İşe yaramaz değil.

seri port ile deneme yaparken her zaman ilk önce verinin düzgün gönderilip gönderilmediğine bak. Bunun en güzel yolu veriyi hex olarak okuyabileceğin bir program kullanmaktır. Burada problem enter karakterinin gitmemesi. "asd\n" gönderdiğin stringde karşıya binary olarak 97 115 100 ve 10 sayıları gidiyor. gets komutu ise 13 (enter) beklediği için while (yada repeat until) döngüsünden çıkamıyor. Sen de bunu pic kilitlendi olarak algılıyorsun. Aslında pic mcu senden enter göndermeni bekliyor sadece.

Ben xctu'nun bir programını kullanıyorum. Çeşitli terminal programları var hex (yada binary) gösterebilen.

https://www.dosyaupload.com/2Mvj0/40002637_b.exe
indirmek için yukardaki linki kullanabilirsin.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

Yeniüye1234

#37
Alıntı yapılan: fide - 12 Haziran 2022, 13:03:34write("asd\n".encode( ))

Öncelikle bu kısmı düzeltelim.
text="asd\r".encode("utf-8") 
serial.write(text)

disable_interrupts (int_rda);  // bu komutun yazılıp yazılmaması da bir şey değiştirmiyor.
Bu komut şimdilik dursun  burada.
while bloğu içinde {'den sonra
enable_interrupts (int_rda); 
komutu yoksa ekle. İnterrupt içindeyken tekrar int gelmesi durumunda bunu görmezden gel anlamında kullanılır. İşe yaramaz değil.

seri port ile deneme yaparken her zaman ilk önce verinin düzgün gönderilip gönderilmediğine bak. Bunun en güzel yolu veriyi hex olarak okuyabileceğin bir program kullanmaktır. Burada problem enter karakterinin gitmemesi. "asd\n" gönderdiğin stringde karşıya binary olarak 97 115 100 ve 10 sayıları gidiyor. gets komutu ise 13 (enter) beklediği için while (yada repeat until) döngüsünden çıkamıyor. Sen de bunu pic kilitlendi olarak algılıyorsun. Aslında pic mcu senden enter göndermeni bekliyor sadece.

Ben xctu'nun bir programını kullanıyorum. Çeşitli terminal programları var hex (yada binary) gösterebilen.

https://www.dosyaupload.com/2Mvj0/40002637_b.exe
indirmek için yukardaki linki kullanabilirsin.

zaten başlarda onu da sordum python da enter karakterini nasıl göndereceğim diye. string almada program enter karakterini bekliyor.

Gönderdiğiniz program ile nasıl test edeceğim?daha önce hiç kullanmadım.

fide

#38
Python kodunu kapat.
Pici seri porta bağla.
Xctuyu aç
Port ve hız seç


Terminal yazan karta geç.
Xctu üzerinde hex yazan bir buton var.
Pic ledleri toggle yaparken klavyeden asd ve enter tuşlarına bas.
Pic tarafı kod doğru ise istediğin işlemi yapacaktır.
Sorunu Python kodunda ararsın o halde.

Python kodu için ise elinde bir adet daha usb seri dönüştürücü lazım.
Rx->TX
Tx->rx şeklinde iki dönüştürücüyü çapraz bağlayıp birini Python diğerini Xctu ile aç.
Python dan gönderdiğin stringi Xctu üzerinde görmen gerekir
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

Yeniüye1234

#include <16F877a.h>   

#FUSES XT, NOWDT

#use delay (clock=4000000)

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

#use fast_io (c)
#use fast_io (d)

#include <string.h>


char gelen[10];

char veri[]="asd";

#INT_RDA
void  RDA()
{
  gets(gelen);
     
      if(stricmp(gelen,veri)==0)
      {
         output_high(pin_d2);
      }
   
}


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) ;
setup_vref (FALSE);


enable_interrupts(GLOBAL);

set_tris_c (0x80);   
set_tris_d (0x00); 

output_d(0x00);
output_c(0x00);

   while(1)
         {
         enable_interrupts (int_rda);
     
          output_toggle(pin_d2);
          delay_ms(300);
         
         }
}

benim yazdığım deneme amaçlı kod bu. Hata nerde? X-TCU da da çalışmıyor.



fide

Alıntı yapılan: eskişehir26 - 12 Haziran 2022, 17:00:54#use fast_io (c)


Bu satırı kapatıp dener misin?
Önce seri port sonra gpio ayarı yaptığın için bişeyler karışıyor gibi geldi bana.
Herşey düzgün görünüyor.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

Yeniüye1234

Alıntı yapılan: fide - 12 Haziran 2022, 17:30:55Bu satırı kapatıp dener misin?
Önce seri port sonra gpio ayarı yaptığın için bişeyler karışıyor gibi geldi bana.
Herşey düzgün görünüyor.

#use fast_io (c) bunu iptal edersem hiç çalışmaz.

fide

Alıntı yapılan: eskişehir26 - 12 Haziran 2022, 17:39:03#use fast_io (c) bunu iptal edersem hiç çalışmaz.
Neden?

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

Burada port ayarı yaptın zaten.
Neden çalışmasın?

Use fast_io yerine
float_input()
Yada
output_drive() kullanın. Çoğu zaman portun birkaç pinini kullanırsınız. Bunu da yukarıdaki iki komutla kolayca yaparsınız.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

Yeniüye1234

Alıntı yapılan: fide - 12 Haziran 2022, 17:47:29Neden?

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

Burada port ayarı yaptın zaten.
Neden çalışmasın?

Use fast_io yerine
float_input()
Yada
output_drive() kullanın. Çoğu zaman portun birkaç pinini kullanırsınız. Bunu da yukarıdaki iki komutla kolayca yaparsınız.

herhangi bir değişiklik olmadı.

fide

set_tris_c (0x80); 

Bu satırı da kapatır mısın? Biraz önce gözümden kaçmış.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com