A

Saydırma

Başlatan acetler, 13 Eylül 2011, 11:22:03

acetler

hocam aşağıdaki komutlarla bir sayıcı yapmayı denedim ama isiste saydıramadım kodlarda bir hata görüyormusunuz acaba


PORTA=0:portb=0
TRISB=0   
TRISA=%11100000 
'-----------------------------------------------------------------
@ DEVICE pic16F628A                                             
@ DEVICE pic16F628A, WDT_ON             
@ DEVICE pic16F628A, PWRT_ON             
@ DEVICE pic16F628A, PROTECT_OFF         
@ DEVICE pic16F628A, MCLR_off           
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 
'-----------------------------------------------------------------
'DEFINE OSC 4
'-------------------------------------------------------------------------
OPTION_REG.7=0   
CMCON=7 
'----------------------------------------------------------------------------
BIRLER        VAR   BYTE
ONLAR         VAR   BYTE
YUZLER        VAR   BYTE
X             VAR   BYTE
SAYI          VAR   BYTE
'---------------------------------------------
SYMBOL  DTA=PortB.0
SYMBOL  CLK=PORTB.1
SYMBOL  RTC_DTA=PORTA.0
SYMBOL  RTC_CLK=PORTA.1
SYMBOL  RTC_RST=PORTA.2
SYMBOL  ASAGI =PORTA.6
SYMBOL  YUKARI=PORTA.7
'-----------------------------------------------------------------------------
CLEAR 
low RTC_RST
low RTC_CLK
PAUSE 200
'-----------------------------------------------------------------------------

READ 20,BIRLER
READ 21,ONLAR
READ 22,YUZLER
BASLA:

        IF YUKARI=0 THEN
        goto ARTI
        ENDIF
        IF ASAGI=0 THEN
        GOTO EKSI
        ENDIF
               
        X=BIRLER
        GOSUB AL
        SHIFTOUT DTA,CLK,1,[SAYI]
        HIGH PORTB.4:PAUSEUS 2:LOW PORTB.4

        X=ONLAR
        GOSUB AL
        SHIFTOUT DTA,CLK,1,[SAYI]
        HIGH PORTB.3:PAUSEUS 2:LOW PORTB.3

        X=YUZLER
        GOSUB AL
        SHIFTOUT DTA,CLK,1,[SAYI]
        HIGH PORTB.2:PAUSEUS 2:LOW PORTB.2
       
        GOTO BASLA
       
ARTI:       
        BIRLER=BIRLER+1
       
        IF BIRLER=10 THEN
        BIRLER=1
        ONLAR=ONLAR+1
        ENDIF
               
        IF ONLAR=10 THEN
        ONLAR=1
        YUZLER=YUZLER+1
        ENDIF
       
        IF YUZLER=10 THEN
        YUZLER=1
        ENDIF
       
        WRITE 20,BIRLER :PAUSE 10
        WRITE 21,ONLAR :PAUSE 10
        WRITE 22,YUZLER :PAUSE 10
       
        PAUSE 500
       
        GOTO BASLA

EKSI:       
       
        BIRLER=BIRLER-1
       
        IF BIRLER<0 THEN
        BIRLER=9
        ONLAR=ONLAR-1
        ENDIF
               
        IF ONLAR<0 THEN
        ONLAR=9
        YUZLER=YUZLER-1
        ENDIF
       
        IF YUZLER<0 THEN
        YUZLER=9
        ENDIF

        WRITE 20,BIRLER :PAUSE 10
        WRITE 21,ONLAR :PAUSE 10
        WRITE 22,YUZLER :PAUSE 10
       
        PAUSE 500
       
        GOTO BASLA



AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111],SAYI :RETURN
     

         
         
END
         
                     

acetler

pardon bu kodlar artı yadırıyor ama eksi saydırmıyor


PORTA=0:portb=0
TRISB=0   
TRISA=%11100000 
'-----------------------------------------------------------------
@ DEVICE pic16F628A                                             
@ DEVICE pic16F628A, WDT_ON             
@ DEVICE pic16F628A, PWRT_ON             
@ DEVICE pic16F628A, PROTECT_OFF         
@ DEVICE pic16F628A, MCLR_off           
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 
'-----------------------------------------------------------------
'DEFINE OSC 4
'-------------------------------------------------------------------------
OPTION_REG.7=0   
CMCON=7 
'----------------------------------------------------------------------------
BIRLER        VAR   BYTE
ONLAR         VAR   BYTE
YUZLER        VAR   BYTE
X             VAR   BYTE
SAYI          VAR   BYTE
'---------------------------------------------
SYMBOL  DTA=PortB.0
SYMBOL  CLK=PORTB.1
SYMBOL  RTC_DTA=PORTA.0
SYMBOL  RTC_CLK=PORTA.1
SYMBOL  RTC_RST=PORTA.2
SYMBOL  ASAGI =PORTA.6
SYMBOL  YUKARI=PORTA.7
'-----------------------------------------------------------------------------
CLEAR 
low RTC_RST
low RTC_CLK
PAUSE 200
'-----------------------------------------------------------------------------

