Bir Kayan Yazı Daha

Başlatan infomaster, 18 Şubat 2006, 02:23:25

infomaster

Merhaba arkadaşlar.

Aşağıdaki devreyi hazırladım. 60 kolonlu bir kayan yazı devresi yaptım.

Çalışıyor. RS-232 üzerinden kayacak metni girebiliyorsunuz. Ancak yazı kayarken sanki çift görünüyormuş gibi oluyor. Gölge şeklinde değil. kolonlar arasındaki geçiş sırasında birşeyler oluyor.

Ustalardan ricam , 74HC595'leri sürdüğüm kısımda yazdığım kodu bir incelemeleri. Clockları doğru mu veriyorum acaba?

Not: Şu an için Türkçe karakter gösteremez. Font tablolarını bitirmedim. Onu da yollarım bitince. Şimdi yukarıdaki sorunu çözmeliyim.

Ben 18F452 kullandım. Siz isterseniz sadece kodda uygun yerleri değiştirerek 16F877 kullanabilirsiniz. Bacak bağlantıları aynı kalabilir.

Yardımlarınız için şimdiden teşekkürler.





#include <18F452.H>
#fuses HS,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, RESTART_WDT, ERRORS)

#define PIN_ST_CP      PIN_C2  // RCLK ----> Pin 12 ST_CP
#define PIN_SH_CP      PIN_C3  // SRCLK ---> Pin 11 SH_CP
#define PIN_SER_IN    PIN_C5  // SER -----> Pin 14
//#define PIN_MRS       PIN_C1  // PIN 10
//#define PIN_OE        PIN_C3  // PIN 13

#byte port_a = 0x0F80
#byte port_b = 0x0F81
#byte port_c = 0x0F82
#byte port_d = 0x0F83
#byte port_e = 0x0F84

#use fast_io(B)
#use fast_io(C)
#use fast_io(D)

long s1_char_size=41;
char s1[79];
long i;

void get_line1(void)
{
  for(i=0; i<s1_char_size; i++)
  {
    if(kbhit())
    {
      s1[i]=getc();
      delay_cycles(2);
      printf("%C",s1[i]);
      delay_us(1);
    }
    else
      i -= 1;
  }
}

char  const msg_default[] = "Kayan yazi uygulamasi. Deneme 1234567890";

char  const ascii1[32][5] = {
   {0,0,0,0,0}                  //   0
   {0,0,95,0,0}         //   {0,95,0,0,0,0}
   //   1
   {0,7,0,7,0}          // {0, 7,0,7,0,0}
 //   2
   {20,127,20,127,20}          //   3
   {36, 42, 127, 42, 18}       //   4
   {39, 21, 107, 84, 114}      //   5
   {54, 73, 86, 32, 80}        //   6
   {0, 11, 7,0,0}      // {0, 11, 7,0,0,0}
//   7
   {0, 28, 34, 65,0}    // {0, 28, 34, 65,0,0}
 //   8
   {0, 65, 34, 28,0}    // {0, 65, 34, 28,0,0}
 //   9
   {42, 28, 127, 28, 42}       //   10
   {8, 8, 62, 8, 8}            //   11
   {0, 88, 56, 0,0}      // {0, 88, 56,0,0,0}
  //   12
   {8,8,8,8,8}                 //   13
   {0, 96, 96, 0,0}      // {0, 96, 96,0,0,0}
  //   14
   {32, 16, 8, 4, 2}           //   15
   {62, 81, 73, 69, 62}        //   16
   {0, 66, 127, 64,0}       // {0,66, 127, 64,0,0}
     //   17
   {114, 73, 73, 73, 70}       //   18
   {34, 65, 73, 73, 54}        //   19
   {24, 20, 18, 127, 16}       //   20
   {39, 69, 69, 69, 57}        //   21
   {60, 74, 73, 73, 48}        //   22
   {1, 113, 9, 5, 3}           //   23
   {54, 73, 73, 73, 54}        //   24
   {6, 73, 73, 41, 30}         //   25
   {0, 54,54,0,0}         // {0, 54, 54,0,0,0}
   //   26
   {0, 91, 59, 0,0}         // {0, 91, 59,0,0,0}     // 27
   {8, 20, 34, 65,0}           //   28
   {20, 20, 20, 20, 20}        //   29
   {65, 34, 20, 8,0}           //   30
   {2, 1, 81, 9, 6}            //   31
   };

