16f877a ile 7-segment-display çalıştırırken aldığın ilginç hata.

Başlatan ferhatmacin, 11 Şubat 2012, 22:36:09

ferhatmacin



Nedense   RB6 daki çıkıştan elektrik gitmiyor.Nedeni ne olabilir?

Mplab ta yazdığım kod şöyle:

#include<htc.h>
#define _XTAL_FREQ 8000000 
__CONFIG (UNPROTECT & WDTDIS & HS & LVPDIS & PWRTDIS & BORDIS);	
const unsigned char
segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void main(void)
{
	char i;
	TRISB=0x00;
	PORTB=0x00;
	while(1)
	{
		PORTB=segment[i];
		i++;
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		if(i<9)
		i=0;
		}
	}


Önerinizi bekliyorum dostlar.Ne yapmam lazım?  Saygılarımla

AsHeS

PIC  C ye hakim değilim ama i while döngüsünden önce i=0  yapmanız yararınıza olabilir.Ayrıca ekranda sadece segment[0] gözükür çünkü if (i<9) komutu her sayıda çalışacaktır.Dizide ki ilk elemanınız 00111111  olduğu için RB6  lojik 1 e çekilmez.

elektronikhobi

Sanırım bu bölümü şöyle yazmak istediniz:

if (i > 9) {
    i = 0;
}


Bir de örneğin 0 yazdırmak için bit dizilimi gfedcba  şeklinde ise    0×3f eğer abcdefg şeklinde ise 0×7e göndermek gerekiyormuş.
Hükmedemediğiniz bir hayat için, bir dünya için, bu kadar fırıldak olmanın anlamı yoktur.

Düz yaşayacağız, dik duracağız, doğru gideceğiz.


ferhatmacin

Öncelikle  ilk arkadaşımız i=0  yazılmasını denememi istedi bu işe yaramadı  bunu belirteyim.
2. olarak da   abcdefg olan döngüyü  gfedcba şeklinde getirdim belki çözer diye.Bu sefer aşağıdaki  hatayı verd =)


He bi de   orada   parantez koymaya  gerek yok kanımca çünkü if döngüsü zaten kendinden sonraki ilk   komutu döndermeye çalışır.

justice_for_all

ilk hatan mclr pinini +5 v a baglamamissin hata vermedimi proteus?

ikincisi ise segment karsiliklarini kontrol et onda hata vardir belki

hep ayni karakterimi gosteriyor?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

ferhatmacin

+5V bağladım yine aynı sonuç verdi.

Ayrıca  başka karakter vermiyor abcdefg şeklinde  yazınca   Rb6  çalışmıyor.   Diğer türlü de  Rb0 çalışmıyor.  Ama karakter değişmesi yok hep aynı karakter gösteriyor display

Mucit23

Alıntı yapılan: ferhatmacin - 12 Şubat 2012, 00:01:02
Öncelikle  ilk arkadaşımız i=0  yazılmasını denememi istedi bu işe yaramadı  bunu belirteyim.
2. olarak da   abcdefg olan döngüyü  gfedcba şeklinde getirdim belki çözer diye.Bu sefer aşağıdaki  hatayı verd =)
(Resim gizlendi görmek için tıklayın.)

He bi de   orada   parantez koymaya  gerek yok kanımca çünkü if döngüsü zaten kendinden sonraki ilk   komutu döndermeye çalışır.

yanlışım yoksa Sadece A seğmentinin yanmaması gerekirsen C seğmentide yanmıyor ama picin logıc durumları düzgün görünüyor. Displaymi bozuk acaba. Bence başka bir isis penceresinde displaylerin tüm segmentlerini kontrol edin

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

elektronikhobi

Alıntı yapılan: ferhatmacin - 12 Şubat 2012, 00:01:02
He bi de   orada   parantez koymaya  gerek yok kanımca çünkü if döngüsü zaten kendinden sonraki ilk   komutu döndermeye çalışır.

Tutarlılık önemli olduğu için iyi bir kodlama alışkanlığı olarak  küme parantezlerini kullanmak iyidir. Örneğin şu şekilde bir kodumuz olsun.

#include <stdio.h>

int main()
{
    _Bool bir_kosul = 1;

    if (bir_kosul)
        printf("kosul dogru");

    printf ("devam ediyoruz");
}


Kodumuzun bir yerinde döngüyü iptal etmek istiyoruz.
#include <stdio.h>

int main()
{
    _Bool bir_kosul = 1;

    if (bir_kosul)
        //printf("kosul dogru");

    printf ("devam ediyoruz");
}


Devam ediyoruz'un nasıl if döngüsünün altına çekildiğini farkettiniz mi?

Hükmedemediğiniz bir hayat için, bir dünya için, bu kadar fırıldak olmanın anlamı yoktur.

Düz yaşayacağız, dik duracağız, doğru gideceğiz.


ferhatmacin

2-3 tane segment denedim hepsinde aynı sonucu verdi.Sonra gittim  bağlantısını kesip segmentle  öyle baktım.Gene aynı sonucu verdi.Başka bi kod çalıştırdım  sadece   kablolarla ,   o zaman  RB6 dan elektrik vermişti. Bence  aşağıdaki kodlarda bişiyi eksik unutuyorum galiba.En son hali aşağıdaki gibi kodun
#include<htc.h>
#define _XTAL_FREQ 8000000 
__CONFIG (UNPROTECT & WDTDIS & HS & LVPDIS & PWRTDIS & BORDIS);	
const unsigned char
segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void main(void)
{
	char i;
	TRISB=0x00;
	PORTB=0x00;
	
while(1)
	{
		PORTB=segment[i];
		i++;
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		if(i<9)
	{	i=0; }
		}
	}

elektronikhobi

Hükmedemediğiniz bir hayat için, bir dünya için, bu kadar fırıldak olmanın anlamı yoktur.

Düz yaşayacağız, dik duracağız, doğru gideceğiz.


justice_for_all

Alıntı yapılan: ferhatmacin - 12 Şubat 2012, 00:47:28
2-3 tane segment denedim hepsinde aynı sonucu verdi.Sonra gittim  bağlantısını kesip segmentle  öyle baktım.Gene aynı sonucu verdi.Başka bi kod çalıştırdım  sadece   kablolarla ,   o zaman  RB6 dan elektrik vermişti. Bence  aşağıdaki kodlarda bişiyi eksik unutuyorum galiba.En son hali aşağıdaki gibi kodun
#include<htc.h>
#define _XTAL_FREQ 8000000 
__CONFIG (UNPROTECT & WDTDIS & HS & LVPDIS & PWRTDIS & BORDIS);	
const unsigned char
segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void main(void)
{
	char i;
	TRISB=0x00;
	PORTB=0x00;
	
while(1)
	{
		PORTB=segment[i];
		i++;
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		__delay_ms(50);
		if(i<9)
	{	i=0; }
		}
	}



siz yukardaki uyarilari hic dikkate almamissinizki..

ilk once bir degisken tanimlamasi yapiyosaniz onun degeriniz sifirlamalisinizki  baslangicta sacma degerler almasin.
ikinci if(i<9) değil if(i>9) boyle olmasi gerekir buyuk kucuk isareti onemli!!!!!!

simdi anlasildi neden tek karakter gosterildigi if(i<9) bu satir her zaman dogru olacagi icin hep sifiri gorursunuz ama segmentlerde yine problem var sifirda tam gozukmuyor.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

ferhatmacin

Tamam hata çözüldü evet aynen öyle elektronikhobi.Siz de haklısınız justice..Şimdi tek sorun sanki C segmenti hiçbi zaman yanmıyor.  bunu nası çözebiliriz

justice_for_all

picin c segmentine giden pinine bakmaniz gerek enerji gidiyomu gitmiyomu diye
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay