XXX VAR BYTE [XX] ne ifade ediyor?

Başlatan Yasin, 14 Ekim 2016, 22:05:38

Yasin

Merhaba arkadaşlar ve @ete hocam.

@ete hocam, yazdığınız bir encoder okuma programını inceledim ve programda gözüme bilmediğim birkaç şey takıldı. Bende öğrenmek amaçlı sormak istedim. Merakımı giderirseniz sevinirim.

Yazdığınız program:

'****************************************************************
'*  Name    : ENCODER.BAS                                       *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2014 [ETE]                          *
'*          : All Rights Reserved                               *
'*  Date    : 06.10.2014                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_off
@ DEVICE pic16F628A, PWRT_On
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_On
@ DEVICE pic16F628A, HS_OSC
DEFINE OSC 20
CMCON=7
'---------------------------------------------------------------
PORTA=0:TRISA=%00000000
PORTB=0:TRISB=%11000000
'-------------------------------------------------------------
DEFINE LCD_DREG   PORTA 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT   0 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG   PORTB 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT   0 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG  PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT  1 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_BITS   4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES  2 'LCD Kaç sıra yazabiliyor
'---------------------------------------------------------------

ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.

INTCON=%10001000  'Kesmeler aktif ve   PORTB Değişiklik kesmesi aktif
'---------------------------------------------------------------------
SAYAC  VAR WORD 56
SAY    VAR BYTE 58
TEMP   VAR BYTE
ESKI   VAR BYTE
YENI   VAR BYTE

YON    VAR BIT

SYMBOL A=ESKI.6
SYMBOL B=YENI.7
SYMBOL BAYRAK=INTCON.0
'---------------------------------------------------------------------
LCDOUT $FE,1

PAUSE 250

LCDOUT $FE,$80,"LUTFEN  BEKLEYIN"
ESKI=PORTB
bayrak=0
sayac=0
PAUSE 250
LCDOUT $FE,1
BASLA:
      lcdout $FE,$80,"YON=",DEC1 YON
      LCDOUT $FE,$C0,"SAYAC=",DEC SAYAC ,"    "

      GOTO BASLA     
     
DISABLE
KESME:
         YENI=PORTB & %11000000
         YON=A ^ B
         IF YON=1 THEN
           SAYAC=SAYAC+1
         ELSE
           SAYAC=SAYAC-1
         ENDIF
         ESKI=YENI
         TEMP=PORTB
         BAYRAK=0
         RESUME
         ENABLE


İlk sorum, SAYAC VAR WORD 56 ve SAY VAR BYTE 58 kısımlarındaki 56 ve 58 sayıları ne ifade ediyor ve programda ne amaçlı kullanılıyor? İkinci sorum ise şu. Kesme kısmında TEMP=PORTB diye bir satır var. Ama TEMP değişkeni programın başka hiçbir yerinde kullanılmamış. TEMP değişkenin bu programdaki kullanım amacı nedir?

ete

İşlemci hafızasında her bir değişken Data RAM dediğimiz alanda bir hafıza adresine yerleştirilir. Normalde işlemci bunu otomatikman yapar ve kendi kafasına göre yerleştirir. Ama değişekenlerin yanına bu adresleri siz yazarsanız ki benim yazdığım gibi derleme esnasında değişkenler o adreslere yerleştirilir. Burada dikkat edilecek şey yerleştirmenin genellikle 56 dan başladığı ve byte lar için 1 adres , wordler için 2 adres ayrılması gerektiğidir.
Bu şekilde yerleşmiş bir değişken tablosu İsis simulasyonunda program simule edilirken değişkenlerin aldığı değerler watch window dan izlenebilir. Bu işlem genellikle hata ayıklamak için kullanılan bir yöntemdir. Hatasız program en azından ilk etapta yazmak mümkün değildir. İllaki bir şey unutur yada yanlış yaparsınız. Bu hatayı bulmak için genellikle değişken değerlerine ihtiyaç duyulurki bu da ancak değişken adreslerini bilirseniz mümkün oluyor.

Programa dikkat edersen PORTB değişiklik kesmesi uygulanıyor. PORTB de olacak bir değişikliği anlamak için önce PORTB önceden ne şeklide idi bilmek ve onu baz alarak değişiklik olmuşmu karşılaştırmak gerekir. İşte TEMP=PORTB ifadesi portB nin değişiklik öncesi halini hafızaya almak için kullanılıyor. Derleyici otomatik olarak okunmuş bir PortB değerini esas aldığı için hangi değişkenle okunduğu önemli değildir okunmuş olması önemlidir.

Ete

Yasin

Cevabınız için teşekkürler. Denemek için bir devre kurup programınızı yükledim ama sayaç her seferinde 4 artıyor veya 4 azalıyor hocam. Bende bunu düzeltmek için kesme programının başına şu kodu yazdım, ama yine 4 arttırarak ve 4 azaltarak çalıştı. Sebebi ne olabilir?

