Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

CCS C PIN Kontrol ?

Başlatan VonalOrdu, 21 Ağustos 2013, 09:16:52

VonalOrdu

Merhaba öncelikle kullandığım derleyiciyi ve yeni bir kullanıcı olduğumu söylemek isterim => CCS C Compiler.
Ben örneğin bir A0 pinine bir led bağladım ve bunu output_high(pin_a0) ile yaktım,
daha sonra bu A0 pini yanıyormu yanmıyormu nasıl kontrol edebilirim ?
Birde bunu değişken tanımlama gibi bir yöntemle yapmak istemiyorum örneğin;
output_high(pin_a0); durum=1;
output_high(pin_a0); durum=0;
yani direk pin durumunu vericek bir fonksiyon veya komut kümesi var mı ?

tyildizak

input_state()

Syntax:
value = input_state(pin)

Function:
This function reads the level of a pin without changing the direction of the pin as INPUT() does.

VonalOrdu

Alıntı yapılan: tyildizak - 21 Ağustos 2013, 13:26:56
input_state()

Syntax:
value = input_state(pin)

Function:
This function reads the level of a pin without changing the direction of the pin as INPUT() does.
Teşekkürler.
Bu fonksiyonla olduğunu bende okumuştum fakat beceremedim bir türlü kullanmasını biliyorsanız kısa bir örnek alabilirmiyim ?

skara1214

 int1 value;


value = input_state(pin_a0);
Herkes ölür ama herkes gerçekten yaşamaz

Okan AKÇA

neden boyle bir şeye ihtiyac duydunuz aktif yapıldıysa sizin yazdıgınız kod  degerlendirir aktif yada pasif olacagına

Gökhan BEKEN

PORTA ve LATA'nın farkı burdan geliyor. Birisi çıkışa değer göndermek için çıkışı okumak için.
Mesela PORTA=PORTA derseniz porta eski değerini asla alamaz.
LATA yı değer okumak için PORTA'yı ise değer yazmak için kullanın.
CCS C dili bazı şeyleri otomatik kendi yapıyor direkt erişemiyorsunuz.
İlgili registerlerin adreslerini programın başında tanımlayın
Örneğin:
#BYTE PORTA = 0XF80
#BYTE LATA = 0XF80
#BYTE TRISA = 0xF92

Bu adresler her picte farklı olabilir. Datasheetten öğrenin gerçek adresini. Ben salladım.
Özel mesaj okumuyorum, lütfen göndermeyin.

VonalOrdu

Alıntı yapılan: meftun - 21 Ağustos 2013, 18:21:22
PORTA ve LATA'nın farkı burdan geliyor. Birisi çıkışa değer göndermek için çıkışı okumak için.
Mesela PORTA=PORTA derseniz porta eski değerini asla alamaz.
LATA yı değer okumak için PORTA'yı ise değer yazmak için kullanın.
CCS C dili bazı şeyleri otomatik kendi yapıyor direkt erişemiyorsunuz.
İlgili registerlerin adreslerini programın başında tanımlayın
Örneğin:
#BYTE PORTA = 0XF80
#BYTE LATA = 0XF80
#BYTE TRISA = 0xF92

Bu adresler her picte farklı olabilir. Datasheetten öğrenin gerçek adresini. Ben salladım.
Teşekkürler lat_a yı daha önce hiç görmemiştim.
CCS C de böyle bir fonksiyon yok sanırım.
Ama sorunumu #use fast_io() ve set_tris_x() fonsiyonlarıyla çözdüm ama senin dediğin daha mantıklı geldi.
Teşekkürler.

AsHeS

CCS yi bilemem ama XC8 de 18f45k20 kullanırken PORTA nın 0.bitini çıkış olarak ayarladıktan sonra değer atamak için LATAbits.LA0=1; ifadesini,PORTA nın 0.bitini giriş olarak ayarladıktan sonra okumak için x=PORTAbits.RA0; ifadesini kullanıyorum. LAT registeri çıkışa yazmak için PORT registerleri okumak için kullanılıyor.
Örnek Kod:
LATAbits.LA0 = pwm_channel[0];
        LATAbits.LA1 = pwm_channel[1];
        LATAbits.LA2 = pwm_channel[2];
        LATAbits.LA3 = pwm_channel[3];

Gökhan BEKEN

Yaptığım denemelerde hangisi ile okuyup hangisi ile yazacağımız duruma göre değişiyor diye karar vermiştim.

Aşağıda daha önceden test edip çalıştırdığım örnekler var. Yanlarına notlar düşmüştüm.

PORTB = ((~(1<<5)) & LATB); //portb nin 5. bitini 0 yap
PORTB = (1<<5) | LATB; // port b nin 5.bitini 1 yap



Mesela aşağıdaki if bloğunda PORTD registerini kullandık.
if(((1<<0) & PORTD) != 0) {PORTB = (1<<0) | LATB;} else{PORTB = ((~(1<<0)) & LATB);} //eğer portd nin 0. biti 1 ise portb nin 0. bitini 1 yap, yoksa, 0 yap


Ancak aşağıdakinde LATB registerini kullandık. Çünkü PORTB yi çıkış olarak kullandığımızdan ordan okuma yapmak için LATB yi kullanmamız gerekir.
if(((1<<0) & LATB) != 0) {PORTC = (1<<0) | LATB;} else{PORTC = ((~(1<<0)) & LATB);} //eğer portb nin 0. biti 1 ise portc nin 0. bitini 1 yap, yoksa, 0 yap


if(PORTDbits.RD0) {PORTB = (1<<0) | LATB;} else{PORTB = ((~(1<<0)) & LATB);} //eğer portd nin 0. biti 1 ise portb nin 0. bitini 1 yap, yoksa, 0 yap

İşin özü bir registeri bir işlemin iki tarafında birden kullanmamak.
mesela portb= diye başlıyorsa eşitliğin sağ tarafında latb kullanmak mantıklı. Çünkü portb yazarsak aynı anda(çok kısa sürede) hem okumuş hem yazmış olacağımızdan yanlış sonuç üretiyor.
Özel mesaj okumuyorum, lütfen göndermeyin.