CCS C'de Pin Numaralarını Değişken İle Göstermek

Başlatan mokan, 05 Nisan 2011, 11:58:53

mokan

Merhaba arkadaşlar,
CCS C'ye yeni başladım.Daha önceden PBP ile çalışıyordum.PBP'de pin numaralarını değişkneler kullanarak gösterme vardı ve çok işe yarıyordu.Örneğin;
portb.0[x]
yada
portb.[x]
şeklinde.Burada x normal 8 bitlik bir değişken.CCS'de buna benzer bir gösterimi yapmaya çalıştım ancak olmadı.Acaba CCS'de böyle buna benzer bir gösterim şekli mevcut mu? Mevcut ise nasıl yapabilirim?
İyi çalışmalar.

Nedenler

#define LED   pin_b0

output_high(LED);
delay_ms(500);
output_low(LED);

İstediğin bu muydu ?

mokan

yok hayır tam olarak bu değil.İlk attığım mesajda kod şeklinde yazmayınca gösterimde sıkıntı olmuş şimdi düzelttim.Sadece pin numarasını değişken ile göstermek istiyorum.

mokan

İkinci bir sorumda main() fonksiyonu içinde
#define....
tanımlaması yapabiliyor muyuz acaba? Yukarıda bahsettiğim gösterim şekli olmaz ise en azından gerektiğinde  define ile "nendenler" arkadaşın gösterdiği tanımlama şeklinde yapmak için soruyorum.

jackal183

main'in içerisinde makro kullanamazsın diye biliyorum ama üstadlar daha iyi bilir

jackal183

bildiğim kadarıyla CCS'te bu mümkün değil, portun tamamına( mesela output_port_c(0x01); )  belirli ya da değişken üzerinden kod gönderebilirsin, değişkenlerle pin pin ulaşmak tek bir kodla mümkün değildir. eğer kodunda sürekli bir değişim gerekiyorsa portu her seferinde 0xFF ile and'leyerek yapabilirsin

Nedenler

jackal183 güzel açıklamış bende bunu bir örnekle pekiştireyim.
Öncelikle define tanımlamasını programın istediğin yerinde yapabilirsin. Ancak bu iş için sana lazım olmayacak. Şöyle yapacaksın.
Diyelim ki x değişken değerin 10 olsun. Yani 0b00001010. Biz bunu b portundan direk gönderdiğimiz zaman b1 ve b3 aktif (1) olacak diğerleri 0 olacak.

//x değeri desimal 10 binary 00001010
output_b(x); // yanlızca b1 ve b3 aktif.

Eğer şöyle yaparsan;

output_b(x | input_b()); // 00001010 ile b portunun o anki durumu mantıksal veya işlemine tabi tutuluyor ve sonuçta sadece x içerisinde 1 olan değerler değiştiriliyor diğer pinler aynı kalıyor.

Özetlersek;
PortB'nin 6. ve 7. pinleri 1 diğerleri 0 olsun. Ve ben sadece 0. ve 1. pinleri değiştirmek isteyeyim. Bu durumda x değeri de desimal 3 binary 00000011 olsun.
output_b(x); yaparsam 6 ve 7. pinlerde 0 konumuna düşecek ama output_b(x | input_b()); yaptığımda sadece 1 ve 2. pin değerleri değiştirilecek diğerleri üzerinde işlem yapılmayacak.

Aynı şeyi şöyle de yapabilirsin. Programın başında #byte PORTB=6 olarak tanımlama yaparsan PORTB=x ya da PORTB|=x şeklinde kullanabilirsin. Burda ki 6 PortB'nin picin bank diyagramındaki adresidir.

jackal183

"Nedenler" açıklaman için teşekkür ederim, ben yazdığın açıklamada bir şeyi merak ettim, belki de yeni konu açmalıydım, neyse.

en sonda #byte PORTB=6 bu kod ne yapıyor tam anlamadım bunu ve şu cümleyi "Burda ki 6 PortB'nin picin bank diyagramındaki adresidir." ne anlama geliyor

muhittin_kaplan

Bizim Alışkanlığımız olan PORTA-PORTB-TrisA gibi yerler aslında işlemci hafızasında belli bir yer. bunu Datasından (ram) görebilirsiniz.
Biz herhangi bir dilde Portb=0x00 yazdığımızda aslında derleyici bunu ilgili adrese yazıyor. 16f877 için bu (portb) 06 ya denk geliyor.
Yukardaki tanımlama
Byte kadar bir alan olan 06 Adresini Bundan sonra PORTB olarak kullanacağım anlamına geliyor.


tyildizak

