Birden fazla encoder okuyan slaveler ile rs485 haberleşmesi

Başlatan gogoce, 12 Temmuz 2018, 17:50:42

gogoce

Merhaba arkadaşlar,
bir arkadaşımın isteği üzerine amatör bir kablo sayma sistemi yapıyoruz. İlk etapta 4 adet slave 628 var. Bunların her biri 15 pulse encoder okuyor. onüne koyduğumuz makara ile yaklaşık her pulse de 1 cm kablo cıkısı oluyor. Bunları denetleyen 1 adet 877 var. Oncelikle proteusta denemek istedik fakat programdaki hatadan dolayı tüm değerler aynı hale geliyor. Ete hocamın rs485 ve kesme derslerinden yola çıkarak bişeyler yapmaya çalıştık ama sanırım bir yerde hatamız var bulamadık ve yardım istiyoruz.
Saygılar

SLAVE

@ __config _BODEN_OFF & _CP_ON & _DATA_CP_ON & _PWRTE_ON & _WDT_ON & _MCLRE_OFF & _INTOSC_OSC_NOCLKOUT & _LVP_OFF
CMCON=7
Define OSC 4
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25 
dEFINE HSER_CLROERR 1

PORTA=0
TRISA=%11111111
PORTB=0
TRISB=%11110010

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
OPTION_REG=%10000000    'dahili Pull up dirençleri iptal edildi
INTCON.3=1              ;PORTB DEĞİŞİM KESMESİ AÇIK

KIMLIK    VAR  BYTE
KIME      VAR  BYTE
EMIR      VAR  BYTE
SAYAC     VAR  WORD
ALDI      VAR  BIT

DURUM VAR BYTE
NEW VAR BYTE
OLD VAR BYTE
YON VAR BYTE
CM VAR BYTE
MT VAR BYTE   
TEMP VAR BYTE     
SYMBOL KONT=PORTB.0
'-----------------------------KARTA KIMLIK NUMARASI VERME--------------------------------------
IF PORTA.2=0 AND PORTA.3=0 AND PORTA.4=0 AND PORTA.5=0 THEN KIMLIK=0
IF PORTA.2=0 AND PORTA.3=0 AND PORTA.4=0 AND PORTA.5=1 THEN KIMLIK=1
IF PORTA.2=0 AND PORTA.3=0 AND PORTA.4=1 AND PORTA.5=0 THEN KIMLIK=2
IF PORTA.2=0 AND PORTA.3=0 AND PORTA.4=1 AND PORTA.5=1 THEN KIMLIK=3
IF PORTA.2=0 AND PORTA.3=1 AND PORTA.4=0 AND PORTA.5=0 THEN KIMLIK=4
IF PORTA.2=0 AND PORTA.3=1 AND PORTA.4=0 AND PORTA.5=1 THEN KIMLIK=5
IF PORTA.2=0 AND PORTA.3=1 AND PORTA.4=1 AND PORTA.5=0 THEN KIMLIK=6
IF PORTA.2=0 AND PORTA.3=1 AND PORTA.4=1 AND PORTA.5=1 THEN KIMLIK=7
IF PORTA.2=1 AND PORTA.3=0 AND PORTA.4=0 AND PORTA.5=0 THEN KIMLIK=8
IF PORTA.2=1 AND PORTA.3=0 AND PORTA.4=0 AND PORTA.5=1 THEN KIMLIK=9
IF PORTA.2=1 AND PORTA.3=0 AND PORTA.4=1 AND PORTA.5=0 THEN KIMLIK=10
IF PORTA.2=1 AND PORTA.3=0 AND PORTA.4=1 AND PORTA.5=1 THEN KIMLIK=11
IF PORTA.2=1 AND PORTA.3=1 AND PORTA.4=0 AND PORTA.5=0 THEN KIMLIK=12
IF PORTA.2=1 AND PORTA.3=1 AND PORTA.4=0 AND PORTA.5=1 THEN KIMLIK=13
IF PORTA.2=1 AND PORTA.3=1 AND PORTA.4=1 AND PORTA.5=0 THEN KIMLIK=14
IF PORTA.2=1 AND PORTA.3=1 AND PORTA.4=1 AND PORTA.5=1 THEN KIMLIK=15

