C ile bir Port'un yarısını kullanma?

Başlatan kursadalp, 08 Kasım 2004, 18:21:49

kursadalp

Arkadaşlar, Hi-tech picc kullanıyorum ve 16f877 ni C Portunun sadece 0-3 arası girişleri #define ile tanımlamak istiyorum. Bir komut ile yalnızca o dört bitin değişmesi maksadım. En kolay tanımlamayı nasıl yapabilirim?

Herkese şimdiden teşekkürler. Allah hepinize zihin açıklığı versin ve dinamizminizi hiç eksiltmesin.

eelektro

arkadaşim yanlış anlamadıysam sorunun cevabı bu

#include <pic.h>
#define LED1 RC0
#define LED2 RC1
#define LED2 RC2
.
.
.
main (void)
{
.
.
.
}
╠ ▒▒ ▒ ▒ ▒ ▒▒▒ ▒ ▒ ▒ ▒ ▒▒▒▒ ▒ ▒  ▒▒ ╠

ahmetu

hitech değilde ccs ile şöyle oluyor;

#bit RA0 = 0xF80.0
#bit RA1 = 0xF80.1
#bit RA2 = 0xF80.2
#bit RA3 = 0xF80.3
#bit RA4 = 0xF80.4


#define  sanal_a(x) \
                               RA0 = x & 1; \
                               RA1 = (x >> 1) & 1; \
                               RA2 = (x >> 2) & 1; \
                               RA3 = (x >> 3) & 1; \
                               RA4 = (x >> 4) & 1 \


kullanımı ise;

sanal_a(0x04);


Burada sanal_a(0x04); komutu PORTA'nın 5 nci bitini kesinlikle etkilemeyeceltir, 5 nci bitin değeri komuttan önce neyse sonrada o olacak. Bu yöntemle sağda solda kalmış boş bitleri tek bir port yapıp kullanmakta mümkün mesela;

#bit RA0 = 0xF80.0
#bit RA1 = 0xF80.1
#bit RB2 = 0xF81.2
#bit RD3 = 0xF83.3
#bit RE0 = 0xF84.0
#bit RE1 = 0xF84.1
#bit RE2 = 0xF84.2


#define  sanal_port(x) \
                               RA0 = x & 1; \
                               RA1 = (x >> 1) & 1; \
                               RB2 = (x >> 2) & 1; \
                               RD3 = (x >> 3) & 1; \
                               RE0 = (x >> 4) & 1; \
                               RE1 = (x >> 5) & 1; \
                               RE2 = (x >> 6) & 1 \


NOT: Örnek bitlere ait yazdığım adresler 18 serisi içindir.

DumrulBey

Merhaba,

Ek: Ehe, cevabı mesajımı yazdıktan sonra en son ki CCS PIC C sürümünü öğrenmek için baktığımda öğrendim. Ama açıkcası noktalı virgül ile ilgili bir hassasiyet varmı öğrenmek isterim...

Alıntı Yap3.210  The \ line continuation character is now accepted for all preprocessor directives
Dostum verdiğin bu bilgiler ne kadar güzel böyle! Basit ve kısa ama bir o kadar da kıymetli! Açıkcası bu tür şeyleri öğrendikçe C'ye ilgim kat ve kat arıyor. Assembly ile boşa saç baş yoluyormuşuz biz...:)

Elbette assembly dilini öğrenmek faydalı oldu. Herkese önce bu dil ile emeklemesini tavsiye ederim. Koşmaya geçince ise mecburen yoruluyor insan. Bu durumda bir otomobile binmek gerek!

Sormak istediğin bir şey var. Şimdi oradak ">>" ifadeleri sağ yanındaki değer kadar kaydırma, " &" işareti ise "ve mantığı" oluyor öyle değil mi? Peki satır sonlarındaki "\" işaret ne oluyor? Ayrınca en sondaki satırda ";" işareti yok! Böyle mi olması gerekiyor?

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

ahmetu

bu en sondaki \ tamamen CCS'ye özel, aslında olmaması lazımdı, kodu ilk yazdığımda derlenirken hata verdi bende CCS forumunda böyle birşey yapılmış diye aradığımda buldum. En sondaki noktalı virgül define tanımlamanın son satırı olduğu için yok. Ya bu C' ye geçin artık valla yazanlara dua edersiniz :lol:

kursadalp

ilgilenen arkadaşlara teşekkürler....

kurumahmut

Alıntı yapılan: "ahmetu"bu en sondaki \ tamamen CCS'ye özel, aslında olmaması lazımdı, kodu ilk yazdığımda derlenirken hata verdi bende CCS forumunda böyle birşey yapılmış diye aradığımda buldum. En sondaki noktalı virgül define tanımlamanın son satırı olduğu için yok. Ya bu C' ye geçin artık valla yazanlara dua edersiniz :lol:

Bu CCS ye özel bir operatör değil arkadaşlar her C de olan bir oreratördür. ve de satırın daha bitmediğini gösterir. Bazen örüntüyü hoş tutmak yada uzun satır kullanmaktan kurtulmak için kullanılır....

kurumahmut

Burdaki arkadaşın gönderdiği define yapısı her iş için fonksiyon yazmaktansa iş için gerekli komutları define işlemi ile tanımlamak. Derleme aşamasında sizin sanal_port(x) dediğiniz yere compiler
                              RA0 = x & 1; \
                              RA1 = (x >> 1) & 1; \
                              RB2 = (x >> 2) & 1; \
                              RD3 = (x >> 3) & 1; \
                              RE0 = (x >> 4) & 1; \
                              RE1 = (x >> 5) & 1; \
                              RE2 = (x >> 6) & 1 \

rutinlerini yerleştirir. Sizde bunu çağırmak için
sanal_a(0x04); yazarsınız. HATTA rutinlerde son satıra ; koyarsanız kullanırken sanal_a(0x04) yazmanız da sorun çıkarmayacaktır. Ancak C alışkanlığı olarak sona ; adettendir. denilipp konulur. tabiki define sonuna da konmaz....