31 dereceden sonra GLCD görüntü karışıyor?

Başlatan emrah, 11 Temmuz 2011, 16:29:03

emrah

mrb,

GLCD ile saat sıcaklı takvim devresi yapmıştım sorunsuz 5-6 aydır çalısıyordu cünkü sıcaklık 30 dereceyi bulmuyordu. bu haftalar hava sıcaklıklarının artmasıyla yaptıgım devre 31 dereceyide gösterip 32 ye geçtiginde 37 yazıyo ve ekrandaki yazı çizgi ne varsa karışıyor ve çalısmasına devam etmiyor. simulasyondada baktım aynı olay ordada oluyor.

ısı sensöründe bir sorun olabilirmi? sorun nerden olabilir?

aksam  program ve resimlerini ekleyecegim.

My75

Simülasyondada oluyorsa yazılım kaynaklıdır..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

emrah

http://imageshack.us/photo/my-images/30/11072011142.jpg/

http://imageshack.us/photo/my-images/405/11072011144.jpg/

Isı bölümündeki program şu şekildedir ,

BASLA:

     GoSub ZAMAN_OKU
     GoSub SENSOROKU
     GoSub EKRANYAZ
     GoSub TERMO
     If PORTA.2=1 Then GoTo DON
     
     
     
     
     
     
     
     
     GoSub ANIMAS           ' EN SONUNCU GOSUB OLACAK!!
GoTo BASLA

' BUTON BIRAKILDIMI ?
DON:

If PORTA.2=0 Then DelayMS 100 : GoTo STMENU
GoTo DON



ANIMAS:
If KNT2=0 Then
Print At 1,KAY1," EMRAH "
DelayMS 175
KAY1=KAY1-1 
EndIf

If KAY1=57 Then KNT2=0
If KAY1=1 Then KNT2=1

If KNT2=1 Then
Print At 1,KAY1," emrah  "
DelayMS 175
KAY1=KAY1+1 
EndIf

Return

TERMO:

If ISI>51 Then
GoTo BASLA
EndIf

ART=57

X=ISI

For I=0 To X
ART = ART-1
Plot ART,116
Plot ART,115
If ART=55 Or ART=56 Then GoTo ATLA2
UnPlot ART+1,114
ATLA2:
If I=X Then
Plot ART,114
EndIf
Next

Y=49-X
AZAL=ART-1

For K=0 To Y
If K=0 Then
UnPlot AZAL,114
EndIf
UnPlot AZAL,116
UnPlot AZAL,115
AZAL=AZAL-1
Next

Return


  If ISI>50 Then GoTo GEC
 
   If KNT=1 Then
   
    Y=ISI
    ART=57
   
    For I=0  To Y
   
    ART=ART-1   
    Plot ART,115
    Plot ART,116
    Next
   
    X=49-Y
    AZAL= ART
   
    For K=0 To X
   
    AZAL=AZAL-1
    UnPlot AZAL,115
    UnPlot AZAL,116
    Next
   EndIf
GEC:
   
      If PORTA.2=1 Then 
       GoTo STMENU
       EndIf

GoTo BASLA

EKRANYAZ:

Print Font Berna_B__18
        If SN//2=0 Then
        Print At 13,7,Dec2 SAAT,":",Dec2 DAK,":",Dec2 SN,"  "
        EndIf       
       
       If SN //2=1 Then
       Print At 13,7,Dec2 SAAT,"   ",Dec2 DAK,"   ",Dec2 SN,"  "
       EndIf

    '*******   ISI GÖSTEGESİ ********   
If  ISI2>59 Then 
ISI=5 
EndIf

If KNT=1 Then
GoTo ATLA
EndIf
If ISI2=SN Then 

ATLA:
KNT=1 
Print Font Berna____10
        Print At 49,80, Dec ISI," "                 
        Print At 49,93,"'C"     
EndIf 

  Print Font Berna____10
        Print At 36,9,Dec GUN     
  SEC=AY
  SEC2 = DAY
  GoSub AYSEC
  GoSub GUNSEC 
 
  If SAAT=0 Then
  If DAK=0 Then
  If SN=0 Then
  GoSub cercCli
  EndIf
  EndIf
  EndIf
Return 






'*****************   ISI SENSÖRU    ***************
    SENSOROKU:
        Inc AC
OWrite DQ, 1, [$CC, $44]     
Repeat
DelayMS 25                   
ORead DQ, 4, [C]             
Until C <> 2                 
OWrite DQ, 1, [$CC, $BE]     
ORead DQ, 2,[Temp.LowByte,Temp.HighByte, C, C, C, C, C, CPERD]

If Temp=0 Then ISARET = SIF
If Temp>0 Then ISARET = AR
If Temp>500 Then
Temp=65536-Temp
ISARET = EK
EndIf

ISI = ((Temp*10) / 16)/10
    Return
   


proton da yeni oldugumdan biryerleri atlıyor olabilirmiyim? ısı bölümünü baska programdan aldım. ısı bar şekli ise kendime ait.  ısı bar kısmında olabilir diye düşünüyorum ?

   

My75

#3
Genel olarak inceleyecek kafa kalmadı şu saatte ama ilk gördüğüm hata

