PC SERİ PORTTAN BİLGİ ALMA

Başlatan ferit0158, 06 Şubat 2020, 20:33:44

ferit0158

Alıntı yapılan: ete - 08 Şubat 2020, 21:00:56Neden başka bir şey görmüyorsun hiç düşündünmü?
Ben açıklayayım. Ama önce şunu belirteyim. Muhtemelen başka karekter yada karekterler de geliyordur ama sen yalnızca 3 byte alacak şekilde programını düzenlediğin için yalnızca 3 bayte görüyorsun.
RSIN  { TIMEOUT },WAIT("AB"),sayi[0],sayi[1],sayi[2]
Bu satırı şöyle yazmayı dene
RSIN  { TIMEOUT },WAIT("AB"),sayi[0],sayi[1],sayi[2], SAYI[3]
ve ekrana verirkende ,
lcdout $fe,2,@RAKAM1," ",@RAKAM2," ",@RAKAM3, @RAKAM4
Şeklinde yaz bakalım ne çıkacak?

Ete


dediğiniz gibi denedim hocam. RSIN  { TIMEOUT },WAIT("AB"),sayi[0],sayi[1],sayi[2] bu şekilde yazdığımda pc tarafından 123 yazıyorum pic tarafında ki ekranda 495051 olarak okuyorum. RSIN  { TIMEOUT },WAIT("AB"),sayi[0],sayi[1],sayi[2], SAYI[3] bu şekilde yazıp pc tarafından 123 gönderince ekrana hiç veri gelmiyor.

Hattuşa

slm şimdi kodda usart kesmesine sokmalı ve değişkenleri burada değerlendirme yapmakta yarar var, ben protona göre yazayım PBP ya çevirirsiniz yada aklınıza yatarsa PBP ya çeviririz

öncelikle usart kesme ayarlarını yapalım;

'usart ayarları slave olarak 9600 baudrate ayarlaması yapılacak burada kritik olan 
'SPBRG değerinin doğru verilmesi gerekiyor bunu da kristal hızı etkiliyor
Declare Hserial_Baud  = 9600      ' Set baud rate to 9600
Declare Hserial_RCSTA = %10010000  ' Bit7 SPEN: Serial Port Enable bit 
Declare Hserial_TXSTA = %10101100  ' Bit5 TXEN: tx enable , Bit3 BRGH: High Baud Rate Select
Declare Hserial_Clear = On         ' Optionally clear the buffer before receiving
Declare Hserial_SPBRG =25        ' 20MHZ osilatör ve 9600 baud rate için SPBRG=129 bkz.datasheet
Declare FSR_CONTEXT_SAVE = On


Symbol RCIE = PIE1.5   ' USART Receive Interrupt Enable
Symbol RCIF = PIR1.5   ' USART Receive Interrupt Flag


RCIE =1  'usart alım için usart kesmesi aktif ediliyor


Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7  ' Global Interrupt Enable


GIE =1
PEIE =1

On_Hardware_Interrupt GoTo KeSMe


burada kesmeyi aktif edip kesme içerisinde usart kesmesini aktif ettik ve kesme oluştuğunda KESME etiketine gideceğiz

KeSMe:

Context Save 

HSerIn 20,ATLA,[Wait("AB"),gelen[0],gelen[1],gelen[2],gelen[3],gelen[4],gelen[5],gelen[6],gelen[7],gelen[8],gelen[9]]
bilgi geldi =1
if gelen[0] =>48 and gelen[0]<=57 then okunandata[0] =gelen[0]
if gelen[1] =>48 and gelen[1]<=57 then okunandata[1] =gelen[1]
if gelen[2] =>48 and gelen[2]<=57 then okunandata[2] =gelen[2]
if gelen[3] =>48 and gelen[3]<=57 then okunandata[3] =gelen[3]
if gelen[4] =>48 and gelen[4]<=57 then okunandata[4] =gelen[4]
if gelen[5] =>48 and gelen[5]<=57 then okunandata[5] =gelen[5]
if gelen[6] =>48 and gelen[6]<=57 then okunandata[6] =gelen[6]
if gelen[7] =>48 and gelen[7]<=57 then okunandata[7] =gelen[7]
if gelen[8] =>48 and gelen[8]<=57 then okunandata[8] =gelen[8]
if gelen[9] =>48 and gelen[9]<=57 then okunandata[9] =gelen[9]



ATLA:
TeMp =RCREG
Context Restore

değişkenler ise

dim temp as byte        'usart kesmesinin bayrağını sıfırlama değişkeni
dim bilgigeldi as bit   'usart kesmesi oluşup oluşmadığını belirliyoruz
dim gelen[1] as byte
dim okunandata[10] as byte' usart kesmesinden alınan doğru değerler



