Ynt: 4lü Display 74HC573 ile sürmek..

Başlatan Mr.Java, 07 Şubat 2013, 00:14:01

Mr.Java

Arkadaşlar merhaba.Elimde pic deney seti var.4lü display ile çalışmak istiyorum fakat biraz karmaşık geldi bana. 1 saattir çıkamadım işin içinden.Ekteki resim deney setinde display kısmının çizimi.display data bacakları bir bacakta.a,b,c,d, yani birler onlar yüzler binler bir tarafta entegreye zaten kıl oldum durum böyle olunca beyin iptal oldu.Örnek C,ccs,picbasic hiç farketmez yardımcı olabilirseniz sevinirim...,



mesaj birleştirme:: 07 Şubat 2013, 00:15:30

Bu arada LEDlerde bağlı 74HC 573'te var.RA3 pinine bağlı bilginize.ORAda RA5=0 dedikmi iptali söz konusu yoksa portta şişme oluyor.

Mr.Java

Yardım edebilecek birisi yok mu ?Teşekkürler..

mehmet

Datalar parelel gidiyor. Önce led seçtireceksiniz.
Sonra displayda gösterilecek data çıkarılacak.
Enable pinleri ile hc573 seçilecek data girişine verilecek
ve output enable durum değiştirecek.
Ayrıntılarını datasheetinden öğrenebilirsin.

Saygılar...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

pisayisi

Segmentleri kontrol eden led v1, v4 pinlerinin gecikme ile taranarak segmentlerda data oluşturcak bitleri çıkışa yönlendirmek lazım. Ancak led e,f,g,db pinleri ile segment seçme pinleri ortak kullanılmış. Bu durumda ALE pinleri ile birinci ve ikinci hc573 leri adeta takla attırmak lazım, bağımsız pinlerle segment seçme olsa forumda eski sayfalarda işine yarayacak çok kodlar bulabilirsin. Ancak burda D tipi latch kullanarak pinlerden tasarruf edilirken kod karşaması getirilmiş...
Murat

mehmet

11 Latch Enable (aktif high) [RC3 Segment] [RC4 display seç]
1  Output enable (aktif low) [RA3]
Buna göre;

RA3 high; (çıkılşarı kapat)
RC4 high; (display seçimi açık)
portd display sec; (16, 32, 64, 128)
RC4 low;
RC3 high; (segment seçimi açık)
portd segment rakamları;
RA3 low; (girişteki verileri çıkışa ver)

Her hangi bir ide ile bunlar düzenlenebilir.

Saygılar...


Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Mr.Java

#5
Alıntı yapılan: pisayisi - 07 Şubat 2013, 20:11:01
Segmentleri kontrol eden led v1, v4 pinlerinin gecikme ile taranarak segmentlerda data oluşturcak bitleri çıkışa yönlendirmek lazım. Ancak led e,f,g,db pinleri ile segment seçme pinleri ortak kullanılmış. Bu durumda ALE pinleri ile birinci ve ikinci hc573 leri adeta takla attırmak lazım, bağımsız pinlerle segment seçme olsa forumda eski sayfalarda işine yarayacak çok kodlar bulabilirsin. Ancak burda D tipi latch kullanarak pinlerden tasarruf edilirken kod karşaması getirilmiş...
ü

Kesinlikle katılıyorum kodlarda karmaşa söz konusu.Alttaki arkadaşın dediğini anladğım kadarıyla bir uygulayıp yorumları atacağım..

mesaj birleştirme:: 07 Şubat 2013, 22:51:30


#define uchar unsigned char
#define uint unsigned int

uchar led_dis[10] = { 0x40,0x79, 0x24, 0x30, 0x19,
                           0x12, 0x02, 0x78, 0x00, 0x10 };
uchar segment_display[4];
        
                     


void main() {

uint sayici;

        TRISA=0x00;
	TRISB=0x00;
	TRISC=0x00;
	TRISD=0x00;
	TRISE=0X00;
	PORTD=0XFF;
	PORTA.RA3=0;
	PORTC.RC5=1;
        Delay_Ms(200);
        PORTC.RC5=0;
        PORTC.RC3=1;
        Delay_Ms(200);
        PORTC.RC3=0;
        PORTC.RC4=1;
        PORTD=0X00;
        Delay_Ms(200);
        PORTC.RC4=0;
        PORTD=0XFF;
        PORTC.RC2=1;
        PORTE.RE0=0;
        PORTE.RE1=0;
        PORTE.RE2=0;

 while(1)
    {
       for(sayici=0;sayici<9999;sayici++)
       {
          segment_display[0]=(uchar)(sayici/1000);
           segment_display[1]=(uchar)((sayici%1000)/100);
           segment_display[2]=(uchar)((sayici%100)/10);
           segment_display[3]=(uchar)(sayici%10);
           led_dis();

}
     
  }
     }