Alıntı yapılan: muhittin_kaplan - 05 Nisan 2011, 17:26:32
Bizim Alışkanlığımız olan PORTA-PORTB-TrisA gibi yerler aslında işlemci hafızasında belli bir yer. bunu Datasından (ram) görebilirsiniz.
Biz herhangi bir dilde Portb=0x00 yazdığımızda aslında derleyici bunu ilgili adrese yazıyor. 16f877 için bu (portb) 06 ya denk geliyor.


Ek olarak; eğer portb'nin adresini bilmiyorsak(başka bir sfr de olabilir) adres belirtmeden şu şekilde de yapılabilir:

#byte  portb= getenv("SFR:portb")



mokan

aslında ben pinlerde genel bir işlem yapmak istemiyorum şu vereceğim örnek daha açıklayıcı olur umarım;
lineer bir sistemi süren motor olduğunu düşünün ve bu lineer sistem mesafe olarak belirli sınırlar içinde(sağ taraf için ve sol taraf için sınır olacak) hareket edecek.bu sınırlara ulaştığında switchlere(switc'ler motor üzerinde olacak) basarak pic sol sınıra veya sağ sınıra geldiğini anlayacak.Ancak sıkıntı şurada ki;ben sol ve sağ sınır uçlarına sabit bir port ucunu koyamıyorum.Sebebi ise motor sistemin sol ucuna yada sağ ucuna konabilir.Bu durumda benim sağ sınır switch ucum ile sol sınır switch ucum değişiebilir.Sabit tanımlamayı bu yüzden yapamıyorum.Onun için bende (basic'de bu şekilde çözmüştüm) port pin numarasını değişken olarak yazıyorum.Mesela x değişkeni benim için sağ sınırı belirtsin y değişkeni sol sınırı belirtsin.portb.0 ve portb.1 de switch uçlarım olsun.Sistem bağlansıtı yapıldığında ilk sinyal veren switch'i sol olarak algılıyor.Bu sol switch, sistemin sol yada sağ başa bağlantısından dolayı b.0'da olabilir b.1'de olabilir.Eğer b.0 ise y içine 0 değeri atıyorum sonra portb.y ifadesi ile sol switch ile ilgili işlemleri yapıyorum.Ama portb.1 ise y içine 1 değeri atıyorum.Bundan dolayı gösterim bu şekilde olmalı.Aksi halde her switch sorgumda (ki sık sık yapmam gerekiyor kesme uçlarım dolu) sürekli if ile değişken sorgulatıp b.0 yada b.1 i dikkate al demem gerekiyor.

Murat Mert

S.A.
Sn. Arkadaşım ben protonda seri iletişim için şöyle birşey kullanmıştım:

Device = 16f877
.....
.....
Dim X as byte
.....
....
X = PORTB'  portb deki değişikliği X değişkenine attım
basla:

İf x.2 = 1 then ......

Print At 1,1, "PORT:", Bin X ' portb deki değişikliği binary görmek için
....
goto basla

sayısal olarak port b de değişiklik yapmak içinde:
portb = x
x.1 = 1' portb nin 1. pinini high yapıyor

mert07

Ruzgarbey

Alıntı yapılan: mokan - 05 Nisan 2011, 11:58:53
Merhaba arkadaşlar,
CCS C'ye yeni başladım.Daha önceden PBP ile çalışıyordum.PBP'de pin numaralarını değişkneler kullanarak gösterme vardı ve çok işe yarıyordu.Örneğin;
portb.0[x]
yada
portb.[x]
şeklinde.Burada x normal 8 bitlik bir değişken.CCS'de buna benzer bir gösterimi yapmaya çalıştım ancak olmadı.Acaba CCS'de böyle buna benzer bir gösterim şekli mevcut mu? Mevcut ise nasıl yapabilirim?
İyi çalışmalar.
mehaba.
picbasicte
portb.0[x] =1
komutunun anlamı portb nin x değerindeki bitini high veya low yap anlamındadır. sanırım bu şekilde kullanıyorsununz ?

CCS kullanmaya yeni başladım. Bu şekilde bir kullanım için aşağıdaki gibi bir komut kullanıyorum.
unsigned byte cikis=0,x=0;
bit_set(cikis,x);
output_b(cikis);


umarım faydası olur.saygılarımla.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

mokan

Amacım çıkış değeri değiştirmek değil.Giriş değerini sorgulatmak.Bunu giriş değeri içinde uygulayabiliyor muyuz?

Ruzgarbey

c de
bit_test()
komutu var. bunu kullanarak  istediğin sorgulamayı yapabilirsin.
int1 kontrol=0;
kontrol=bit_test(portb,x);

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