ccs c bit bazında atama nasıl yapılır?

Başlatan salih18200, 16 Ekim 2009, 12:19:02

salih18200

merhaba arkadaşlar benim amacım hi-tech te olduğu gibi
bir portun tek bitine 0-1 şeklinde bilgileri atamak
örnek

RA.0=1;
RA.1=0;

pin_a0=1;
pin_a1=0;

şeklinde eşitlik kullanarak atama yapmak bu şekilde bir şey
ccs de mümkünmüdür.

soruma ek olarak tanımladım bir değişkenin bitlerine nasıl erişebilirim

int8 a;
a nın bitlerine tek tek nasıl erişebilirim

mikromuh

Yanlış hatırlamıyorsam bu şekilde kullanabilirsin.

output_bit(pin_b0,1);
output_bit(pin_b0,0);

yada

#define pin5   pin_b5
#define pin6  pin_b4

  output_high(pin5);    
  output_low(pin6);

onurksp

Alıntı yapılan: "salih18200"merhaba arkadaşlar benim amacım hi-tech te olduğu gibi
bir portun tek bitine 0-1 şeklinde bilgileri atamak
örnek

RA.0=1;
RA.1=0;

pin_a0=1;
pin_a1=0;

şeklinde eşitlik kullanarak atama yapmak bu şekilde bir şey
ccs de mümkünmüdür.

soruma ek olarak tanımladım bir değişkenin bitlerine nasıl erişebilirim

int8 a;
a nın bitlerine tek tek nasıl erişebilirim


CCS de  bir portun tek bitine  0 yada 1 bilgisi atamak için output_high(pin_B3) yada output_low(pin_A2)  komutlarını kullanabilirsin.  yada istenen portun istenen bitini 1 yada 0 yapmak için output_bit(PINC4,1) yada output_bit(PINB5,0) komutlarını kullanabilirsin.


umarım sorunu doğru anlamışımdır  bunlar işine yarar.

gelelim ikinci soruna istediğin bite ulaşmak için kaydırma komutlarını  kullan istediğin biti en sağa kaydır ve elde ettiğin yeni sayıyı da 00000001 ile AND(ve işlemi) işlemine tut sana sadece 1. terim kalsın  buda istediğin bit olur.

necati

bit_set(a,3);//a nın 3.bitini 1yap

bit_clear(a,3);//a nın 3.bitini 0 yap
[email]entegreterbiyecisi@yahoo.com[/email]

onurksp

Alıntı yapılan: "necati"bit_set(a,3);//a nın 3.bitini 1yap

bit_clear(a,3);//a nın 3.bitini 0 yap


hazır kod olduğunu bilmiyordum bu da güzelmiş.Bnm fikir biraz asmbly ile mikroişlemciler dersinden kalma :D

salih18200

cevaplarınız için teşekkürler
ama benim istediğim bu deildi ccs c fonksiyonlarını kullanmadan yapmak
istiyordum.C syntax sına uygun olarak çünki yazdığım kod kayan yazı tarama işlemi yapıyor.Verdiğiniz fonksiyonlar fazladan kod ürettiği için benim algoritmamın yavaş çalışmasına neden oluyor...
C içerisinde asm kullanarak kısa yoldan hallettim
ilginize teşekkürler...

rojhatbilge

Evet CCS C de fonksiyon kullanmadan portlara direk erişim yapılabilir.
Bazı C araçlarıyla bu mümkün. Bu araç bit alanları dediğimiz bir yapı (struct).

Fikir vermesi için 16F628 için oluşturduğum kütüphaneyi aşağıda yayınlıyorum. Aşağıdaki kodları programın global alanına yazmanız yada daha iyisi benim yaptığım gibi kütüphane oluşturup reg16F628A.h çeklinde include etmeniz yeterli.

#ifndef  _REG16F628A_H_
#define  _REG16F628A_H_


typedef struct tagREG {
   int1 p0:1;
   int1 p1:1;
   int1 p2:1;
   int1 p3:1;
   int1 p4:1;
   int1 p5:1;
   int1 p6:1;
   int1 p7:1;
} REG;

REG PORTBbit;
REG PORTAbit;

REG TRISBbit;
REG TRISAbit;

#byte TRISAbit = 0x85
#byte TRISBbit = 0x86
#byte PORTBbit = 0x06
#byte PORTAbit = 0x05

#byte TRISA = 0x85
#byte TRISB = 0x86
#byte PORTB = 0x06
#byte PORTA = 0x05


#endif


Bundan sonra artık ana programda ve fonksiyonlarda TRIS ve PORT'lara direk isimleriyle erişebilir değer yazdırılabilir veya okunabilir.
Bit bit erişmek içinde  TRISXbit.px ve PORTXbit.px şekinde istenilen portun bitine bit olarak erişilip, okunup yazılabilir.

Portlara direk erişim için örnek;
void main()
{
   int8 val;
   
   TRISA = 0X0F;        
  
   TRISBbit.p0 = 1;
   TRISBbit.p2 = 0;
   
   val = PORTA;
   
   PORTBbit.p2 = 1;
   
   if(PORTBbit.p7 == 1)
      PORTBbit.p6 = 0;
}


Yukarıdaki kütüphane her işlemci için yazılıp kullanılan işlemciye göre include edilebilir.

Zaten kütüphaneyi incelerseniz atanan değerlerin TRIS ve PORT adresleri olduğu görülüyor.
Kütüphaneyi genişletip diğer registerleride yukarıdaki biçime benzer olarak adreslerini atayıp kullanabilirsiniz.

Kolay gelsin...

salih18200

cevabınız için teşekkürler aradım cvp tamda buydu

rojhatbilge

Yadımcı olabildiysek ne mutlu bize :)

SiVRiSiNEK

#include <16F628A.H>
#use     DELAY(CLOCK=4000000)

long     x;
#locate  x = 0x50
#bit     y = x.1
#bit     z = x.15

#byte    a = 0x52
#bit     b = a.0
#bit     c = a.5

void main()
{
   y = 1;
   z = 0;
   b = 1;
   c = 0;
   if(y==1) c=1; //edit: buda mümkün tabiki
}


mesela yukarıdaki örnekte önce long cinsinden (16bit) x oluşturuluyor ram'de 0x50 adresine konumlandırılıyor ve y,z bitlerine erişiliyor
sonra int cinsinden (8bit) a oluşturuluyor ram'de 0x52 adresine konumlandırılıyor ve b,c bitlerine erişiliyor
anahtar kelimeler

#byte
#bit
#locate

Seferi

Konuyu hortlatıyorum biraz ama... yeni başlık açıp konu kirliliği yaratmak istemedim.  Birkaç sorum olacak:
   int1 p0:1;

buradaki " : " ne işe yaramaktadır? Bu p0'ın 1bit olacağını mı gösteriyor? Eğer öyleyse "    int x:8;  " x'in 8 bitlik olacağı mı anlaşılıyor? Ve Yine eğer öyleyse zaten "int1" ifadesi bu işi görmüyor mu?

Birde ben
#byte PORTA=05
#bit RA0=PORTA.0

şeklinde saklayıcılara direkt erişmek için tanımlamayı düşünüyorum, bu şekilde yaptığımda ram de ekstradan yer kaplar mı yoksa özel saklayıcıları kullanacağım için bir etkisi olmaz mı? Yardımlarınız için şimdiden çok teşekkür ediyorum.