Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Animasyon Denemesi

Başlatan runcode, 13 Aralık 2014, 21:50:13

runcode

Merhaba arkadaşlar bir animasyon yapmaya çalıştım ama fotograflar daha seri yüklenmesi lazım
acaba donanımmı yetmiyor?
pic18f4580
20mhz kristal
128x64 glcd ekran
BURDAN İZLEYEBİLİRSİNİZ:
GLCD ANİMASYON
17 kare resim basılıyor
code:
https://yadi.sk/d/TyxAq-_0dMX5Z

RaMu

#1
Çok faydası olmaz ama
#use delay (clock=20000000)

yerine
#use delay(clock=40MHz,crystal=20MHz)

kullanırsan, işlemci 2 katı daha hızlı çalışır,
herbir resmi 2 katı hızda basmış olursun.

Senin paylaştığın kodlarıda buraya direk ekliyorum,
daha kolay bakıp yanıtlanabilir;

Glcd_balik.c
/*******************************************************
      PIC18f4580 ile Grafik LCD Uygulaması
*******************************************************/

#include <18f4580.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#include <HDM64GS128.c> // HDM64GS12.c dosyası programa ekleniyor
#include <graphics.c>  // graphics.c dosyası programa ekleniyor


unsigned int16 dongu=0;

   const int balik[]= {....resim datası var uzunca......};

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
glcd_init(ON);
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
glcd_init(ON);
int x,y,i,z,x1,y1;
yazi:
char yazi1[]="YASIN";        // Karakter dizisi tanımlanıyor
char yazi2[]="EKEN";  // Karakter dizisi tanımlanıyor
char yazi3[]="ILK BALIK ANIMASYONU";
char YAZI4[]="CALISMAM...";

glcd_init(ON); // Ekran siliniyor
   glcd_text57(48, 5, yazi1, 1, ON);  // GLCD'de yazı yazdırılıyor
   delay_ms(125);
   glcd_text57(51, 20, yazi2, 1, ON);  // GLCD'de yazı yazdırılıyor
   delay_ms(125);
   glcd_text57(4, 35, yazi3, 1, ON);
   delay_ms(125);
   glcd_text57(37, 50, yazi4, 1, ON);
   delay_ms(2000);
glcd_init(ON);
 
for(i=0;i<=32;i=i+2)
{
   glcd_circle(64, 32, i, NO, ON); // GLCD'de Daire çizdiriliyor
   delay_ms(100);
} 
   delay_ms(3000);
glcd_init(ON);

for(i=0;i<=30;i=i+5)
{
    glcd_circle(64, 32, i, NO, ON); // GLCD'de Daire çizdiriliyor
    delay_ms(300);
}
    delay_ms(2000);
y1=0;
x1=0;
i=0;
for(i=0;i<=128;i=i++)
{
    glcd_pixel(y1, 32, ON); 
    i=y1++;  
    delay_ms(1);
    glcd_pixel(64, x1, ON); 
    i=x1++;   
    delay_ms(1);
    
if (dongu==17408)                // Her Resim 1024 Byte İşleniyor Onun İçin 17x1024'e Eşitliyorum 
    dongu=0;
}
delay_ms(500);
glcd_pixel(64, 32, OFF);     // Hedefin Ortasını Söndürüyorum
delay_ms(3000);
//glcd_init(on);
while(true)                      // Resim Basma İşlemi Başlıyor
{
if (dongu==17408)                // Döngüden Çıkması İçin
    goto yazi;
int x,y,i,z;
int genislik  = 128;
int yukseklik = 64;
      glcd_init(on);

for(y=0;y<yukseklik;y+=8) {
   for(x=0;x<genislik;x++) {
      for(z=0;z<8;z++) 
      { 
       for (i=0;i<8;i++){
       if(bit_test(balik[dongu],z)){ //bit 0 mı 1 mi?
               glcd_pixel(x,y+z,ON);
            
            } 
      }
      }
      dongu++;          
   }
}
}
}
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ferdem

#USE FAST_IO(PORT_NAME)
Bu bildirimi yaparsanız daha hızlanabilir. Yapılmadığı durumda CCS C her pin high/low komutundan önce  tris registeri set eder sonra high/low yapar, zaman kaybı olur. Port pinleri siz tris ile set edip use_fast_io bildirimiyle bu zaman kaybından kurtulabilirsiniz.

Bir projede ilk yazılan kod genelde en hızlı kod olmuyor, üzerinde düşündükçe basitleştirme-hızlandırma yapılabilir. İlk bakışta dikkatimi çeken en içteki for (i=0;i<8;i++) döngüsü oldu, bu döngünün ne işe yaradığını anlayamadım, 8 defa aynı iş yapılıyor gibi.

runcode