void LED_DISPLAY(void)
{
uchar i,TEMP,k;
PORTA.RA3=0;
for(k=0;k<50;k++)
     for(TEMP=0X80,i=0;i<4;i++)
     {
     PORTC.RC4=1;
     PORTD=TEMP;
     PORTC.RC4=0;
//******************************************************************************

//******************************************************************************
     PORTC.RC3=1;
     PORTD=LED_DIS[segment_display[i]];
     PORTC.RC3=0;
//******************************************************************************

     TEMP>>=1;
     delay_ms(100);

//****************¹************/************************************************
     PORTC.RC4=1;
     PORTD=0X00;
     PORTC.RC4=0;
     delay_ms(100);
//******************************************************************************
     }
}

void delay(uchar a,uchar i)
{
     while(--a)
     while(--i);
}

          
     }
}


Basit olaraktan denedim yapamadım..Nerede takıldım acaba ?

mehmet

void LED_DISPLAY(void)
{
uchar i,TEMP,k;
PORTA.RA3=1; //çıkışlar kapalı
for(k=0;k<50;k++)
     for(TEMP=0X80,i=0;i<4;i++)
     {
     PORTC.RC4=1;
     PORTD=TEMP;    // Displaylarin anot-katod durumuna göre invert olabilir???
     PORTC.RC4=0;
//******************************************************************************

//******************************************************************************
     PORTC.RC3=1;
     PORTD=LED_DIS[segment_display[i]];
     PORTC.RC3=0;
//******************************************************************************

     //TEMP>>=1;
     //delay_ms(100);

//****************¹************/************************************************
     //PORTC.RC4=1;
     //PORTD=0X00;
     //PORTC.RC4=0;
     //delay_ms(100);
//******************************************************************************
     }
     PORTA.RA3 = 0; // latch daki verileri çıkışa ver
     delay_ms(100);
     TEMP>>=1;
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Mr.Java

Anlamadım şimdide mikrocde while(1) döngüsünde Specifier needed hatası veriyor bilgisi olan var mı ?

Ayrıca kendi #include .h dosyamı nasıl oluşturabilirim acaba ?

mehmet

config.h
/*
|--------------------------------------------------------------------------
| Örnek olarak port tanımlamaları
|--------------------------------------------------------------------------
|
*/
#ifndef CONFIG_FILE
#define CONFIG_FILE

void MCU_init()
{
     // giriş/çıkış seçimi
     TRISA = 0B00000000;
     TRISB = 0B00000000;
     TRISC = 0B00000000;
     TRISD = 0B00000000;
     TRISE = 0B00000000;
     
     // portların ilk değerleri
     PORTA = 0B00000000;
     PORTB = 0B00000000;
     PORTC = 0B00000000;
     PORTD = 0B00000000;
     PORTE = 0B00000000;
     
     // interrupt tanımlamaları
     
     // diğer tanımlamalar
     //UART1_Init(9600);              // UART1 9600 boud'a ayarla(örnek)
}

#endif


main.c içerisinde #include "config.h" olarak eklersin ve
ana döngü içerisinden de MCU_init(); ile ilk fonksiyon çağrısıyla
ilgili tanımlamaları yapabilirisim.
Daha geliştirilebilir; mesela: LCD.c, LCD.h yapabilirisin. LCD.c içerisinde
sabit değikenlerin olur ve işlemci değiştirsen de bunda değişiklik yapmazsın.
Sadece LCD.h içerisinden LCD portlarını tanımlarsın.
Elinde bunun gibi birkaç fonksiyon dosyaların olur. Bunları yeniden yazmana
gerek kalmaz. Sadece header dosyalarındaki port tanımlamalarını, vs. değitirirsin...

Saygılar...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Mr.Java

Mehmet bey teşekkürler o sorunumu çözüdm lakin bu defa ilginç bir hata ile karşılaştım bunun anlamı nedir acaba ? Kodumuz ;

#define uchar unsigned char
#define uint unsigned int

uchar led_dis[16] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x00,0x46,0x40,0x06,0x0E};    // Göndereceğimiz değerler.