şimdi biz ana döngüde "bilgigeldi" bayrağını takip edeceğiz, eğer bilgigeldi =1 olmuşsa usarttan bir bilginin geldiğini ve değişkenlere aktarım yapıldığını bileceğiz ve işlemi buna göre yapacağız.
usart içerisinde ise biz biliyoruz ki gelen datalar string olarak geliyor ve hane hane geliyor. ASCII tablosuna göre rakamlar 48-57 değerleri arasında geliyor ve biz sadece rakamlarla ilgileniyoruz burada amacımız gelen data adedini tam bilemiyoruz bunu anlamak için 10 adet data okuması yapıyoruz ve okunan dataların rakam olanları ile ilgilendiğimiz için rakam olanları okunandata değişkenine atıyoruz. ana programda içi dolu okunandatanın adedine göre if veya case yapısı oluşturulup ondalıklı rakama çevrilir

NOT:
SAYI1=SAYI1*10
SAYI2=SAYI2*1
SAYI3=SAYI3
SON=SAYI1+SAYI2.+sayı3

bu kısım hatalı ustam, 3 basamaklı sayı geliyor mesela 123, siz yüzler hanesini 10 ile onlar hanesini 1 ile çarpıp birler hanesi ile topluyorsunuz, yani pc den 123 gönderildiğinde bu hesaplama ile ekranda 13 rakamı okursunuz, yanlışmıyım?

ete

4 byte beklerken ekranda bir şey gözükmemesi hem enteresan hemde iyi değil. Rn azından timeout çalışıp gelen 123 ü bize vermesi gerekirdi. Ancak bilgiyi nasıl alıp nasıl gösterdiğini bilmiyorum. Ascii değerlerini rakama çevirme kısmında sorun olabilir. En kolay yolu gelen bilgi 48-57 aralığında ise bu sayıdan 48 çıkarmaktır. Böylece sayının gerçek değerini bulursun.
On tabanına göre işlemlerde 49-50-51 şeklinde gelmiş sayı gurubunun her birinden 48 çıkartıp 1-2-3 rakamlarını elde eder ve sonra 1x100 + 2x10 + 3=123 şeklinde sayıyı oluşturabilirsin.
Şayet pc tarafında sayı sonuna bir karekter eklenmiyor ise o zaman gerçek anlamda timeot fonksiyonundan yararlanmak gerekir. 4-5 basamaklı bir sayının gelme süresi 10-15 ms yi geçmez. 15 ms lik timeout koyulursa program aldığı ile yetinir ve geri dönüp aldıklarını yazar. Gerekirse bir bit değişkeni şayet bilgi alınmış ise set edilir ve dönüşte bu bit değişkenine bakılarak set ise bilgi ekrana verilir.
Ete

Hattuşa

@ete hocam;
şunu merak ediyorum. diyelim ki kullanıcı pc den 2 basamaklı bir değer gönderdi, bizde bu tarafda bütün değerleri kaçırmamak adına array dizimizi 10 byte olarak okumak istedik, şimdi timeout a düşerse bizim 1 ve 2 bytelarıda okuyamama sorunu yaşıyor olabilirmiyiz. yani gelen data miktarı uyuşmadığı için baştakileri de okuyamama sorunu yaşıyor olabilirmiyiz?   

ete

Bu iş tamamen yazdığınız programa bağlıdır. 10 elemanlı bir dizi almayı bekliyorsa ve 3 eleman yollanmış ise o 3 eleman mutlak surette alınır. Sonrasında bir şey gelmeyeceği için sistem zaman aşımını bekler ve geri döner. Bir ara denemeler yapıp bunları bizzat görmüş ve yaşamıştım. En güzeli bir sonlandırma işareti kullanmak oluyor buda denemeyle sabit.
Ete

elektro77

#20
5 yıl önce ete hocamında yardımı ile seri porttan gelen verilere göre 5 adet roleyi açıp kapatma devresi yapmıştım.
Windows arayüzünü bir arkadışımla beraber yapmıştık.pbp de yazdıgımız alma kodlarına göre seri porttan 2 haneli yani 49 gibi bir değer gönderdiğimizde 1. roleyi çekmeli idi. Fakat bunu bir türlü başaramamıştık.
Tesadüfen aklımıza gelen birşeyi yani aynı veriyi 2 kere arka arkaya göndermeyi denedik. Devre çalıştı. hiç sorun yaşamadık.
Belki sizin okuyamadığınız kodlarda arka arkaya 2 kere geliyor olabilir mi diye düşündüm. Bilmiyorum belki faydası olur diye yazdım. Saçmaladı isem özürdilerim.
çalışan kodlar aşağıdaki şekilde:
@ DEVICE PIC16F628A
@ DEVICE PIC16F628A, WDT_ON
@ DEVICE PIC16F628A, PWRT_ON
@ DEVICE PIC16F628A, BOD_ON
@ DEVICE PIC16F628A, PROTECT_OFF
@ DEVICE PIC16F628A, LVP_OFF
@ DEVICE PIC16F628A, CPD_OFF
@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT

DEFINE OSC 4
'---------------------------INPUT-OUTPUT ARRANGEMENT----------------------------
PORTA=0:TRISA=%00000000
PORTB=0:TRISB=%00000010 ' PortB.1 giriş diğerleri çıkış
CMCON=7

'-------------------COMUNICATION DEFINES----------------------------------------
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

'-------------------------VARIABLES---------------------------------------------

TEMP      var BYTE 52
Mot1      VAR BYTE
Mot2      Var Byte
Mot3      Var Byte
Mot4      Var Byte
'i VAR BYTE
SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

'---------------------------INITIALISATION--------------------------------------
RCIE=1
PEIE=1
GIE=1
INTCON=%11000000
ON INTERRUPT GOTO INT

START:
 IF MOT1=49 Then            
      PORTA.1=0
      PORTA.3=1                  
ENDIF  
      If Mot1=50 Then            
        PORTA.3=0                
        PORTA.1=0              
ENDIF
      IF Mot1=53 Then            
        PORTA.3=0
        PORTA.1=1
ENDIF                  

      
      IF MOT1=54 THEN            
      PORTB.7=0
      PORTA.0=1
ENDIF 
      IF MOT1=55 THEN             
        PORTA.0=0                 
        PORTB.7=0                 
ENDIF            
      IF MOT1=56 THEN            
      PORTA.0=0
      PORTB.7=1
ENDIF 

        
      IF MOT4=57 Then         
      PORTB.5=0
      PORTB.6=1
ENDIF
      If Mot4=58 Then          
        PORTB.6=0               
        PORTB.5=0               
ENDIF
      IF Mot4=59 Then           
      PORTB.6=0
      PORTB.5=1
ENDIF
      
      IF MOT4=65 THEN            
      PORTB.3=0
      PORTB.4=1
ENDIF
      IF MOT4=66 THEN          
        PORTB.4=0                
        PORTB.3=0                 
         ENDIF
      IF MOT4=67 THEN          
      PORTB.4=0
      PORTB.3=1
ENDIF
     
      goto start
     
DISABLE
INT:
    GIE=0
    hSerIn , [WAIT(" "),Mot1,Mot2,Mot3,Mot4] 
    TEMP=RCREG
    GIE=1
    Resume
enable

END
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ferit0158

arkadaşlar sorun çözüldü. bu kadar çaba sarf ettim strese girdim. çözüm yolu ararken sizlerinde vaktini aldım. öncelikle şunu söyleyeyim yeni bir pic kartına gerek kalmadı. makinenin orijinal kartı çalıştı. sorunun kaynağı  makineyi kontrol eden bilgisayarın usb çıkışına bağlı olan usb seriport çevirici. sizlerin de gösterdiği yöntemleri deneyip hiç bir sonuç alamıyor olmam tuhafıma gitti. bende bütün bu çalışmaları kendimi riske atıp çalışan diğer makinede denedim. yine sonuç alamayınca çalışan makinenin pic kontrol kartını  üzerinde çalıştığım arızalı makineye takıp deneme yaptım. ama çalışan kartta çalışmaz olunca bu defa arızalı dediğim pic kontrol kartını çalışan makineye takınca kart çalıştı. nereden diye araştırırken deneme yanılma vs. derken usb seriport çeviriciyi değiştirince makine çalışmaya başladı. çok ilginç bir sorun kaç gündür bana iyi stres yaşattı ama nihayet çözüldü. hepinize tekrar teşekkür ederim

Hattuşa

@ferit158 usta sorununun çözüldüğüne sevindim,ANCAK;
sistemin yurtdışından devresine göre uçuk fiyattan alınmaması adına PIC kartını çalışır vaziyette sonlandırmanızı isterdim. zira para bizim değil ama çıkan para milli servetimiz, yazık dışarıya çıkmasın

ferit0158

Alıntı yapılan: pro-TR - 10 Şubat 2020, 19:59:44@ferit158 usta sorununun çözüldüğüne sevindim,ANCAK;
sistemin yurtdışından devresine göre uçuk fiyattan alınmaması adına PIC kartını çalışır vaziyette sonlandırmanızı isterdim. zira para bizim değil ama çıkan para milli servetimiz, yazık dışarıya çıkmasın

doğru söylüyorsun üstadım. aslında sorun sizlerin sayesinde çözülmüş zaten. böyle bir kart arızası karşıma gelirse nasıl bir yol izleyeceğimi biliyorum artık. bir konuda daha bilgi sahibi oldum sayenizde. tekrar teşekkür ediyorum siz değerli üstadlarıma bilgi paylaşımınız ve yardımınızdan dolayı.

Powered by EzPortal