Simüleden Gerçeğe

Başlatan clusmy, 02 Haziran 2005, 15:55:53

clusmy

Selam ustalar...Benim pic ile yaptığım bitirme projem var.Yalnız şu ana kadar yalnızca proteus ta simülasyonunu yaptım henüz devresini board üzerinde kurmadım.Benim öğrenmek istediğim bu devreyi board üzerinde kurarken programda herhangi bir değişiklik yapacakmıyız.Mesela,bazı programlarda lcd ekranın hazırlanmasını beklemek için 1 sn. gecikme koyuyorlar.Bunun gibi değişiklikler yapmak gerekiyormu programda...

dombilik

lcd nin kendini hazırlaması için 200msn lik bir gecikme yeterli oluyor(bunu programınızda yazmış olmanız gerekiyor).
simulatörde yaptıgınız devreye uygun bir program yazmışsanız ve similatörde de çalışıyorsa pcb ye geçişde bir problem yaratmaz.Yani programı tekrar değiştirmenin bir anlamı yok.
Fakat simulatörde görünmeyen besleme ucları ve xtal bağlantıları pcb yi
tasarlarken hesaba katılması gereken uçlar..
Bildiklerini kime miras bıraktın?kimseyemi? O zaman bildiklerinin ne önemi kalır. ******** /////////// ******** PROTON-ASM PROTEUS 7.4 SP3 EAGLE 5.40

teketek

Şuanda board üzerinde deneme imkanım olmadığı için proteusta simüle ederek yapmaya çalıştığım bi proje var.Bu projede 2x16 lcd ekran ve 5 adet buton kullanıyorum ve proteusta simüle ederken ekranda bikaç saniyede bi titreşim ya da gidip gelme gibi bi problem ortaya çıkıyor.Sorun galiba gecikme olayıyla ilgili ama benim anlamadığım gecikmeyi azaltıyorum olmuyor, gecikmeyi artırıyorum bu sefer butona basıldığında algılamamaya başlıyor.Acaba diyorum board üzerinde çalıştırdığımda da gene aynı şekilde ekranda titreme vb. sorunları görecekmiyim sizce ?
Bilgi fark yaratır..

Veli B.

Ekrandaki ttreme, tarama şeklinde ise , muhtemelen çok sık ekranı temizleme yapıyorsunuz.Algoritmanızı kontrol edip düzeltin böyle ise.
32 bölümlü menü için protonda sadece 3 tane ekran temizleme kullanmıştım.

teketek

evet çok sık temizleme yapmak zorunda kalıyorum ya da şöyle söylim her menü seçeneği lcd ekrana yazılırken bir öncekini temizlesin diye şöyle yapıyorum:

   .
    .
    .
    MENU1:
    LCDOUT $FE,1, "MENU:"
    LCDOUT $FE,$C0, "1)PROGRAM"
    POZ=1
    PAUSE 250
    GOTO SECIM
    
MENU1_1:
    LCDOUT $FE,1, "PROGRAM: "
    LCDOUT $FE,$C0, "1_1)PROGRAM SEC"
    POZ=10
    PAUSE 500
    GOTO SECIM
        
MENU1_2:
    LCDOUT $FE,1, "PROGRAM:"
    LCDOUT $FE,$C0, "1_2)PROG OLUSTUR"
    POZ=20
    PAUSE 500
    GOTO SECIM
     .
     .
     .


bu işlemi temizleme ($FE,1) yapmadan nası düzeltebilirim?
Bilgi fark yaratır..

Veli B.

Bunun için bir kaç farklı yöntem var.Kişi programın gelişimine ve algoritmasına göre ayarlama yapmalı.Bazı püf noktalarına hakim olmak önemli.
Örneğin:
- 2. gönderilen karakter zinciri, 1. den fazla veya aynı ise,1. otomatikman silinir ve 2. yazılır.Sizin zincir sonuna koyacağınız bir- iki boşluk bile bunu size sağlar.
lcdout 254,128,"deneme"
lcdout 254,128,"bu tamam"

şeklinde gönderim yapılırsa
ekranda
bu tamam

olarak görünür.

fakat
lcdout 254,128,"deneme"
lcdout 254,128,"tamam"

şeklinde bir gönderim yapılırsa ekran çıktısı;
tamame


şeklinde olur...( "e" harfi 1. gönderimden kalan artıktır.)

