kayan yazıya zaman eklemek

Başlatan taytis, 02 Kasım 2005, 07:40:54

taytis

#include <16F877.h>
#include <string.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include  <Lcd.c>
void main()
 {
  char yazi[]=" Kayan yazinizi buraya yaziniz :D";
  int a;
  int git=1;
  lcd_init();
  delay_ms(6);

  for (;;)
    {
      git=1;
      for (a=0;a<strlen(yazi)-15;a++)
        {
          lcd_gotoxy(1,1);
          printf(lcd_putc,"ALI KORKMAZ");
          lcd_gotoxy(git--,2);
          printf(lcd_putc,yazi);
          delay_ms(300);
        }
    }

}



arkadışımızın yaptığı kayan yazı programına zaman eklemek istesek mesala 10 da. sonra otomatik olarak duracak ne gibi bir kod eklememiz lazım.  Saygılarımla İyi Bayramlar

g6n

bu programin dogru calistigina emimisin ?

for (;
{
git=1;
for (a=0;a<strlen(yazi)-15;a++)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"ALI KORKMAZ");
lcd_gotoxy(git--,2);
printf(lcd_putc,yazi);
delay_ms(300);
}
}

1) program for dongusune girdiginde her donusu icin ilk satira "ALI KORKMAZ" yaziyor bu komutu dongulerin disinda bir kez yazmaniz yeterli
2) git degiskeni ilk olarak 1 degerini aliyor daha sonra 0,255,254,... (git-- ' den dolayi) 255 nolu sutuna yaz komutuna lcd biraz kizar bence
3) gotoxy komutunu kullanirsaniz yapmak zor olur. algoritmik olarak ekranda (ornegin yaziniz ABCDEFGH) olsun sirasi ile
ABCDEFGH
BCDEFGH
CDEFGH
DEFGH
EFGH
FGH
GH
H
gozukmesi icin yazinin basmaya baslama yeri sabit olmasi gerekir (1.sutun)  o yuzden gotoxy komutuna gerek yok,yazilacak degiskeni kendi icinde kaydirip ekrana basmaniz gerekir. Surekliligi saglamak amaci ile yazinin arkasina kendisini biraz bosluk birakarak eklemeniz yarali olur.
4) asil sorunuzun cevabinida soyle izah edeyim 300ms bekle yapacaksak bekleme suresi/300 ms ornekte 10 dakika demissiniz (yazma zamanini kaale almadan) 10*60*1000/300=2000 gibi sayi elde ederiz dongulere girmeden sayac=2000 ilave edin programinizdaki lcd_putc satrini her gordugunde  sayac-- for dongusu yerine while komutu ile sayac>0 kullanmaniz yeterli olur.

sayac=2000
while (sayac>0)
{
  ekran_yazma_satirlari
  sayac--;
}

iyi calismalar
g6n

M_B

Merhaba arkadaslar;
Yeniden baslık acmak ıstemedıgımden buraya yazmayı uygun gordum.
http://www.biltek.tubitak.gov.tr/gelisim/elektronik/index.htm
sitesindeki Hi-Tech C ile yapılmıs kayan yazı devresını  CCS C ye cevirdim ve istedigim sonucu elde edemedim.
yazı kayıyor ama bazı karakterler eksık cıkıyor.
kafama su takıldı. acaba devreyi uygulamaya gecsem gene eksık karekter mı cıkar ?  yoksa benim makineden mı kaynaklanıyor. kaynaklanıyor desem Picbasıc le yapılmıs kayan yazılarda isis sımulasyonu cok guzel calısıyor. sizlerden rıcam asagıdakı linke sımulasyon  kaynak dosyasını koydum ındırip denemenız
Bir turlu hayatı goremedım. Bu konuda benimle bilgilerinizi payaslmanızı rıca ederıyoum.
Herkese Tesekkurler
M_B


http://picproje.4shared.com/
Pass: www.picproje.org
veya dırek lın asagıda

http://picproje.4shared.com/account/file.jsp?id=20462871&sId=18GWRVf79k25vYFl
kayan yazı c dosyası
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

ilker_32

Selamlar,

Kesin eksiklikler çıkar diye düşünüyorum. Bende CCS ' ye çevrilmiş hali olması lazım eve gidince upload ederim senin kodlarla karşılaştırırız... Olay çözülür.
____________
Kolay gelsin...

M_B

Simdiden İlker_32 Hocam tskler. ınsallah sorunu hallederız.
Bir an once eve gitmenizi bekliyorum ;)
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

ferdem

