saat devamlı ileri sayıyor+(videolu) hata nerede?

Başlatan adembas, 10 Ocak 2011, 17:20:31

adembas

Herkese merhaba. ben Ankara'dan Adem. Aranıza yeni katılıyorum.pic ile yeni ugraşmaya başladım ve proton kullanıyorum. Yeni pic deneme kartı aldım ve saat projesi ustunde calısıyorum fakat sankı saat ılerı ayar dugmesıne basılmıs gıbı ılerı sayıyor vıdeoda gorebılırsınız. kodları da gonderıyorum. Lutfen yardım edın..
http://www.youtube.com/watch?v=G00_icEMUHI


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 5/15/2010                                         *
'*  Version : 1.0                                               *
'*  Notes   : lcd de yazı denemesi                                                  *
'*          :                                                   *
'****************************************************************
Device=16F84A
XTAL=4
TRISB=0
PORTB=0



Dim i As Byte
Declare LCD_TYPE alpha
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
Declare LCD_DTPIN PORTB.0
Declare LCD_ENPIN PORTB.5
Declare LCD_RSPIN PORTB.4

basla:

   saat         var     Byte
dsaat        var     Byte
dakika       var     Byte
saniye       var     Byte
ticks        var     Byte
guncelle     var     Byte


        pause   500
        saat    =   0
        dakika  =   0
        saniye  =   0
        ticks   =   0
        guncelle=   1
        
        OPTION_REG  =   $55
        INTCON      =   $a0
        On  Interrupt   GoTo    tickint
        PORTB=0
        TRISB=%00000000
        PORTA=1
        TRISA=%11111111
        
ana_dongu:
        If  PORTB.1=0   Then    saat_arttir        
        If  PORTB.2=0   Then    saat_azalt
        If  PORTB.3=0   Then    dak_arttir
        Cls
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," PM"
        EndIf
            guncelle=0
     EndIf
        
        GoTo    ana_dongu
        
saat_arttir:
        lcdout  $fe,$c0,"   *SAAT ILERI*"
            saat=saat+1
            If saat >=24 Then
                saat=0
            EndIf
        GoTo    ark_sondur

saat_azalt:
        lcdout  $fe,$c0,"   *SAAT GERI*"
       
            saat=saat-1
            If saat >=24 Then
                saat=23
            EndIf
        GoTo    ark_sondur    
            
dak_arttir:
        lcdout  $fe,$c0,"   *DAK.ILERI*"
        dakika=dakika+1
        If dakika   >= 60 Then
            dakika=0
            saat=saat+1
            If saat >=24 Then
                saat=0
            EndIf
        EndIf
        GoTo    ark_sondur

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
                    Sound  PORTA.3,[110,20]
                       If saat>=24 Then
                            saat=0
                        EndIf
                EndIf
        EndIf
        guncelle=1
        
tiexit:
    INTCON.2=0
    Resume
End





kod tag kullanıldı
ayrıca, video hata vermektedir .
maxim

Ruzgarbey

kodlarını birde şu şekilde denermisin acaba
ticks=ticks+1
if ticks=61 then
ticks=0
saniye=saniye+1
endif
if saniye=60 then
saniye=0
dakika=dakika+1
endif
if dakika=60 then
saat=saat+1
Sound  PORTA.3,[110,20]
dakika=0
endif
if saat=24 then saat=0
guncelle=1
INTCON.2=0
    Resume
kolay gelsin.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

adembas

Teşekkur ederim yardımınız için. Verdiginiz komutları değiştirdim , sorun hala devam ediyor...

Digimensch



ete

Adembas,

Anladığım kadarı ile programı PBP dan Protona aklına estiği gibi çevirmişsin.

Bazı hatalar var tabiiki programda sorun onlardan kaynaklanıyor. Sırası ile açıklayayım sonrada düzeltilmiş halini vereceğim.

Birincisi Option Registerinde gereksiz tanımlama mevcut. Bu nedenle Onu değiştir. Option register değeri 5 olacaktır.
Daha sonra değişken tanımlamaları PBP şeklinde olmuş onlarıda Proton tanımlamasına çevir.
Protonda Dim Değişken as Byte (yada Word) şeklinde tanımlanır.
Daha sonra gecikme komutları yine PBP daki şekli ile kalmış Onları Delayms olarak değiştir.
Daha sonra ekrana yazdırma komutlarıda yine PBP dan kalma. Onlarıda Print At komutları ile değiştir.

