CCS C ve PIC16F877A. "D" ve "B" Portu Hakkında.

Başlatan Melih1802, 09 Haziran 2014, 14:07:26

Salih

#define outb1 output_high(pin_b1);


Evet yapabilirsiniz.

Hatta

#Define A_Akim (Akim > 10)

....

if A_Akim     ......

kullanabilirsiniz.

Elektroemre

Hatta;

#define out(x) output_high(pin_##x##);


deyip:

out(b1)
out(b2)
out(a1)


şeklinde de kullanabilirsiniz.

Melih1802

Doğrumudur.


#include "C:\Users\melih\Desktop\test1\main.h"
void main()
{
#define out(x) output_high(pin_##x##);

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

set_tris_d(0b11111111);//
  set_tris_a(0x00);
  set_tris_b(0x00);
  set_tris_c(0x00);
    output_a(0x00);
    output_b(0x00);
    output_c(0x00);
     
while(1)
//-------------------------------------------------------
{
if ((input(pin_d0)==0)&(input(pin_d1)==0))
{
out(b0)
out(b7)
}
else
{
out(b0)
out(b7)
}
//------------------------------------------------------
if (input(pin_d2)==0)
{
out(b1)
out(b7)
}
else
{
out(b1)
out(b7)
}
//------------------------------------------------------------
if (input(pin_d3)==0)
{
out(b2)
out(b7)
}
else
{
out(b2)
out(b7)
}
//------------------------------------------------------------
if (input(pin_d4)==0)
{
out(b3)
out(b7)
}
else
{
out(b3)
out(b7)
}
//------------------------------------------------------------
if (input(pin_d5)==0)
{
out(b4)
out(b7)
}
else
{
out(b4)
out(b7)
}
//------------------------------------------------------------
if (input(pin_d6)==0)
{
out(b5)
out(b7)
}
else
{
out(b5)
out(b7)
}
//-------------------------------------------------------------
if (input(pin_d7)==0)
{
out(b6)
out(b7)
}
else
{
out(b6)
out(b7)
}
}
}

Salih

Bana göre şöyle tanımlama yapmak ilerde yapılacak pin değişiklerin daha kolay yapılmasını sağlar.

#Define  B_Stop  input(Pin_B0)
#Define  M_On     output_high(Pin_D0)



B_Stop sembolünü programda 20 defa kullandık ve ilgili pinin bir nedenle değiştirmemiz
gerekti. Bu durumda sadece bir satırlık tanımı değiştirmemiz yeterli olur.

Kabil ATICI

Programlarınızı yazarken  satır veya bloklarınıza açıklamalar eklemeniz önemli. Daha sonra program üzerinde çalışırken veya bir başkası çalışması durumunda programın daha kolay anlaşılmasına yardımcı olacaktır.
Örneğin butonlarınıza isim verdi iseniz,
//sağ butonu basıldı mı?

//buton inceleme  kodu

//yukarı moturu çalıştı

//pompa çalıştı.
//pompa durdu.
//kırmızı led yandı.
gibi ifadeler yardımcı olacaktır.

Örneği
set_tris_d(0b11111111);// buton portu giriş olarak ata
ambar7

Melih1802

Kalabalık yapmaması için size verdiklerimde bu açıklamalar olmuyor, fakat buradaki her satıra açıklamayı yazıyorum.

Birkaç adet buton ve limit swicth var. Butona bastığımda limit swicth kapalıysa buton motoru sürüyor.
Fakat herhangi bir 2 buton basılıysa hareket olmaması lazım bunu nasıl engellerim.

