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

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

Mr.Java

#15
Öyle fakat kafama takıldı.İleride elimde bulunan ds18b20 ile sıcaklık bilgisini displaya gönderme veya adc ile okuduğum değeri displaya yazmak veya keypad veya IR  istediğimde tekrardan sorun çıkıcak :' ( Tam anlamadan geçmek istemiyorum.Size ekte boardın diagramını göndericeğim.Sorum örneğin displayin tekli kullanım,2'li kullanım vs. nasıl yapaacağımdır.

Buda sizi son rahatsız etmem olacak sadece amaç mantığını tam olarak kavrama  :P

http://s2.dosya.tc/server/QfFIXE/BK300Circuitdiagram.rar.html


mesaj birleştirme:: 08 Şubat 2013, 15:11:08

Anlamadığım yerleride belirttim.İyi günler kolay gelsin.

#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; // tanımlamalar tamam sıkıntı yok..
     RA3=0;          // Led seçmek için HC573 aktif ediliyor.            
     
     for(k=0;k<50;k++) // 50 değeri nedir burada ?
     for(TEMP=0X80,i=0;i<4;i++) // TEMP değişkeni 0b10000000 atanmış.4 lü displayleri tek tek seçme yeri burasımı anladığım kadarıyla ?
     {
     
//******************************************************************************
     RC4=1;    // segment aktif                
     PORTD=TEMP;  //segmente 0x80 gönderiyor. ???               
     RC4=0;     //tekrar kaptmış                 
//******************************************************************************     

//******************************************************************************
     RC3=1; // display seçme açık
     PORTD=LED_DIS[DIS_NUM[i]]; // burada displaylara birler onlar şekilinde bilgi gönderiyor lakin biz i değişkenine herhangi bir işlem yapmadık. i++ vs. gibi ?
     RC3=0;
//******************************************************************************

     TEMP>>=1;    //kaydırma =?              
     delay(10,10);       // bundaki gecikme süresi edir acaba ? Delay_Ms(100) gibi düşünürsek ?       
   
//******************************************************************************
     RC4=1; //Led seçme açık.
     PORTD=0X00; // 0 lanıyor ? 
     RC4=0;
     delay(1,10);
//******************************************************************************     
     }
}

void delay(uchar a,uchar i) // burası ayrı muamma :D
{        
     while(--a)
     while(--i);
}

mehmet

#16
Rahatsızlık olmaz, öyle düsünme. Burada herkez keyfi takılıyor.
Birbirimize yardımcı olmaya çalışıyoruz...

Elimden geldiğince açıklamaya çalıştım...
BoardConfig.h içerisinde RA2 ve RA5 pinleride malumun üzere
PWM ledini (Led10) ve 8 adet ledi (Led1-8 ) kapatmak için...

