Bu kod neden çalışmıyor (tpic6b595+pic16f628)

Başlatan halukece, 24 Haziran 2008, 17:41:26

halukece

Merhaba arkadaşlar. 3 tane tpic6b595 kaskat bağlı ve pic16f628 ile çıkıştaki ledleri kontrol ediyorum.

Bu kod neden bir kere icra ediliyor çözemedim.

#define EXP_OUT_ENABLE       PIN_B6
#define EXP_OUT_CLOCK        PIN_B5
#define EXP_OUT_DO              PIN_B4
#define NUMBER_OF_74595     3
#define SRCLR 	             PIN_A2
#define EN3                            PIN_B3 

void write595(BYTE* eo) {
  BYTE i;

  output_low(EXP_OUT_CLOCK);
  output_low(EXP_OUT_ENABLE);

  for(i=1;i<=NUMBER_OF_74595*8;++i) {
    if((*(eo+(NUMBER_OF_74595-1))&0x80)==0)
      output_low(EXP_OUT_DO);
    else
      output_high(EXP_OUT_DO);
   shift_left(eo,NUMBER_OF_74595,0);
   output_high(EXP_OUT_CLOCK);
   output_low(EXP_OUT_CLOCK);
  }
  output_high(EXP_OUT_ENABLE);
  output_low(EXP_OUT_ENABLE);
}

BYTE R[3]={73,146,36};
BYTE G[3]={146,36,73};
BYTE B[3]={36,73,146};

void main()
{
   init();    // HIGH(SRCLR);  LOW(EN3); PORTB çıkış, PORTA ÇIKIŞ
	
	while(1){
		write595(R);
		PAUSEMS(500);
		write595(G);
		PAUSEMS(500);
		write595(B);
		PAUSEMS(500);
	}
}


Döngü bir kere düzgün çalıştıktan sonra, ledler sönüyor.
write595 fonksiyonu CCS in standart 74hc595 driver'ındandır.
Gerçekte denemedim ama proteus ta bir kere çalışıp duruyor. PIC in PORTB sini bu şekilde denedim. O çalışıyor. Bunda sorun ne olabilir?  :roll:

Gurkan-Demirbas

Merhaba;
C biliyorum ama PIC C bilmiyorum !!..;
shift_left(eo,NUMBER_OF_74595,0);

Bunun işlevi nedir?
Eğer tahmin ettiğim gibi eo pointerinin içeriklerini değiştirerek shift yapıyorsa; 2inci turda bu saklayıcıların içerikleri 0 olacaktır.
İlk döngü bittiği anda (bence !!..) R,G,B nin değerlerinin hepsi sıfır oluyor. Bence R,G,B tanımlamalarını While(1) döngüsü içerisinde yapmalısın.

Bir de C'de (Yanılmıyorsam) eğer SAYI[2] gibi birşey tanımlıyorsan bu SAYI[0], SAYI[1], SAYI[2] gibi 3 değişkene karşılık gelmezmi? Programında R[0], G[0] ve B[0] atlanmış gibi geldi bana.

==> Dediğim gibi PIC C'ye aşina değilim, Bu yüzden yazdıklarımda hata ve/veya yanlışlık olabilir !!......

Gürkan

M_B

Merhaba arkadas
while(1){ 
      write595(R); 
      PAUSEMS(500); 
      write595(G); 
      PAUSEMS(500); 
      write595(B); 
      PAUSEMS(500); 
   }

kısmını

While(1)
{ 
  write595(R[x]);
  PAUSEMS(500);
  write595(G[x]);
  PAUSEMS(500);
  write595(B[x]);
  PAUSEMS(500);
  x++;
 if(x==3) {x=0;}
}


seklinde yazmayı dene bakalım.

not: program basında tanımla  ve ilk deger olarak 0 ver.

Kolay gelsın.
M_B
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

halukece

Alıntı yapılan: "Gurkan-Demirbas"Merhaba;
C biliyorum ama PIC C bilmiyorum !!..;
shift_left(eo,NUMBER_OF_74595,0);

Bunun işlevi nedir?
Eğer tahmin ettiğim gibi eo pointerinin içeriklerini değiştirerek shift yapıyorsa; 2inci turda bu saklayıcıların içerikleri 0 olacaktır.
İlk döngü bittiği anda (bence !!..) R,G,B nin değerlerinin hepsi sıfır oluyor. Bence R,G,B tanımlamalarını While(1) döngüsü içerisinde yapmalısın.

Bir de C'de (Yanılmıyorsam) eğer SAYI[2] gibi birşey tanımlıyorsan bu SAYI[0], SAYI[1], SAYI[2] gibi 3 değişkene karşılık gelmezmi? Programında R[0], G[0] ve B[0] atlanmış gibi geldi bana.

==> Dediğim gibi PIC C'ye aşina değilim, Bu yüzden yazdıklarımda hata ve/veya yanlışlık olabilir !!......

Gürkan

Saol Gürkan. Evet dediğin gibi diziler shift_left fonksiyonu ile 0 oluyormuş.
Önceden de bu fonksiyonu kullandım ama böyle bi durum olmamıştı. herhalde o zaman geçici dizi ile çalışıp orjinalini hep yüklüyordum. Döngü başında değerleri yeniden yükleyince düzeldi. Program bu kadar basit değil ama başlangıçta böyle bir problemi çözmem iyi oldu.

Teşekkürler.
while(1){
		for (i=0;i<3;i++){
			Temp1[i]=RR[i];
			Temp2[i]=GG[i];
			Temp3[i]=BB[i];
		}
		write595(Temp1);
		PAUSEMS(500);
		write595(Temp2);
		PAUSEMS(500);
		write595(Temp3);
		PAUSEMS(500);
	}


Buradaki gibi bir diziyi diğer bir diziye en kısa yoldan nasıl atarım. Uzun zamandır uğraşmıyordum bu işlerde. Tekrar baştan alıyorum.  :roll:

Döngü ile atmak bana ilkel geldi biraz. :)

Gurkan-Demirbas

C'ye çok hakim değilim, daha iyi bilen arkadaş mutlaka vardır;
Ama dediğin şekildeki tanımlama dışında benim önerebileceğim başka birşey gelmiyor aklıma.
GürkaN