M

12adet 8x8dotmatris saat yardım

Başlatan mast79, 14 Haziran 2013, 23:41:13

mast79

8x8 dot matris ekranda çalışan saat devresi proteus'da çalışır görünüyor ama devre gerçekte neden çalışmıyor? fikirlerinizi paylaşır mısınız? programı ve isis devresi ekte. şimdiden teşekkürler

ete

Devreye ve programa baktım.
Sorun yok eksikler var. En önemlisi donanım eksikliği. Bir dotmatrix led içinde bir sırada 8 adet led bulunuyor.
Bu ledlerin Anot uçlarına 2V civarında voltaj verdiğiniz zaman ortak katod ucuna da GND verirseniz ledlerin tamamı yanar. (yada ledler ortak anot ise tersini yaparsanız) Bu durumda Ortak katod ucu şayet direk GND ye bağlı ise sorun yoktur. Ama bu ucu bir pic pinine bağlayıp oradan LOW verirseniz,
SINK akımı olarak pic den 8*20=160 ma akım çekilirki pic bunun ancak 20-25 ma lik kısmını karşılayabilir.
O halde bu sistemi biraz değiştirmek ve ortak katod uçlarını direk pic den değil, pic in sürdüğü bir başka elemandan almak gerekir.  Bu konuda en uygun olanı ise ULN2803 entegresidir. Bu entegrenin giriş ucuna HIGH uygularsan çıkıştan LOW alırsın ama her bir low 500 ma akım verebilecek şekildedir.
Yapman gereken devrende T1-T8 arası bağlantıları ULN2803 entegresine girip çıkışları matrix üzerinde bulunan T1-T8 pinlerine bağlamak olacaktır.
Ancak unutma Pic pinlerinden sürekli HIGH çıkartıp aktif edeceğin pini LOW yapıyorsun. ULN kullanınca bunun tam tersini yapacaksın. Pİnler LOW da beklerken aktif olan uc HIGH olacak. Sende pinler HIGH da beklerken aktif olan uç LOW oluyor. Bu sorunu düzeltmez isem işlemcin kısa zamanda bozulacaktır.
Diğer bir sorun ise 74164 pinlerinden matix pinlerine yapılan bağlantılarda seri akım sınırlama direnci kullanılması hususudur.
74164 pininden HIGH çıktığı zaman bunun seviyesi 5V dolayındadır. Matrix ledleri ortalama 2V civarında bir voltaj ile çalışır. 74164 pinini direk matrixe bağlarsan matrix ledi aşırı akım çeker. Halbuki maksimum 20 ma dolayında bir akım çekmelidir. O halde araya seri akım sınırlama direnci bağlaman gerekir. Normal olarak yapılması gereken şey,
matrix data sheetinden ledlerin forward voltajlarını öğrenmek ve ona uygun bir direnç değeri hesaplamaktır. Buda şöyle olur. Diyelimki forward voltajı 2V imiş.
R=(5V-2V)/0,015 =200 ohm hesaplanır. Led akımını ortalama olarak 15ma kabul ettim. 200 ohm standart direnç değildir. Ya 180 ohm yada 220 ohm kullanman gerekir. 180 kullanırsan ledler 16ma dolayında bir akım çeker. 220 ohm kullanırsan ledler 13 ma dolayında bir akım çeker. Matrix parlaklığına göre uygun bir değer seçersin.

Gelelim yazılımla ilgili eksikliklere
Bu tür programlarda sigorta ayarları önemlidir.
Hiç bir sigorta ayarı koymamışsın.
18F452 için sigorta ayarların aşağıdaki şekilde olmalı.

asm
    __CONFIG _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
    __CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_OFF_2L
    __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
    __CONFIG _CONFIG3H, _CCP2MX_ON_3H
    __CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
    __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
    __CONFIG _CONFIG7H, _EBTRB_OFF_7H
endasm

PBP3.0 kullanmadımığım için oradaki sigorta yazım formatını incelemedim. Sen kendin ayarlamalısın.