READ 20,BIRLER
READ 21,ONLAR
READ 22,YUZLER
BASLA:

        IF YUKARI=0 THEN
        goto ARTI
        ENDIF
        IF ASAGI=0 THEN
        GOTO EKSI
        ENDIF
               
        X=BIRLER
        GOSUB AL
        SHIFTOUT DTA,CLK,1,[SAYI]
        HIGH PORTB.4:PAUSEUS 2:LOW PORTB.4

        X=ONLAR
        GOSUB AL
        SHIFTOUT DTA,CLK,1,[SAYI]
        HIGH PORTB.3:PAUSEUS 2:LOW PORTB.3

        X=YUZLER
        GOSUB AL
        SHIFTOUT DTA,CLK,1,[SAYI]
        HIGH PORTB.2:PAUSEUS 2:LOW PORTB.2
       
        GOTO BASLA
       
ARTI:       
        BIRLER=BIRLER+1
       
        IF BIRLER>9 THEN
        BIRLER=0
        ONLAR=ONLAR+1
        ENDIF
               
        IF ONLAR>9 THEN
        ONLAR=0
        YUZLER=YUZLER+1
        ENDIF
       
        IF YUZLER>9 THEN
        YUZLER=0
        ENDIF
       
        WRITE 20,BIRLER :PAUSE 10
        WRITE 21,ONLAR :PAUSE 10
        WRITE 22,YUZLER :PAUSE 10
       
        PAUSE 500
       
        GOTO BASLA

EKSI:       
       
        BIRLER=BIRLER-1
       
        IF BIRLER<0 THEN
        BIRLER=9
        ONLAR=ONLAR-1
        ENDIF
               
        IF ONLAR<0 THEN
        ONLAR=9
        YUZLER=YUZLER-1
        ENDIF
       
        IF YUZLER<0 THEN
        YUZLER=9
        ENDIF

        WRITE 20,BIRLER :PAUSE 10
        WRITE 21,ONLAR :PAUSE 10
        WRITE 22,YUZLER :PAUSE 10
       
        PAUSE 500
       
        GOTO BASLA



AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111],SAYI :RETURN
     

         
         
END
         
                     

ete

Birinci verdiğin programda artırma ve eksiltme mantığı yanlış.  10 tabanına göre sayı sistemini öğrenmen gerek.
Birler=9+1 olduğunda Birler=10 olur ama bu durumda onlar hanesi bir artırılırken birler hanesi sıfırlanması yani sıfırdan başlaması gerek sen 1 den başlatmışsın. İkinci programda bunu düzeltmişsin.
Pic de kullanılan sayı sistemlerinde Byte cinsindenbir sayı artırıldığı sürece en büyük 255 değerine ulaşır ve tekrra artırılırsa yeniden değeri sıfır olur.

Aynı şekilde sayı birer birer eksiltilirse sayı sıfıra ulaşır ve tekrar eksiltilirse değeri 255'e döner. Bu nedenle ;
IF BIRLER<0 şeklinde bir ifade yanlıştır. PBP matematiğinde sıfırdan küçük sayı yoktur. O halde çözüm nedir derseniz;
IF BIRLER=255 then
   BIRLER=0
   ONLAR=ONLAR-1
ENDIF şeklinde olmalıdır.

Gerek artır ve gerek eksilt kısımlarında her bir durumu ayrı bir if satırı ile yapmanda gerekmez.
Artırmada;

BIRLER=BIRLER+1
IF BIRLER=10 (veya IF BIRLER>9) THEN
   BIRLER=0
   ONLAR=ONLAR+1
   IF ONLAR=10 (veya ONLAR>9) THEN
      ONLAR=0
      YUZLER=YUZLER+1
      IF YUZLER=10 THEN YUZLER=0
   ENDIF
ENDIF

şeklinde bir kod kullanmak hem kodun işleyişini hızlandırır hemde anlaşılması daha kolay olur.
Aynı şekilde Azaltma kısmında ;

BIRLER=BIRLER-1
IF BIRLER=255 THEN
   BIRLER=0
   ONLAR=ONLAR-1
   IF ONLAR=255 THEN
      YUZLER=YUZLER-1
      IF YUZLER=255 THEN YUZLER=0
   ENDIF
ENDIF

Şeklinde bir kod yazılması daha uygun olacaktır.

Ete


acetler

Teşekkür ederim...

al hanesini değiştirerek çalıştırmıştım ama şimdi mantığı anladım

AL:    LOOKUP X,[64,63,6,91,79,102,109,125,7,127,111,0],SAYI :RETURN


3mZ

Bak birde ders-13 indir çok güzel anlatılmış orda saygılar iyi çalışmöalar

gkhnpic

ete hocam 16f84te porta ve portbyi bir port gibi kullanabilirmiyiz ? yani portbdeki 8 bit ten fazla led üzerinde animasyon yapmak istiyorum bunun bir yolu varmıdır ? teşekkürler

ete

Bahsini ettiğin portlar zaten gerçek birer port. Her türlü işte kullanılabilir.
PORTB+PORTA ikilisini 8 bit + 5 bit olarak kullanabilirsin. Ancak PORTA.4 open kollektör olunca led sürmede biraz sıkıntı verir. Aşmanın yolları var ama en iyisi sen 8+4=12 bit olarak kullan derim.
Bir word değişkeninin Byte0 tarafını PortB ye verir, Byte1 tarafınıda PortA nın ilk dört bitine verirsin.
Ete

Powered by EzPortal