paralel data girişi yapıp seri olarak göndermek??

Başlatan timu57, 08 Ocak 2011, 13:06:31

timu57

merhaba
yapmaya çalıştığım şey PIC 16F877A yı kullanarak
en basitinden 8 bit paralel bilgi girişi yapıp, seri olarak diğer PIC e göndermek ve
diğer alıcı PIC te bu gelen seri 8bit bilgiyi tekrar paralel olarak ledler vasıtasıyla görmek.
bunu if then else komutlarıyla PORTB yi kullanarak yapmaya çalıştım ama olmadı.
örneğin 00000001,00000010,00000011,00000100
3. sıradaki 8 bitlik veriyi gönderdiğimde sadece 3. led yansın istiyorum ama bir ve ikinci ledde yanıyor.
bunları PORTB den switchlerle girip karşı taraftaki PIC'in portb ye bağlı ledlerinde görebilmek istiyorum.
PBP da bunu nasıl yapabiliriz?

Tagli

Yazmış olduğun kodu eklersen hatalarını bulabiliriz. Paralel giriş clock eşliğinde mi olacak yoksa asenkron mu? Bir hız gereksinimin var mı?
Gökçe Tağlıoğlu

timu57

yazmış olduğum kod aşağıdaki gibidir.
clock eşliğinde olursa ne olur, yada asenkron nasıl olur bilmiyorum. daha yeni başlamış sayılırım PIC öğrenmeye.
yardımcı olabilirseniz sevinirim

VERİCİ KODLARI:

@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_ON
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
CMCON=7
ADCON1=7
PortA=0
TrisA=%00000000
PortB=0
TrisB=255
SYMBOL CIKIS=PORTA.0
ver var byte
pause 200

basla:
ver=0
if portB=%00000001 then
ver=11
gosub gonder
WHILE portB=%00000001
WEND
endif

if portB=%00000010 then
ver=22
gosub gonder
WHILE portB=%00000010
WEND
endif

if portB=%00000011 then
ver=33
gosub gonder
WHILE portB=%00000011
WEND
endif

if portB=%00000100 then
ver=44
gosub gonder
WHILE portB=%00000100
WEND
endif
PAUSE 100
GOTO BASLA
'-------------------------ALT PROGRAMLAR---------------------------------------
gonder:
SEROUT2 CIKIS,396,["T","I","M",ver]
SEROUT2 CIKIS,396,["T","I","M",ver]
SEROUT2 CIKIS,396,["T","I","M",ver]
SEROUT2 CIKIS,396,["T","I","M",ver]
return
END


ALICI KODLARI:

@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_ON
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
CMCON=7
ADCON1=7
PORTA=0
TRISA=%00000001
PORTB=0
TRISB=%00000000 'B portu tamamı çıkıs yapıldı.
'---------------------------degiskenler------------------------------
AL VAR BYTE
LEDA VAR PORTB.1
LEDB VAR PORTB.2
LEDC VAR PORTB.3
LEDD VAR PORTB.4
GIRIS VAR PORTA.0
'-----------------------------B A S L A N G I Ç ---------------------------
CLEAR
PAUSE 300
PORTB=0 'tüm çıkıslar low seviyesinde
'-------------------------------------------------------------------------------
BASLA:
SerIn2 GIRIS,396,[WAIT ("TIM"),AL]
IF AL=11 THEN
TOGGLE LEDA
ENDIF
IF AL=22 THEN
TOGGLE LEDB
ENDIF
IF AL=33 THEN
TOGGLE LEDC
ENDIF
IF AL=44 THEN
TOGGLE LEDD
ENDIF
PAUSE 200
GOTO BASLA
END


Ruzgarbey

Alıntı yapılan: timu57 - 09 Ocak 2011, 02:31:06
yazmış olduğum kod aşağıdaki gibidir.
clock eşliğinde olursa ne olur, yada asenkron nasıl olur bilmiyorum. daha yeni başlamış sayılırım PIC öğrenmeye.
yardımcı olabilirseniz sevinirim

VERİCİ KODLARI:

@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_ON
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
CMCON=7
ADCON1=7
PortA=0
TrisA=%00000000
PortB=0
TrisB=255
SYMBOL CIKIS=PORTA.0
ver var byte
pause 200

basla:
ver=0
if portB=%00000001 then
ver=11
gosub gonder
WHILE portB=%00000001
WEND
endif

