avatar_haberlesme

Ufak Bir Soru

Başlatan haberlesme, 12 Ocak 2013, 21:59:30

haberlesme

Hocam birde asıl zorlandıgım ve çözemedigim satırdaki taramayı sürekli çalışır halde bırakıp bilgiyi nasıl aktarabilirim burası arasındaki komutsal baglantıyı kuramıyorum.Buda tabiki benim bilgi eksikligimden kaynaklanıyor.

haberlesme

Hocam yazdıklarınızdan anladıgım kadarıyla böyle birşey çıkarttım ortaya müsait zamanınızda incelerseniz sevinirim kayan yazıda kendi yazdıgım programla bir kayan yazı yapmayı çok istiyorum matrix programını inceledim ama sıcaklık ısı falan girdigi için hangisinin bana lazım olan kısım oldugunuda seçemedim

ete

#17
Aynı anda yapılmıyor bu iki iş zaten. Kullandığın denetleyici bi komut için 1us zaman harcıyor. Gözün aldatılması için 1000 us lik bir zaman gerekiyor. 1000us de 1000 tane iş yapılır anlamına geliyor bu.
Her şeyin bir sırası var diye düşün. Bazı işler çok süratli yaılması nedeni ile sana sorun yaratmayacaktır. Bunların başında shift registerlere bilgi aktarmak geliyor. Sen yeterki işlem sırasını iyi tespit et. Böylece işin kolaylaşır.
Önce devreni kur. Aslında devren kurulu dediğim gibi program mantığını değiştireceksin. PortB den tarama yaptıracaksın.
1 satır bilgisini shift registerlere verip 1 nolu satırı aktif edeceksin. 1 ms bekleyip satır tarmasını sıfırlayacaksın.
2. satır bilgisini shift registerlere verip bu seferde 2 . satırı aktif edeceksin.
..
8. satır bilgisini verip 8. satırı aktif edeceksin
tekrar başa döneceksin.
Bu anlattıklarımı programa dönüştürmek çok kolay.
Her bir displayi 1 adet 74HC595 sürecek demiştik. O halde her bir display içğn 8 adet satır bilgisi olması gerekiyor. Yani harf dataları 8 adet olacaktır.
Bu dataları tutacak değişkenleri tanımlarken DISP1[8] , DISP2[8] ...şeklinde display addi kadar tanımlarsan işin kolaylaşır.
Sonra 0-7 arası bir döngü kurup  bu dataları shift registerlere aktarabilirsin.
Diyelimki senin devrende olduğu gibi 2 adet displayimiz olsun.  Ohalde değişken tanımlaması şöyle olacak,
DISP1 VAR BYTE[8]
DISP2 VAR BYTE[8]
Bu değişkenlere değer vermek için harf datalarını satır satır oluşturacaksın.
SOnra bunları değişkenlere vereceksin. Bir tane yapalım hemen.
DISP1[0]=%00011000 'A
DISP1[1]=%00100100
DISP1[2]=%01000010
DISP1[3]=%01000010
DISP1[4]=%01111110
DISP1[5]=%01000010
DISP1[6]=%01000010
DISP1[7]=%00000000
Bu A harfine ait datalar. İlgili değişkene verdik.
Birde M harfi tanımlayalım onuda ikinci displaye verelim.
DISP2[0]=%01000010  'M
DISP2[1]=%01100110
DISP2[2]=%01011010
DISP2[3]=%01011010
DISP2[4]=%01000010
DISP2[5]=%01000010
DISP2[6]=%01000010
DISP2[7]=%00000000
Şimdi bunları ekrana verelim bakalım.

FOR I=0 yo 7
   GOSUB AKTAR 'shift registerlere bilgi aktarıldı
   PORTB=DCD I  'I nın değerine bağlı olarak ilgili biti set eder. Yani I=0 iken PORTB=1 , I=1 iken PortB=2 , I=3 iken PortB=4 yapılmış olur. Buda satır taramasını sağlar bize.
   Pause 1
   PORTB=0
   next

AKTAR:
           SAYIA=DISP1[I]:SAYIB=DISP2[I]
          SHIFTOUT DTA,CLK,1,[SAYIA,SAYIB]
           PULSOUT KILIT,1
            RETURN
şeklinde halledilir.
Biraz hızlı yazdım . eksik bir şey olabilir çıkarsa program çalışınca anlaşılır ve ona göre gerekli düzeltme yapılabilir.

Ete


haberlesme