KESME:
   F=F+1
   IF F/4=1 THEN
      F=0
      YENI=PORTB & %11000000
      YON=A ^ B
      IF YON=1 THEN
         SAYAC=SAYAC+1
      ELSE
         SAYAC=SAYAC-1
      ENDIF
      ESKI=YENI
      TEMP=PORTB
   ENDIF
   BAYRAK=0
   RESUME
   ENABLE
 

ete

Sebebi basit aslında Encoder-pot kullanıyor isen her tık da 4 defa konum değiştirir bu encoderler. Pic de bunları algılayıp 4 defa sayma yapar. Bunu önlemenin yolu encoderin yalnızca bir konumunda sayac artımı yaptırman gerekir. Nedir bu konumlar,
%00 - %01 - %10 - %11 şeklinde geliyor yerlerini karışık yazdım sıra yanlış olabilir.İşin şu kısmında;
     YENI=PORTB & %11000000
      YON=A ^ B
      IF YON=1 THEN
         SAYAC=SAYAC+1
      ELSE
         SAYAC=SAYAC-1
      ENDIF
yerine
     YENI=PORTB & %11000000
      YON=A ^ B
      IF YON=1 and YENI=%11000000 THEN
         SAYAC=SAYAC+1
      ELSE
         SAYAC=SAYAC-1
      ENDIF
şeklinde bir ifade kullanırsan YENI değeri yalnızca %11000000 olunca sayac bir artar.
İstersen Yeni değerini %01000000 veya %10000000 veya %00000000 şeklinde de alabilirsin.
Seçtiğin bir değer sıkıntılı çalışırsa diğer seçenekleri denemende yarar var. Pot Tık ettiğinde sabit bir konumda kalıyor ise istersen A ve B uçlarını lojik olarak kontrol et ona görede o değeri yukarıdaki YENI değerinde kullan.
Ete

Yasin

#4
Teşekkürler hocam. Bu şekilde düzgün çalıştı.

Yasin

@ete hocam,

Bugün yine birkaç deneme yaptığımda encoderı normal bir hızla çevirince sayaç eksilip artıyor kafasına göre. Çok yavaş çevirince düzgün çalışıyor. Diğer değerleri de denedim ama düzelmedi. İlk başta fark etmemiştim bugün tekrar deneyince bu problemi gördüm. Kesme programı şu şekilde:

KESME:
         YENI=PORTB & %11000000
         YON=A ^ B
         IF YON=1 AND YENI=%11000000 THEN
           SAYAC=SAYAC+1
         ENDIF
         IF YON=0 AND YENI=%11000000 THEN
           SAYAC=SAYAC-1
         ENDIF
         ESKI=YENI
         TEMP=PORTB
         BAYRAK=0
         RESUME
         ENABLE

ete

Programda kusur yok. İşlemci hızı artırılabilir ama zaten 20 mhz de çalışıyor ise kusuru encoder de aramak gerekir. Encoder contakları çok dar alanda çalışıyor ve parazit üretmeye çok yatkınlar. Belkide A ve B uçları ile gnd aradına 100 nf bağlayarak denemelisin.
Ete

Yasin

Alıntı yapılan: ete - 16 Ekim 2016, 22:46:31
Programda kusur yok. İşlemci hızı artırılabilir ama zaten 20 mhz de çalışıyor ise kusuru encoder de aramak gerekir. Encoder contakları çok dar alanda çalışıyor ve parazit üretmeye çok yatkınlar. Belkide A ve B uçları ile gnd aradına 100 nf bağlayarak denemelisin.
Ete

18F452 kullanıyorum ve 40MHz'de çalıştırıyorum hocam. Yazdığım program biraz yüklü bir program. Sizin söylediğiniz düzenlemeyi yapmadan önce SERIN2 komutunu kullandım 5-6 satırda. Bunun etkisi olabilir mi? Zira 4 arttırıp 4 azaltan haldeyken düzgün çalışıyordu. Hatta ben size programı özelden göndereyim. Zira programı benden yazmamı rica eden arkadaş izin vermeyebilir buradan göndermeme.

ete

Serin2 ve Serin komutları kesme oluşmasını engeleyebilirler. Zira istedikleri bilgi gelmemiş ise programı 65 ms bloke ederler. Buda encoder okumayı engeller. Bir şekilde seri giriş komutlarını encoder kullanılmadığı zamana denk getirecek bir sistem yaratmak daha doru olur yada en iyisi USART kesmesi kullanmak. Encoder kesmesine USART kesmesinide dahil edebilirsin.
Programın geri kalanını göremiyorum PAUSE ler var ise onlarda etkiler çalışmayı. Kesme kullandığınız programlarda;
PAUSE
SERIN ve SERIN2
PULSIN
gibi komutları kullanmaktan kaçının.
Pause süresi bitmeden kesme oluşmuş olsa bile program oraya atlamaz.
Serin  komutları istedikleri bilgi gelinceye kadar programı bloke ederler en azından 65 ms bloke eder sonra bırakır.
Pulsin komutu gelen puls geniş ise bitirinceye kadar programı bloke eder.

Ete

Powered by EzPortal