if portB=%00000010 then
ver=22
gosub gonder
WHILE portB=%00000010
WEND
endif

if portB=%00000011 then
ver=33
gosub gonder
WHILE portB=%00000011
WEND
endif

if portB=%00000100 then
ver=44
gosub gonder
WHILE portB=%00000100
WEND
endif
PAUSE 100
GOTO BASLA
'-------------------------ALT PROGRAMLAR---------------------------------------
gonder:
SEROUT2 CIKIS,396,["T","I","M",ver]
SEROUT2 CIKIS,396,["T","I","M",ver]
SEROUT2 CIKIS,396,["T","I","M",ver]
SEROUT2 CIKIS,396,["T","I","M",ver]
return
END


ALICI KODLARI:

@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_ON
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
CMCON=7
ADCON1=7
PORTA=0
TRISA=%00000001
PORTB=0
TRISB=%00000000 'B portu tamamı çıkıs yapıldı.
'---------------------------degiskenler------------------------------
AL VAR BYTE
LEDA VAR PORTB.1
LEDB VAR PORTB.2
LEDC VAR PORTB.3
LEDD VAR PORTB.4
GIRIS VAR PORTA.0
'-----------------------------B A S L A N G I Ç ---------------------------
CLEAR
PAUSE 300
PORTB=0 'tüm çıkıslar low seviyesinde
'-------------------------------------------------------------------------------
BASLA:
SerIn2 GIRIS,396,[WAIT ("TIM"),AL]
IF AL=11 THEN
TOGGLE LEDA
ENDIF
IF AL=22 THEN
TOGGLE LEDB
ENDIF
IF AL=33 THEN
TOGGLE LEDC
ENDIF
IF AL=44 THEN
TOGGLE LEDD
ENDIF
PAUSE 200
GOTO BASLA
END
merhaba.kodlarınız arasında paralel data girişi ve çıkışı ile ilgili herhangi bir kod görmedim.kodlarınızda sadece portb nin belli pinlerini okuyup , okuduğunuz değere göre ver ısımlı değişkene değer yükleyip seri olarak diğer işlemcinize gönderiyorsunuz.
eğer istediğiniz VERICI picin PORTB uçlarındaki değişikliğin seri olarak Alıcı picin PORTB pinlerinde çıkmasını istiyorsanız şu şekilde yapın.
verici kodu
BASLA:
IF NOT PORTB=0 THEN 'PORTB nin girişlerine basılmış ise
ver=portb 'portb nin içeriğini okuduk.
gosub gonder 'alıcı pice gönderiyoruz.
while portb <> 0  :wend 'portb nin girişi bırakılıncaya kadar döngü kur
ENDIF
GOTO BASLA

ALICI:
BASLA:
SerIn2 GIRIS,396,[WAIT ("TIM"),AL]
portb=AL
GOTO BASLA

sorunuzdan anladığım kadarı ile cevaplamaya çalıştım.kolay gelsin





Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

timu57

soruma cevap vermeye çalıştığınız için öncelikle teşekkür ederim ama derdimi tam anlatamamışım
vericinin portb sinden ikilik sistemde sayı girip (00000001,00000010 gibi) alıcının portb sine bağlı ledlerden bunu 10 luk sistemde okumak istiyorum.
yani 00000101 bilgisini gönderdiğimde alıcıda sadece 5. led yansın istiyorum.
1. ve 3. ledler yansın istemiyorum. bunu nasıl yapabiliriz acaba?

frkcn

bu dilden çok anlamıyorum ama bide böyle denermisin..

@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_ON
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
CMCON=7
ADCON1=7
PORTA=0
TRISA=%00000001
PORTB=0
TRISB=%00000000 'B portu tamamı çıkıs yapıldı.
'---------------------------degiskenler------------------------------
AL VAR BYTE
GIRIS VAR PORTA.0
'-----------------------------B A S L A N G I Ç ---------------------------
CLEAR
PAUSE 300
PORTB=0 'tüm çıkıslar low seviyesinde
'-------------------------------------------------------------------------------
BASLA:
SerIn2 GIRIS,396,[WAIT ("TIM"),AL]
IF AL=11 THEN
portB=%00000001
ENDIF
IF AL=22 THEN
portB=%00000010
ENDIF
IF AL=33 THEN
portB=%00000100
ENDIF
IF AL=44 THEN
portB=%00001000
ENDIF
PAUSE 200
GOTO BASLA
END
Bugün ömrümün geride kalan son günü...