Alıntı yapılan: ferdem - 14 Aralık 2014, 07:10:27
#USE FAST_IO(PORT_NAME)
Bu bildirimi yaparsanız daha hızlanabilir. Yapılmadığı durumda CCS C her pin high/low komutundan önce  tris registeri set eder sonra high/low yapar, zaman kaybı olur. Port pinleri siz tris ile set edip use_fast_io bildirimiyle bu zaman kaybından kurtulabilirsiniz.

Bir projede ilk yazılan kod genelde en hızlı kod olmuyor, üzerinde düşündükçe basitleştirme-hızlandırma yapılabilir. İlk bakışta dikkatimi çeken en içteki for (i=0;i<8;i++) döngüsü oldu, bu döngünün ne işe yaradığını anlayamadım, 8 defa aynı iş yapılıyor gibi.

Evet sorun çözüldü hocam tşk ederim sıkıntı for döngüsündeymiş gayet akıcı oldu :)

runcode

Alıntı yapılan: RaMu - 14 Aralık 2014, 02:21:18
Çok faydası olmaz ama
#use delay (clock=20000000)

yerine
#use delay(clock=40MHz,crystal=20MHz)

kullanırsan, işlemci 2 katı daha hızlı çalışır,
herbir resmi 2 katı hızda basmış olursun.

Senin paylaştığın kodlarıda buraya direk ekliyorum,
daha kolay bakıp yanıtlanabilir;

Glcd_balik.c
/*******************************************************
      PIC18f4580 ile Grafik LCD Uygulaması
*******************************************************/

#include <18f4580.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#include <HDM64GS128.c> // HDM64GS12.c dosyası programa ekleniyor
#include <graphics.c>  // graphics.c dosyası programa ekleniyor


unsigned int16 dongu=0;

   const int balik[]= {....resim datası var uzunca......};

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
glcd_init(ON);
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
glcd_init(ON);
int x,y,i,z,x1,y1;
yazi:
char yazi1[]="YASIN";        // Karakter dizisi tanımlanıyor
char yazi2[]="EKEN";  // Karakter dizisi tanımlanıyor
char yazi3[]="ILK BALIK ANIMASYONU";
char YAZI4[]="CALISMAM...";

glcd_init(ON); // Ekran siliniyor
   glcd_text57(48, 5, yazi1, 1, ON);  // GLCD'de yazı yazdırılıyor
   delay_ms(125);
   glcd_text57(51, 20, yazi2, 1, ON);  // GLCD'de yazı yazdırılıyor
   delay_ms(125);
   glcd_text57(4, 35, yazi3, 1, ON);
   delay_ms(125);
   glcd_text57(37, 50, yazi4, 1, ON);
   delay_ms(2000);
glcd_init(ON);
 
for(i=0;i<=32;i=i+2)
{
   glcd_circle(64, 32, i, NO, ON); // GLCD'de Daire çizdiriliyor
   delay_ms(100);
} 
   delay_ms(3000);
glcd_init(ON);

for(i=0;i<=30;i=i+5)
{
    glcd_circle(64, 32, i, NO, ON); // GLCD'de Daire çizdiriliyor
    delay_ms(300);
}
    delay_ms(2000);
y1=0;
x1=0;
i=0;
for(i=0;i<=128;i=i++)
{
    glcd_pixel(y1, 32, ON); 
    i=y1++;  
    delay_ms(1);
    glcd_pixel(64, x1, ON); 
    i=x1++;   
    delay_ms(1);
    
if (dongu==17408)                // Her Resim 1024 Byte İşleniyor Onun İçin 17x1024'e Eşitliyorum 
    dongu=0;
}
delay_ms(500);
glcd_pixel(64, 32, OFF);     // Hedefin Ortasını Söndürüyorum
delay_ms(3000);
//glcd_init(on);
while(true)                      // Resim Basma İşlemi Başlıyor
{
if (dongu==17408)                // Döngüden Çıkması İçin
    goto yazi;
int x,y,i,z;
int genislik  = 128;
int yukseklik = 64;
      glcd_init(on);

for(y=0;y<yukseklik;y+=8) {
   for(x=0;x<genislik;x++) {
      for(z=0;z<8;z++) 
      { 
       for (i=0;i<8;i++){
       if(bit_test(balik[dongu],z)){ //bit 0 mı 1 mi?
               glcd_pixel(x,y+z,ON);
            
            } 
      }
      }
      dongu++;          
   }
}
}
}


40MHz i kabul etmedi derlerken hata verdi hocam tekrar 20MHz çektim cevabın ve ilgin için tşk ederim

runcode

#5
ŞUNU FARKETTİM YAZILIMDA MHz İ KÜÇÜLTTÜKÇE HIZLANIYOR BÜYÜLTÜKÇE YAVAŞLIYOR AYNI DONANIM 1MHz E ÇEKİYORUM YAZILIMDAN ROKET OLUYOR :)
GLCD BALIK V1.1

