Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

LCD SAAT SORUNU

Başlatan POWER, 09 Mart 2005, 08:39:37

POWER

Arkadaşlar;
Aşağıda LCD saat uygulaması var.Fakat bir acayip çalışıyor.Çok uğraştım içinden çıkamadım.Proğram kitaptan alıntı olmasına rağmen düzgün çalışmıyor.Hata nerede acaba?Yardımcı olabilirmisiniz?Sizlere kolaylık olsun diye ısıs dosyasını aşağıdaki linke ekliyorum. KOLAY GELSİN.

http://groups.yahoo.com/group/PicProjeUP3/files/POWER]

LCD SAAT:

Define  LCD_DREG    PORTA      
Define  LCD_DBIT    0  
Define  LCD_RSREG   PORTA
Define  LCD_RSBIT   4
Define  LCD_EREG    PORTB
Define  LCD_EBIT    3
'--DEĞİŞKEN TANIMLAMALARI-------------------------------------------------------
saat        var     byte
dsaat       var     byte
dakika      var     byte
saniye      var     byte
ticks       var     byte
guncelle    var     byte
i           var     byte
'-------------------------------------------------------------------------------
@           device WDT_OFF
   Pause   100
   
   saat=   0
   dakika= 0
   saniye= 0
   ticks=  0
     
   guncelle=1
   
   OPTION_REG=$55
   INTCON=$a0
   ON INTERRUPT Goto tickint
   PORTB=0
   TRISB=%00111111
'-------------------------------------------------------------------------------
ana_dongu:
   
   If  PORTB.7 = 0   Then    dak_azalt
   If  PORTB.6 = 0   THEN    dak_arttir

