pic c de portlar ya hep ya tek mi kontrol ediliyor?

Başlatan erg, 10 Ağustos 2006, 18:54:08

erg

bizim sorunumuz su. pic 16f84 un 8 pinli b portunu kontrol etmek istiyoruz. bize gereken 7 bacak. onun icin gereken kod bir dizide bulunuyor. bu 7 bacakta birkac for dongusunun icinde. normalde 8. bite de 0 yukluyorum boylece calisiyor ama simdi o pinide kullanmamiz gerekiyor. ama tek tek port b0=1; portb1=0 seklinde yazmak istemiyoruz.

ben header file da bu portun 7 bitini toplamaya calistim basaramadim.
bir baska dizide belirmeye calistim o da olmadi.

unsigned char erg[]={RBO,RB1,RB2,RB3,RB4,RB5,RB6}
bir de unsigned yerine int kullanarak.

bunu yapmanin yolu yok mudur varsa nasil?

kurumahmut

#byte PORTB = 0x......artık ne ise port adresi...


int new_value;

new_value = 0xFF;    //Örnek değer...

PORTB = ( PORTB & 0x80 ) | ( new_value & 0x7F );

Amaç yeni değerin MSB sini sıfırlarken, portb nin eski değerinin msb si harici diğerleri sıfırlanır sonra bu iki değer veya işlemine alınır. Sonra porta yazılır...

Ziya

struct tanımına bak.

struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN unused;           // low order up.  ENABLE will
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN enable;           // on to an I/O port to gain
           int     data : 4;         // be pin B0.
        } lcd;

#byte lcd = 6                  // on to port B (at address 6)


Yukarıda lcd değişkeni  port_b dir.  lcd.rs değişkeni pin_b1 dir. lcd.rs=1 ya da lcd.rs=0 şeklinde kullanılır.

istediğin bu değil de pinlere dizi gibi erişeyim diyorsan bir dizi tanımla.

dd[8]={128,64,32,16,8,4,2,1} şeklinde.

portb nin 8. bitini set edeceksen

portb |= dd[7]

portb nin 4. bitini resetleyeceksen

portb &= ~dd[3]

döngü içerisinde istediğin gibi kullanabilirsin.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

piedos

Bunların hiçbirine gerek yok.
TRISB register ına 0x80 sayısını yüklersen iş çözülür.
Pinlerin mimarisini incelemeni tavsiye ederim.
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

kurumahmut

Değişik bir bakışla doğru ama ya RB7 yi çıkış olarak kullanmak isterse...

Ziya

Alıntı yapılan: "piedos"Bunların hiçbirine gerek yok.
TRISB register ına 0x80 sayısını yüklersen iş çözülür.
Pinlerin mimarisini incelemeni tavsiye ederim.
Gerek yoksa sileyim mi? Database şişmesin gereksiz yere.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

rree

And işlemi ile istediğn pini 0 yapabilirsin 1 olanlar bilgilerin olur. işine yararmı

Veli B.

And işleminden kastın sanırım ampersand "&". AND değildir değil mi?

rree

KesSin=PortB
    MovLW %00001100
    ANDWF KesSin,F
                RRF KesSin,F
    RRF KesSin,F
Ornek kotta PortB okunuyor   2. 3. bitler and işlemi uygulanır. diğer bilgiler sıfırlanır. Data sağa iki defa sağa kaydırılır. değerler endüşük bit
haline alır. KesSin  ramda bir değişken adıdır. Sonuç 0000000XX olur. probleminize çözüm olurmu?

erg

herkese cabalarindan dolayi teşekkür ediyorum. pek deneme firsatim olmadi. onumuzdeki gunlerde deneyip daha net seyler soyleyebilirim ama okudugum kadariyla cogu bizim isimizi karsilamayacak gibi duruyor.

ben size programi gondereyim. bu zamanlamasi tam tutmasa da saat programi. deneme amacli yazildi. en icerdeki dongude 4 adet 7-segment gostergeyi surekli olarak tazelemek suretiyle 7 pin kullanarak 4 adet 7-segment kontrol ediliyor. program sismesin diyede dongulerin icindeyiz ve sayilari da en bastaki dizinden cagiriyoruz.

#include <pic.h>
#include <delay.c>
main(void)
{
int m=0;
int i=0;
int j=0;
int k=0;
int l=0;
int sayac[10]={63,6,91,79,102,109,125,7,127,111};
TRISB=0;
TRISA=0;
for(l=0;l<3;l++)
{
k=0;
j=0;
i=0;
if(l==2)l=0;
m=0;
for(k=0;k<10;k++)
{
for(j=0;j<6;j++)
{i=0;m=0;
for(i=0;i<10;i++)
{m=0;
for(m=0;m<20;m++)

{PORTB=~sayac[i];
PORTA=2;
DelayMs(7);

PORTB=~sayac[j];
PORTA=4;
DelayMs(7);

PORTB=~sayac[k];
PORTA=8;
DelayMs(7);

PORTB=~sayac[l];
PORTA=16;
DelayMs(7);
}
}
}
}
}
}


simdi burada da goruldugu uzre portb surekli dizinden cagiriliyor. ornegin 63 sayisi 00111111 olarak portb ye yuklendiginde gosterge 0 gosteriyor.

simdi gene goruldugu uzre portb seklinde kontrol edince 8 pin birden surekli olarak dongu icerisinde. o yuzden kullanilmayan pine bir fonksiyorn yuklemem gerekse ben bir dizi if koyacagim sonra da neredeyse ayni baska bir for dongusunde sayilari tekrar tanitacagim yeni dizilere ihtiyac duyacagim. program tek pin yuzunden iki katina cikiyor. onun yerine ben herhangi bir isimle tanitacagim sekilde sadece portb nin 7 pinini kontrol edebilsem kalan portu da bosa ciksa. yani mesela

goster=~sayac[j];

goster portb nin ilk 7 pinine benim numarayi gonderse kalan 8. rb7 benim emrimde bos kalsa.

umarim anlasilir olmuştur
herkese tekrar ve simdiden teşekkürler

kurumahmut

Sanırım yeterli cevabı ilk mesajda vermiştim. 7pini ayrı 1 pini ayrı kontrol etmek istiyorsun. Ben böyle anlıyorum. Verilen kodu fonksiyona çevirip istediğin zaman çağırabilirsin. Ayrıca RB7 için de aynı mantıkta bir fonksiyon yazarsın. Amacın 7bit değişirken 8.nin değişmemesi ve de 8.bit değişirken 7bitin değişmemesi değil mi?