HC573_4Display.c
#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);  //Fonksiyonları main fonksiyonundan önce yazarsan
                                             // burada deklerasyon yapmana gerek kalmaz...


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++)    // Sanıyorum bundan sonraki işlemler 50 kere tekrarlanıyor öyle anladım.
     for(TEMP = 0X80, i = 0; i < 4; i++) //i değişkeni burada değişiyor.
     {

//******************************************************************************
     RC4 = 1;
     PORTD = TEMP;
     RC4 = 0;
//******************************************************************************

//******************************************************************************
     RC3 = 1;
     PORTD = LED_DIS[DIS_NUM[i]];   // i değişkeni for döngüsünden değiştiriliyor...
     RC3 = 0;
//******************************************************************************

     TEMP >>= 1; // 0b10000000
                          // 0b01000000
                          // 0b00100000
                          // 0b00010000
                          // kaydırma yapılıpyor bu 4 kere oluyor 4. de tekrar 0x80 oluyor.
                 
     delay(10,10);

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

void delay(uchar a,uchar i)   // i 0'a kadar saydıktan sonra a bir eksiliyor, a da 0 olunca delay fonksiyonu bitiyor.
                                             // kesin bir zamnlama değil. "Saykıl işlem * i * a" yaklasık olarak gecikme
{
     while(--a)
     while(--i);
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

Mr.Java

#17
Anladım biraz karışık programlamış fakat çözeceğiz artık.Kiti çözdüm gibi zaten.Kendi kütüphanelerimi oluşturdum sıkıntı yok fkat işte displaylerde 2 adet 573 sakat etti beni  :D Biraz daha uğraşırsam çözeceğim biliyorum.

Yardımın için teşekkürler.Belki iyi anlayan birisi konumu ziyaret ederde aydınlatır diye ümit ediyor,iyi forumlar diliyorum..

mesaj birleştirme:: 08 Şubat 2013, 18:04:51

Bu arada OPTION&=0x7f;  nedir ?

mehmet

Alıntı yapılan: Fkarizmatik - 08 Şubat 2013, 17:40:18
Bu arada OPTION&=0x7f;  nedir ?
OPTION = OPTION & 0x7F;
anlamına gelir.
a += 1 ==> a = a + 1
a -= 1 ==> a = a - 1
a &= 1 ==> a = a & 1
a >>= 1 ==> a = a >> 1
...

Saygılar...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

Mr.Java

Mehmet hocam sayenizde çok şey öğrendim.Bunlardan başlıcası;

-Kendi kütüphanemi oluşturdum.Display,LCD,BoardConfig v.s. bunların sayesinde kod yazmak inanılmaz kısa ve zevkli olmaya başladı.
-Başımızın belası 74HC sorunu bitti artık  ;D

Şimdi ise kafamdaki farklı bir şey için displayda son örnek yapmak istiyorum tam kavramak için;

Displayda başlangıçta "5-20" değeri görünecek ve RB0 basıldığında "5-14" RB1 de ise "5-15" gibi v.s. Görünüşte Çok kolay fakat donanım girince displaylarda bozulma oluyor.Görüntüde çok fazla titreme oluşuyor sebebini çözemedim.

#include "BoardConfig.h"  //Board Config Ayarları

void LED_DISPLAY(void);
void delay(uchar a,uchar i);
uchar LED_DIS[5]={0X92,0Xbf,0Xc0,0Xc0};

/********************************************************************************************
LED DİSPLAY KABAK TADI VERMEDEN ÖNCEKİ SON ÖRNEK =)
09.02.2013
Fatih ASLAN
/*******************************************************************************************/
void main (void)
{
   uchar key;

   Board_Ayar();     //Ayarlar Yükleniyor.

   TRISB=0X0F;       //RB0-RB3 Arası Giriş yapılıyor.
   PORTB=0X0F;

   ADCON1=0X00;

   while(1)
   {
          key=PORTB;
          if(key !=0x0F)
          {
                switch(key)
                {
                case  0x0E:              //°17 değeri
                   LED_DIS[2]=0Xf9;
                   LED_DIS[3]=0XF8;
                   break;
                case  0x0D:              //°18
                   LED_DIS[2]=0Xf9;
                   LED_DIS[3]=0X80;
                   break;
                case  0x0B:              //°19
                   LED_DIS[2]=0Xf9;
                   LED_DIS[3]=0X90;
                   break;
                case  0x07:              //°20
                   LED_DIS[2]=0XA4;
                   LED_DIS[3]=0XC0;
                   break;
                }
           }
           LED_DISPLAY();    //Bunu kütüphane oluşturmuştum fakat ayrıntıları görmenizi istedim.Led_display.h
     }
}

////////////////////////////////////////////////////////////////////////////////
 //LED_Display.h config
 //Bildiğiniz üzere önce led seçim sonra displaya bilgi gönderim şeklinde ayarlandı

//******************************************************************************

void LED_DISPLAY(void)
{
     uchar i,TEMP;
     RA3=0;
     TEMP=0X80;
     for(i=0;i<4;i++)
     {

//******************************************************************************
     RC4=1;
     PORTD=TEMP;
     RC4=0;
//******************************************************************************

//******************************************************************************
     RC3=1;
     PORTD=LED_DIS[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);
}

mehmet

Timer intterupt kullanabilirsin;
Örneğin: Timer belli bir zaman kurulur. (1us,10ms, 27ms gibi)
Her kesmede bir değişken artırılır, ana döngüdeki
LED_DISPLAY(); adımını
if (degişken == 100) {LED_DISPLAY(); degisken = 0;}
olarak degiştirirsin. Ana döngüde fazla delay fonksiyonu kullanmazsın,
yada hiç kullanmazsın.
Aynı şekilde buton olaylarını da interrupt olarak
kullanırsın. Boylece buton ve display gecikmede
olmaz.
Genelde debounce gecikmesi yüzünden ekrana
yazma sıkıntısı oluşabilmektedir. Bazı durumlarda
Senin kullandığın sistemde sadece ekranda
değişiklik oldugunda ekran fonkiyonunu çağırman
bir değişik çözüm olabilir.


Saygılar...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

Mr.Java

Anladım.Kesme fonksiyonu oluşturup döngüde tek tek atmamı istiyorsunuz.evet çözülebilir gibi fakat  OPTION & 0x6F; kullandıktan sonra sorun halloldu ? burada option tam olarak ne iş yapıyor çözemedim. Ayrıca diğer bir sorum ise Delay_Ms(10,100) tam olarak kaç ms denk geliyor ?

mehmet

Pic ailesiyle aram çok iyi olmadığı için OPTION olayını
bilemiyorum.
Senin delay fonksiyonun:
while(--a)while(--i);
delay(10,100) -> 10x100x"saniyedeki işlem" olur.
4Mhz bir kristal için 1Mhz çevrim işlemi sayarsak;
1.000.000 / 1000 = 1000 çevrim gecikme olur.
Bu da 1ms yapar.(Umarım yanlış hesaplamamışımdır)
(Bu oranlar yaklaşık sayılır. Mcu nun yaptığı başka
işlemlerden dolayı bu tür gecikme fonksiyon zamanları
değişim gösterir.)
Kesin zamnlamalarda kesme kullnmak daha doğru
hesaplamalar yapmamızı sağlar...

Saygılar...

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"