Pause 500
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO KESME
KIME=0
BASLA:
      ALDI=0:SAYAC=0
     
BIR:


      SAYAC=SAYAC+1
      IF SAYAC=30000 THEN BASLA
      IF KIME=KIMLIK THEN   
         GOSUB YOLLA       
         ALDI=0
      ENDIF

      GOTO BASLA                   


YOLLA:
      KONT=1
      HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
      HSEROUT ["E","T","E",MT,CM,10,13] 
      ALDI=0
      KONT=0
      RETURN         

DISABLE
KESME:

IF INTCON.0=1 THEN ;PORTB DEĞİŞİM BAYRAĞI
         NEW=PORTB & %11000000
         YON=OLD.6 ^ NEW.7                                 
            IF YON=1 THEN
            CM=CM+1
            ELSE
            CM=CM-1
            ENDIF
           
                IF CM=100 THEN
                CM=0
                MT=MT+1
                ENDIF
                    IF CM=255 THEN
                    CM=0
                    MT=MT-1
                    ENDIF
                        IF MT=255 THEN
                        MT=0
                        ENDIF
                       
           
                   
                    OLD=NEW
                    TEMP.6=PORTB.6
                    TEMP.7=PORTB.7
                    DURUM=PORTB       
INTCON.0=0
endif

    hSerIn 20,ATLA,[WAIT("ETE"),KIME,EMIR]
    ALDI=1   
ATLA:
    TEMP=RCREG
    Resume
    enable


MASTER

@ __config _CP_ALL & _DEBUG_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF & _CPD_ON
CMCON=7
ADCON1=7
Define OSC 4
DEFINE LCD_DREG PORTC   
DEFINE LCD_DBIT 0     
DEFINE LCD_EREG PORTD   
DEFINE LCD_EBIT 1     
DEFINE LCD_RSREG PORTD   
DEFINE LCD_RSBIT 0       
DEFINE LCD_BITS 4       
DEFINE LCD_LINES 4       
DEFINE LCD_COMMANDUS 2000 
DEFINE LCD_DATAUS 50   
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25 
DEFINE HSER_CLROERR 1
TRISA=0
TRISB=0
TRISC=%10000000
TRISD=0
TRISE=0

KIME    VAR  BYTE
EMIR    VAR  BYTE
SAYAC   VAR  WORD
I       VAR  WORD
ALDI    VAR  BIT
XMT VAR BYTE
MT1 VAR BYTE
MT2 VAR BYTE
MT3 VAR BYTE
MT4 VAR BYTE
XCM VAR BYTE
CM1 VAR BYTE
CM2 VAR BYTE
CM3 VAR BYTE
CM4 VAR BYTE
TEMP 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 
symbol KONT =PORTC.5    ;rs485 gönderme alma pini

Pause 500
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO KESME
LCDOUT $FE,1
KONT=0
KIME=0
BASLA:
      KIME=1:EMIR=10:ALDI=0 
      sayac=0
      GOSUB YOLLA           
      while ALDI=0   
      SAYAC=SAYAC+1
      IF SAYAC=2000 THEN BASLA 
      wend
 
      MT1=XMT
      CM1=XCM
      lcdout $FE,$80,"1:",dec2 MT1,",",dec2 CM2,"MT "
     
IKI:           
      KIME=2:EMIR=10:ALDI=0 
      sayac=0
      GOSUB YOLLA           
      while ALDI=0       
      SAYAC=SAYAC+1
      IF SAYAC=2000 THEN IKI 
      wend
      MT2=XMT
      CM2=XCM
      lcdout $FE,$C0,"2:",dec2 MT2,",",dec2 CM2,"MT "   
     
UC:           
      KIME=3:EMIR=10:ALDI=0 
      sayac=0
      GOSUB YOLLA           
      while ALDI=0       
      SAYAC=SAYAC+1
      IF SAYAC=2000 THEN UC 
      wend
   
      MT3=XMT
      CM3=XCM
      lcdout $FE,$94,"3:",dec2 MT3,",",dec2 CM3,"MT "   
      GOSUB BEKLE           