uchar segment_display [4];   //segment 4'lü belirtiyoruz.

uint sayici;  //sayici adında imzasız integer tanımlamamız.

void main() {
              TRISA=0x00;
               TRISB=0x00;
                 TRISC=0x00;
                   TRISD=0x00;
                     TRISE=0X00;
                       PORTD=0XFF;
                        PORTA.RA3=0;
                         PORTC.RC5=1;
                          Delay_Ms(200);
                           PORTC.RC5=0;       //Giriş çıkışlar tanımlanıp öndeğerler atanıyor.
                            PORTC.RC3=1;
                            Delay_Ms(200);
                           PORTC.RC3=0;
                          PORTC.RC4=1;
                         PORTD=0X00;
                        Delay_Ms(200);
                       PORTC.RC4=0;
                      PORTD=0XFF;
                     PORTC.RC2=1;
                    PORTE.RE0=0;
                   PORTE.RE1=0;
                 PORTE.RE2=0;
}

while(1)
    {
       for(sayici=0;sayici<9999;sayici++;)
       {
          segment_display[0]=(uchar)(sayici/1000);           //binler
           segment_display[1]=(uchar)((sayici%1000)/100);   //yüzler
           segment_display[2]=(uchar)((sayici%100)/10);   //onlar
           segment_display[3]=(uchar)(sayici%10);        //birler
           led_dis();

}


Hata SS ;


mehmet

#10
Bu hali bende derlendi...
Saygılar..
.
Not:"{}" parantez problemi...

#define uchar unsigned char
#define uint unsigned int

uchar led_dis[16] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x00,0x46,0x40,0x06,0x0E};    // Göndereceğimiz değerler.

uchar segment_display [4];   //segment 4'lü belirtiyoruz.

uint sayici;  //sayici adında imzasız integer tanımlamamız.

void main() {
              TRISA=0x00;
               TRISB=0x00;
                 TRISC=0x00;
                   TRISD=0x00;
                     TRISE=0X00;
                       PORTD=0XFF;
                        PORTA.RA3=0;
                         PORTC.RC5=1;
                          Delay_Ms(200);
                           PORTC.RC5=0;       //Giriş çıkışlar tanımlanıp öndeğerler atanıyor.
                            PORTC.RC3=1;
                            Delay_Ms(200);
                           PORTC.RC3=0;
                          PORTC.RC4=1;
                         PORTD=0X00;
                        Delay_Ms(200);
                       PORTC.RC4=0;
                      PORTD=0XFF;
                     PORTC.RC2=1;
                    PORTE.RE0=0;
                   PORTE.RE1=0;
                 PORTE.RE2=0;


while(1)
    {
       for(sayici=0;sayici<9999;sayici++)
       {
          segment_display[0]=(uchar)(sayici/1000);           //binler
           segment_display[1]=(uchar)((sayici%1000)/100);   //yüzler
           segment_display[2]=(uchar)((sayici%100)/10);   //onlar
           segment_display[3]=(uchar)(sayici%10);        //birler
           led_dis();
           }
           }

}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Mr.Java

       }
           }

}


evet eklediğim halde aynı hatayı veriyor.neden acaba ? 2 gündür bir display ile uğraşıyorum yav pfff.

mehmet

#12
while(1) öncesideki "}" silersen düzelecektir...

Saygılar...

Ek: led_dis[16] ile led_dis() fonksiyon isimleri aynı olamaz...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Mr.Java

#13
Mehmet bey ilginiz için çok teşekkürler lakin sorun aynı tekrardan o hatayı verdi.
Kiti aldığım kişiyle yazıştık ve kodu gönderdim.kendisi Hi-tech ile derlememi derleyici olarak hi-tide kullamamı tavsiye etti.(Eskiden kullanıyordum hi-tide)
Compile ettim tak çalıştı kitte displaylar.Fakat sistemi biraz farklı geldi bana.Tüm kodları yolluyorum..

ANA Program;

#include "BoardConfig.h"  
__CONFIG ( HS & WDTDIS & PWRTEN & LVPDIS & BORDIS & UNPROTECT & WRTEN & DEBUGDIS);       

#define uchar  unsigned char
#define uint   unsigned int
void LED_DISPLAY(void);
void delay(uchar a,uchar i);


uchar LED_DIS[]={0xc0,0xf9,0xa4,0xb0,0x99,
            0x92,0x82,0xf8,0x80,0x90,0xff};     