kontrol:
   IF  guncelle = 1  THEN
       Lcdout  $fe, 1
       dsaat = saat
       If  (saat // 12) = 0 Then
           dsaat = dsaat + 12
       Endif
       
       If saat < 12 Then
          lcdout dec2 dsaat, ":", dec2 dakika, ":", dec2 saniye, "AM"  
   
           else
           lcdout dec2 (dsaat-12), ":", dec2 dakika, ":", dec2 saniye, "AM"
         
           Endif
           guncelle = 0
       Endif
       goto ana_dongu
'-------------------------------------------------------------------------------
dak_arttir:
   dakika = dakika + 1
   If dakika >= 60 Then
       dakika = 0
       saat = saat + 1
       If saat >= 24 Then
           saat = 0
       Endif
   Endif
   Goto ark_sondur
'-------------------------------------------------------------------------------
dak_azalt:
   dakika = dakika - 1
   If dakika >= 60 Then
       dakika = 59
       saat = saat - 1
       If saat >= 24 Then
           saat = 23
       Endif
   Endif
'-------------------------------------------------------------------------------
ark_sondur:
   For i = 1 to 25
       Pause 10
   Next i
   guncelle = 1
   Goto kontrol
   Disable
'-------------------------------------------------------------------------------
tickint:
   ticks = ticks + 1
   If ticks < 61 Then tiexit
       ticks = 0
       saniye = saniye + 1
       If saniye >= 60 Then
           saniye = 0
           dakika = dakika + 1
           If dakika >= 60 Then
               dakika = 0
               saat = saat + 1
                   If saat >= 24 Then
                       saat = 0
                   Endif
               Endif
           Endif
       guncelle = 1
'-------------------------------------------------------------------------------
tiexit:
   INTCON.2 = 0
   Resume
   end
TB6BKG

ete

@Power,

Hem programda hemde oluşturduğun şemada bazı hatalar var. Önce programdan başlayalım;

Dikkat etti isen artır ve azalt tuşları Portb.6 ve Portb.7 ye bağlı. Dolayısıyla bu pinlerin giriş olması gerekir. Programda ise TrisB=%00111111 olarak verilmiş yani tam tersi B.6 ve B.7 çıkış olarak ayarlanmış. Bunu düzeltmek için Trisb=255 yazarsan sorun hallolacak.

Şemada Tuşların GND ye bağlı kısımları için Label kullanmışsın ve GND diye isim vermişsin. Ama tuşların GND ye bağlı olan kısmı yukarıda LCD nin GND bacağına tam bağlanmamış ve dolayısıyla tuşlar GND almıyor. Ya irtibatı tam yapacaksın veya tuşlara harici olarak bir GND bağlayacaksın. Bunu yaparsan sorun çözülüyor.

Bu arada saatin nasıl çalıştığı konusunda da biraz bilgi vereyim istersen.
Belki biliyorsundur ama bilmeyenler için açıklamakta yarar var. Sistem TMR0 kesmesi ile çalışıyor. Option Registerine $55 verilerek ön bölücü (prescaler) 1/64 olarak ayarlanmış ve bu bölme işlemi TMR0 için verilmiş.
Diğer taraftan INTCON registerine $A0 verilerek TMR0 kesmesi aktif hale getirilmiş. Sonuçta; TMR0 ;
64 us x 256 = 16384 us = 16,384 ms de bir kesme oluşturacaktır. Her kesme oluşumunda Ticks değişkeni bir artırılacak ve Tricks 61 olunca Saniye değişkeni bir artırılacaktır. Neden derseniz,
16,384 ms x 61 = 999,42 ms ediyor. Buda yaklaşık olarak 1 saniye ye eşdeğerdir. Dolayısıyla her 61 kesmede yaklaşık 1 saniyelik süre geçmiş oluyor. Buradan 1 sn. lik süre elde edilerek saat çalıştırılmış oluyor.

Şayet Saatin daha doğru çalışmasını istersen 1000000-999424=576 us lik bir ilave gecikme gerekiyor. Yani her bir saniye artırımında yaklaşık 575 us lik bir gecikme koymak gerekir. Bunu da Saniye=Saniye+1 satırından hemen sonra koyabilirsin. Komut "Pauseus 575" şeklinde kullanılacaktır. Hatta 574 kullanmakta fayda var zira pause komutu sanırım 2 saykıl yani 2 us lık bir gecikmeye zaten sebep olacak dolayısıyla 574 doğru sonucu verecektir.


KOlay Gelsin
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

POWER

Hocam iyi çalışmalar;
Cevabınız ve açıklayıcı bilgileriniz için çok teşekkür ederim.Söylediğiniz yerleri düzelttikten sonra sorunsuz olarak çalışıyor.Isıs ta gayet güzel çalışıyor.Ben yeni öğrenen bir kişi olarak bu boarddan çok şey öğrendim öğrenmeyede devam ediyorum.Tekrar teşekkür ederim.KOLAY GELSİN
TB6BKG

UHF

Hocam iyi çalışmalar;
Elimde 1 adet 2x16 LCD Display var.Markası ve modeli belli değil.LCD saat uygulamasını ISIS ta olduğu gibi bağladım fakat ekrana hiç bir görüntü gelmiyor.Dısplayın  devreye uygun olması gerekiyormu?Bağlantıları defalarca kontrol ettim fakat sonuç değişmedi.Hata nerede acaba?Sık sık rahatsız ediyoruz ama başka çaremiz yok.Kusura bakmayın. KOLAY GELSİN

ete

Genelde LCD ler standart. Her şeyden önce bacak sayısına bakın. Şayet 14 adet ise muhtemelen çalışacaktır. Tabiiki bozuk değil ise.
İsis de kontrast trimpotu kullanılmadan LCD çalışıyor. Ama gerçekte 22 K lık bir trimpot bu iş için kullanılmalıdır. Bağlama şekli ise;
- Trimpotun giriş ucu (soldaki veya sağdaki olabilir) GND ye bağlanacak.
- Trimpotun orta ucu , LCD nin 3 nolu ucuna bağlanacak.
- Trimpotun son ucu da +5V'ta bağlanacak. Bu trimpotu bağladıktan sonra önce orta ucu GND tarafına çekin yani Orta uç GND ye bağlansın sonra ekranda uygun görüntü alıncaya kadar hafifçe ters yöne doğru trimpotu ayarlayınız.
Bu işlemden önce mutlaka LCD nin bacaklarının doğru olarak bulunması gerekir. Genellikle 1 ve 14. bacaklar numara ile gösterilmiştir. Bunlara dikkat ediniz.
Bütün bunlara rağmen LCD çalışmaz ise ya bozuktur yada dğerleri ile eşlenik değildir.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

cozturk

ISIS te +,- besleme bağlamadan da display çalışıyor. zahmet etmeyiniz. (seri display)

ete

Sevgili Çöztürk,

Her şeyden önce sözünü tam anlayamadım <zahmet etmeyiniz> ne anlama geliyor.
Açıklamaları tam anlamamışsın anlaşılan. Bu başlık altında bir Isis şeması ve dosyası verilmiş vaziyette ve orada LCD ye +5V ve GND bağlantısı yapılmış ancak kontrast trimeri bağlanmamış vaziyette idi. Arkadaşın tecrübesiz biri olacağını ve gördüğünü aynen uyguladığını düşünerek yukarıdaki açıklamayı verdim. Umarım ben senin açıklamanıda yanlış anlamamışımdır.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

cozturk

Estağfirullah,
yani besleme ve gndyi bağlamaya lüzum yok. devre görünümünü sadeleştirmek için. picin beslemesini bağlamıyoruz ya onun gibi

ete

Bak işte yine yanlış anlamışım. Sen işin Isis yanını anlatıyorsun bense gerçek devreyi anlatmaya çalışıyorum. Her neyse bu sohbet lüzümsuz uzayacak iyisimi işi anlayacaklara bırakalım.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

POWER

ETE Hocam iyi çalışmalar;
Sorun kontrast trimpotu kullanmadığımdan kaynaklanıyormuş.Isis te trimpot bağlamadan çalıştığı için yanılgıya düştüm birde tecrübesizlik tabiki.Trimpotu bağladıkdan sonra hemen hemen tamamını gnd ye çekince görüntü geldi bende direkt gnd ye bağladım sorunsuz çalışıyor.Çok teşekkürler.
SORMAK İSTEDİĞİM BİR KAÇ SORUM VAR HOCAM:

1-Saat bölümü, 12'den sonra 01 geçip artarak devam ediyor.Benim yapmak istediğim gündüz bölümünde 12'den sonra 13-14-15 diye devam etmesini istiyorum.
2-Örneğin imleci bir pozisyon sağa kaydırmak için $fe,$c14 kullanılıyor bildiğiniz gibi.3 pozisyon kaydırmak için ben komutların arasına ",' koyarak 3 kez yazdım.Sonuçta oldu ama bunun daha kısa bir yolu yokmu?
Tekrar teşekkür ederim.KOLAY GELSİN
TB6BKG

ete

@Power,
Bu program 12 saat mantığına göre yazılmış. Gerekli düzeltmeler yapılırsa sistem 24 saat mantığına görede çalışabilir. İlk tespitime göre iki yolla yapılabilir. Birincisi, saat sayacını 24 saate çıkaracaksın ve 24 den sonra sıfırlayacaksın ve dolayısıyla AM-PM göstergecini kaldıracaksın. Bu arada programda bu bölüm hatalı. Hiz PM göstergesi yok. Birisi PM olmalı. Programı çok fazla incelemedim sadece saniye hesap mantığını incelemiştim. Sen yapmaya çalış. Boş zamanım olurs abende inceleyip 24 saat üzerinden çalıştıracağım.

İkinci soruna gelince, istediğinin bir yolu kursorü (yani yazılacak yer) direkt gitmek istediğin yere adreslersin ve yaz dediğin zaman oraya yazılır. İlk aklıma gelen bu. Başka gelirse açıklarım. Şİmdi bu nasıl olacak dersen. LCD nin 1. satırı 1. karekterin adresi $80 dir. bu adrese 1-16 sayılarınan hangisini eklersen yazılacak yeri tesbit etmiş olursun. Örnek;
lcdout $fe,$86,"ete" dediğim zaman
soldan itibaren 6. haneden itibaren ete yazısı yazılmış olacaktır.
2. satırın 1. karekter adresi ise $C0 dır. Buna göre kendin nereye yazmak istersen hesapla ve yazıver.

Kolay Gelsin
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

POWER

Hocam iyi çalışmalar;
Verdiğiniz bilgilerle değişik denemeler yaptım fakat bir yerde takıldım kaldım.2x16 LCD dısplay ile aşağıdaki komutları yazarak  

If saat < 12 Then
          lcdout $fe,$83,dec2 dsaat,":",dec2 dakika,":",dec2 saniye,$fe,$94,"AM"
                 
1. satırın 4.hanesinden başlayarak "12:45:10" ve aynı satırın son iki hanesinede "AM" yazdırmayı hedefledim.Fakat "AM" Dısplay de görünmüyor.En son  $fe,$89,"AM" yaptığım zamanda adres saniye hanesine karşılık geldiği için saniyenin olması gerektiği yerde AM harfleri oluyor.  $fe,$90,"AM"   yaptığım zaman "AM" hiç görünmüyor.Yani  $fe,$89,"AM" dan sonraki yazılar görünmüyor.Yine gözden birşeyler kaçırmayayım diye çok uğraştım ama olmadı.Yardımlarınızı bekliyorum.KOLAY GELSİN
ISIS Dosyaları aşağıda:
http://groups.yahoo.com/group/PicProjeUP3/files/POWER]
TB6BKG

ete

@Power,

Anlaşılan Hexadesimal matematiğini bilmiyorsun yada sayıları bilmiyorsun. Desimal olarak izah edeyim.
Hex olarak $80değeri desimal olarak 128'e eşittir. LCD 16 Karekter aldığına göre 128+16 =144 eder. Sondan iki haneye "AM" yazdıracağınıza göre 144-2= 142 eder bunun Hex karşılığı ise 8E dir. dolayısıyla yazacağınız komut şöyle olmalıdır.

   lcdout $fe,$83,dec2 dsaat,":",dec2 dakika,":",dec2 saniye,$fe,$8e,"AM"

Sanırım hatanın nerede olduğunu anladın.
Hex sayılar (0-15 arası)
0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F
olarak yazılır. Sanırım sen desimal gibi topladın hatan orada.

Kolay Gelsin
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

POWER

Teşekkürler Hocam hatayı anladım ve düzelttim.Şimdide 24 lü sisteme göre çalıştırmak için uğraşacağım.Tekrar teşekkürler.KOLAY GELSİN
TB6BKG

ete

@Power,

Programa baktımda aslında sistem 24 saat üzerinden kurulmuş. Dolayısıyla bir iki satırı iptal edersen saat 24 saat üzerinden çalışabilir.
İptal edilecek satırları aşağıda veriyorum

'        If  (saat // 12) = 0 Then           *** iptal edilecek
'            dsaat = dsaat + 12              *** iptal edilecek
'        Endif                                       *** iptal edilecek
       
'        If saat < 12 Then                     *** iptal edilecek
          lcdout $fe,$83,dec2 dsaat,":",dec2 dakika,":",dec2 saniye,$fe,$8e,"AM"                    *** sondaki  ,"AM" bölümü iptal edilecek
                   
'           else                                *** iptal edilecek
'           lcdout $fe,$83,dec2(dsaat-12),":",dec2 dakika,":",dec2 saniye,$fe,$8e,"PM"                      *** iptal edilecek
         
'            Endif                               *** iptal edilecek

Hepsi bukadar. Bunları çıkartırsan saat 24 saat üzerinden çalışır.
Aslında ben senin yerine olsam 3. bir tuş koyarım ve bu tuş ile 12/24 saat çalışmayı seçimli hale getiririm. Hadi yap bakalım yapabilecekmisin.

İptal edilenleri çıkartınca Kontrol bölümü aşağıdaki gibi olacak. Bu arada başta yer alan;
 LCDOUT $FE,1 komutu ekranda kırpışmaya sebep oluyor. Bunun yerine;
 LCDOUT $FE,2 kullan, daha iyi olacaktır.

kontrol:
    IF  guncelle = 1  THEN
        Lcdout  $fe, 2
        dsaat = saat
        lcdout $fe,$83,dec2 dsaat,":",dec2 dakika,":",dec2 saniye,$fe,$8e',"AM
        guncelle = 0
        Endif
        goto ana_dongu


Kolay Gelsin
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com