DORT:           
      KIME=4:EMIR=10:ALDI=0 
      sayac=0
      GOSUB YOLLA           
      while ALDI=0       
      SAYAC=SAYAC+1
      IF SAYAC=2000 THEN DORT 
      wend
   
      MT4=XMT
      CM4=XCM

     lcdout $FE,$D4,"4:",dec2 MT4,",",dec2 CM4,"MT"   
     GOSUB BEKLE             
     GOTO BASLA             'AYNI İŞLEMİ TEKRARLAMAK ÜZERE BAŞA DÖNDÜK.
     


BEKLE:
      FOR I=0 TO 300
        PAUSEUS 5
      NEXT
      RETURN
     
YOLLA:
      kont=1
     HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
      HSEROUT ["E","T","E",KIME,EMIR,10,13] 
      ALDI=0
      kont=0
      RETURN
                   
     
DISABLE
KESME:
    GIE=0
    hSerIn 20,ATLA,[WAIT("ETE"),XMT,XCM]
    ALDI=1   
ATLA:
    TEMP=RCREG
    GIE=1
    Resume
    enable


Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Öncelikle yapılabilecek iyileştirmelerle başlayalım.
'-----------------------------KARTA KIMLIK NUMARASI VERME--------------------------------------
IF PORTA.2=0 AND PORTA.3=0 AND PORTA.4=0 AND PORTA.5=0 THEN KIMLIK=0
IF PORTA.2=0 AND PORTA.3=0 AND PORTA.4=0 AND PORTA.5=1 THEN KIMLIK=1
IF PORTA.2=0 AND PORTA.3=0 AND PORTA.4=1 AND PORTA.5=0 THEN KIMLIK=2
IF PORTA.2=0 AND PORTA.3=0 AND PORTA.4=1 AND PORTA.5=1 THEN KIMLIK=3
IF PORTA.2=0 AND PORTA.3=1 AND PORTA.4=0 AND PORTA.5=0 THEN KIMLIK=4
IF PORTA.2=0 AND PORTA.3=1 AND PORTA.4=0 AND PORTA.5=1 THEN KIMLIK=5
IF PORTA.2=0 AND PORTA.3=1 AND PORTA.4=1 AND PORTA.5=0 THEN KIMLIK=6
IF PORTA.2=0 AND PORTA.3=1 AND PORTA.4=1 AND PORTA.5=1 THEN KIMLIK=7
IF PORTA.2=1 AND PORTA.3=0 AND PORTA.4=0 AND PORTA.5=0 THEN KIMLIK=8
IF PORTA.2=1 AND PORTA.3=0 AND PORTA.4=0 AND PORTA.5=1 THEN KIMLIK=9
IF PORTA.2=1 AND PORTA.3=0 AND PORTA.4=1 AND PORTA.5=0 THEN KIMLIK=10
IF PORTA.2=1 AND PORTA.3=0 AND PORTA.4=1 AND PORTA.5=1 THEN KIMLIK=11
IF PORTA.2=1 AND PORTA.3=1 AND PORTA.4=0 AND PORTA.5=0 THEN KIMLIK=12
IF PORTA.2=1 AND PORTA.3=1 AND PORTA.4=0 AND PORTA.5=1 THEN KIMLIK=13
IF PORTA.2=1 AND PORTA.3=1 AND PORTA.4=1 AND PORTA.5=0 THEN KIMLIK=14
IF PORTA.2=1 AND PORTA.3=1 AND PORTA.4=1 AND PORTA.5=1 THEN KIMLIK=15

satırlarının hepsinin yerine
KIMLIK=(PORTA & %00111100)>>2 yazmak yeterli olacaktır.
SAYAC=SAYAC+1
      IF SAYAC=30000 THEN BASLA

satırları ne işe yarıyor bir anlam veremedim. Bana göre hiç bir işe yaramıyor.
Bu satırları tamamen sil oradan.
Diğer satır da ise;
      IF KIME=KIMLIK THEN   
         GOSUB YOLLA       
         ALDI=0:KIME=0 'buraya KIME=0 ekledim. Bu sayede her alışverişten sonra bir kere bu komut icra edilecektir.
      ENDIF