Asıl önemli hata, butonları PortB.1 , PortB.2 ve PortB.3 pinlerine vermişsin ama bunları Tris registerinde belirtmemişsin.
Ama en önemlisi aynı pinleri LCD nin data hattı olarak göstermişsin. Bu nedenle ,
- Butonları PortA ya geçir. Yani;
POrtA=0
TrisA=%00000111 şeklinde tanımlama yap ve butonları birer pullup direnci ile PortA.0 , PortA.1 ve PortA.2 ye bağla. Butonların diğer ucu GND de olmalıdır. Butona basılınca PortA pinlerine LOW uygulanacaktır.

Ana döngü eiketi altında bir kaç satır sonra CLS komutu var. Bu komut ekranın görünürlüğünü ortadan kaldırmaktadır. Bu komutu oradan sil ve onun yerine ARK SONDUR etiketi altına ;
Print At 2,1,Rep 32\16
komutunu ekle.

Bunları tamamladıktan sonra programı derle ve çalıştır. Çalışacaktır.

Doğru programı aşağıda veriyorum.

E T E

Device=16F84A
Xtal=4
PORTA=0
TRISA=%00000111
TRISB=0
PORTB=0

Dim i As Byte
Declare LCD_Type alpha
Declare LCD_Lines 2
Declare LCD_Interface 4
Declare LCD_DTPin PORTB.0
Declare LCD_ENPin PORTB.5
Declare LCD_RSPin PORTB.4

basla:

Dim saat   As    Byte
Dim dsaat  As Byte
Dim dakika     As     Byte
Dim saniye     As     Byte
Dim ticks        As     Byte
Dim guncelle     As     Byte


       DelayMS   500
        saat    =   0
        dakika  =   0
        saniye  =   0
        ticks   =   0
        guncelle=   1
       
        OPTION_REG  =   $55
        INTCON      =   $a0
        On  Interrupt   GoTo    tickint
        PORTB=0
        TRISB=%00000000
        PORTA=1
        TRISA=%11111111
       
ana_dongu:
        If  PORTA.0=0   Then    saat_arttir       
        If  PORTA.1=0   Then    saat_azalt
        If  PORTA.2=0   Then    dak_arttir
'        Cls
kontrol:


    If  guncelle    =   1   Then
        Print At 1,4
 
        dsaat=saat
        If (saat//12)=0 Then
            dsaat=dsaat+12
        EndIf
       
        If  saat<12 Then
            Print  Dec2 dsaat,":",Dec2  dakika,":",Dec2 saniye," AM"
        Else
            Print  Dec2  (dsaat-12),":",Dec2 dakika,":",Dec2 saniye," PM"
        EndIf
            guncelle=0
     EndIf
       
        GoTo    ana_dongu
       
saat_arttir:
        Print At 2,1,"   *SAAT ILERI*"
            saat=saat+1
            If saat >=24 Then
                saat=0
            EndIf
        GoTo    ark_sondur

saat_azalt:
        Print At 2,1,"   *SAAT GERI*"
       
            saat=saat-1
            If saat >=24 Then
                saat=23
            EndIf
        GoTo    ark_sondur   
           
dak_arttir:
        Print At 2,1,"   *DAK.ILERI*"
        dakika=dakika+1
        If dakika   >= 60 Then
            dakika=0
            saat=saat+1
            If saat >=24 Then
                saat=0
            EndIf
        EndIf
        GoTo    ark_sondur

ark_sondur:
        For i=  1   To  25
        DelayMS   10
        Next    i
        guncelle=1
        Print At 2,1,Rep 32\16
        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
                    Sound  PORTA.3,[110,20]
                       If saat>=24 Then
                            saat=0
                        EndIf
                EndIf
        EndIf
        guncelle=1
       
tiexit:
    INTCON.2=0
    Resume
'    Enable
End
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

adembas

Teşekkur ederim ETE hocam dediginiz gibi düzenledim çalıştı devre. Benim pic deneme kartında butona basınca HİGH oluyor, onlara göre düzenlemesini yaptım. Sonraki aşama alarm ekleme olacak. Biraz ugraşayım bakalım..

omereliusuk

eğer alarm devresi ekleyeceksen bu sistem tam kararlı çalışmaz. gecikmeler yaşanabilir. bence sen RTC DS1302 veya DS1307 kullanmaya bak. eğer sadece basit bir devre istiyorsan veya kesmeyi öğrenmek istiyorsan eyvallah ona diyeceğim yok. nisan ayında yeni öğrenmeye başladığım zaman bu yöntemi öğrenmiştim ilk olarak. daha sonra bu yöntemin gecikmeler sebep olacağın gördüm ve RTC kullanmaya karar verdim. tabi karar yine senin...