Sanırım butonları tanıtıp ( limit swicth' ler hariç olacak ) bir engelleme yapmam gerekecek.

sadogan


Kabil ATICI

#22
ikisi aynı anda basılma durumu varsa ise
if ((input(pin_d7)==1)&&(input(pin_d6)==1))
{
hareket işlemleri kodunu buraya yaz.
}
ambar7

Melih1802

#23
Üstad o zaman: Bu 2 buton biribirnle basılırsa değilmi. Bunları daha da çoğaltabilirmiyiz.

10 buton olsun 1-2 ile basılırsa, 1-3 ile basılırsa...... 5-8 ile basılırsa, 10-2 ile basılırsa gibi.

if ((input(pin_d7)==1)&&(input(pin_d6)==1))
{
hareket işlemleri kodunu buraya yaz.
}

mesaj birleştirme:: 10 Haziran 2014, 14:09:42

if ((input(pin_d0)==1)&&(input(pin_d1)==1))
if ((input(pin_d0)==1)&&(input(pin_d2)==1))
if ((input(pin_d0)==1)&&(input(pin_d3)==1))
if ((input(pin_d0)==1)&&(input(pin_d4)==1))
if ((input(pin_d0)==1)&&(input(pin_d5)==1))
if ((input(pin_d0)==1)&&(input(pin_d6)==1))
if ((input(pin_d0)==1)&&(input(pin_d7)==1))

if ((input(pin_d1)==1)&&(input(pin_d2)==1))
if ((input(pin_d1)==1)&&(input(pin_d3)==1))
if ((input(pin_d1)==1)&&(input(pin_d4)==1))
if ((input(pin_d1)==1)&&(input(pin_d5)==1))
if ((input(pin_d1)==1)&&(input(pin_d6)==1))
if ((input(pin_d1)==1)&&(input(pin_d7)==1))

if ((input(pin_d2)==1)&&(input(pin_d3)==1))
if ((input(pin_d2)==1)&&(input(pin_d4)==1))
if ((input(pin_d2)==1)&&(input(pin_d5)==1))
if ((input(pin_d2)==1)&&(input(pin_d6)==1))
if ((input(pin_d2)==1)&&(input(pin_d7)==1))..............

Mantığı böylemi kurmam azım yoksa daha kısa bir yolu varmıdır.

Kabil ATICI

#24
Bu bildiğimiz VE (AND) işlemi. Şu anda 2 buton basılmaz , yani basılı değilse işlem yapacak şekilde ayarlanmış durumda. Eğer dediğiniz gibi olması için ayrı ayrı kontrol edeceksiniz.
if ((input(pin_d7)==1)&&(input(pin_d6)==1))
{
hareket işlemleri kodunu buraya yaz.
}
if ((input(pin_d1)==1)&&(input(pin_d2)==1))
{
hareket işlemleri kodunu buraya yaz.
}
if ((input(pin_d3)==1)&&(input(pin_d4)==1))
{
hareket işlemleri kodunu buraya yaz.
}

parantez içi işlemler aynı ise o zaman alt program kavramı üzerinde durmak gerekecek..
if (input(pin_d3)==1)
{
if (input(pin_d1)==1)
{
//kodu
}
if (input(pin_d2)==1)
{
//kodu
}
...//diğerleri
}
ambar7

Salih

#25
if ((input(pin_d0)==1)&&(input(pin_d1)==1))
if ((input(pin_d0)==1)&&(input(pin_d2)==1))
if ((input(pin_d0)==1)&&(input(pin_d3)==1))
if ((input(pin_d0)==1)&&(input(pin_d4)==1))
if ((input(pin_d0)==1)&&(input(pin_d5)==1))
if ((input(pin_d0)==1)&&(input(pin_d6)==1))
if ((input(pin_d0)==1)&&(input(pin_d7)==1))


Bu kodlar için şöylede olabilir
if (input_D() == 0XFF)   ....


Demek istediğim bir portu direk okuyup, bir sayıyla karşılaştırabilirsin.

Melih1802

#26
Kodları yazmak için burası uygun yermi.


set_tris_d(0b11111111);//
  set_tris_a(0x00);
  set_tris_b(0x00);
  set_tris_c(0x00);
    output_a(0x00);
    output_b(0x00);
    output_c(0x00);
   
if ((input(pin_d0)==1)&&(input(pin_d1)==1))
if ((input(pin_d0)==1)&&(input(pin_d2)==1))
if ((input(pin_d0)==1)&&(input(pin_d3)==1))
if ((input(pin_d0)==1)&&(input(pin_d4)==1))
if ((input(pin_d0)==1)&&(input(pin_d5)==1))
if ((input(pin_d0)==1)&&(input(pin_d6)==1))
if ((input(pin_d0)==1)&&(input(pin_d7)==1))

{
output_low(pin_b7);
}

while(1)
{
if ((input(pin_d0)==0)&(input(pin_d1)==0))// Bu satırda;1-d0 ve d1 and mantığında çalışıyor.
{                                         //(==0 buton low olursa aktif) (==1 olsaydı high olursa aktif olacaktı)
output_high(pin_b0);
output_high(pin_b7);
}
else
{
output_low(pin_b0);
output_low(pin_b7);
}

mesaj birleştirme:: 11 Haziran 2014, 09:05:48

Yapmak istediğim şu: 1 den 9' a kadar buton var.
Bunlardan herhangi birine basarken bir diğerine bastığımda tüm çıkışların pasif olmasını ve her iki buton bırakılana kadarda pasif kalmasını istiyorum.

mesaj birleştirme:: 10 Haziran 2014, 19:16:05

Alıntı yapılan: ambar7 - 10 Haziran 2014, 13:10:26
ikisi aynı anda basılma durumu varsa ise
if ((input(pin_d7)==1)&&(input(pin_d6)==1))
{
hareket işlemleri kodunu buraya yaz.
}


Bu kodu eklediğimde ( doğru yere doğru şekilde eklemişsem ) tum butonlar çalışmaz hale geliyor.

Salih

while(1)


Bu satırdan öncekiler, pic enerjilendiğinde sadece bir kere çalışır.

Melih1802

#28
Alıntı yapılan: salih - 10 Haziran 2014, 14:18:35
if ((input(pin_d0)==1)&&(input(pin_d1)==1))
if ((input(pin_d0)==1)&&(input(pin_d2)==1))
if ((input(pin_d0)==1)&&(input(pin_d3)==1))
if ((input(pin_d0)==1)&&(input(pin_d4)==1))
if ((input(pin_d0)==1)&&(input(pin_d5)==1))
if ((input(pin_d0)==1)&&(input(pin_d6)==1))
if ((input(pin_d0)==1)&&(input(pin_d7)==1))


Bu kodlar için şöylede olabilir
[b]if (input_D() == 0XFF)[/b]   .... [color=blue]Burayı nasıl yapacağımı kavrayamadım.[/color]


Demek istediğim bir portu direk okuyup, bir sayıyla karşılaştırabilirsin.


mesaj birleştirme:: 10 Haziran 2014, 19:19:11

Alıntı yapılan: salih - 10 Haziran 2014, 19:16:40
while(1)


Bu satırdan öncekiler, pic enerjilendiğinde sadece bir kere çalışır.


Anladım. Fakat altınada yazdığımda yinede çalışan tüm butonlar çalışmaz oluyor.

Salih

Butonların çalışmasını şema çizerek gösterirmisin.
Ben çalışmayı tam anlayamadım