Burada Master den gelen emir kime ise onun cevap vermesi ve Master in bunu alarak emrin yerini bulduğunu anlaması gerekir. Sen bir şey yolluyorsun ama HT ve CM gibi anlamsız şeyler yolluyorsunki bu master e emrin alındığını onaylamıyor.

KESME satırlarında biraz düzeltme yapmak gerek. Aşağıdaki şekilde değiştir.
DISABLE
KESME:

IF INTCON.0=1 THEN ;PORTB DEĞİŞİM BAYRAĞI
         NEW=PORTB & %11000000
         YON=OLD.6 ^ NEW.7                                 
         IF YON=1 THEN
           CM=CM+1
         ELSE
           CM=CM-1
         ENDIF
           
         IF CM=100 THEN
           CM=0
           MT=MT+1
         ENDIF
         
         IF CM=255 THEN
           CM=0
           MT=MT-1
         ENDIF
         
         IF MT=255 THEN
           MT=0
         ENDIF
                       
         OLD=NEW
         TEMP.6=PORTB.6
         TEMP.7=PORTB.7
         DURUM=PORTB       
         INTCON.0=0
         goto CIK
endif

    hSerIn 20,ATLA,[WAIT("ETE"),KIME,EMIR]
    ALDI=1   
ATLA:
    TEMP=RCREG
   
CIK:   
    Resume
    enable

IF CM=255 ile başlayan satıra dikkat etmek gerekir. Çünki bana göre CM hiç bir zaman 255 olamayacak. Çünki 100 olunca CM=0 yapıyorsun. Tek bir şekilde 255 olabilir oda YON=0 ise CM=CM-1 olacak ve önce sıfır sonrada 255'e dönecektir. Amacın bu ise sözüm yok ama CM=SM+1 ile hiç bir zaman CM=255 olamaz çünki bir önceki satırda IF CM=100 then CM=0 komutların var. Gerekirse bu satırlarıda sil.
Görünüşe göre iki kesme kullanıyorsun PORTB değişiklik kesmesi ve USART kesmesi. Değişiklik kesmesinden sonra programı çıkışa yönlendirmediğin için program HESERIN komutuna geliyor. Halbuki gelen bir şey yok ve sen onu boşuna HESERIN komutuna yönlendirmiş oluyorsun. Bu nedenle değişiklik kesmesi oluşunca sonunda onu RESUME-ENABLE komutuna yönlendirmek gerekir yukarıda onu yapmış oldum.
hSerIn 20,ATLA,[WAIT("ETE"),KIME,EMIR]  komut satırındaki 20 ms lik bekleme de orada fazla bence. bunu 10 ms yapabilirsin.

Master programında ,
en başlarda LCDOUT $FE,1 komutu LCD nin açılış (initalize) komutu olup bu komutu verdikten sonra en azından 200 ms lik bir gecikme vermen gerekir ki bu süre açılış için gerekli olan süredir.
Bana kalırsa bu satırı PAUSE 500 komutundan öncesine yerleştir böylece açılış gecikmesi 500 mslik bekleme esnasında gerçekleşmiş olsun.

Programı yazmayan kişinin birden mantığına erişmesi zor oluyor. Master program mantığı konusunda her şey doğru gibi göüküyor. Sırası ile Slave lere emri yollayıp geri onay aldığında bir sonrakine geçiyorsun. Burada şiimdilik bir sorun göremedim ama aklıma da çok yattığını söyleyemem. Tavsiyem sorun olursa bu kısım üzerinde ayrıca tartışalım derim.
Ete


gogoce

Tesekkurler hocam dediklerinizi dikkate alacagim
Cm ve mt yi olcum yapacagimiz icin sectim. Encoder 15 pulse ve her 1 pulse 1 cm onuda if cm=100 then
Cm=0
Mt=mt+1 yaparak metreye ilave ettim ayni husus icin negatifi de dusundum. Aksi yonde cm nin once 0 sonra 255 olmasini da ekledim. Diger hususlaricin deneyip tekrar buradan yazacagim
Tekrar tesekkurler
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

Hocam teşekkür ederim proteusta çalıştı birkaç gün içerisinde pcbler ile de deneyip sonucu burdan yazarım
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

Powered by EzPortal