Hocam dediklerinizi yaparak böyle oluşturdum ama yanlız taramada sadece ilk 3 pini tarıyor orda kalıyor muhtemelen oda for döngüsü altındaki portb=  eşitlemedeki yeri anlayamadım ondan kaynaklı ama yaptıgımı ek e koydum hocam ilginiz için minnettarım çok sağolun.

ete

İyi gidiyorsun. Eksikler var onları tamamladım.
Buyur bakalım,

@ DEVICE pic16F628A, INTOSC_OSC_CLKOUT
@ DEVICE pic16F628A, WDT_OFF                                               
@ DEVICE pic16F628A, PWRT_ON           
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, BOD_OFF
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, CPD_OFF
@ DEVICE pic16F628A, PROTECT_OFF

DEFINE OSC 4   '***************************YENİ İLAVE ETTİM
CMCON=7        '***************************YENI İLAVE ETTİM
TRISB=0 : TRISA=0
PORTB=0 : PORTA=0

CLK VAR PORTA.0
DTA VAR PORTA.1
OE  VAR PORTA.2
I VAR BYTE
SAYIA VAR BYTE
SAYIB VAR BYTE
DISP1 VAR BYTE[8]
DISP2 VAR BYTE[8]

DISP1[0]=%00011000 'A
DISP1[1]=%00100100
DISP1[2]=%01000010
DISP1[3]=%01000010
DISP1[4]=%01111110
DISP1[5]=%01000010
DISP1[6]=%01000010    'burada bir bit eksik yaılmış onu düzelttim program çalışınca anlaşıldı
DISP1[7]=%00000000

DISP2[0]=%01000010  'M
DISP2[1]=%01100110
DISP2[2]=%01011010
DISP2[3]=%01011010
DISP2[4]=%01000010
DISP2[5]=%01000010
DISP2[6]=%01000010
DISP2[7]=%00000000

BASLA:   
FOR I=0 To 7
   GOSUB AKTAR 'shift registerlere bilgi aktarıldı
   PORTB=DCD I  '  ***********************BU SATIR DÜZELTİLDİ***********************
   Pause 1
   PORTB=0
   next
   GOTO BASLA

AKTAR:
    SAYIA=DISP1[I]:SAYIB=DISP2[I]   ' ****************BU SATIR DÜZELTİLDİ
    SHIFTOUT DTA,CLK,1,[SAYIA,SAYIB]
    PULSOUT OE,1
    RETURN


Ete

haberlesme

#20
Hocam şuan m ve a harfleri displayde sorunsuz görünüyor bunu yaptıgım uygulama devresinde deneyebilir miyim şema yı gördünüz eklenti yapmam gerekir mi ? birde dahili osilatör kullanılamaz degilmi hocam bu devrede 4 Mhz tanımladıgımıza göre ilk önce bunu eklemekten başlıyayım 

İkinci sorum ise hocam burda tek tek tanımlamayı gördük ama çok karakterli bir yazı yazdıgımızda nasıl devam etmem gerekir.şuan bu mantıgı anladım hocam.

yada hocam çok karakterli sistemdeki açıklama gelmeden bu programı bide kaydırma aşamasını mı anlasam siz nasıl uygun görürseniz

ete

#21
Şemayı aynen uyguluyor isen gerçek devrende de çalıştırabilirsin.
Çok karekterlide yalnızca akıllıca bir işlem sırsası uygulaman gerekiyor.
Yazdırılacak yazı bir Lookup tablosuna yerleştirilir. Bu tablo sana yazının karekterlerini teker teker almanı sağlar.
Bir karekter tablosu hazırlarsın. Yine lookup tablosu şeklinde.  Her harfin dataları 8 tane olacak biliyorsun. Bunları alt alta yazarsan sana kolaylık olur. Bir tablo sana harfin data tablosundaki başlangıç adresini verir. İleriki aşamada aynı yerden hem adres hemde kaç data alınacağını bile belirleyebilirsin.
Tablodan aldığın yer (adresi) diğer tabloda parametre olaak kullanıp o adrese uyan yerden 8 adet okuma yaparsın.
Böylece ekrana yazdırılacak karekterleri dizi değişkenlerine bu şekilde sırası ile yarleştirirsin. Matirx saat projesinde Tablo örneği mevcut.  Yazı için Lookup tablosu oluşturmak son derece kolay.
Lookup index,["Y","A","Z","I","L","A","C","A","K"," ","Y","A","Z","I"],AL
Bu satırda önce INDEX=0 verip AL=Y olarak alacaksın. SOnra bunu ikinci tabloya yollayıp oradan Y harfinin adresini tespit edecek ve sonunda data tablosundan o adrese tekabül eden 8 adetdatayı okuyup DISP1 değişkenine aktaracaksın.
Sonra Index=1 verip bu seferde A harfini alıp ona ait bilgileri DISP2 değişkenine aktaracaksın.
Bu aşamaya gelmen zaman alabilir. Biraz çalışırsan yaparsın.