Bir diğer yöntem ise menu yapısındadır.Bu konuda kendi yönteminizi oluşturmanız gerekir.Minimum sekme ile max işlem için menüye giriş, menü içinde gezinme, seçme, up ve down gibi işlemler için sağlam bir altyapı kurmalı ve lcd rutinini menü kısmından ayırması gerekir(altı çizili olan kısım yoruma açıktır.Benim genelde kullandığım yöntem bu şekilde, fakat kişi kendi algoritmasına göre bir tarz seçmelidir)

teketek

@katana önerilerin için çok sağol.benim yaptığım şekli tam olarak anlatim istersen.

  .
   .
   .
SECIM:
    IF POZ=0 AND SEC=0 THEN MENU1
    IF POZ=1 AND SEC=0 THEN MENU1_1  'MENU1 İÇİN
    IF POZ=1 AND ASAGI=0 THEN MENU2
    IF POZ=1 OR POZ=100 OR POZ=200 AND SOL=0 THEN BASLA
    
    IF POZ=10 AND ASAGI=0 THEN MENU1_2 'MENU1_1 İÇİN
    IF POZ=10 AND SOL=0 THEN MENU1
    IF POZ=10 AND SEC=0 THEN PROGRAMSEC 'PROGRAM SEC
    
    IF POZ=20 AND SOL=0 THEN MENU1 'MENU1_2 İÇİN
    IF POZ=20 AND YUKARI=0 THEN MENU1_1 
    IF POZ=20 AND SEC=0 THEN PROGOLUS
    
'-------------------------------------------------------    
    IF POZ=100 AND YUKARI=0 THEN MENU1 'MENU2 İÇİN
    IF POZ=100 AND ASAGI=0 THEN MENU3
    IF POZ=100 AND SEC=0 THEN MENU2_1
    
    IF POZ=110 AND ASAGI=0 THEN MENU2_2  'MENU 2_1 İÇİN
    IF POZ=110 AND SEC=0 THEN SAATAYAR 
    
    IF POZ=120 AND YUKARI=0 THEN MENU2_1 'MENU2_2 İÇİN
    IF POZ=120 AND SEC=0 THEN TARIHAYAR
    
    
    IF POZ=110 OR POZ=120 AND SOL=0 THEN MENU2
    
'-------------------------------------------------------    
    
    IF POZ=200 AND SEC=0 THEN MENU3_1  'MENU3 İÇİN
    IF POZ=200 AND YUKARI=0 THEN MENU2
    
    IF POZ=210 AND SOL=0 THEN MENU3

    GOTO SECIM
    .
    .
    .
    MENU1:
    LCDOUT $FE,1, "MENU:"
    LCDOUT $FE,$C0, "1)PROGRAM"
    POZ=1
    PAUSE 250
    GOTO SECIM
    
MENU1_1:
    LCDOUT $FE,1, "PROGRAM: "
    LCDOUT $FE,$C0, "1_1)PROGRAM SEC"
    POZ=10
    PAUSE 500
    GOTO SECIM
        
MENU1_2:
    LCDOUT $FE,1, "PROGRAM:"
    LCDOUT $FE,$C0, "1_2)PROG OLUSTUR"
    POZ=20
    PAUSE 500
    GOTO SECIM
        
    
      
'---------------------------------------------------------    
MENU2:
    LCDOUT $FE,1, "MENU:"
    LCDOUT $FE,$C0, "2)AYARLAR"
    POZ=100
    PAUSE 250
    GOTO SECIM
    
MENU2_1:
    LCDOUT $FE,1, "AYARLAR"
    LCDOUT $FE,$C0, "2_1)SAAT AYAR"
    POZ=110
    PAUSE 500
    GOTO SECIM
    
MENU2_2:
    LCDOUT $FE,1, "AYARLAR"
    LCDOUT $FE,$C0, "2_2)TARIH AYAR"
    POZ=120
    PAUSE 500
    GOTO SECIM
    
'---------------------------------------------------------    
MENU3:
    LCDOUT $FE,1, "MENU:"
    LCDOUT $FE,$C0, "3)DEGER ATA  "
    POZ=200
    PAUSE 250
    GOTO SECIM

MENU3_1:
    LCDOUT $FE,1, "DEGER ATA:"
    LCDOUT $FE,$C0, "ISI:    SURE:   "
    POZ=210
    PAUSE 500
    GOTO SECIM
    .
    .
    .

   