char  const ascii2[32][5] = {
{50, 73, 121, 65, 62}          //      0
{124, 18, 17, 18, 124}         //      1   A
{65, 127, 73, 73, 54}          //      2   B
{62, 65, 65, 65, 34}           //      3   C
{65, 127, 65, 65, 62}          //      4   D
{127, 73, 73, 65, 65 }         //      5   E
{127, 9, 9, 1, 1}              //      6
{62, 65, 73, 73, 58}           //      7
{127, 8, 8, 8, 127}            //      8
{0, 65, 127, 65, 0}       // {0, 65, 127, 65,0,0}
        //      9
{32, 64, 65, 63, 1}            //      10
{127, 8, 20, 34, 65}           //      11
{127, 64, 64, 64, 64}          //      12
{127, 2, 12, 2, 127}           //      13
{127, 2,  4, 8, 127}           //      14
{62, 65, 65, 65, 62}           //      15
{127, 9, 9, 9, 6}              //      16
{62, 65, 81, 33, 94}           //      17
{127, 9, 25, 41, 70}           //      18
{38, 73, 73, 73, 50}           //      19
{1,1,127, 1, 1}                //      20
{63, 64, 64, 64, 63}           //      21
{7, 24, 96, 24, 7}             //      22
{127, 32, 24, 32, 127}         //      23
{99, 20, 8, 20, 99}            //      24
{3, 4, 120, 4, 3}              //      25
{97, 81, 73, 69, 67}           //      26
{0, 127, 65, 65,0}          // {0, 127, 65, 65,0,0}
          //      27
{2, 4, 8, 16, 32}              //      28
{0, 65, 65, 127,0}          // {0, 65, 65, 127,0,0}
          //      29
{4, 2, 1, 2, 4}                //      30
{64, 64, 64, 64, 64}           //      31
};

char  const ascii3[31][5] = {    // 0 -- 30 == 31 elements
   {0, 0, 7, 11,0}        // {0, 7, 11,0,0,0}
  //   0
   {32, 84, 84, 84, 56}     //   1
   {127, 40, 68, 68, 56}    //   2
   {56, 68, 68, 68,0}     //   3
   {56, 68, 68, 40, 127}     //   4
   {56, 84, 84, 84, 24}     //   5
   {8, 126, 9, 9, 2}     //   6
   {8, 84, 84, 84, 60}     //   7
   {127, 8, 4, 4, 120}     //   8
   {0, 68, 125, 64,0}      // {0, 68, 125, 64,0,0}
//   9
   {32, 64, 68, 61,0}     //   10
   {127, 16, 40, 68,0}     //   11
   {0, 65, 127, 64, 0}      // {0, 65, 127, 64,0,0}
//   12
   {124, 4, 120, 4, 120}     //   13
   {124, 8, 4, 4, 120}     //   14
   {56, 68, 68, 68, 56}     //   15
   {124, 20, 20, 20, 8}     //   16
   {8, 20, 20, 20, 124}     //   17
   {124, 8, 4, 4, 8}     //   18
   {72, 84, 84, 84, 36}     //   19
   {4, 63, 68, 68,0}     //   20
   {60, 64, 64, 32, 124}     //   21
   {28, 32, 64, 32, 28}     //   22
   {60, 64, 48, 64, 60}     //   23
   {68, 40, 16, 40, 68}     //   24
   {12,80, 80, 80, 60}     //   25
   {68, 100, 84, 76, 68}     //   26
   {0, 8, 54, 65,0}           // {0, 8, 54, 65,0,0}
//   27
   {0,0,119,0,0}             // {0, 119,0,0,0,0}     // 28
   {0, 65, 54, 8,0}           // {0, 65, 54, 8,0,0}
//   29
   {2,1,2,4,2}     //   30
};