Sistem simulasyonda çalıştığına göre çalışmayan devrene bakmak gerekir. Nasıl bir bağlantı kullandın.
İsis de çalışan şey mutlaka gerçeğinde de çalışmalıdır. Bu nedenle İsis in varsayımlarına bakman gerekir.
Zira İsis bazı kriterleri var kabul eder.
1.  İsis besleme voltajı varmı yokmu bakmaz. Var kabul eder. O halde işlemciye besleme verilmişmi  bakman gerekiyor. Tabiiki ayrıca matirxlerin beslemelerine ve 74164 ün beslemelerinede bakmalısın. Kısaca tüm beslemelerin varlığından emin olman gerekir.
2. İsis işlemciye kristal bağlı kabul eder. Sen devreni 4 Mhz de çalıştırdığına göre işlemcinin 13 ve 14 nolu osilatör bacaklarına bir kristal yada rezonatör bağlı olduğundan emi,n olmalısın. Kristal bağlı ise aynı pinlerin birer 22pf kondansatörle GND ye bağlı olduğundan da emin olman gerekiyor.
Rezonatör bağlı ise dıştaki bacaklar OSC bacaklarına ortadaki bacak ise GND ye bağlı olmalıdır.
3. MCLR bacağı reset bacağıdır ve 2K2 direnç ile +5V ta bağlı olmalıdır bu pin.
4. İşlemci besleme bacaklarına 100nf kondansatör bağlı olmalıdır.
5. İsis çıkışlarının bir elemanı sürecek kadar akım verip vermediğinede pek bakmaz. Bunu gerçek devrende mutlaka düşünüp gerekli önlemi almalısın.

Şimdilik aklıma gelenler bunlar.
Son olarak şunu söyleyeyim. Devrenin ana çalışmama nedeni yinede matrix ledlerin ortak uçlarının sürülüş şeklidir. Pic pini ile beslenen bu uçlar pic in yeterli akımı verememesi nedeni ile ledlerin yanmamaktadırlar.

Ete

mast79

soruma cevap verdiğiniz için çok teşekkür ederim. devreyi gerçekte kurarken isideki gibi kurmadım. T1-T8 uçlarına BDX54C transistörü bağlı, 164 çıkış uçlarında ise 2803a var, 2803a dan dot matrise 100ohm lik dirençler koydum. Dot matrislerde ışık şiddeti çokda parlak değil. Bu yüzen flexsi glass kullanıyorum. dot matrisler ortak anot. Ama sizin dediğiniz gibi ortak katot kullanmayı düşünüyorum. Aslında devreyi kuralı baya oldu. devre tarih, sıcaklık ve başka animasyonlar da yapıyor. Mesala kayan yazıyı, sıcaklığı, tarihi dotlarda rahatlıkla görebiliyorum ama satte sıkıntı oluyor. Yalnız saate ben veri yazınca yazdığımı ekranda görebiliyorum. yani saniye, dak, saat, gün, ay, yıl bilgilerini zaman[8] dizisine ben gösteriyorum. bu gösterdiğim veriler aynen ekranda görünüyor. ama benim istediğim saatin o anki güncel değeri göstermesi. Acaba DS1302 de bir bozukluk olabilir mi? Onu hiç değiştirmedim. Devreyi sağa sola taşırken mutlaka bağlantılar kopmuş yada baskı devredeki bakır yollar arası bağlantı kopukluğu meydana gelmiş olabilir çünkü çok sayıda kablo kullandım. Bu yüzden tekrar dikkatlice kontrol edeceğim. Devrede Pic reset ucunda 10k'lık direnç kullandım. Rezanatör iki ucuna da 22pF bağlı, pic besleme +5V ucunda 100nF var ve tüm 164 besleme uçlarında da 100nF kullandım. devreyi bu hafta bir kontrol edeyim size tekrar cevap yazarım. Tekrar bilgileriniz için teşekkür ederim.

ete