burda yapmaya çalıştığım şey her menü için bi pozisyon değeri (POZ=X)atıyarak pic'in o an hangi menüde olduğunu bilmesini sağlamak.Sonra bu poz'un değerine göre yapılacak işlemi (mesela poz=1 se menü1 de diyelim bu durumda basılacak tuşlara göre alt veya diğer menüleri ekrana getirmek) gerçekleştirmek.

Alıntı YapMinimum sekme ile max işlem için menüye giriş, menü içinde gezinme, seçme, up ve down gibi işlemler için sağlam bir altyapı kurmalı ve lcd rutinini menü kısmından ayırması gerekir(altı çizili olan kısım yoruma açıktır.Benim genelde kullandığım yöntem bu şekilde, fakat kişi kendi algoritmasına göre bir tarz seçmelidir)

bunu bu proje için nasıl yapabilirim küçük bir örnekle açıklayabilirmisin?
Bilgi fark yaratır..

Veli B.

TARA:
LCDOUT $FE,1
LCDOUT $FE,192,"ESC",$FE,203,"ENTER"
RETURN

TAZELE:              
READ 10,RUNT.HIGHBYTE
READ 11,RUNT.LOWBYTE 
READ 12,STDT.HIGHBYTE
READ 13,STDT.LOWBYTE
READ 15,STOPT
RETURN


AYARLAR: 
     
select case TUS
    CASE 1
        LCDOUT $FE,128,  "1-RUN TIME SET "
    case 2
        LCDOUT $FE,128,  "2-STOP TIME SET"
    case 3
        LCDOUT  $FE, 128,"3-STANDBY SET  "
    End select


IF UP=1 THEN 
UPP: IF UP=1 THEN UPP 
     TUS=TUS+1
     ENDIF
     
IF DN=1 THEN 
DNN: IF DN=1 THEN DNN
        TUS=TUS-1
     ENDIF
IF TUS>3 THEN TUS=1
IF TUS<1 THEN TUS=3


IF ESC=1 THEN
ESCD: IF ESC=1 THEN ESCD
    lcdout $fe,1
      RETURN
      ENDIF
IF ENTER=1 THEN 
ENS: IF ENTER=1 THEN ENS
        SELECT CASE TUS
            CASE 1 
            GOTO RUN  
            CASE 2
            GOTO STP
            CASE 3
            GOTO STD
        END SELECT
        GOSUB TARA
       ENDIF
   
GOTO AYARLAR 


RUN:
LCDOUT $FE,1
RUN1:                    
IF UP=1 THEN 
UPF: IF UP=1 THEN UPF 
     RUNT=RUNT+10
     ENDIF
     
IF DN=1 THEN 
DNF: IF DN=1 THEN DNF
        RUNT=RUNT-10
     ENDIF
IF RUNT>300 THEN RUNT=0
IF RUNT<0 THEN RUNT=300
RUNTH=(RUNT/60)
RUNTL=RUNT//60

LCDOUT $FE,128,"RUNTIME : ",DEC1 RUNTH,":",DEC2 RUNTL


IF ESC=1 THEN
ESCF: IF ESC=1 THEN ESCF
      READ 11,RUNT.LOWBYTE 
      READ 10,RUNT.HIGHBYTE
      GOSUB TARA
      GOTO AYARLAR
      ENDIF
IF ENTER=1 THEN 
ENF: IF ENTER=1 THEN ENF
    WRITE 10,RUNT.HIGHBYTE 
    WRITE 11,RUNT.LOWBYTE
    PAUSE 10
    GOSUB TARA
    GOTO AYARLAR
ENDIF
GOTO RUN1
'********************************
STP:
IF STOPT=0 THEN STOPT=1
LCDOUT $FE,1
STP1:
IF UP=1 THEN 
UPT: IF UP=1 THEN UPT
     STOPT=STOPT+1
     ENDIF
     
IF DN=1 THEN 
DNT: IF DN=1 THEN DNT
        STOPT=STOPT-1
     ENDIF
IF STOPT>15 THEN STOPT=1
IF STOPT<1 THEN STOPT=15
LCDOUT $FE,128,"STOP T : ",DEC2 STOPT
IF ESC=1 THEN
ESCT: IF ESC=1 THEN ESCT
      READ 15,STOPT
      GOSUB TARA
      GOTO AYARLAR
      ENDIF
IF ENTER=1 THEN 
ENT: IF ENTER=1 THEN ENT
    WRITE 15, STOPT 
    PAUSE 10
    GOSUB TARA
    GOTO AYARLAR