void main(void)
{
  int char_index;
  int col_index;
  int x = 0;
  long MSD, LSD;
  int delaycount;
  int16 startposition;

  set_tris_b(0);
  set_tris_c(0x40);
  set_tris_d(0);
  port_b = 0;
  port_c = 0;
  startposition = 0;

  for(i=0; i<79; i++)
    s1[i] = 46;

  for(i=0; i<sizeof(msg_default); i++)
    s1[i] = msg_default[i];

  delay_ms(100);
  do
  {
    if(!input(PIN_E1)) //BUTONA BASILDI MI?
    {
      do
      {
        delay_cycles(2);
        printf("\f\r\n");
        printf("\f\r\n Kac karakter.(0--99):");
        MSD=getc();
        delay_cycles(2);
        printf("%C",MSD);
        delay_us(1);
      }while(!isamoung(MSD,"0123456789"));
      do
      {
        LSD=getc();
        delay_cycles(2);
        printf("%C",LSD);
        delay_us(1);
      }while(!isamoung(LSD,"0123456789"));

      s1_char_size = 10*(MSD-48) + (LSD-48);
      delay_cycles(2);
      printf("\r\n\n  %lu karakter girin: ",s1_char_size);
      get_line1();
    }
    delaycount=10;
    while (delaycount)
    {
      col_index = startposition % 6;
      char_index = startposition / 6;
      if (char_index >= sizeof(s1))
      {
        startposition = 0;
        char_index = 0;
        col_index = 0;
      }
      x = s1[char_index];

// 74HC595 ler suruluyor
      output_high(PIN_SH_CP);
      output_high(PIN_ST_CP);
      output_high(PIN_SER_IN);
      output_low(PIN_SH_CP);
      delay_us(1);
      output_high(PIN_SH_CP);
      output_low(PIN_SER_IN);

      for (i=0;i<60;i++) // 60 tane kolon kullanıyoruz
      {
        //port_b=0;
        output_low(PIN_ST_CP);
        delay_ms(100);
        output_high(PIN_ST_CP);
        delay_us(1);
        output_low(PIN_SH_CP);
        delay_us(1);
        output_high(PIN_SH_CP);

        if (col_index == 5)
        {
          col_index = 0;
          char_index++;
          if (char_index >= sizeof(s1))
            char_index = 0;
          x = s1[char_index];
        }
        else
        {
          if ( x < 32)
            port_b = 0;
          else if( x < 64)
            port_b = ascii1[x-32][col_index];
          else if( x < 96 )
            port_b = ascii2[x-64][col_index];
          else if( x < 128)
            port_b = ascii3[x-96][col_index];
          col_index++;
        }
        delay_us(120);
        port_b=0;
      }
      delaycount--;
    }
    startposition++;
  } while(1);
}
PAYLAŞILMAYAN BİLGİNİN DEĞERİ YOKTUR.

ozcan33

Bence en kolay çözüm şu:
595 lerin MR bacağını pice bağla, 595 leri sürmeden önce kısa bir süre önce 0 sonra 1 yap böylece tüm ledler söner. Geçişlerde iz kalmaz.

Aynı şeyi devreyi değiştirmeden şöyle yapabiliriz:
tüm satırlara 0 yükle (595 lere) çok kısa süre tara.

Eline sağlık.

sapkaliamca

Kardeşim eline sağlık güzel bir proje bu konuyla çok ilgileniyorum acaba bana çalışmalarını yollarmısın mesela pc den hangi program ile yükleme yapıyorsun birde 16f877 ile yapmayı düşünüyorum bana yardımcı olurmusun teşekkür ederim.
ŞAPKALIAMCA MUTLULUKLAR DİLER

infomaster

Merhaba,

@sapkaliamca,

verdiğim kodun başında aşağıdaki değişikliği yaparsan 16F877'de çalışır.

#if defined(__PCM__)
#include <16F877A.H>
#fuses HS,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A4, rcv=PIN_A5,RESTART_WDT, ERRORS)

#define PIN_ST_CP      PIN_C2  // RCLK ----> Pin 12 ST_CP
#define PIN_SH_CP      PIN_C3  // SRCLK ---> Pin 11 SH_CP
#define PIN_SER_IN    PIN_C5  // SER -----> Pin 14
//#define PIN_MRS       PIN_C1  // PIN 10
//#define PIN_OE        PIN_C3  // PIN 13

#byte port_a=5
#byte port_b=6
#byte port_c=7
#byte port_d=8


Sana yollayabileceklerim bu kadar. Konrol kartını delikli plakete yaptım. LED kartı da başka bir sistem için hazırlanmış bir şey. Yani baskı devreyi kendin hazırlayacaksın. Windows'daki HYPERTERMINAL programını kullanabilirsin.
Haberleşme hızı: 9600 bps
Data Bits: 8
Parity: None
Stop Bits: 1
Flow Control: None
olmalı. Daha sonra şemadaki RE1'e bağlı butona basınca kayan yazı silinir, hyper terminalde sana kaç karakter yollamak istediğini soran bir ibare çıkar. Sayıyı yazarsın. Metni sorar. Girince yazı kaymaya başlar.

Basit değil mi?

Ama unutma ben hala geliştiriyorum. Daha yapacak şey çok.

Kolay gelsin.
PAYLAŞILMAYAN BİLGİNİN DEĞERİ YOKTUR.

infomaster

Tekrar merhaba,

MR olayını denedim. Sorun orada değil.

delaycount=10;
while (delaycount)

ile birlikte ekrana gelmesi gereken yazı 10 defa taranıyor. Daha sonra tüm yazı 1 pixel kaydırılıp 10 defa daha taranıyor. İşte tam bu arada birşey oluyor ve yazı çift görünüyor.

Ben aşağıdaki koddan şüpheleniyorum:
     col_index = startposition % 6;
      char_index = startposition / 6;

acaba buradaki hesaplama biraz zaman alıyor da sönük kalan pixel bir süre sonra bir yandaki pixel de belirince mi sorun çıkıyor diyorum?  :?:

Sizce bu hesaplama gözü rahatsız edecek kadar uzun sürer mi?

Sürer derseniz ne edersek kısaltabiliriz?
PAYLAŞILMAYAN BİLGİNİN DEĞERİ YOKTUR.

e3

Infomaster kardeşim elerine sağlık devre güsel.Ancak ben C den hiç anlamıyorum.(include ve main kısmı hariç. :lol:  ;)  :lol: ) Daha yeni öğreniyorum da. :?  Ancak sadece rakamlarla oynayarak değiştirme yapacaksan 6 sayısını değiştir ve öyle dene.Gerçi pic i baya bir yazıp silmen gerekecek ama eee yapıncaya kadar uğraşmak gerekiyor.
Ben bir kayan yazı yapıım dedim çıldırma eşiğine geldim.Allah' a çok şükür eşik gerilimim yükselte anca kurtardık. :lol:
Sana devrende iyi çalışmalar.Umarım devren çabuk biter de sende çok uğraşıp benim gibi asabiyetten kurtulursun.  :P  Herkese iyi günler....Saygılarımla. 8)
Bir de kardeş sana zahmet olmazsa bu kodları böyle sayfadan alınca bozuluyorlar.Sen bunun bize dosyasını gönderir misin? Rapid Share adresine felan... :?:   Valla gönderirsen çok mutlu oluruz.Tekrar tekrar teşekkürler.İyi günler...
.eem.

infomaster

Arkadaşlar,

Bu kod beni baya zorladı. Hatayı bir türlü anlayamadım.

Hata aslında bir göz yanılması.
Aşağıda bir çizim ile hatayı göstermeye çalıştım.


delaycount=4;
    while (delaycount)
    {


Yukarıdaki satırların anlamı, sola doğru kayma işlemini ekranı aynı görüntü ile 4 defa (ya da isteğinize göre dafa fazla) tarayarak yavaşlatmak. Daha sonra ekrandaki tüm görüntü 1 pixel sola kaydırılıp 4 tarama daha yapılıyor. Sanırım bu geçiş esnasında gecikme oluyor sönüp yanan ve bir solda tekrar beliren pixel buna neden oluyor.

Ama kodu

delaycount=1;
    while (delaycount)
    {


şeklinde değiştirip En sondaki satırdan önce delay_ms(50); eklerseniz:
   [B]delay_ms(50);[/B]
    startposition++;
  } while(1);
}


yukarıdaki etki kayboluyor ama bu defada gayet doğal olarak kırpışma başlıyor.

Sorunu yurtdışındaki bir forumda da anlattım.
http://www.ccsinfo.com/forum/viewtopic.php?p=59275#59275

Yardımlarınızı bekliyorum.


NOT: @protection: kodları bu sayfadan kopyaladıktan sonra notpad'e yapıştır. Sonra test.c adıyla kaydet yeter.
PAYLAŞILMAYAN BİLGİNİN DEĞERİ YOKTUR.

XX_CİHAN_XX

Arkadasım c kodlarından pek anlamam ama hatanın nerde oldugunu bılıyorum cunku aynı sey benımde basıma geldı.Bende yaptıgım kayan yazılarda senınle aynı mantıgı kullanıyordum ve senın basına gelen su cıft kayma olayı benımde basıma geldı ve o sorunu soyle cozdum gercı tam bır cozum degıl ama yazının duzgun kaymasını saglıyor
Sanırım yazıyı kaydırmadan once 10 defa ekrana gonderıyorsun veya daha fazla her neyse ondan sonra ekranı refresh yapma ısı bıtınce ekran datalarını kaydırıyorsun anladıgım kadarıyla.
Iste sorunun kaynagı burası !
10 defa gonderme yapmıyacaksın ekrana dataları 1 kere gondereceksın ondan sonra yazıyı kaydırıp tekrar gondereceksın yanı ekran taramasını 1 e dusur sorunun duzelır.2 kez bıle tarama yaparsan olmuyor yıne cıft kayıyor ama 1 kes data gondermesı yapıp yazıyı kaydırırsan gayet guzel ve temız kayıor .Ama bu seferde baska bır sorun cıkıyor!
Buseferde yazı cok hızlı kaymaya baslıyor.Cunku 10 kez ekrana gonderme yapıpta kaydırırken olusan kayma gecıkmesı 1 kez refresh yapıp kaydırmaya gore cok farklı bır zaman surecı olacaktır halıyle.
Yanı bu durumda eskı kayma hızından 10 kat hızlı kayacaktır yazı.
Bu durumda yazı net , duzgun , temız ama hızlı kayar yazıyı yavaslatmak ıcın ne yapmak gerekır?
Onun cozumude basıt ama bı yere kadar.Bu durumda ne yaparsın satrı taraması yapıyorsan her satırın datasını gonderıp o satırı yanık vazıyette bı sure bekletıp dıger satıra gecıyorsun yaz ıste o bekletme zamanını artırarak kayma hızını yavaslatabılırsın
Aynı sekılde stun taraması yuapıyorsan her stun ıcın o stunun yanık kalma zamanını artırarak kayamayı yavaslatabılırsın:) yanlız burda bı yere kadar olur zamanı cok artırırsan bu sefer tarama sınyalı goz ıle gorulur hale gelıcektır.Bu durumdada yazı cıft kaymasa bıle kıprasım dedıgımız olay olusur.O yuzden bu zamanı ıyı ayarlamak gerekır.
Ben olayı buraya kadar cozebıldım.Yanı benım dedıgım mantıkla cıft kayma olayı cozulur yazı duzgun kayar fakat bıraz hızlı kayar.Yavaslatırsan yıne duzgun kayar fakat tıtresım olabılır.Onu henuz bende yok edemedım ama dedıgım yontem ısını gorecektır kesınlıkle.Tıtreesım olayına bı carede sızden gelırse bende faydalanmıs olurum :D
kolay gelsın
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