İlk mesajından gerçek devrenin hiç çalışmadığı anlamını çıkarmıştım. Ama görülüyorki kısmen çalışıyor. Asıl sorun sanırım güncel saat gösterimi. Bunun bir çok sebebi olabilir. Burada yeniden sebep sıralaması yapmayacağım. Sorun Ds1302 de olabilir devredeki konumuda olabilir.
Artık bulmak sana kalmış.
Ete

mast79

iyi geceler ete hocam,
devreyi inceledim bazı bağlantı eksikleri buldum. ds1302 yi değiştirdim. sonra devre 00-00-00 olarak çalışmaya başladı . yani saniye hanesi birden itibaren saymaya başladı. programı değiştirdim. zaman[8] dizinine kendim o anki güncel saat değerini verdim. Saat ekranda titreme yapıyor. bunun nedeni ne olabilir?

ete

Titremenin tek bir sebebi oluyor. Her bir satırın ekranda kalış süresi yetersiz. Bu konu üzerinde çalışmalısın.
Ete

mast79

iyi akşamlar ete hocam,
Hocam titremeyi giderdim.  Değişiklik yaptığım programa bakar mısınız? Programı ekte gönderiyorum. Hocam devre gerçekte çalışırken ufak bir sorun oluyor. Saat her 20 saniyede bir hafif duraksıyor. Bu konuda görüşlerinizi bekliyorum. Zaman ayırıp sorularıma cevap verdiğiniz için teşekkür ederim.

ete

Simulasyonda bu duraksamayı fark edemiyorum. Ancak programa bakınca bazı şeyleri özellikle RTC registerlerinin çevrim işlemlerini uzun uzadıya hallettiğini görüyorum. Mutlaka çevrimden taşan zaman oluyordur.Şöyle izah edeyim.
Programda yapacağın bütün işleri bir çevrim için 1 sn lik süreden daha kısa zamanda bitirmelisin.
Sorun bu sürenin taşması olabilir. Başkada bir sorun göremedim.

Ete

mast79

ete hocam hayırlı günler,
saatteki duraksamayı hallettim. yardımlarınız için teşekkür ederim. Devreyi bilgisayar kontrollu yapmaya çalışıyorum. Böylece zaman[8] dizinine değer vermeden bilgisayar saatini pice gönderip saati güncelleyebilirim. Proteusda İsis virtual terminali kullandım. devreyi gönderiyorum. orada sorum olacak size. isisde deve çalışıyor. gerçekte çalıştığını denemedim. hserout ve hserin kullandım. "<" işaretinden sonra pic gelen verileri eeproma yüklüyor sonra ordan verileri alıyorum. sorum şu;
I2cwrite için for döngüsü kullanmadan verileri eeproma yazabiliyorum. I2cread için for döngüsü koydum. Buradaki for döngüsünü kaldırınca bilgileri okuyamıyorum. Bu for döngüsü zorunlu mu? Bunu başka ne şekilde değiştirebilirim.
teşekkür ederim iyi çalışmalar.

ete

Programda anlam veremediğim komut satırları mevcut. Mesela
hserin [wait("<"),STR gelen\40\">"]  satırında 40 adet karekter alınacağını gösteriyor. Ama kim alacak bunları?
Bu komutun çalışması için Gelen isimli değişkenin ;
Gelen VAR BYTE[40] şeklinde tanımlanması gerekirdi.
Böylece 40a det değişik karekter alınarak gelen isimli değişken indexlenerek 0-39 arasına yerleştirilebilirdi. Ama bakıyorum senin değişkenin yalnzıca byte olarak tanımlanmış.
Aynı şekilde,   anim=gelen[0]  komut satırında da gelen isimli değişken sanki bir dizi değişkeni gibi kullanılmış ama tanımlaman dizi şeklinde değil.
Muhtemelen okuma kısmında bu yüzden çalışmıyor.