Ben harfleri ikilik sistemde yazıyorum, bakıldığı zaman şekli anlaşılacak şekilde. Kodun CCS C deki ve biraz da değişmiş hali:
//fatiherdem.net
#include <16F628A.h>
#fuses NOPROTECT, NOWDT, NOLVP,INTRC_IO
#use delay(clock=40000000)
void main(){
int j,//kaydırma zamanı ayarlayıcısı, j artar ise yazı daha yavaş kayar
i,//tarama dongusunun sayaci
t=0,
b_ind=0;//baslama_indisi, kelimenin kacıncı harfinden itibaren gosterilecegini belirler
char kelime[]={
0xFF,0x89,0x89,0x89,0x76,0x00, // B
0x84,0xFD,0x84,0x00,           // İ
0xFF,0x80,0x80,0x80,0x80,0x00, // L
0x84,0xFD,0x84,0x00,           // İ
0xFF,0x02,0x0C,0x02,0xFF,0x00, // M
0x00,0x00,0x00,0x00,           // Bosluk
0x38,0x40,0x80,0x40,0x38,0x00, // v
0x70,0xA8,0xA8,0xA8,0xB0,0x00, // e
0x00,0x00,0x00,0x00,          // Bosluk
0x01,0x01,0xFF,0x01,0x01,0x00, // T
0xFF,0x89,0x89,0x89,0x81,0x00, // E
0xFF,0x18,0x24,0x42,0x81,0x00, // K
0xFF,0x04,0x08,0x10,0xFF,0x00, // N
0x84,0xFD,0x84,0x00,           // İ
0xFF,0x18,0x24,0x42,0x81,0x00};// K
//toplam_sutun sayısı 80 
while(1){
   j++;
   if(j%400==0){
      b_ind+=1; //yazı bir kaydı
      j=0; //j yi sıfırlamakta fayda var-bu satır çok gerekli değil ama j nin çok büyük sayılara gitmemesi için sıfırlayabiliriz-
   }
      for(i=0,t=b_ind; i<=15; i++,t++,t=t%80){//tarama işlemi
         output_a(i);//sutunu seç
         output_b(kelime[t]); //ilgili datayı gonder
      }

}


}//maini kapat

/*****KODLA ALAKALI AÇIKLAMALAR*****/
/* for dongusu sadece 16 adet sutunu taramak için çalışıyor,
i=0 iken 1 sutun seçili vaziyette output_a(i) komutu işlendiğinde ilk sutun aktif(seçildi)! Hangi ledlerin yanacağı söylediğimiz anda o sütundaki o ledleri yakabiliriz.
Bunu output_b(kelime[t]); satırıyla söylüyoruz, t=0 olduğunu düşündüğümüzde yazımızın ilk harfinin ilk kolonu çıkacaktır. Vakit kaybetmeden 2.satırı
seçiyoruz(output_a(i) de i=1 olunca 2 satır seçiliyor) ve hemen 2.satırda yanmasını istediğimiz ledlerin bilgisini kelime[1] verisini
output_b(kelime[t]); satırıyla yolluyoruz(t=1 olunca 2 sütun verileri gönderilir). Bu böyle gidiyor taa ki i=15 oluncaya kadar. i=15 olunca baştan bir daha tara...
Henüz yazımız kaymıyor ve sadece ilk 16 sutunu gorunuyor, belirli zaman aralıklarında t yi bir arttırısak panomuz kelime[0] ı göstereceği yere kelime[1] i gösterecek.
Böylece yazımız da 1 kaymış olacak. t nereye kadar artacak? Dizimizin boyutları içinde kalmalı, bu yüzden t=t%dizi_boyutumuz; diyoruz.

Ancak bu koda herhangi bir bekleme koymadım, çünkü simulasyonda çalıştırmak için yazdım(yazmaya çalıştım). Gerçek bir panoda çalıştırmayı denerseniz düzgün bir görüntü elde edemezsiniz(beklemeleri koymanız gerekir). Özellikle büyük panolarda beklemeler hassas ayar gerektiriyor, 16 sutun için çok fazla sorun olmayabilir.
Gerçek bir devrede düzgün çalışması için for döngüsündeki komutların arasına beklemeler serpiştirmelisiniz :), bu iş rastgele olmayacak tabi ki.. //kolay gelsin
*/

Burda kullanılan mantık satır tarama mantığı[özür dilerim, düzeltiyorum, burada kullanılan:sütun tarama mantığıdır], bir de satır tarama mantığı var aklınızda bulunsun:)
Şu anda ben de 8x48 bir panoyu bir f877 ve 3 74HC154 le sürüyorum(sütun tarama). Parlaklık ve karakterlerin düzgün oluşmasıyla ilgili problemlerim var:). Küçük panolar nispeten daha kolay. Sütun tarama yaparak iyi mi ettim kötü mü ettim bilemiyorum, arkadaşlardan 48 sütun üzeri bir panoyu(hazır dotmatrixlerle- bu projede de kullanılan) sütun taramayla düzgün bir şekilde çalıştıranlar var mı? Şu an üzerinde çalışıyorum, benim de sorularım olacak... :) Kolay gelsin

ilker_32

/////////////////////////////////////////////////////////////////////

PİC C LİTE

/////////////////////////////////////////////////////////////////////


#include <pic.h>
#include <delay.c>
main(void)
{
unsigned char gecici_dizi[16];
unsigned char i,a,toplam_sutun;
signed int kayma,deger;
unsigned const char metin[]={
0xFF,0x89,0x89,0x89,0x76,0x00, // B
0x84,0xFD,0x84,0x00,           // İ
0xFF,0x80,0x80,0x80,0x80,0x00, // L
0x84,0xFD,0x84,0x00,           // İ
0xFF,0x02,0x0C,0x02,0xFF,0x00, // M
0x00,0x00,0x00,0x00,           // Bosluk
0x38,0x40,0x80,0x40,0x38,0x00, // v
0x70,0xA8,0xA8,0xA8,0xB0,0x00, // e
0x00,0x00,0x00,0x00,          // Bosluk
0x01,0x01,0xFF,0x01,0x01,0x00, // T
0xFF,0x89,0x89,0x89,0x81,0x00, // E
0xFF,0x18,0x24,0x42,0x81,0x00, // K
0xFF,0x04,0x08,0x10,0xFF,0x00, // N
0x84,0xFD,0x84,0x00,           // İ
0xFF,0x18,0x24,0x42,0x81,0x00};// K

//Metindeki sütunların sayısını hesapla
toplam_sutun=80; //10x6+5x4=60+20=80

//Port ayarlama işlemleri
TRISB=0;
TRISA=0;
CMCON=0x07;
PORTB=0x00;

for(;;){//Ana döngü
//Geçici diziyi sıfırla
for(i=0;i<=15;i++){
gecici_dizi=0; //Dizi elemanları başlangıçta 0
}

//Kaydırma işlemleri  
for(kayma=-14;kayma<=toplam_sutun;kayma++){

//Metni 16 sütunluk parçalara böl
for(i=0;i<=15;i++){
deger=i+kayma;
if(deger<0)gecici_dizi=0; //metin girişi
if(deger>=0&&deger<=toplam_sutun-1)
gecici_dizi=metin[deger];
if(deger>toplam_sutun)gecici_dizi=0; //metin çıkışı
}

//Tarama işlemleri
for(a=0;a<40;a++){ //Aynı görüntüyü 40 kez tekrarla
for(i=0;i<=15;i++){ //Geçici diziyi görüntüle
PORTB=gecici_dizi; // Veriyi PortB'ye gönder
PORTA=i; // ilgili sütun'u seç
DelayUs(200); // 200 mikrosaniye bekle
}}}

}// işlemleri tekrarla
}// Program sonu

///////////////////////////////////////////////////////////////////////////////

CCS İLE

//////////////////////////////////////////////////////////////////////////////


#include <16F628A.h>
#device *=16
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOMCLR, LVP, NOCPD
#use delay(clock=4000000,RESTART_WDT)



void setup_mcu()
{
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_oscillator(4000000);
}

void main()
{

unsigned char gecici_dizi[32];
unsigned char i,a,toplam_sutun;
signed int kayma,deger;
unsigned  char const metin[80]={
0xFF,0x89,0x89,0x89,0x76,0x00, // B
0x84,0xFD,0x84,0x00,           // İ
0xFF,0x80,0x80,0x80,0x80,0x00, // L
0x84,0xFD,0x84,0x00,           // İ
0xFF,0x02,0x0C,0x02,0xFF,0x00, // M
0x00,0x00,0x00,0x00,           // Bosluk
0x38,0x40,0x80,0x40,0x38,0x00, // v
0x70,0xA8,0xA8,0xA8,0xB0,0x00, // e
0x00,0x00,0x00,0x00,          // Bosluk
0x01,0x01,0xFF,0x01,0x01,0x00, // T
0xFF,0x89,0x89,0x89,0x81,0x00, // E
0xFF,0x18,0x24,0x42,0x81,0x00, // K
0xFF,0x04,0x08,0x10,0xFF,0x00, // N
0x84,0xFD,0x84,0x00,           // İ
0xFF,0x18,0x24,0x42,0x81,0x00};// K

setup_mcu();

//Metindeki sütunların sayısını hesapla
toplam_sutun=80; //10x6+5x4=60+20=80

setup_mcu();
//Port ayarlama işlemleri
set_tris_b(0x00);
set_tris_a(0x00);  

output_b(0x00);

for(;;){//Ana döngü
//Geçici diziyi sıfırla
for(i=0;i<=15;i++){
gecici_dizi=0; //Dizi elemanları başlangıçta 0
}

//Kaydırma işlemleri  
for(kayma=-14;kayma<=toplam_sutun;kayma++){

//Metni 16 sütunluk parçalara böl
for(i=0;i<=31;i++){
deger=i+kayma;
if(deger<0)gecici_dizi=0; //metin girişi
if(deger>=0&&deger<=toplam_sutun-1)
gecici_dizi=metin[deger];
if(deger>toplam_sutun)gecici_dizi=0; //metin çıkışı
}

//Tarama işlemleri
for(a=0;a<40;a++){ //Aynı görüntüyü 40 kez tekrarla
for(i=0;i<=15;i++){ //Geçici diziyi görüntüle
output_b(gecici_dizi); // Veriyi PortB'ye gönder
output_a(i); // ilgili sütun'u seç
delay_us(200); // 200 mikrosaniye bekle
}}}}}