ENDIF
GOTO STP1
'///////////////////////////////////////////
STD:
LCDOUT $FE,1
STD1:
IF UP=1 THEN 
UPR: IF UP=1 THEN UPR
     STDT=STDT+30
     ENDIF
     
IF DN=1 THEN 
DNR: IF DN=1 THEN DNR
        STDT=STDT-30
     ENDIF
IF STDT>900 THEN STDT=0
IF STDT<0 THEN STDT=900
STDTH=(STDT/60)
STDTL=STDT//60
LCDOUT $FE,128,"STANDBY T: ",DEC2 STDTH,":",DEC2 STDTL
IF ESC=1 THEN
ESCR: IF ESC=1 THEN ESCR
      READ 12,STDT.HIGHBYTE
      READ 13,STDT.LOWBYTE
      GOSUB TARA
      GOTO AYARLAR
      ENDIF
IF ENTER=1 THEN 
ENR: IF ENTER=1 THEN ENR    
      WRITE 12,STDT.HIGHBYTE
      WRITE 13,STDT.LOWBYTE
      PAUSE 10
       GOSUB TARA
    GOTO AYARLAR
ENDIF

GOTO STD1

şu an kullanmakta olduğumun atası sayılabilecek,  eski yöntemlerimden birisi.Umarım işine yarar.
Buna benzer yapılar kurabilirsin.Tecrübe önemli, gelişirmek sana kalıyor.

mhk

MENU1:
   LCDOUT $FE,2,     "MENU:           "
   LCDOUT $FE,$C0, "1)PROGRAM   "

Senin yaptığın kodlarda biraz değişiklik ile dikkat edersen lcdout kısmında hiç ekran temizlenmedi. Önemli olan ekran silinmesi ise bunu ekrana boşluk koyarak ta gerçekleştirebilirsin. Yukarda görüldüğü gibi. Eğer 2x16 lcd kullanıyorsan , her bir menü yazısını 16 karaktere tamamlarsın.
"Menu1               "
"Menu2               "  gibi. Bu yöntemin dezavantajı boşlukların hafızada yer kaplamasıdır. Diğer bir yöntem ise alt programlara gitmeden önce 1 defa ekranı sildirir ondan sonra alt program işlemini gerçekleştirebilirsin.
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

teketek

Sorun çözüldü:

@katana verdiğin örnek baya işime yarayacak tekrar sağol.bu örnekle "select case" kullanımını öğrenmiş oldum.ayrıca evet ekranı çok sık temizlediğimden kaynaklanan bir sorunmuş.

@mhk her alt menü için "$fe,1" kullanmak sorunumu çözdü denebilir.şöyle bişey yaptım ve ekrandaki kıpraşma ortadan kalktı.

  .
   .
   .
BASLA:
    LCDOUT $FE,1
BIR:LCDOUT $FE,$80,HEX2 SAAT,":",HEX2 DAKIKA:LCDOUT $FE,$17,HEX2 GUN,"/",HEX2 AY,"/",HEX2 YIL
    LCDOUT $FE,$C0,"KULLANIMA HAZIR"   
    POZ=0
    PAUSE 150
    GOSUB GETTIME 'DS1302 DEN ZAMANI ÖĞREN 
    IF POZ=0 AND SEC=1  THEN GOTO BIR
    .
    .
    .


burda eğer menü içinde gezilirken ana ekrana dönülürse "BASLA" etiketine dönüyor ancak stand by durumundayken döngü kendi içinde hapsoluyor $fe,1 komutu icra edilmediğinden dolayı kıpraşma ortadan kalkıyor.

Alıntı Yap
@katana
Bunun için bir kaç farklı yöntem var.Kişi programın gelişimine ve algoritmasına göre ayarlama yapmalı.Bazı püf noktalarına hakim olmak önemli.
Örneğin:
- 2. gönderilen karakter zinciri, 1. den fazla veya aynı ise,1. otomatikman silinir ve 2. yazılır.Sizin zincir sonuna koyacağınız bir- iki boşluk bile bunu size sağlar.
Kod:
 
lcdout 254,128,"deneme"
lcdout 254,128,"bu tamam"


şeklinde gönderim yapılırsa
ekranda
Kod:
bu tamam


olarak görünür.

fakat
Kod:
 
lcdout 254,128,"deneme"
lcdout 254,128,"tamam"


şeklinde bir gönderim yapılırsa ekran çıktısı;
Kod:
 
tamame



şeklinde olur...( "e" harfi 1. gönderimden kalan artıktır.)

sonunda olay çözüldü teşekkürler:)
Bilgi fark yaratır..