DON:

If PORTA.2=0 Then DelayMS 100 : GoTo STMENU
GoTo DON

böyle yazmışsın ama bu şu demek

If PORTA.2=0 Then DelayMS 100
GoTo STMENU
GoTo DON

doğrusu

If PORTA.2=0 Then DelayMS 100 : GoTo STMENU:endif
GoTo DON


Yani porta.2=0 veya 1 farketmez herşekilde STMENU.Buna benzer hatalar olabilir..


Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

emrah

yardımınz için sagolun fakat öyle bir yazım yanlışı olsa derleyemezdim hata veriridi derleyici.

yanyana yazdıgın zaman endif ile sonlandırmaya gerek yok pic basi te oldugu gibi.  koşul sonrası olacaklar alt alta yazılsaydı ozaman endif kullanılırdı.


My75

O zaman siz sadece porta.2=0 olduğunda bir gecikme sağlıyorsunuz yani koşula bağlı olarak STMENU'ye gitmiyor.Onu demek istedim.Yoksa hata vermez tabi.
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

emrah

yok olurmu öyle şey, İF komutundan sonra koşul sağlandıysa devamındaki işleri sırası ile yapar.
proton olarak idda etmiyorum ama pic basıc te bu böyledir, aynı komutlar oldugundan protondada böyle oldugunu düşünüyorum

My75

#7
Protonda endif kullanılmadan bir şeyler yapılıyordu ama hatırlayamadım,bu şekildemiydi,emin değilim.Gerçi sorunun bundan değildir.

Tamam haklısın ben yanılmışım,help kısmına göz attım,sorun yok,iyi akşamlar.
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

emrah

neyse yardımların için sagol.  protonda profesyonel arkadas yokmu yardım edebilecek ?

Klein

Protondan anlamıyorum bu yüzden kodda hata var mı yok mu bilemem.
Ama dikkatimi çeken birkaç nokta var.

ISI değerinizin 32 olması için  temp değerinizin  512 olması gerek.  Ama siz tempi hesaplarken
If Temp>500 Then 
 Temp=65536-Temp

şart cümlesini koymuşsunuz.  Burada yapılan işlem nedeniyle sorun gerçekleşiyor olabilir.
Sanırım bunu negatif sayı için yaptınız.  Eğer öyle ise, ve sorun gerçekten burada ise  "if temp >  32767" olarak değiştirirseniz. tüm pozitif sıcaklık bölgesinde sorunsuz çalışabilirsiniz.

emrah

ısı programını hazır olarak baska programdan kopyaladıgım için o şekilde gelmiş. programı bas dosyasında çalıstırıp ISI degişkeninin neler aldıgını gözlemliyordum ancak burdaki satırın sorun yapacagı aklıma gelmedi.

klein, yardımların için sagol sorun çözüldü. 

ordaki 500 ü ne amaçla yazmış orayı anlayamdım? 32 derece 500 ün üstüne cıkıyor ISI degişkeninin değeri. - ısı işareti almayla ne alakası var ?

Klein

#11
işaretli sayı ile ilgisi şu:

Binary sistemde işaretli sayı kavramı yok. Ama derleyiciler işaretli sayıyı işlemek için bir yöntem uyguluyor.
Yöntem şu:
Normalde değeri 0 olan 16 bit sayıyı 1 eksiltirsen değeri 65535 olur. Derleyici bu sayıyı -1 kabul ediyor.
Ds serisi sıcaklık ölçerler de  de aynı mantığı kullanıyor. 
Örneğin Ds18B20 12 bit sıcaklık ölçer 0.0625 derece aralıklarla ölçüm yapıyor.  +0.0625 derece için sensör çıkışı 1 ,  0.125 derece için 2,
0,5 derece için 8 olur.  aynı şekilde -0.0625 derece için 65535 , -0.125 için 65534 olur. 

Çalışmanızda işaretsiz sayı kullanıyorsanız ,  ama gelen veri işaretli ise   karşılaştırmada

if(x<0) ifadesi işe yaramaz. çünkü işaretsiz sayı ile çalıştığınız için derleyici için busayı hep pozitiftir ve bu şart anlamsızdır. Bu gibi durumlarda
işaretli olabilen bir sayıyı işaretsiz değişkene attığımızda, işaretin varlığını sayının belirli bir değerden büyük olup olmamasına göre anlarız.
bu değer 8 bit için 127 , 16 bit için 32767 dir.   

Muhtemelen kodu yazan arkadaş 9 bit sensör ile çalışıyordu. Bunun için sayıyı 500 olarak değerlendirdi.

emrah

#12
açıklamalarınız içinde teşekkür ederim. şimdi anlaşıldı ...

birde şu aklıma takıldı;

If Temp=0 Then ISARET = SIF
If Temp>0 Then ISARET = AR
If Temp>32767 Then
Temp=65536-Temp
ISARET = EK
EndIf



temp bilgisinden 65536 yı çıkarmış. bu sayı 32 bit degilmi ? fakat temp de word olarak tanımlı ?


Klein

Bu işlemde bir anormallik yok.  Sonuç 16 bit değişkene sığıyorsa sorun olmaz.