/////////////////////////////////////////////////////////////////////
____________
Kolay gelsin...

M_B

ferdem arkadasım degerli bilginiz icin cok teşekkür ederım. Programınızı ıncelıyorum ve yenı bır seyler daha ogrendım, ogrenıyorum. Sayenizde Allah razı olsun. Bunun mantıgını kapınca sızın gıbı buyuk bır kayan yazı yapmayı dusunuyorum.


Ufak bır sorum daha olcak. Bu sorum genel. Tek bu yazı ıcın degıl
asagakı gıbı bazen hatalar verıyor sımulasyon ve demek ıstıyor anlamıyorum.  
similasyonda [PIC16 MEMORY] PC=0X00ED Attemp to read unimplemented memory location 0x008D ignored.
hatası verıyor yazı ıkı uc kere kaydıktan sonra bu normalmıdır.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

ferdem

Normal değil, ben defalarca başlatıp defalarca kaydırdım ama o hatayı alamadım. Hata metninin başındaki  "[PIC16 MEMORY] PC" ifadesi önemli, PC ile bir alakası var sanırım. Koda tekrar baktım hata yok gibi, ilk aklıma gelen "dizi indisi dizinin boyutunu açmış olabilir dizi dışındaki bellek bölgelerine ulaşma talebinde bulunuyor olabilir" di ama öyle bir problem görünmüyor. Bilemiyorum bu problemin kaynağını. Kayan yazının mantığını anlaman çok sürmez, bir de satır tarama var onu unutma. Bir de en önemlisi büyük panonun icraatına girişmeden bu forumda kayan yazıyla ilgili yazılanları mutlaka ama mutlaka oku.

İlker_32, verdiğiniz kodlar için teşekkür ederim.
Kolay gelsin, İyi çalışmalar

M_B

İlker_32 hocam;
vermiş oldugunuz kod ıcın teşekkür ederım.
Verdiğiniz kodu derledım ve denediğimde ise bendeki gibi bazı karakterler
cıkmıyor  resımde i ve m olması lazım ama i nın bır yerı cıkmıyor m nınde baska bır kısmı cıkmıyor. ornek olarak ta resım ekledım.

Not: Ferdem hocanın verdigi kodu derlediğimde simulasyonda gayet guzel calısıyor. aynı devreyı kullanıyorum bır problem yok.



Birde simulasyonumda soyle bır hata verıyor.

[PIC16 CORE] PC=0x0075 TRISA instruction is deprecated for PIC16F628
not: bu sadece kayan yazı ıcın degıl baska programlarda da verıyor.


resım  :
http://img508.imageshack.us/my.php?image=kayanyaziuc0.gif
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

ferdem

Resim ekli dosyalardaki devre resmiyle aynı, hata mesajı göremedim(resimden ne anlamamız gerekiyor).


Her programda aynı hatayı veriyorsa bu ISIS la ilgili bir durum. Kodun gerçek bir PIC de hata vermeyeceğini düşünüyorum. Bu meselenin çözümüyle alakalı bir bilgim ne yazık ki yok. Bir ihtimal ISIS ı kaldırıp yeniden kurmak çözüm olabilir, bir ihtimal... Kolay gelsin, iyi çalışmalar.

ilker_32

Dostum o font değişikliğinden aslında yazılar çıkıyor. Tübitağın kayan yazısını biraz daha detaylı incelemen gerekir. Sana %100 garanti veririm. Pratikte çıkmayacaktır. Font değişikliği daha önce konuşuldu. (NO PROBLEM :lol: )

İNCELE;

http://fonts.goldenweb.it/index_file/l/en/d2/Freeware_fonts/c/0-9/start/150/default.html
____________
Kolay gelsin...