output_bit fonksiyonu portlardan başka kayıtcılara uygulamak doğrumu

Başlatan rree, 29 Ocak 2016, 22:29:25

rree

İki sorum var ccsde

1. soru
output_bit fonksiyonu portlardan başka kayıtcılara uygulamak doğrumu!
Yoksa mutlaka  bit değişkeni tanımlamalıdır?

Örnek:
#define CCP2ASE  31527  // Pwm kapatmak için ECCP2AS 7 bit
main(){
output_bit( CCP2ASE,1);
}

2. Sorum farklı
18f25k22 pwm modülünde   CCP_SHUTDOWN_AC_L   parametrenin görevi nedir?



omereliusuk

output_bit( CCP2ASE,1); yerine
*( CCPint8veyaint16)|=1;
Gibi bir yazim kullanilabilir. Ilgili adresin degerine veri yazabilir veya adresin verisini okuyabilirsiniz.

dursuncemal

port a icin bir ornek verecek olursak;

#byte PORTA = 0xf80

#bit  ra7         = 0xf80 .7
#bit  ra6         = 0xf80 .6
#bit  ra5         = 0xf80 .5
#bit  ra4         = 0xf80 .4
#bit  ra3         = 0xf80 .3
#bit  ra2         = 0xf80 .2
#bit  ra1         = 0xf80 .1
#bit  ra0         = 0xf80 .0

bundan sonra artik derleyicinin fonksiyonlarina bagli kalmadan;PORTA = 1; veya ra7 = 1; yada if(ra0) {} vs yazabiliriz.//NOT ccs derleyicisi ,icin


:=

rree

Alıntı yapılan: omereliusuk - 29 Ocak 2016, 23:08:59
output_bit( CCP2ASE,1); yerine
*( CCPint8veyaint16)|=1;
Gibi bir yazim kullanilabilir. Ilgili adresin degerine veri yazabilir veya adresin verisini okuyabilirsiniz.
*((int16)CCP2ASE)|=1; Bu şekildemi



omereliusuk

Yok oyle degil. Ilgili bitin bulundugu byte veya word (int16) tipinde bir adres olmasi gerekir. O adresi bulup o degeri yazmak gerekir.
Mesela port_a 0×f80 ise birinci biti degistirmek icin *(0X0F80)|=1; port_a nin birinci biti yani pin_a0 artik lojik bir oldu.  Gibi düşünülebilir

dursuncemal

Alıntı yapılan: omereliusuk - 30 Ocak 2016, 11:40:22
Yok oyle değil. Ilgili bitin bulundugu byte veya word (int16) tipinde bir adres olmasi gerekir. O adresi bulup o degeri yazmak gerekir.
Mesela port_a 0×f80 ise birinci biti degistirmek icin *(0X0F80)|=1; port_a nin birinci biti yani pin_a0 artik lojik bir oldu.  Gibi düşünülebilir

daha rahat anlasilmasi icin biraz daha acmak gerekirse ;

*(0X0F80)|=1; // ra0 = 1;
*(0X0F80)|=2; // ra1 = 1;
*(0X0F80)|=4; // ra2 = 1;
*(0X0F80)|=8; // ra3 = 1;
*(0X0F80)|=16; // ra4 = 1;
*(0X0F80)|=32; // ra5 = 1;
*(0X0F80)|=64; // ra6 = 1;
*(0X0F80)|=128; // ra7 = 1;

                                         biede bunlari 0 yapmak var ? (veya) operatoru yerine( ve ) operatoru 1den 128 e olan sayilar terslenecek//not bu islemler bye sal islem bitsel islemlerde yukaridaki gibi yada struct union yapisi kulanlabilir.
:=

rree

      output_bit(PIN_A0,0); Fonksiyonu çalıştırdığımızda  trisA ve portA yı etki ediyor biliyorum. Bizim başka registerlere işlem yapmaya çalıştığımızda mesela
#define CCP2ASE  31527   
Main:(){output_bit(CCP2ASE,0); } 
Çalıştırılırsa ikinci bir aralıktaki registerin değerimnide değiştirimi? Eğer değiştiri ise
Kendimiz buna benzer bir makro yazabilirmiyiz.

#Define Outputx_bit(x,(short)b)  (if(b==0){x|1} \ (if(b==1){x&0}   ben yazmaya çaıştım ama olmadı sanırım.


dursuncemal

etkiliyor demendeki maksadi anlamadim. output_bit(PIN_A0,0); evet tris a yi ve port ayi etkiliyor. ama zaten amacimiz bu diilmiyani registerlere işlem yaptirmak.sen neyin degismesinden endıselenoyorsun ?
:=

rree

  Burada iki kayıtçıyı değiştiriyor
Output_bit(PinA_0,1 );  fonksiyonu çalıştırdığımızda Trisa nın 0 bitini nasıl buluyor da değiştiriyor?

  Burada bir  kayıtçımı etkileniyor   
output_bit(CCP2ASE,0);  fonksiyonunu çalıştırdığımda sadece CCP2ASE bit kayıtcısınımı etki ediyor

dursuncemal

 output_bit(CCP2ASE,0);  fonksiyonunu çalıştırdığımda sadece CCP2ASE bit kayıtcısınımı etki ediyor //evet

Output_bit(PinA_0,1 );  fonksiyonu çalıştırdığımızda Trisa nın 0 bitini nasıl buluyor da değiştiriyor?//cunku bu ccs ye  ozel  bir fonksiyon pinlere veri yazmak icin .soz konusu pinlere yazmak olunca da kendince bir onlem almis porta veri yazmak icin tris tris registerinin ilgili pinını cıkıs yapmak icin mudahale ediyor.  genelde ben pek kendi giris cikis  fonksiyonlarini kullanmayi tercih etmiyorum. portlari tanimlayip  Output_bit(PinA_0,1 ); yerine ra0 = 0; yaziyorum.
mesela CCP2ASE biti hangi resisterin biti onu tanimlayalim sana. 31527 < adresi bu galiba?

Main:(){output_bit(CCP2ASE,0); } 
Çalıştırılırsa ikinci bir aralıktaki registerin değerimnide değiştirimi? Eğer değiştiri ise > baska bir registeri degistirmez.

Output_bit(PinA_0,1 ); gibi bir fonksiyonu sende yazarsin problrm diil ki
:=