Diğer bir konuda HSERIN ile bilgi alırken aynı zamanda eproma bilgi yazma meselesi. Gelen bilgi bit bazında alınır ve zamanlaması çok önemlidir.
Aynı anda yazma yapmaya kalkarsan muhtemelen bit kaçırırsın ve aldıkların çorbaya döner diye düşünüyorum.
Bence aldıklarını diziye alıp sonra gerekirse kayıt etmek en doğrusu olur.

Kesme içinde "goto oku" şeklinde komut vererek programı kesme dışına çıkartıyorsun ve geriye dönüşde mümkün görülmüyor. Buda büyük bir hata bence. Kesme çok özel bir konumdur. Oraya girerken sistem bütün değişken değerlerini kayıt edip girmeye çalışır. Ordan dışarı çıkartırsan değişken değerleri çorbaya döner. Stack şaşırır.
Üstelik USART kesmesi oluştuğunda kesmeden çıkmadan kesme bayrağınında sıfırlanması gerekir. AKsi halde sürekli kesme konumunda kalır program. Bu bayrak RCREG registerinin okunup bir başka değişkene eşitlenmesi ile yapılmaktdaır.
TEMP=RCREG denilmesi yeterlidir.

Goto OKu diye programı yollamışsın okuma kısmına ama onun devamında ne var bir bakalım,
while 1=1   şeklinde bir satır devamında bir kaç komut satırı ve sonunda wend komutu ile döngüyü bitirmişsin.
Bu sistem genelde C dilinde kullanılan bir sistem olup programı sonsuz döngüye sokar. Anlayacağın bu while,wend döngüsüne bir kere girdinmi bir daha çıkamayacağın anlamına gelir.
Üstelik hala USART kesmesi içinde iken söz konusu satırlarda yer alan Gosub komutları ile program bazı alt programlara yönlendirilmektedirki buda programın kilitlenmesine sebep olacaktır mutlaka.
Genel Kural şudur, Kesme içinde bir goto yada gosub ile kesme dışındaki bir alt programa atlayamazsın!!!!.

Gerisine bakmadım artık. Bir sürü hata mevcut. Bunları düzeltmek için programda köklü değişiklikler yapmak gerekir yada yapacağın bazı şeylerden vaz geçmek en doğrusu olur.

Ete



mast79

ete hocam iyi geceler,
önceki söyledikleriniz ışığında programı değiştirdim. Dosyayı bir türlü gönderemedim. programı gönderiyorum.
Include "MODEDEFS.BAS" 'Seri İletişim İçin Gerekli                            
Define OSC 20
DEFINE LOADER_USED 1
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFiNE HSER_SPBRG 129  '20mhz ve 9600 da sayı değeri spbrg=129
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1
DEFINE HSER_BITS 8
DEFINE I2C_SLOW 1
DEFINE LCD_DREG PORTB       
DEFINE LCD_DBIT 0       
DEFINE LCD_RSREG PORTB       
DEFINE LCD_RSBIT 4       
DEFINE LCD_EREG PORTB       
DEFINE LCD_EBIT 5       
DEFINE LCD_RWREG PORTB     
DEFINE LCD_RWBIT 6       
DEFINE LCD_BITS 4       
DEFINE LCD_LINES 4
SYMBOL GIE  =INTCON.7   
SYMBOL PEIE =INTCON.6   
SYMBOL RCIE =PIE1.5     
SYMBOL RCIF =PIR1.5
SDA var PortC.4   '24c64nın 5.bitine bağlı
SCL var PortC.3   '24c64nın 6.bitine bağlı
E_Data var PortE.2:
E_Clear var PortE.0:
E_Clock var PortE.1:
OERR VAR RCSTA.1:
CREN VAR RCSTA.4:
RST var PORTC.0:
IO var PORTC.2:
SCLK var PORTC.1:
ADCON1 = 7
i var byte:j var byte:l var byte:m var WORD:n var WORD:T var byte
TrisC.7=1:TrisD=0:TrisE=0:PortE=0:PortC=0:PortD=0     
RCIE=1: PEIE=1:GIE=1   
TRISB.7=0
portb.7=0
stn var byte:syc var word:okar var byte:bb var byte:
sy1 var word:addr var word:addres var word:syc1 var word:
sy2 var WORD:anim var byte:font Var byte:syc2 var WORD:
pointer var word:dizi var byte[96]:mem var byte[1000]:
dgskn var Bit:Hafiza var byte[200]:
Karakter var byte:Sayac var word:addres=0
gelen VAR BYTE[40]:yy var byte:xx var byte:TEMP VAR BYTE:yy=0:
ON INTERRUPT GOTO KESME
LCDOUT $FE,1
E_Clear=1
Low RST 
Low SCLK
START:
hserout ["kesme yok",13,10]
    IF gelen[0]="a" THEN  gosub yaz
    high PORTB.7     
    pause 300
    low PORTB.7