Kabil ATICI

#6
Resim gönderirken önce var olan resmi siliyor sondan sonra diğer resmi basıyor.
Bu da görüntünün kesik kesik gelmesine sebep oluyor.
İkinci resmi göndermeden ekranı silmezsen o kesiklik oluşmaz.
Gönderilen ikinci görüntü birincinin yerini alacaktır.

Birde biliyorsunuz bu işlemcide saat frekansı/4 şeklinde çalışıyor.
Normalde işlemci farklı olsa bile bunun bir benzerini 3.6864MHz'de çalıştırdım. Gerçi ben ekranın tamamını yazdırmak için uğraşmadım sadece yarısını değiştirdim. (işlemci kapasitesi 8K idi)

Bu ekranlarda çok yüksek hızlarda güncelleme yapamıyorsunuz, ekran yenileme hızı nedeniyle soluk görünüyor.

Bir şeyler çizeceksen çizmek istediğin resmi önce işlemcinin RAM'inde çiz sonra bunu ekrana gönder. Böylece görüntün akıcı ve hızlı olur. Doğrudan gönderiyorsan (data olarak) zaten resmin kendini gönderebilirsin.
ambar7

RoNNeZ

Alıntı yapılan: ambar7 - 14 Aralık 2014, 11:20:30
Resim gönderirken önce var olan resmi siliyor sondan sonra diğer resmi basıyor.
Bu da görüntünün kesik kesik gelmesine sebep oluyor.
İkinci resmi göndermeden ekranı silmezsen o kesiklik oluşmaz.
Gönderilen ikinci görüntü birincinin yerini alacaktır.

Birde biliyorsunuz bu işlemcide saat frekansı/4 şeklinde çalışıyor.
Normalde işlemci farklı olsa bile bunun bir benzerini 3.6864MHz'de çalıştırdım. Gerçi ben ekranın tamamını yazdırmak için uğraşmadım sadece yarısını değiştirdim. (işlemci kapasitesi 8K idi)

Bu ekranlarda çok yüksek hızlarda güncelleme yapamıyorsunuz, ekran yenileme hızı nedeniyle soluk görünüyor.

Bir şeyler çizeceksen çizmek istediğin resmi önce işlemcinin RAM'inde çiz sonra bunu ekrana gönder. Böylece görüntün akıcı ve hızlı olur. Doğrudan gönderiyorsan (data olarak) zaten resmin kendini gönderebilirsin.

hocam işlemcinin ram i nasıl kullanıyor ? kafa karışıklığı oluştu bende böyle bir uygulama peşindeyim bilgilendirirseniz sevinirim...

ziyaretci

#8
Alıntı yapılan: RaMu - 14 Aralık 2014, 02:21:18

#use delay(clock=40MHz,crystal=20MHz)



[/code]
İlk defa gördüm bu tanımlamayı. 4 yerine 2 'ye mi bölüyor?

Kabil ATICI

@RoNNeZ

kullandığın derleyici farklılık gösterse de;
uint8_t LCD_RAM[1024]
şeklindeki bir tanımlama senin işlemcinin ram bölümünde 1024 baytlık bir alan ayının (uint8_t  8 bitlik işaretsiz sayı anlamındadır, farklı derleyicilerde farklı tanımlabilir. İşlemcinizin ram miktarı yeterli olmalıdır.)  Buradaki 1024 128x64 piksellik GLCD için gereken ram miktarıdır.
Baytlar üzerinde işlem yapma olayını bildiğinizi var sayıyoruz. LCD'ye bu ram'deki bilgiler uygun adımlarla gönderilir.

Bu RAM'deki bilgiyi LCD'ye gönderme işini asm ile yaptığım için örneğim asm dilindedir.
ambar7

MrDarK

Picproje Eğitim Gönüllüleri ~ MrDarK

RaMu

Alıntı yapılan: erkantr67 - 17 Aralık 2014, 01:35:55
İlk defa gördüm bu tanımlamayı. 4 yerine 2 'ye mi bölüyor?

Hocam pll olan mcu larda pll ayarını yaparak takılan kristalden istenen (tabi olabilecek)
çalışma frekansını otomatik elde etmek için kullanılıyor,
birde usb olan mcular için usb çalışma hızı içinde seçenek var.

#use delay(clock=40MHz,crystal=20MHz)
dediğimizde mcu ya devre üzerinde 20MHz kristal takıyorum
ve pll ile çalışma frekansım 40MHz olsun istiyorum demiş oluyoruz,
ccsc nin sayfasında eğer istenen çalışma frekansı pll ile elde edilemiyorsa
en yakın frekans otomatik seçilir ve derleme sonrasında bu durum warning olarak bildirilir demiş
ama ben bu durumu denemedim, basit denenebilir aslında.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html