Ete


haberlesme

Hocam çok teşekkürler siz belli biryere kadar getirdiniz bu tablo işi ilede biraz ben uğraşayım yapmaya çalışayım takıldıgım yerleri sorayım.

peki hocam bu tamamladıgımız program üzerinden o iki harfi kaydırma mantıgı nasıl oluyor ne gibi bir mantıkla kaydırılıyor komut örnegiyle verebilir misiniz onuda geliştirmeye çalışsam.Sadece tek istedigim kendim anladıgım mantıgını kavradıgım programla bir kayan yazı oluşturmak.

ete

Kaydırma işine sonra bakacağız.

Ete

haberlesme

Tabiki hocam ben şuan tablo oluşturmaya başladım.Çabalıyorum onun için M ve A harflerinide uygulamada denedim o iki harfin matrixlerde parlak ve sorunsuz bir şekilde durması nasıl bir mutluluk veriyor anlatılmaz çok teşekkürler.

haberlesme

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 16.01.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628A, INTOSC_OSC_CLKOUT
@ DEVICE pic16F628A, WDT_OFF                                               
@ DEVICE pic16F628A, PWRT_ON           
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, BOD_OFF
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, CPD_OFF
@ DEVICE pic16F628A, PROTECT_OFF

DEFINE OSC 4   '***************************YENİ İLAVE ETTİM
CMCON=7        '***************************YENI İLAVE ETTİM
TRISB=0 : TRISA=0
PORTB=0 : PORTA=0
                                                             
DTA VAR PORTA.0     ' DS pini tanımlandı
CLK VAR PORTA.1       
OE VAR PORTA.2
I VAR BYTE
SAYIA VAR BYTE
SAYIB VAR BYTE
VER VAR BYTE
AL VAR BYTE
DISP1 VAR BYTE[8]
DISP2 VAR BYTE[8]

DISP1[0]=%00011000 'A
DISP1[1]=%00100100
DISP1[2]=%01000010
DISP1[3]=%01000010
DISP1[4]=%01111110
DISP1[5]=%01000010
DISP1[6]=%01000010    'burada bir bit eksik yaılmış onu düzelttim program çalışınca anlaşıldı
DISP1[7]=%00000000

DISP2[0]=%01000010  'M
DISP2[1]=%01100110
DISP2[2]=%01011010
DISP2[3]=%01011010
DISP2[4]=%01000010
DISP2[5]=%01000010
DISP2[6]=%01000010
DISP2[7]=%00000000

BASLA:   
FOR I=0 To 7           
   GOSUB AKTAR 'shift registerlere bilgi aktarıldı
   PORTB=DCD I  '  ***********************BU SATIR DÜZELTİLDİ***********************
   Pause 1
   PORTB=0
   next   
   GOTO BASLA

AKTAR:
    SAYIA=DISP1[I]:SAYIB=DISP2[I]   ' ****************BU SATIR DÜZELTİLDİ
    SHIFTOUT DTA,CLK,1,[SAYIA,SAYIB]
    PULSOUT OE,1
    RETURN
   
TABLO:
    LOOKUP VER,[60,66,66,126,66,66,66,0,_
                64,64,64,64,64,64,124,0],AL
   

                 
   

 



Hocam bu şekilde tabloyu oluşturdum ama devamın aktar etiketinin altı biraz değişecek galiba.

haberlesme

#26
Son hali ile böyle bir mantık kurmaya çalıştım ama beceremedim hocam.

@ DEVICE pic16F628A, INTOSC_OSC_CLKOUT
@ DEVICE pic16F628A, WDT_OFF                                               
@ DEVICE pic16F628A, PWRT_ON           
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, BOD_OFF
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, CPD_OFF
@ DEVICE pic16F628A, PROTECT_OFF

DEFINE OSC 4   '***************************YENİ İLAVE ETTİM
CMCON=7        '***************************YENI İLAVE ETTİM
TRISB=0 : TRISA=0
PORTB=0 : PORTA=0
                                                             
DTA VAR PORTA.0     
CLK VAR PORTA.1       
OE VAR PORTA.2
I VAR BYTE
SAYIA VAR BYTE
SAYIB VAR BYTE
VER VAR BYTE
VERI VAR BYTE
AL VAR BYTE
DISP1 VAR BYTE[8]
DISP2 VAR BYTE[8]