goto START 
'***********************   
dISABLE
KESME:
GIE=0
HSERIN  [WAIT("<"),str gelen\40\">"]
TEMP=RCREG
RCIF=0 
GIE=1
RESUME     
ENABLE
'******************************
yaz:
HSEROUT ["dis kesme oldu",13,10]
I2CWRITE SDA, SCL, $A0, addres, gelen[yy]
yy=yy+1
for xx=0 tO 39
   I2CREAD SDA, SCL, $A0, xx, gelen[xx]   
   PAUSE 10
next xx
anim=gelen[1]
syc=0
select case anim
       case "1"   'uzun metin kaydır           
            sy2=0
            gosub ata3
            for syc1=0 to 360
                gosub anim1
                gosub Tara
                sy2=sy2+1             
            next syc1                                     
       case else
       portb.7=0     
end select
gelen[0]=0
yy=0         
return
'************************************
ata3:
    for M=2 to 20         
        karakter=gelen[M]
        gosub Tablo1                           
    next M
return
'************************************
anim1:
   gosub bosalt
   for sy1=0 to 95
      dizi[sy1]=Mem[sy2+sy1]
   next sy1
return
'************************************
bosalt:
   for sy1=0 to 95
   dizi[sy1]=$00
   next sy1
return
'**************************************
Ata:               
Mem[syc]=okar
syc=syc+1                         
return
'************************************
Tablo1:             
select case karakter     
case "a"
For T=0 to 5
lookup2 T,[$20,$54,$54,$54,$38,$00],okar
Gosub Ata
next T
case "b"
For T=0 to 5
lookup2 T,[$7F,$28,$44,$44,$38,$00],okar
Gosub Ata
next T
case "c"
For T=0 to 5
lookup2 T,[$38,$44,$44,$44,$44,$00],okar
Gosub Ata
next T
case "d"
For T=0 to 5
lookup2 T,[$38,$44,$44,$28,$7F,$00],okar
Gosub Ata
next T
case "e"
For T=0 to 5
lookup2 T,[$38,$54,$54,$54,$18,$00],okar
Gosub Ata
next T           
case "f"
For T=0 to 5
lookup2 T,[$08,$7E,$09,$09,$02,$00],okar
Gosub Ata               
next T                               
case else
For T=0 to 5
lookup2 T,[$00,$00,$00,$00,$00,$00],okar
Gosub Ata   
next T
end select
return
'*********************************************
Tara:
for bb=0 to 2               
for j=0 to 95                                                                   
stn=dizi[j]                                               
E_Data=stn.0
E_Clock=1
E_Clock=0                                                                                                                                     
next j
PortD=%11111110   
PAUSE 1         
PortD=%11111111
                                                                               
for j=0 to 95       
stn=dizi[j]
E_Data=stn.1           
E_Clock=1
E_Clock=0                     
next j
PortD=%11111101   
PAUSE 1 
PortD=%11111111
                     
for j=0 to 95       
stn=dizi[j]
E_Data=stn.2           
E_Clock=1
E_Clock=0                     
next  j
PortD=%11111011
PAUSE 1     
PortD=%11111111           
               
for j=0 to 95       
stn=dizi[j]
E_Data=stn.3           
E_Clock=1
E_Clock=0                     
next j
PortD=%11110111
PAUSE 1 
PortD=%11111111         
         
