portb nin ilk dört bitini değişkene atamak?

Başlatan Tenir, 19 Nisan 2005, 15:08:17

Tenir

2 basamaklı bir 7 segment göstergeyi pic16f84 kullanarak sürmeye çalışıyorum. 7448 kullanıyorum çünkü pic in diğer pinleri bana lazım.
PortB nin  ilk dört pinini 74ls48 entegresine bağladım. programı picBasic kullanarak yazmaya çalışıyorum. Ama bu konuda çok bilgili değilim.
programda portb nin ilk dört pinini bir değişkene nasıl atayabilirim. Şu an tek tek pinleri kontrol ettiriyorum (mesela 1 için: if portb.0=1 and portb.1=0 and portb.2=0 and portb.3=0 then şeklinde) ben bunu m gibi bir değişkene atayıp  if m=1 şeklinde kontrol ettirmek istiyorum. Ya da daha kolay bir şekli varsa o da olur. yardımlarınız için şimdiden teşekkürler.

tnr

PortB'nin ilk dört bitinden sadece 1 display mi yoksa 2 display mi sürmek isitiyorsun? Eğer 1 display süreceksen, registerda saklı olan bilgiyi BCD'ye çevirmen gerek. Picbasic bilmediğim için kod yazamam. Mantık olarak şöyle birşey yapabilirsin: PortB'nin ilk dört bitini maskelersin, sonra register'daki göndermek istediğin ilk dört bit ise regiseter'in son dört bitini maskelersin sonra da portb ile ilgili register'ı VEYA işlemine tabi tutarsan göndermek istediğin bilgi portb'nin ilk dört bit'ine yazılır diğer bit'lerde değişiklik olmaz.

SpeedyX

m = portb & %00001111
if m<15 and m>7 then goto buyuk
if m=7 then goto orta
if m<7 then goto kucuk

Tenir

teşekkürler arkadaşlar. Bir sorum daha olacak: peki m değerini portb nin ilk dört bitine nasıl aktarabilirim?

ete

Belki daha sonra daha kısa bir yol bulabilirim ama ilk aklıma gelen önce ilk dört biti sıfır yapıp sonra m değerini buraya yerleştirmek oldu. Şöyle yapılacak ;
PortB=PortB & %11110000
PortB=PortB OR m

Diyelimki PortB=%00010110 olsun , m ise m=%1101 olsun
Bu durumda ;
PortB=%0001 0110 & %1111 0000=%0001 0000
PortB=%0001 0000 OR %1101 = %0001 1101
olacaktır.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

tnen

INCLUDE "MODEDEFS.BAS"
TRISB = 0
PORTB = 0
SAYAC  VAR   BYTE
TEMP     VAR  BYTE
DEGER   VAR  BYTE

SAYAC = 0
DEGER = 7

MAIN :

FOR SAYAC = 0 TO 9

TEMP = DEGER<<4   'PORTB NIN SON 4 BITINE ATILACAK DEGER

PORTB =TEMP | SAYAC  

PAUSE 500

NEXT SAYAC

DEGER = DEGER+1 'PORTB NIN 4 BITINDEKI DEGER BELIRLENIYOR.

IF DEGER > 9 THEN DEGER = 0

GOTO MAIN
END


Yukardaki kod yardımcı olur sanırım.

ete

@tnen,

yazdığın koddan bir şey anlamadım. Her şeyden önce  @Tenir arkadaş bir m değerini ki bu 4 bitlik bir değer PORTB nin ilk dört bitine nasıl yerleştireceğim diye sormuş. Sen ise;
TEMP = DEGER<<4 'PORTB NIN SON 4 BITINE ATILACAK DEGER
demişsin. Yani son 4 bite atmaya çalışıyorsun.
Peki PortB nin önceki değeri özellikle son 4 bitlik (veya senin ifadende ilk 4 bitlik değişmemesi gereken değer ne olacak?) bunu dikkate almamışsın.
Birde neden 10 adet lik döngü kullandın hiç anlamadım.
Daha doğrusu yazdığın kodun amacını anlayamadım açıklarmısın?.
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

tnen

@ete  
Hocam programda fazla acıklama yapmadıgım için ozur dilerim oncelikle.
Hocam 74LS48 BCD to 7 segment decoder bunun için portb 'nin 0-1-2-3 nolu pinlerine 74LS48 baglandıgına gore bu pinler cıkıs olması gerekir. Dongu 9 a kabar cunku sayıcı gibi dusundum.Tabi burada dongu 15 e kadar da olabilirdi. burada ki dongunun amacı displaye yollanılacak deger neye gore degişir bilmedigimden bende dongu ile yaptım.Eger portb nin 4-5-6-7 ci pinleri cıkıs değil giriş ise kodda kucuk bi degişiklikle hallediliir. bense bu pinleri cıkıs olarak kabul ettim. koddada goruldugu gibi 4 bitlik degişimler birbirlerinden etkilenmez. bu kodda m degeri sayac degeri DEGER ise diger 4 bitlik degerdir.

SpeedyX

[marq=left]bu konu neden bukadar uzadı anlamadım. aslında herkes aynı dili konuşuyor...[/marq]
ortaya bi karışık yapıyorum;
Assembly:
movfw portb ; değeri değişkene aktarmak.
andlw 0x0f
movwf sayac
---
movfw sayac ; değeri çıkışa aktarmak.
andlw 0x0f
movwf portb
---
movlw .15 ; bu da sayıcı.
movwf sayac

movfw sayac
movwf portb
call 1sn_bekle
decfsz sayac,f
goto $-4
goto $ ; kilit


Pic Basic:
sayac = portb & 0x0f ' değeri değişkene aktarmak.
---
portb = sayac & 0x0f ' değeri çıkışa aktarmak.
---
sayac = 15 ' bu da sayıcı.
while sayac>=0
      portb = sayac
      pause 1000
      sayac = sayac-1
wend


C:
sayac = portb & 0x0f // değeri değişkene aktarmak
---
portb = sayac & 0x0f // değeri çıkışa aktarmak.
---
for(sayac=15;sayac>=0;--sayac) { // bu da sayıcı.
      portb=sayac;
      snBekle(); //veya delay_ms(1000); veya delayms(1000);
}