avatar_sonmoikan

Seri Bit Girişi

Başlatan sonmoikan, 01 Ağustos 2014, 15:50:16

sonmoikan

ETE hocam size bir sualim olacaktı.

Diyelim ki portb.2 a seri data girişi yapıyorum, bir döngü içerisinde 8 adet peş peşe girilen logic bit değerini nasıl 8 bitlik bir değişkene atayabilirim.


@ DEVICE PIC16F628A
@ DEVICE PIC16F628A, WDT_ON
@ DEVICE PIC16F628A, BOD_ON
@ DEVICE PIC16F628A, PWRT_ON
@ DEVICE PIC16F628A, PROTECT_OFF
@ DEVICE PIC16F628A, MCLR_OFF
@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT
@ DEVICE PIC16F628A, BOD_ON

TRISA=0
TRISB=%00000100   ;portb.2 bilgi girişi
PORTA=0
PORTB=0

DEFINE OSC 4
CMCON = 7

DEFINE SHIFT_PAUSEUS 100

SYMBOL CLK_165=PORTB.0
SYMBOL SH_165 =PORTB.1
SYMBOL SO_165 =PORTB.2

SYMBOL CLK_595=PORTB.5
SYMBOL DS_595 =PORTB.6 
SYMBOL SH_595 =PORTB.7

I VAR BYTE 
VERI VAR BYTE 50
TEMP VAR BIT[8]

SH_165=1 ;74HC165 i pulsout başlangıcı 1 olsun

BASLA:

;normal olanı
;SHIFTIN SO_165,CLK_165,0,[VERI]  ;Giren veriyi oku
;PULSOUT SH_165,2
;PAUSE 10
;SHIFTOUT DS_595,CLK_595,1,[VERI] ;giren veriyi çıkart
;PULSOUT SH_595,2
;PAUSE 10

PULSOUT SH_165,2       ;Bir sonrası okuma için 74HC165 i resetle
FOR I = 0 TO 7
    DS_595=SO_165      ;Giriş datasını çıkış datasına eşle
    PULSOUT CLK_595,2  ;okunan biti 74C595 e gonder
    PULSOUT CLK_165,2  ;giriş datasının bir sonraki bitine bak
NEXT I
PULSOUT SH_595,2       ;8 adet Bit bilgisini 75HC595 den çıkart
PAUSE 10
                 
GOTO BASLA


Ben bu şekilde yapabildim oldu,
fakat ard arda okuduğum 8 adet (daha az-çok) logic değeri bir değişkene kaydedemedim. Örneğin;



FOR I = 0 TO 7
   PULSOUT CLK_165,2 
   TEMP[I]=SO_165       
NEXT I

VERI=TEMP ;tek tek okuduğun bit bilgilerini birleştirip, 1 byte lık  değişkene atayamıyorum

SHITOUT DT_595,CLK_595,0,[VERI] 
PULSOUT SH_595,2   


SHIFTIN komutunu kullanmadan yapabilmenin başka bir yöntemi var mı acaba?

Saygılarımla...
ABDULLAH

ete

#1
Bu gibi işlerde iki yöntem den birini kullanmak gerekir.
Birincisi bir index değişkeni (Mesela I) alıp onunla 8 adetlik bir döngü kurulur.

FOR I=0 to 7
Sonra Okunan bilgiyi tek bitlik bilgi olarak okuyup sonra atanacak değişkene aktarmak uygun olur.
Gelen=PORTB.2 'portB.2 den veri geldiğini varsayalım.
Veri.0[I]=Gelen  şeklinde bir eşitlikle gelen veri bitleri Veri isimli değişkene aktarılmış olacaktır.
Next

İkinci yöntem her okumadan sonra veriyi shift (kaydırma) yaparak veri bitleri ayarlanır.
For I=0 to 7
Gelen=PORTB.2
Veri=Gelen
Veri=Veri<<1
Next

bu sistemde 8 adet veri bitini Veri isimli değişkene atar.
Bu verdiğim örnekler veri bitlerini alır ancak clk palsi ile senkron yapmaz. Senkronu senin sağlaman gerekir. Yada shiftin ile bu işi halletmen daha uygun olabilir.

Ete

sonmoikan

#2
Her 2 yöntemi de yaptım hocam gayet güzel oldu teşekkür ederim.


;*******************************************************************************
UCUNCU_YONTEM:
    PULSOUT SH_165,2       ;Bir sonrası okuma için 74HC165 i resetle
    FOR I=7 to 0 step-1   
        veri.0[I]=SO_165   ;Giriş datasını çıkış datasının I Bitine ekle
        PULSOUT CLK_165,2  ;giriş datasının bir sonraki bitine bak
    Next
    SHIFTOUT DS_595,CLK_595,1,[VERI]
    PULSOUT SH_595,2       ;8 adet Bit bilgisini 75HC595 den çıkart
    PAUSE 10
RETURN
;*******************************************************************************
DORDUNCU_YONTEM:
    PULSOUT SH_165,2       ;Bir sonrası okuma için 74HC165 i resetle
    For I=0 to 7
        TEMP=SO_165        ;Giriş datasını sanal değişkene ata (0 yada 1 olur)
        VERI=VERI<<1+TEMP  ;Veri datasını 1 sola yadır ve okunan bit değerini ekle
        PULSOUT CLK_165,2  ;giriş datasının bir sonraki bitine bak
    Next
        SHIFTOUT DS_595,CLK_595,1,[VERI]
        PULSOUT SH_595,2       ;8 adet Bit bilgisini 75HC595 den çıkart
        PAUSE 10
RETURN   
ABDULLAH

Powered by EzPortal