uchar DIS_NUM[4];        
void main (void)
{
     uint counter;
     
     Board_init();         
     
     while(1)
    {
       for(counter=0;counter<9999;counter++)
       {
           DIS_NUM[0]=(uchar)(counter/1000);          
           DIS_NUM[1]=(uchar)((counter%1000)/100);    
           DIS_NUM[2]=(uchar)((counter%100)/10);      
           DIS_NUM[3]=(uchar)(counter%10);            
           LED_DISPLAY();                             
       }        
    }  
}


void LED_DISPLAY(void)
{
     uchar i,TEMP,k;
     RA3=0;                      
     
     for(k=0;k<50;k++)
     for(TEMP=0X80,i=0;i<4;i++)
     {
     
//******************************************************************************
     RC4=1;                    
     PORTD=TEMP;                 
     RC4=0;                      
//******************************************************************************     

//******************************************************************************
     RC3=1;
     PORTD=LED_DIS[DIS_NUM[i]];
     RC3=0;
//******************************************************************************

     TEMP>>=1;                  
     delay(10,10);              
   
//******************************************************************************
     RC4=1; 
     PORTD=0X00;
     RC4=0;
     delay(1,10);
//******************************************************************************     
     }
}

void delay(uchar a,uchar i)
{        
     while(--a)
     while(--i);
}


BoardConfig.h
/*******************************************
  Îļş£ºBoardConfig.h
  ¹¦ÄÜ£ºÓÃÓÚBK300 PICʵÑé°åÓ²¼ş³õʼ»¯ÉèÖÃ/******************************************/

#include <pic.h>			//°üº¬Í·Îļş
/******************Êı¾İÀàĞͺ궨Òå******************/
#define uchar unsigned char
#define uint unsigned int

/*******************************************
º¯ÊıÃû³Æ: Board_init
¹¦    ÄÜ: ³õʼ»¯ÊµÑé°å
²Î    Êı: ÎŞ
·µ»ØÖµ  : ÎŞ
/********************************************/
void Board_init(void)
{

  //*****½«ËùÓĞIO¿ÚÈ«²¿ÅäÖÃΪÊä³ö******************************************************
	TRISA=0x00;	   
	TRISB=0x00;
	TRISC=0x00;
	TRISD=0x00;
    TRISE=0X00;
  //************************************************************************

   
  //*****¹Ø±ÕLED1--LED8******************************************************
   PORTD=0XFF;   //PORTDÊä³ö¸ßµçƽ
   RA3=0;        //ʹÄÜ74HC573Êä³ö
   RC5=1;
   asm ("NOP");
   asm ("NOP");  
   RC5=0;         //74HC573Ëø´æÊä³öPORTDÊä³öµÄ¸ßµçƽʹLED¹Ø±Õ
  //************************************************************************

  //*****¹Ø±ÕÊıÂë¹Ü¶ÎÑ¡*****************************************************
   RC3=1;
   asm ("NOP");
   asm ("NOP"); 
   RC3=0;        //U2Ëø´æ¸ßµçƽÊä³ö¹Ø±ÕÊıÂë¹Ü¶ÎÑ¡           
 //************************************************************************

 //*****¹Ø±ÕÊıÂë¹Üλѡ*****************************************************
    RC4=1;
    PORTD=0X00;
    asm ("NOP");
    asm ("NOP"); 
    RC4=0;        //U3Ëø´æ¸ßµçƽÊä³ö¹Ø±ÕÊıÂë¹Üλѡ           
 //************************************************************************
    PORTD=0XFF;

    RC2=1;        //RC2Êä³ö¸ßµçλ¹Ø±ÕLED10

    RE0=0;        //¹Ø±Õ·äÃùÆ÷ 
    RE1=0;        //¹Ø±Õ¼ÌµçÆ÷
    RE2=0;        //ÉèÖÃMAX485Ϊ½ÓÊÕ״̬
}


Bizde aynısını yaptık sorun ?
Sistem nasıl çözmüş hiçbirşey anlamadım doğru dürüst.Özetleyebilirseniz artık display konusunu geçmek istiyorum.
Teşekkürler..

mehmet

HC573 ile board konfigurasyonuna göre düzenleme
yapılmış. Ben sadece datashetten bakarak yardımcı olmaya
çalıştım. Deneme imkanım yoktu.
Çalıştıysa çok fazla kurcalama :P
Olanları geliştirmeye bak...

Saygılar...

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr