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.
arkadaşim yanlış anlamadıysam sorunun cevabı bu
#include <pic.h>
#define LED1 RC0
#define LED2 RC1
#define LED2 RC2
.
.
.
main (void)
{
.
.
.
}
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.
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...
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:
ilgilenen arkadaşlara teşekkürler....
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....
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....