port okuma

Başlatan papsukkal, 19 Haziran 2011, 02:20:21

papsukkal

düşük değerlikli 4 biti output, diğerleri input olarak tanımlı bir portun tamamını okumanın bir yöntemi varmı?

örnek

portc nin 2.portunda 1 var (output tanımlı) ve 4. portta da 1 var (input tanımlı)
ve ben x değişkenine port c yi olduğu gibi yazmak istiyorum. yani x=00010100 olsun istiyorum

mümkünmüdür ? mümkünse nasıldır?

şimdiden teşekkür ederim.

ccs c kullanıyorum

Tagli

x = PORTC; yazsan olmaz mı? C18'de bu şekilde oluyor.
Gökçe Tağlıoğlu

jackal183

ccs c de bu yazdığın şekilde olmuyor diye biliyorum, forumda ccs ile ilgili bu konu daha önce açılmıştı orda anlatmışlardı hocam, biraz kurcala bulursun

fahri-

b portundan 8 bit okumak için:
data=input_b();



papsukkal

data=input_b();

bu komutu kullandığımda portun bir kısmı output olarak tanımlı olduğundan dolayı hiç bir işlem yapmıyor

ben SET_TRIS_C(0b11110000)  ikenki port c yi okumak istiyorum. output_c komutunu kaldırınca fonksiyon çalışıyor ancak bu komutla hem hata vermiyor hem fonksiyon yokmuş gibi davranıyor.

şimdi forumu tekrar tarayacağım umarım bulurum.


   {
   int i, sutun, sayi;
   for ( i = 0 ;i < 4 ;i++)
      {
      SET_TRIS_C(0b11110000);
      switch(i)
         {
         case 0:
         output_high(pin_c0);
         sutun = 0;
         break;
         
         case 1:
         output_high(pin_c1);
         sutun = 1;
         break;
         
         case 2:
         output_high(pin_c2);
         sutun = 2;
         break;
         
         case 3:
         output_high(pin_c3);
         sutun = 3;
         break;
         }
         sayi = input_c();
         delay_ms(20);
         OUTPUT_c(0x00);
      }
       

papsukkal

tagli hocam

bütün derdim x = portc yazamamak. bu komutu pbp de kabul ediyor ama ccs kabul etmiyor.

acaba ccs ile boşuna mı vakit harcıyorum ?


mesela pbp deki şu kodu

            For Col = 0 To 3
              TrisB = Dcd col ^ $ff
              Row = PortB >>4
              if row != $f then
              key = ((col) * 3) + (ncd (Row ^ $f))
            endif
   
ccs c de kaç satırda yazarız?

Tagli

Alıntı yapılan: papsukkal - 19 Haziran 2011, 16:25:11
acaba ccs ile boşuna mı vakit harcıyorum ?
Evet aslında tüm mesele burada  ;)

Bence eğer bir dil istediğin register'a doğrudan erişmene imkan vermiyorsa özgürlüğünü kısıtlıyor demektir ve terk edilmelidir.
Gökçe Tağlıoğlu

papsukkal

peki tagli hocam hangi c yi öneriyorsun?

yolun başındayken tedbir alalım

Tagli

Bu tartışma başladı mı bitmez ama bence CCS C dışında herhangi biri olabilir. Tavsiyem Hitech C ile C18 arasında bir seçim yapman. Bu ikisinin arasındaki farkları ben de tam bilmiyorum, zaten çok da farklı değiller sanırım ama ben C18 kullanıyorum.
Gökçe Tağlıoğlu

papsukkal

sağol hocam inceleyip karar vericem

Ersin


F1 tuşuna bas orda kullanımı mevcut, bu tip şeylere de ccs in forumuna bakabilirsin.
value = input_state(pin)


fahri-

bütün c compilerlarda istediğin registerlere ulaşılabilir. c yi bilmeden c hakkında neden yorum yapılıyorki...

camby

....
movlw      b'00001111'
movwf      TRISB
.....

movf   PORTB
movwf PORTC    :D

Burda sorun yok da , C'de niye olmamış.. ?

JKramer

Kullandığınız mikrodenetleyicinin kataloğunu açıp C portunun adresini öğrenirsiniz. Daha sonra da kodunuza şu satırı ilave edersiniz:
#byte  PORTC=(C portunun adresi) //parantezler yok


Katalogları açmışken derleyicinin kullanma kılavuzunu da açıp #USE FAST_IO ve #USE STANDARD_IO 'un ne olduğuna da bakın.

Alıntı yapılan: fahri- - 19 Haziran 2011, 22:45:30
bütün c compilerlarda istediğin registerlere ulaşılabilir. c yi bilmeden c hakkında neden yorum yapılıyorki...

Kesinlikle katılıyorum. Öyle bir hava oluşturuluyor ki, sanki bu derleyici insanların kafasına silah dayayıp zorla "output_b ya da input_c 'yi kullanacaksın, başka yolu yok" diyor. İster derleyicinin bu tip gömülü fonksiyonlarını kullanırsınız ister doğrudan register'ların isimlerini kullanırsınız. Ben output_b yazdığımda derleyici arka planda ne yapıyor bilmiyorum ki diyenler de bir zahmet .lst dosyasına bakıversin.

Şimdi de "ben bütün register'ları tek tek tanımlamak zorunda mıyım?" diyenler olacaktır, onları da kırmayalım: CCS ide'sini açın. Tools-->Device editor e tıklayıp register dosyası oluşturmak istediğiniz mikrodenetleyiciyi seçin. Sağ tarafta "make include file" seçeneğini tıklayın. Burada istediğiniz tercihleri (structure ya da her bir bit'i ayrı ayrı tanımlama gibi) yaptıktan sonra oluşturulacak dosya yolunu belirleyip "Generate" e tıklayın. (sadece komut satırlı olanı kullanıyorsanız evinizde ide'yi kurup bir kereliğine register dosyalarını alabilirsiniz.)

papsukkal

#byte  PORTC=(C portunun adresi) //parantezler yok

18f452 için adres f82 bu satırı ekledim

pin c1 den loj-1 çıkışım var buton üzerinden dönüş yapıp c4 üzerinde bunu okumam gerekiyor. istediğim 8 bitin tamamını okumak.

portc içeriği okuduğumzaman 00000010 değerini okuyorum. görmek istediğim 00010010. demekki hala doğru şeyi yapamıyorum.

yaklaşık 5 gündür bununla uğraşıyorum. aslında istediğim şeyi if döngüsü ile yapabilirdim 10 satır fazla yazardım sonuca ulaşırdım ama son 5 günde öğrendiklerimi öğrenemezdim.

bu arada öncelikle gömülü komutları kullanmak durumundayım çünkü serdar çiçek'in kitabında da bulduğum diğer eğitim dokümanlarında da register üzerinden işlem yapmaktan açık bir şekilde bahsedilmiyor. sadece standart komutlar anlatılıyor. ve elbetteki sadece bildiklerimi uygulayabilirim

pinc4 teki bilgiyi portc registerinde göremememin sebebi ne olabilir?

gösterdiğiniz anlayış ve yardımlarınız için tekrar teşekkür ederim