avatar_Mucit23

Porta birbirinden bağımsız bilgiler yazma

Başlatan Mucit23, 12 Ocak 2013, 11:23:07

Mucit23

Ete Hocam Merhaba

Bir konuda fikrinizi almak istiyorum.

Multiplex olarak çalışan bir saat var elimde. Yüksek voltaj verildiği için üzerinde bulunan 16F877 yanmış. Ben yeni bir işlemciye yeniden kod yazıyorum.

Saatin Şemasını çıkardım. Ekte hocam inceleyebilirsiniz.

Saat Multiplex olarak çalışıyor. Portb nin yüksek 4 bitiyle 4 adet displey taranıyor.  Düşük 4 bitinde ise ekranda görünecek rakam bilgisi veriliyor.

Ben Portb nin yüksek 4 bitine karışmadan düşük 4 bite değer göndermeliyim. Yani düşük 4 bite gönderdiğim değer yüksek 4 bitteki değeri bozamayacak. Ben yaptım aslında ama deveye hendek atlatmak gibi birşey oldu.

Bunu en optimize bir şekilde nasıl yaparım.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Bu sistemde B portu yarım yarım kullanıldığına göre olayın iki boyutu var demektir.
Birincisi Üst bitleri yani Bit4-bit7 arası bitleri bozmadan İlk 4 bite yani 0-3 bitlerine bilgi yazmak,
İkincisi alt bitleri bozmadan Üst bitlere  bilgi yazmak.
Önce birincisini ele alalım;
İşin temeli şöyle yazacağın bitleri sıfırlayarak diğer bitleri (bozmayacağın bitleri) kopyalarsın. O halde TEMP=PORTB & %11110000  (Diyelimki TEMP%1010 000 olsun)
ELinde üst bitlerin kopyası mevcut. O halde şimdi yazacağın bitleri yazarsın ve kopyalanan bitleri yerine yerleştirirsin.
Dİyelimki Sayı_ALT  değişkenimiz değişecek bitlere verilecek bilgiyi tutuyor. Sayı_ALT=12 olsun (%0000 1100)
YAZILAN=SAYI_ALT+TEMP şeklinde porta yazılacak bilgi hazırlanmış olur. Örneklerimize göre bakarsak YAZILAN=%10100000+%00001100=%10101100 şeklinde bir sayı elde edilmiş olacaktır.

Şimdi ikinci alternatifi inceleyelim;
Bu alternatifte bu sefer alt bitleri kopyalayacağız. TEMP=PORTB & %00001111   (Temp=%0000 1100 olsun)
SAYI_UST=%00001010 olsun buda üst bitlere vereceğimiz yeni değer olsun. Bunu üst bitlere yazabilmemiz için 4 bit sola kaydırmamız gerekecektir. SAYI_UST=SAYI_UST<<4  (sayımız %1010 0000 oldu)
Şimdi YAZILAN=SAYI_UST+TEMP şeklinde bir eşitlikle bu işi de tamamlamış oluruz. (YAZILAN=%10100000+%00001100=%10101100)

Umarım senin yaptığından kısadır.  Gerçi ben biraz uzatarak yaptım.  Kısası şöyle;
-Alt bitler değişiyor     TEMP=(PORTB & %11110000) + SAYI
- Üst bitler değişiyor   TEMP=(PORTB & %00001111) + (SAYI<<4)
gördüğün gibi he riki alternatif de tek satırla halledilebiliyor.

Ete

Mucit23

Yok Hocam Ben bayağı bi saçmalamışım :)

Aslında hangi bite ellenmiyecekse onun kopyasını almak aklıma geldi ama ben kopyasını almnadan direk düşük ve yüksek 4 bite yazayım dedim. Kısa yoldan yapamadım.

Herşeyi tek satırda yapmaya çalışıyorum.

Mesela SAYIH ve SAYIL adında iki adet  değişkenimiz olsun. Bu değişkenler max. 4 bitlik değer alıyor ve değişkenin 1. sini düşük 4 biti, Diğer değişken ise yüksek 4 biti temsil etsin

Bu iki  adet değişkene herhangi bir yerde değer yükleyebilirim.

Bu değişkenleri tek bir satırda portb ye yazmak için sizin yazdıklarınızdan anladığım kadarıyla aşağıdaki gibi bir işlem yapmam gerekir.