BASLA:   
FOR I=0 To 7           
   PORTB=DCD I  '  ***********************BU SATIR DÜZELTİLDİ***********************
   Pause 1
   PORTB=0
   next
   GOSUB GOSTER   
   GOTO BASLA


GOSTER:   
    VER=0
    VERI=AL
    VERI=DISP1[I]
    GOSUB AKTAR
    VER=1
    VERI=AL
    VERI=DISP2[I]
    GOSUB AKTAR
    RETURN
   
   



AKTAR:
    SHIFTOUT DTA,CLK,1,[VERI]
    PULSOUT OE,1
    RETURN
   
TABLO:
    LOOKUP VER,[60,66,66,126,66,66,66,0,_
                64,64,64,64,64,64,124,0],AL

ete

Bu kadar kısır bilgi ile bu iş yapabileceğinden şüphe duyamaya başladım. Üstelik bir acelen var gibi birden merdiven basamaklarını atlayayımda en üst noktaya çıkayım diye bir telaş içindesin.
Her işin bir mantığı vardır. Bu çok önemlidir. Yapman gereken şey şayet o datalar doğru iseler onları DISP1 ve DISP2 değişkenlerine aktarmak olacaktır. Önce bunu sağlaman gerekiyor. Örneğinide verdim. Çok zormu bunu yapmak.?
Açıp Lookup komutu nasıl çalışıyor bakman gerek. Üstelik nasıl çalıştığınıda anlattım.
Bu konu ile ilgili bir kod görmeden bir adım öteye ilerlemiyeceğiz.!!!!!!!!

Hala işin mantığını anlamadığını ve olaydan çok uzak olduğunu düşünüyorum. Bir karekter nasıl oluşturulur , oluşturulan bu karekter nasıl display e aktarılır buna hiç kafa yormuyorsun ama bir an önce onları kaydırmaya yalan yanlış kafa yoruyorsun.
Bir konuya dikkatini çekmek isterim. Burada çalışan bir kod var ve %99'unu da ben yazdım. Sen henüz bir şey yapmadın.
Yaptığın tek şey yalan yanlış bir şeyler yazıp olmadı diye bana mesaj atıp benim yapmamı beklemek oluyor.
Bu noktadan sonra ben kod düzeltmeyeceğim.
İşe ödev vererek devam edeceğiz.  İstersen devam ederiz tabiki istemezsen paşa gönlün bilir.
Ödev-1;
Y ve W harflerini oluşturacak data ları tanımla ve bunları display da göster.
Hazırladığın kodu buraya dosya olarak koy .
Neyi nasıl yapacağınıda anlatayım istersen.
Programında yer alan DISP1 ve DISP2 datalarını sileceksin. O dataları Lookup tablosundan alıp sildiğin değişkenlere atayacaksın.
Sonra programın gerisi zaten onları ekrana veriyor.  LOOKUP INDEX,[Data0,Data1,Data2,Data3,Data4....Data15],ALINAN
Bir Lookup tablosu index ile çalışır. Tablo içinde datalar bir birlerinden virgül ile ayrılırlar. Index değeri olarak ne kullanırsan ona denk gelen sıradaki data alınıp ALINAN isimli değişkene yerleştirilir.
Index=0 ise ALINAN=DATA0 olur. , Index=3 ise ALINAN=DATA3 olur.
Bütün yapman gereken  Başlangıçta 0 ile 7 arasında bir döngü kurman. Bu senin index döngün olacak. Sonra lookup tablosuna Gosub ile gidip İndex değerine bağlı olarak o datayı alacak ve sonunda DISP1[INDEX]=ALINAN
aynı işi bu seferde DISP2 için yapacaktır. Onun dataları lookup tablosunda 8. karekterden itibaren başladığına göre;
yine 0 ile 7 arasında bir döngü kıracaksın. Bu senin index değişkenin olacak.
Tablodan data alırken Lookup (INDEX+8) demen gerekiyor. Çünki ilk 8 datayı (0-7) DISP1 için aldın. Sonraki 8 datayı alman için adres değerin en azından 8 den başlaması gerekir.

Ete

haberlesme

Hocam ilk programı hepsini sizde yazsanız anladım o programda istediginiz her harfi ekranda gösterebilirim.Ama şu tablodan deger al göster isi aklımı karıştırdı.Mesela Hocam şimdi şöyle oluşturdum harf datalarını W ve Y harfine ait datalar
Alıntı YapTABLO:
    LOOKUP INDEX,[66,36,24,16,16,16,16,0,_
                  66,66,66,90,90,102,102,0],ALINAN
                    RETURN

Sonrasında ise
Alıntı YapHARF_SEC:
    FOR A=0 TO 7
    INDEX=A
    GOSUB TABLO
    DISP1[INDEX]=ALINAN
    PAUSE 1
    NEXT A
    RETURN

sonrasında ise kodun tamamını ekte verdim ya yine işlem sırası hatası yaptım yada yine beceremedim. hocam bu arada Ben sizden gerçekten programın tamamını beklemiyorum öyle olsaydı örneklerinizden birinin kodlarını değiştirirdim Mucit23 satır taramalı çalışan dedigini yapardım.Ama ben anlamadıgım mantıgını kavramadıgım bişeyi yapmak istemiyorum ilk programı çalıştırdım mantıgını anladım uygulama devremde gördüm çok mutlu etti beni şimdi onda M A  harfleri yerine B C de gösterrebilirim.Ama bu tablodan okumayı anlayamadım affınıza sıgınarak.

ete

Programın tamamını benden beklemiyorsun ama daha bir tek kod yazmadın kendi başına. Bu nedemektir. Bak bir şeyi yapamadım diye hemen yine yollamışsın. Bu kod yazıp çalıştırmadığın anlamına gelmiyorki. Rastgele kod yazım benden yardım istediğin anlamına geliyor. Bu konuyu kendi başına halletmelisin. O zaman anlarım benden kod değil akıl beklediğini.
Üstelik detaylı olarak nasıl yapman gerektiğini sana söyledim. Yeniden söylüyorum hemde hatalarınla birlikte;
1. Programın başına mutlaka açılış gecikmesi koy ..........................Pause 500. Tam yeri başla satırından evvel bir satıra.
2. Yazdığın koda bir bak ve aklını çalıştır lütfen;
BASLA:   
FOR I=0 To 7
   GOSUB HARF_SEC
   GOSUB AKTAR         
   PORTB=DCD I  '  ***********************BU SATIR DÜZELTİLDİ***********************
   Pause 1
   PORTB=0
   next     
   GOTO BASLA
Burada 0-7 arasında çalışan toplamda 8 defa tekrarlanacak olan bir döngü kutuyorsun. Döngü içinde ilk iş Harf_SEC etiketine gitmek oluyor. Orada ne yapılıyor?  orada 8 adet data alınıyor alma işlemi arasına birde pause 1 koymuşsun neden? gerek varmı işi geciktirmeye acaba? Yok elbette. Peki okunan datalar nereye yerleştiriliyor DISP1 dizi değişkenine yalnızca.
Peki DISP2 dizi değişkenine nerede data yerleştiriyorusn.? yok!!!!,  bunu düünememişsin. Peki ben düşünüyorumda sen neden düşünmüyorsun.? Çünkü kalıp ezberliyorsun. Kafanı çalıştırarak işi yapmaya çalışmıyorsun. Sürekli birileri sana yapsın sende ona bakıp anlayayaım diyorsun da ondan.

Peki en başta kurduğun döngü senden 8 adet karektere ait olan ve her biri 8 adet olan data okunmasını isteyecek. O kadar datan varmı? yok elbette. O halde neden orada 0-7 döngüsü kuruyorsunki?

Yapman gereken şu ;
Önce Tablodan 8 adet sıralı datayı alıp sırası ile DISP1 in 8 adet değişkenine yerleştireceğim.
       FOR INDEX=0 TO 7
         GOSUB TABLO
         DISP1[INDEX]=ALINAN
       NEXT
Sonra aynı tablodan bu seferde 8 den 15'e kadar olan dataları alıp bu seferde DISP2 dizi değişkenlerine yerleştireceğim.
Unutma DISP1 diye yazıyoruz anlatırken ama bunun DISP1(0) - DISP(1)..DISP(7) şeklinde 8 adet ayrı dizi değişkeni var.
Parentez içindeki değişkendir ve ona index denir. Dolayısıyla index değiştirerek bu 8 değişkenden istediğime ulaşabiliyorum. Dizi değişkenişnin avantajı budur.
Aynı şekilde DISP2 ninde benzer şekilde 8 adet ayrı değişkeni var.
Ben birinciye nasıl data alınıp yerleştirildi gösterdim. Şimdi sen ikinciyi yap bakalım.
Aktar kısmınıda yanlış yazmışsın. ELinde iki tane 595 var ise neden yapnızca bir byte yazdın oraya?, Daima 2 byte yazman gerekiyor. Bunu izah etmiştim. Birisi disp1 diğeri disp2 olacak.

Umarım bu sefer doğru anlamışsındır
Ete

Powered by EzPortal