for j=0 to 95     
stn=dizi[j]
E_Data=stn.4       
E_Clock=1
E_Clock=0               
next j
PortD=%11101111   
PAUSE 1
PortD=%11111111           
                 
for j=0 to 95   
stn=dizi[j]
E_Data=stn.5           
E_Clock=1
E_Clock=0                     
next j
PortD=%11011111
PAUSE 1
PortD=%11111111     
                 
for j=0 to 95       
stn=dizi[j]
E_Data=stn.6         
E_Clock=1
E_Clock=0                   
next j
PortD=%10111111
PAUSE 1
PortD=%11111111         
                 
for j=0 to 95     
stn=dizi[j]
E_Data=stn.7           
E_Clock=1
E_Clock=0                   
next j
PortD=%01111111
PAUSE 1 
PortD=%11111111
next bb             
return
END

Baka bilir misiniz? Devreyi bilgisayar kontrollü yapmak için visual basic 6.0 ile bilgisayarda bir ara yüz oluşturdum. Bu ara yüzden örneğin "abcde" verisinin isisde kayan yazı olarak çalıştığını görmek için virtual terminal PCDEN GONDERİLEN kısmına <a1     abcde> yazmak yeterli. Hocam mikroelektronikanın easypic5 deneme kartını kullanarak gönderdiğim verinin her bir karakterini LCD ekranda da görebiliyorum. Fakat hocam gönderdiğim veri sürekli kayan yazı olarak çalışmıyor. İstediğim başka bir veri gelene kadar önceki verinin kayan yazı olarak çalışmaya devam etmesi. Bunun hakkında bilgiler vere bilir misiniz? Teşekkür ederim. iyi çalışmalar.

ete

Öncelikle hemen belirteyim programı epeyce toparlamışsın. Bu hali ile ufak tefek kusurlarına rağmen çalışması gerekir.
Belirttiğin tipteki kusurları bulmak ve değişiklik yapmak gerçekten zor ve fazlaca vakit alan bir iş. Bütün programa hakim olmak gerekiyor. Belirgin hataları görmek elbette mümkün. Bunlardan bazılarını söyleyebilirim.
Birincisi bu tür kesme kullanılan programlarda PAUSE komutunu kullanmaktan kaçınmak gerekir. BASIC de temel kural şudur.
Bir kesme oluşsa bile o anda işlenen basic komutu ne ise o bitmeden program kesme etiketine atlamaz.  Programda yer alan Pasue 300  komutuna bakalım. 300 ms lik bir gecikmedir bu. Programcılıkta epeyce uzun bir süredir. Aynı anda veri haberleşmesi yapıyorsan bu komut işlenirken bütün verilerin kaçar alamazsın. Programda şayet PAUSE 300 yerine
PAUSEUS 1 olsa program orada 1us bekleyecek idi. Bu 1us lik süreleri döngü kullanarak çoğaltmak ve sonuçta 300ms lik seviyelere çıkarmak mümkün. Zaten o komut orada çok da gerekli değil bana kalırsa. Amacı bir işaret bilgisi yaratmak. Kısaca Pause 300 yerine;
FOR Z=0 to 10000:Pauseus 1:next   gibi bir komut satırı kullanabilirsin. Program gecikmelerde en fazla 1us bekleyeceği için kesme oluştuğu anda hemen kesme etiketine atlayacaktır.

I2C komutlarında okuma yaptıktan sonra bir gecikme vermekte anlamsızdır. Gerek yoktur. Onlarıda kaldırsan uygun olur diye düşünüyorum.

Diğer bir konuda kesme etiketinde timeout süresi kullanman yararlı olur diye düşünüyorum. Ayrıca veri alındığını belirlemek için bir bayrak kullanmak yararlı olacaktır. Onada direk bayrak demek uygun olur sanırım. Yani BAYRAK=1 ise veri alınmış BAYRAK=0 ise veri alınmamıştır diye düşünmek ve programın Ana kısmında Veri alınmış ise yeni veriyi işlemek üzere onu kullanmak aksi taktirde eski veriyi ekranda tutumak gerekir.

dISABLE
KESME:
GIE=0 :BAYRAK=0
HSERIN 20,ATLA, [WAIT("<"),str gelen\40\">"]
BAYRAK=1
ATLA:
TEMP=RCREG
RCIF=0 
GIE=1
RESUME     
ENABLE

Tabiiki Bayrak isimli bit değişkeni veri alındıktan sonra asıl ekran değişkenlerine aktarılıp sonrada Bayrak=0 denilmesi uygun olacaktır. Aksi halde sürekli yeni veri alınmış gibi gelen verisi işlenecektir.
Ana program içinde şöyle yapılabilir.
hserout ["kesme yok",13,10] 
    IF BAYRAK=1 THEN  gosub yaz  'yani yeni veri geldi anlamına
    high PORTB.7     
    pause 300
    low PORTB.7
goto START

Tabiiki yaz isimli alt program yeni verileri ekran değişkenlerine aktarmalı yalnızca. Ekranda gösterme işi ana program kısmında yapılmalı.
YAZ alt programında veriler aktarıldıktan sonra BAYRAK=0 yapılarak sistem normale döndürülmeli.
Tarama kısmı yaz etiketine giderek yapılmamalı. Orada yalnızca aktarma yapılıp tarama işlemi (kaydırma işlemi) normal BASLA - GOTO BASLA aralığında yapılmalı.

Aşağıdaki satırlarda da bir gariplik var bence,
I2CWRITE SDA, SCL, $A0, addres, gelen[yy]
yy=yy+1

Bu komut ile yalnızca tek bir değişken değerini I2C eproma yazar.
Am sonrasından gelen komut aynı epromdan 40 adet bilgi okumaktadır. Neden bir tane yazıp 40 tane okuyorsun?
Yazma komutuna pause koymak mantıklı olabilir ama okuma komutunda pause koyulması anlamsız.

for xx=0 tO 39
   I2CREAD SDA, SCL, $A0, xx, gelen[xx]   
   PAUSE 10
next xx

Diyeceklerim bunlar. Bu söylenenleri tekrar değerlendir biraz daha toparla bakalım belkide doğru yolu kendin bulabilirsin.
Değilse programı bu aşamada değerlendirmem çok zor benim. En güzeli kendin bulman hatalarını.

Ete

mast79

programı inceleyip değerlendirdiğiniz için teşekkür ederim. Gerçekten çok zaman alan bir iş ama bu devreyi tamamlayıp sitenizde yayınlayacağım. iyi çalışmalar.

mast79

ete hocam iyi günler değişikler sonrası devre çalışıyor. yardımlarınız için teşekkür ederim. devreyi gönderiyorum. pcden gelen virtual terminal kısmına örneğin <11       abcd> verisini yazıp enter tuşuna basın (eğer dış keme oldu virtual terminalde görünmezse veriyi kopyalayarak bir kaç kez arka arkaya gönderin) Gerçekte devreyi denedim çalışıyor. Her yeni veri gönderdiğimde dış kesme oldu yazısını yeni verinin ne olduğunu görebiliyorum. Ete hocam şimdi amacım devredeki animasyon sayısını arttırmak. Yine sorunlar çıkarsa size soracağım. Teşekkür ederim...
iyi çalışmalar

mast79

ete hocam devreye yeni animasyonlar ekledim.
1-soldan sağa metin kaydırma
2- sağdan sola metin kaydırma
3- saat
4- tarih
5- sıcaklık gösterme
beşinci animasyonla ilgili size sorum olacak;
hocam sıcaklık değerini ekranda sürekli tutamıyorum. (sıcaklık görüntülemek için, pcden gelen virtual kısmına, <15> kodunu kopyalayarak birkaç kez gönderin)
bu sorum hakkında bilgi verebilir misiniz. Teşekkür ederim.

Powered by EzPortal