PORTB=((PORTB & %11110000)+SAYIL)+(((PORTB & %00001111)+(SAYIH<<4))<<4)

Sizin dediğine göre tek bir satırda bunu yapsam yeterli olur. Bu şekilde bir kullanım yanlış olurmu? Daha Doğrusu düzgün çalışırmı?
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Bence bu yaptığın yanlış.
PortB nin eski değerinden eser kalmadığına göre neden bu kadar zahmete giriyorsun anlamadım. Tek yapman gereken şey;

PORTB=(SAYIH<<4)+SAYIL şeklinde bir komut vermen hepsi bu.

Mantığımızı çalıştıralım istersen;
- ((PORTB & %11110000)+SAYIL) işlemi PortB ye 4 adet LSB bitlerini yazacak.
- (((PORTB & %00001111)+(SAYIH<<4))<<4)  işlemi hepten karışık bir şey olmuş. adım adım örnekli gidersek
   a) PORTB & %00001111 komutu 4 bitlik LSB yi aldı. Diyelimki alınan %00001010 olsun
   b) SAYIH<<4    SAYIH değerini 4 bit sola kaydırdı  Dyelimki SAYIH=%00001100  idi ve işlem sonunda SAYIH=%11000000 oldu
  c) <<4 işlemi burada fazla olmuş , SAYIH değerini 4 bit daha sola kaydırırsan SAYIH=0 olacaktır. Bunu yok farz etmek lazım.
Şunu anlaman lazım . Portu okuduktan sonra şayet değişmesini istemediğin bitler var ise onları kopyasını alıp değişen kısımla birlikte yeniden prota verirsin. O zaman lazım sana kopya almak. Ama aynı anda bütünbitler değişiyor ise kopya falan almaya gerek yok. Dİrek söylediğim gibi yazarsın olur biter.

Ete

Mucit23

Ben niye bukadar ayrıntıya girmişim anlamıyorum. Sanırım size yanlış anlattım.

Amaç şu hocam.

Kesme 4 adet displayi portb nin yüksek 4 biti ile displayleri tarıyorum. Aynı zamanda her bir kesmede hangi dijit ekranda ise PortB nin düşük 4 bitine o dijite ait rakam bilgisini veriyorum. Ama işte bu işlemni yapınca portb nin yüksek 4 bitindeki tarama bilgisi bozuluyor. 

Dediğiniz gibi yapacam. Zaten her seferinde display bilgisi değişiyor. Sabit kalan birşey yok. 

Sanırım ilk anlatmam gereken şeyi son anlattım. Kusura bakmayın.

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Önceden de söyledim.
Şayet Alt bitler sabit kalıp  üst bitler değişiyor ise o zaman kopyalı yapman gerek. Az bir zaman sonra bu seferde üst bitler kalıp alt bitler değişecek olsa bile yine kopyalı yapman gerek.
Senin son açıkladığın şekilde sanki ikiside aynı anda yapılıyormuş gibi bir intiba yaratmışsın ama sanırım öyle olmamalı.
Henüz displaylerin tarama şekline kafa yormadım ama aynı anda yapıldıklarını sanmıyorum.
Gerçi aynı anda da yapılabilir. Sürme şekline bakılırsa;
1 Nolu display için ABCD bilgisini belirleyeceksin SAYIL= %00000010  'displayde 2 gözükecek
Bu displaya ait 4511 in LE/STB pinini low yapacaksın ama diğerleri HIGH da kalacak. Ohalde SAYIH=%01110000
Ardından bilgileri bir araya getirip porta yazacaksın.
PORTB=(SAYH)+SAYL
bu kadar. Tek satırda yapmış oldun.

Ete

Mucit23

Aynen hocam Bende sizin dediğiniz gibi yapmayı planladım.
Düşük 4 bitte zaten sayı bilgisi var.

Ekranda 1234 yazacaksa
1.kesmede %01110001
2.kesmede%10110010
3.kesmede%11010011
4.kesmede%11100100

göndermem gerekir. Sisteme göre tarama sırası değişebilir.

Bunuda bu fonksiyon yapıyor
PORTB=(SAYIH<<4)+SAYIL

Teşekkürler.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal