Ynt: B0 ve B5 arası bir çıkışta B7 yi aktif etmek.

Başlatan Melih1802, 21 Haziran 2014, 21:42:54

Melih1802

 İstediğim b0 ila b5 arasındaki bir bit (1) ise b7 de (1) ile (1) olacak, (0) ile (0) olacak.

Yapmak istediğimin altta elektronik olarak yapılmışı var ben sadece bunu yazılımla yapmak istiyorum.




mir_as82

#1
hocam maskeleme ile yapsana. Aşağıdaki kod çalışır mı bilmiyorum. Sadece fikir versin diye yazdım.
output_b()&0x3F?output_high(pin_b7) :output_low(pin_b7);

Burada portb registerinin değerini okuyup(output_b() fonksiyonu yerine başka kod olabilir.Amaç port değerini okuyu 0x3F ile karşılaştırmak  CCS ile uzun zamandır uğraşMIyorum ) 0x3F ile bitsel ve yaparsan bence göze daha hoş gelir.

Kabil ATICI

int bayrak=0;


muhtemelen ana döngü içinde
bayrak=0;
B0 ve B5'i 1 yaptığın her yerde
bayrak=1;
yapıyorsun

if (bayrak==1)
{
//
b7 1 yap
}
else
{

//b7 0 yap
}
ambar7

Melih1802

#3
Doğrumu ekledim.
#include <MD800.h>
int bayrak=0;


void main()

{
   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_b(0x00);
    output_b(0x00);
  set_tris_e(0x00);
    output_e(0x00);
  set_tris_a(0x00);
    output_a(0x00);
    

  
     
 while(1)
 


 {
 if ((input(pin_d0)==1)&(input(pin_d6)==1)&(input(pin_d1)==0)&(input(pin_d2)==0)&(input(pin_d3)==0)&(input(pin_d4)==0)&(input(pin_d5)==0))
  output_high(pin_b0);
   else
    output_low(pin_b0);
 
 
  {
 if ((input(pin_d1)==1)&(input(pin_d7)==1)&(input(pin_d0)==0)&(input(pin_d2)==0)&(input(pin_d3)==0)&(input(pin_d4)==0)&(input(pin_d5)==0))
  output_high(pin_b1);
   else
    output_low(pin_b1);
  
 
 {
 if ((input(pin_d2)==1)&(input(pin_d0)==0)&(input(pin_d1)==0)&(input(pin_d3)==0)&(input(pin_d4)==0)&(input(pin_d5)==0))
  output_high(pin_b2);
   else
    output_low(pin_b2);
 
 
  {
 if ((input(pin_d3)==1)&(input(pin_d0)==0)&(input(pin_d1)==0)&(input(pin_d2)==0)&(input(pin_d4)==0)&(input(pin_d5)==0))
  output_high(pin_b3);
   else
    output_low(pin_b3);
  
 
  {
 if ((input(pin_d4)==1)&(input(pin_d0)==0)&(input(pin_d1)==0)&(input(pin_d2)==0)&(input(pin_d3)==0)&(input(pin_d5)==0))
  output_high(pin_b4);
   else
    output_low(pin_b4);
  
 
  {
 if ((input(pin_d5)==1)&(input(pin_d0)==0)&(input(pin_d1)==0)&(input(pin_d2)==0)&(input(pin_d3)==0)&(input(pin_d4)==0))
  output_high(pin_b5);
   else
    output_low(pin_b5);
 


bayrak=0;

bayrak=1;


if (bayrak==1)
{
output_low(pin_b7);
}
else
{
output_high(pin_b7);
}
   
    
 
  
        }
       }
      }
     }
    } 
   }
  }

Kabil ATICI

#include <MD800.h>
int bayrak=0;      //bayrak degişkeni tanımla

void main()

{
   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_b(0x00);
    output_b(0x00);
  set_tris_e(0x00);
    output_e(0x00);
  set_tris_a(0x00);
    output_a(0x00);
   
 while(1)
 
bayrak=0; //ana döngü içinde bayrak sıfırla
 {
 if ((input(pin_d0)==1)&(input(pin_d6)==1)&(input(pin_d1)==0)&(input(pin_d2)==0)&(input(pin_d3)==0)&(input(pin_d4)==0)&(input(pin_d5)==0))
 { output_high(pin_b0);
bayrak=1;}  // b0-b5 herhangi bir bit 1 olduğunda (B0 ve B5'i 1 yaptığın her yerde )
   else
    output_low(pin_b0);
 
 if ((input(pin_d1)==1)&(input(pin_d7)==1)&(input(pin_d0)==0)&(input(pin_d2)==0)&(input(pin_d3)==0)&(input(pin_d4)==0)&(input(pin_d5)==0))
 { output_high(pin_b1);
bayrak=1;}   // b0-b5 herhangi bir bit 1 olduğunda
   else
    output_low(pin_b1);
  
 if ((input(pin_d2)==1)&(input(pin_d0)==0)&(input(pin_d1)==0)&(input(pin_d3)==0)&(input(pin_d4)==0)&(input(pin_d5)==0))
  {output_high(pin_b2);
bayrak=1;}   // b0-b5 herhangi bir bit 1 olduğunda
   else
    output_low(pin_b2);
 
 if ((input(pin_d3)==1)&(input(pin_d0)==0)&(input(pin_d1)==0)&(input(pin_d2)==0)&(input(pin_d4)==0)&(input(pin_d5)==0))
 { output_high(pin_b3);
bayrak=1;}   // b0-b5 herhangi bir bit 1 olduğunda
   else
    output_low(pin_b3);
  
 if ((input(pin_d4)==1)&(input(pin_d0)==0)&(input(pin_d1)==0)&(input(pin_d2)==0)&(input(pin_d3)==0)&(input(pin_d5)==0))
  {output_high(pin_b4);
bayrak=1;}   // b0-b5 herhangi bir bit 1 olduğunda
   else
    output_low(pin_b4);
  
 if ((input(pin_d5)==1)&(input(pin_d0)==0)&(input(pin_d1)==0)&(input(pin_d2)==0)&(input(pin_d3)==0)&(input(pin_d4)==0))
 { output_high(pin_b5);
bayrak=1;}   // b0-b5 herhangi bir bit 1 olduğunda
   else
    output_low(pin_b5);
 
//b7 çıkışının kontrol ve ataması
if (bayrak==1)
{
output_high(pin_b7); // b0-b5 herhangi bir bit 1 olduğunda çıkış 1
}
else
{
output_low(pin_b7);
  }
 }
}
ambar7

Melih1802

Üstad kodlarını seçip yapıştırdım.

Proteusta similasyon yaptığımda girişler ne olursa olsun hiç bir led yanmadı.
Bende programı inceledim ve bayrak=0; //ana döngü içinde bayrak sıfırla Satırını kaldırdım.
Bu sefer program önceki gibi çalıştı fakat b7 hiç sönmedi, Şimdi kafa yoruyorum belki işin içinden çıkamam fakat çok zevkli.

Kolay Gelsin.

Kabil ATICI

Çok özür dilerim...
...
while(1)

bayrak=0; //ana döngü içinde bayrak sıfırla
{
if ((input(pin_d0)==1)&(input(pin_d6)==1)&(input(pin_d1)==0)&(input(pin_d2)==0)&
...
bazen aceyle yapılan hatalar gözden kaçabiliyor... Yukarıda olduğu zaman çalışmaması normal değil mi?

...
while(1)
  {
bayrak=0; //ana döngü içinde bayrak sıfırla
if ((input(pin_d0)==1)&(input(pin_d6)==1)&(input(pin_d1)==0)&(input(pin_d2)==0)&
...

şeklinde olması gerekirdi.

Biliyorsunuz parantezin yeri çok önemlidir. Yapılmakta olan işin akışını değiştirebilir.
ambar7

Melih1802

#7
Estağfurullah Hocam ne özrü. Esas benim özür dilemem lazım Neden;

Kodları sizden aldıktan sonra çalışmayınca bende " Sanırım yaptı fakat bir yerde bir bilinçli hata yaptı, " diye düşünerek sizin de  " Bakalım bulursa sahiden birşeyler kapmış kafa yormuş beleşe takılmıyor " diye düşündüğünüzü düşünerek epey bir merakla daldım  :).

Noktaydı virgüldü süslü parantazler her şey yerinde niye çalışmadığını anlayamamıştım, mantıksal olarak akış doğruydu.

Bulamadım. Ama her zaman dediğim bir söz vardır " Yapamadığınız iş çok daha fazla öğretir ".

Bu projeye birkaç ekleme daha yapacağım.
Bu proje aslında benim 1 sene kadar önce PLC ile yaptığım bir projeydi çalıştırıp epeycede üreterek sattım.
CCS C ye başladığımda kendime bir iş planı yaptım bu planda bir proje seçerek bitirene kadar gitmek' te vardı.

Bu adımı da bitirirsem geriye birkaç ekleme daha kaldı. Bitince PLC ile yaptığım bu basit programı CCS C ile de yapmış olacağım.

Yazdıklarınızı şimdi uygulamaya çalışacağım.


Kolay Gelsin.

mesaj birleştirme:: 22 Haziran 2014, 15:41:29

Çalıştı.

Bu hatayı muhtemelen benim görmem çok uzun sürerdi. Mantığı anladım.