infomaster

Teşekkür ederim.

Benim de şu andaki çözümüm bu ama uygun değil. Bir yolunu mutlaka bulucam.

Forumda mutlaka birilerinin başına gelmiştir. E zaten bu forum da bu nedenle burada. Tecrübeleri paylaşmak.

Saygılar.
PAYLAŞILMAYAN BİLGİNİN DEĞERİ YOKTUR.

sapkaliamca

Sayın INFOMASTER ilgin için teşekkür ederim kolay gelsin sorunu çözersen haberimiz olsun tşk.
ŞAPKALIAMCA MUTLULUKLAR DİLER

omer5151

ustam kolay gelsin ben aranıza yeni katıldım forumu genelde gezdim güzel bir çalışma olarak senin çalışmanı göz önüne aldım eğer bana yardımcı olursan bende 877A kullanarak bu projeden faydalanmak istiyorum.

mesajında :
Ben 18F452 kullandım. Siz isterseniz sadece kodda uygun yerleri değiştirerek 16F877 kullanabilirsiniz. Bacak bağlantıları aynı kalabilir. Demişsin ustam şimdi ben bu kod işlerinden anlamıyorum fakat devre yapmak yani imalat hiç problem değil çünkü mesleğim bu tamirciyim ben ama artık bu işlere yönelmeye karar verdim
eğer mümkünse bana 877a ya göre bi prog gönderebilirsen çok ikrama geçer ve ilk kez bir devreye düzgünce çalıştırmış olurum sayende
şimdiden teşekkür edere çalışmalarında başarılar dilerim

omer5151  :)

PhD

Selam kardeş,

Çalışman gerçekten güzel, tabi paylaşım gibi bir cömertliğinde ayrı bir güzellik teşekkürler.

Sorun için bir şey tavsiye edeciğim belki işe yarar (ben hiç kayan yazı yapmadım ama mantığını biraz biliyoruz işte :) )

Her 10 tarama işleminden sonra arada ekranı sıfır yapan 1 yada 2 taramalık ekranı kapat, yeni kaydırılmış bilgiyi ondan sonra gönder. Bu kapatma kısa olmalı ki göz yanılması ortadan kalksın. Eğer bu kapatma gönderme işi uzun sürerse titremeler olacaktır.

Programını incelemedim ama eğer böyle bir her kaydırma arasında bir kapatma gibi bir programın varsa süresini uzatabilirisin. Çünkü bldiğim kadarı ile LCD ekranlarda kaydırma komutu bu işi yaparak kaydırıyor (tabi grafik ekranlar ;) )

Kolay gelsin.

Edit: Yeni aklıma geldi @LOGAN arkadaşımıza sorarsan daha iyi bilgi alabilirsin bu konularda tecrübelidir.
...hiç...

vatandas30

sayın infomaster
aynı sorun bende de var. tarama sayısını arttırınca çift görünme artıyor ve yazının akıcılığı bozuluyor. eğer bir çözüm bulduysan paylaşırsan sevinirim.

XX_CİHAN_XX

çözümü basit tarama sayısını daima tek yap.(akıcılık duzelecektır)
ekranda data soterdıgın zaman dongusu ıle kayma hızını ayarla  ve ekranda gosterdıkten sonra dıger satıra yada stuna gecmeden once ölü bekleme zamanı koy(ekranda hıc bır gosterım yapmadan bekle)  eger bu zaman varsa degerını bıraz artır.ozaman cıft gorunme sorununda duzelecektır.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

vatandas30

taramayı tek yaptığım zaman akıcılıkta ve görüntüde sorun yok, fakat çok hızlı kayıyor. yavaşlatmak için tarama sayısını artırıyorum . o zaman çift görünme başlıyor.
sürelerle oynadığımda bu seferde gözle görülür titreşim oluyor.