avatar_elektro77

ZAMAN RÖLESİ

Başlatan elektro77, 12 Haziran 2020, 19:40:35

elektro77

Merhabalar:
Rardaki devrede ve yazılımda ete hocamın kaynaklarından yararlanıp bir proje yapmak istiyorum.
Amacım açma ve çalışma zamanını ayarlayabileceğim bir röleyi açıp kapatmak
Açma zamanım 0-1 saat aralığında çalışma zamanım ise 1-20 dakika aralığında olacak ve bir buton yardımı ile start verildiğinde, açılma zamanı  ayarlanan set değerinden  geriye doğru ekran üzerinde saymaya başlayacak. Röle açıldığında ise çalışma zamanı geriye doğru saymaya başlayacak ve döngü stop tusuna basılıncaya kadar bu şekilde devam edecek.
Bu ayarları iki ayrı grup, ayar tuşları kullanarak yapmak istiyorum. Yani menülü olmayacak.
Herhangi bir menüye girmeden benim için biraz daha kolay olacağını düşündüm.
Açma zamanını da çalışma zamanını da ayarlayabildiğim iki tuş grubu tasarladım. Fakat bunların kodlarını henüz yazmaya başlamadım.
Adc kanallarını ise farklı düşüncelerim ve yukarıda bahsettiğim ayarları belki potansiyometreli yapabilirim düşüncesi ile boş bıraktım.

Ekranın alt kısmında yukarıda bahsettiğim durumdan tamamen bağımsız çalışan birde saat tarih olmasını istedim.
Ete hocamın, arşivimde bulunan alarm-saat isimli  bir projesinden tüm kodları kopyalayıp yapıştırdım. Alarma ihtiyacım olmadığı için alarm kodlarını ayıklamaya çalıştım. Ds1307 nin sda ve sck pinlerinin yerlerini değiştirdim. Butonları ise portb dahili pullup ları aktif edip oraya bağladım.
Fakat ds1307 den bilgiyi alamıyor ve saat ve tarihin görüntü alanını ekranın altına yazdıramıyorum.Sıra ile gittiğim için Önce bu konuda yardım istiyorum. Diğer konularda ise takılırsam yine yazarım.
SAYGILARIMLA.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete


Aşağıdaki linki iyice oku bu konuya odaklan.
Odaklan diyorum çünki kopyala yapıştır mantığı ile bu işler olmuyor. Bunu yüzlerce kez söyledim.
RTC den okumadığın bilgileri ekrana yazdırmaya kalkışıyorsun. RTC hafızalarını (registerlerini) hiç bilmiyorsun.

https://etepic.com/index.php/topic,458.0.html

Ete

elektro77

#2
Hocam ne kadarda odaklansam almıyor benim kalın kafa.Ama yinede aşığım bu işe ne yapayım. Sonuç olarak sizin kodlardan derleyip yaptım saat tarihi.
Çalışıyor.
Fakat Saniyeyi de ekrana koyunca gün adı aynı satıra sığmadı.
Birde hocam 2020 olarak yazdırmak için ne yapmam lazım.
Dec4 yaptım ama 0020 olarak gözüktü. BCD ye çevirme konusunda göderdiğiniz linki 50 kere okudum. 2020 olarak yazdırmak için ne yapacağımı anlayamadım. Sahtecilikten nefret ederim ama bende aşağıdaki gibi sahte bir 20 rakamı koyup 2020 yi buldum ama ne kadar doğru olur bilemedim.
LCDOUT $FE,$80,DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN," ",DEC2 AYGUN,".",DEC2 AY,".20",DEC2 YIL," "

Bunu da yaptıktan sonra kopyala yapıştır yapmadan kendimin zaman rölesi ile ilgili yazacağım yerlere geçeceğim. Saatin çokta önemi yoktu ama benimkisi fantazi oldu biraz.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektromanyaq

çok önceden yaptığım bi devre var üzerinde değişiklik yapabilirsin

ete

İLk programındaki hatalardan birisi Analog olan E portunu digital yapmamış olman idi.
RTC den de okunması gerekenleri okumuyor veya okunanları direk desimal formata doğru çevirmiyor idin.
Verdiğim linkte RTC nin nasıl kullanılacağını detaylı anlatmıştım. Gerçi yine kopyala yapıştır yapmışsın ama en azından çalışır bir kod haline gelmiş.
Ama hala Analog pinlerin var göüküyor. Sİstemde analog okuma yapmayacak isen;
ADCON1 registerine %00000100 değeri yerine %00000111 vermen gerekiyor. Data sheet Analog Dİgital Converter kısmında verilen ADCON1 registeri parametrelerine bakarsan göreceksin ne vermen gerektiğini ama akıl mı edemiyorsun bakmakmı istemiyorsun orasını bilemiyorum.
4 adet satırın var LCD de satırın birisini gün adı için kullanıver sende. İllaki gün adınıda yazdırayım diyorsan tabiiki. Çokda gerekli değil bence.

RTC yıl kaydını 0-99 sayı aralığında tutuyor. Bu durumda yıl parametren 20 olarak kayıt ediliyor ve okunuyor. Bunu 2020 olarak göstermek için 2 alternatifin var.
Birincisi seninde uyguladığın yöntem. 20 nin baş tarafına karekter olarak "20" eklenir ve ardından yıl değeri ekrana 2 digit olarak verilirse ekranda elbette 2020 olarak görülür. Yok o şekilde upraşmayayım diyor isen, YEAR (word değişkeni olmalı)=2000+YIL dersin ve ekrana DEC4 YEAR şeklinde yazdırırsın. Hangisini istersen onu kullan. Temel mantık yıl registeri önüne 20 sayısını getirmek nasıl istersen o şekilde yaparsın.
Genelde RTC kullanılan programlarda RTC den okumada kullanılan değişkenlerle ekranda zamanı gösteren değişkenler farklı olursa daha az sorunun olur. İLk programda aynı registerleri kullanıyordun ikincisinde doğru yolu bulmuşsun.
Söyleyecek başka şey yok sanırım.
Ete

 

elektro77

#5
Hocam aşağıdaki gibi birşeyler yapıp devreyi işlevsel hale getirdim ama saçma çalışan bazı durumlar var.
Çalışma şekli şöyle:
Önce direk artır ve azalt tuşları ile zamanlar ayarlanıp sonra sec/kaydete basıp eproma yazıyorum.
Run tuşu ile programı başlatıyorum.
ayarlanan zamanlarda röle açıp kapatıyor.Hepsi bu kadar.
saat ayarlanmak istenirse saat ayar tusuna basılıp açama zamanı tusları ve sec tusu ile ayarlanabiliyor.

saçma kısımı ise Gerim sayım devam ederken sec/kaydet tuşuna basarsam o an neredeyse onu alıyor hafızaya. Almaması gerekli.
Hatalarımı kontrol edebilirmisiniz lütfen?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

Yukarıda bahsettiğim eproma kayıt sorununu ve diğer bazı sorunlarıda çözüp aynı yere yeniden yükledim. Fakat aşamadığım bir sorun var.
Zamanları ayarlarken Artırma ve azaltma işlemlerini daha mantıklı daha etkili ve çözünürlüklü bir şekilde nasıl yapabileceğimi bilemedim. Galiba bir yazılımın menülü olması bu dediğim sorunu aşmak için tasarlanmış bir yöntem gibi duruyor.
Fakat ben kolayı seçeyim diye yine zoru seçtim galiba.
Neyse benim yaptığım tarzda artırma ve azaltma kısmını nasıl daha mantıklı yapabilirim acaba?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#7
Ete Hocam yaptığım yazılımdaki mantık hatalarımı giderebilir misiniz acaba? son hali ektedir.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Bu gibi işler konsantrasyın ve programa hakimiyet gerektirir. 3-5 satırlık progranlarda bu gerekli değil ama uzun progralarda programa tamamen hakim olmak ve her yerin ne yaptığını bilmek gerekir.
Şu anda başımda bir sürü iş var by gibi işlere ayırabileceğim en uzun zaman 10 dak. Bu sürede bir sorun yakalamak zor. Sen en iyisi çalışmaya devam et ve sorun çıkarsa açıkla ona göre çözüm bulalım.

Ete

elektro77

Alıntı yapılan: ete - 15 Haziran 2020, 16:34:09Bu gibi işler konsantrasyın ve programa hakimiyet gerektirir. 3-5 satırlık progranlarda bu gerekli değil ama uzun progralarda programa tamamen hakim olmak ve her yerin ne yaptığını bilmek gerekir.
Şu anda başımda bir sürü iş var by gibi işlere ayırabileceğim en uzun zaman 10 dak. Bu sürede bir sorun yakalamak zor. Sen en iyisi çalışmaya devam et ve sorun çıkarsa açıkla ona göre çözüm bulalım.

Ete

Hocam kodların işi yapan kısımların tamamı aşağıdaki şekildedir. Aşağıya ekle mediğim gerisi ise ekranın altındaki tarih saat programıdır.
Kodlarda eproma kaydetme ile ilgili bazı sorunlar yaşıyorum. Belliki bir yerlerde mantık hatam var.Vakit bulurda kontrol ederseniz sevinirim.
@ __config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF
DEFINE OSC 4
TRISA=%00000000
TRISB=%11111111
TRISC=%00000001
TRISD=%00000010
TRISE=%00000010
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
'--------------------------------------------------------------------------------
ADCON1=%00000111             'ADC KANALLARI DİJİTAL YAPILDI - ADC İPTAL
CMCON=7               'komparatör pinleri iptal hepsi giriş çıkış yapıldı.16F877 de yok.
'OPTION_REG.7=0        'portB deki dahili PULL-UP lar DAHİL edildi. 
OPTION_REG=%00000101  
INTCON=%10100000  
TMR0=0
'--------------------------------------------------------------------------------
DEFINE LCD_DREG		PORTD	
DEFINE LCD_DBIT		4		
DEFINE LCD_RSREG	PORTD	
DEFINE LCD_RSBIT	2	
DEFINE LCD_EREG		PORTD	
DEFINE LCD_EBIT		3		
DEFINE LCD_BITS		4	
DEFINE LCD_LINES	4
'DEFINE ADC_BITS 10     '(Bits)
'DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/32)
'DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)
'-------------------------------------------------------------------- 
SYMBOL AARTIR=PORTB.0
SYMBOL AAZALT=PORTB.1
SYMBOL CARTIR=PORTB.2
SYMBOL CAZALT=PORTB.3
SYMBOL SEC   =PORTB.4
SYMBOL RUN   =PORTB.6
SYMBOL STOPP =PORTB.7
SYMBOL ROLE1 =PORTC.2
'--------------------------------------------------------------------------------
SYMBOL SCL  =PORTE.0'DS1307 TANIMLARI
SYMBOL SDA  =PORTE.1
'--------------------------------------------------------------------------------
'ZAMAN ROLESİ DEĞİŞKENLERİ
SAYACC  VAR BYTE
SNN     VAR BYTE 
DAKK    VAR BYTE
SAATT   VAR BYTE
OK      VAR BYTE
SAYAC1  VAR BYTE
SN1     VAR BYTE
DAK1    VAR BYTE
SAAT1   VAR BYTE
CALIS   VAR BIT
I       var BYTE' for next döngüsünde ve delayda kullanılan deger
BUZER  VAR PORTD.0
TIKALI VAR PORTC.0
'-------------------------------------------------------------------------------
'EKRAN ALTI SAAT DEĞİŞKENLERİ----
SYMBOL SAATAYAR=PORTD.1
SAAT    VAR BYTE  
DAK     VAR BYTE  
SN      VAR BYTE  
ESKISN  VAR BYTE
AYGUN   VAR BYTE 
AY      VAR BYTE 
YIL     VAR BYTE  
HAFGUN  VAR BYTE 
SECOND  VAR BYTE
HOUR    VAR BYTE
MINUTE  VAR BYTE
WEEK    VAR BYTE
DAY     VAR BYTE
MONTH   VAR BYTE
YEAR    VAR BYTE
TEMP    VAR BYTE
SIRA    VAR BYTE


LCDOUT $FE,$40,0,4,12,31,31,12,4,0'SAĞDAN VE SOLDAN OK İŞARETLERİ
LCDOUT $FE,$48,0,4,6,31,31,6,4,0  'SAĞDAN VE SOLDAN OK İŞARETLERİ
CLEAR
'----------------------------EKRAN TEMİZLE--------------------------------------
PAUSE 200
LCDOUT $FE,1
PAUSE 200
'------------------------------------------------------------------------------- 
GOSUB EPROMOKU
gosub zamanoku  'ALT EKRAN SAATİNİ OKU 
gosub EKRAN_STANDBY'ALT EKRAN SAATİNİ EKRANA YAZ
'---------------------------PROGRAM-BASLA---------------------------------------
ON INTERRUPT GoTo KESME


BASLA:'*************************************************************************
 
IF SN1=0 AND DAK1=0 AND SAAT1=0 THEN 
GOSUB EPROMOKU
ENDIF
'-------------------TIKANMA DURUMUNDA YAPILACAKLAR------------------------------
IF CALIS=1 THEN' AND ROLE1=1 THEN
       'CALIS=0
       IF TIKALI=0 THEN'TIKALI SENSÖRÜ
       LCDOUT $FE,$94,"ERR1"
       GOSUB BIP
    ENDIF
 ENDIF


'--------------------------CİHAZI-ÇALIŞTIRMA------------------------------------
IF RUN=0 THEN
      GOSUB BIP
      CALIS=1
      LCDOUT $FE,$94,"RUN "
      ENDIF
IF STOPP=0 THEN
      GOSUB BIP
      CALIS=0
      LCDOUT $FE,$94,"STOP"
      ENDIF

'----------------------------AYARLARI EPROMA YAZMA------------------------------
IF CALIS=0 THEN'Eğer cihaz run durumunda değilse
   IF SEC=0 THEN
   GOSUB BIPBIP 
   
WRITE 0,SNN
WRITE 1,DAKK
WRITE 2,SAATT
WRITE 3,SN1
WRITE 4,DAK1
WRITE 5,SAAT1
LCDOUT $FE,$94,"KAYDEDILDI"
PAUSE 100
LCDOUT $FE,1
PAUSE 100
      ENDIF
   ENDIF

'--------------------------------EKRAN------------------------------------------
IF SNN=0 AND DAKK=0 AND SAATT=0 THEN 
LCDOUT $FE,$80,"CLS: ",1," ", DEC2 SAAT1,":",DEC2 DAK1,":",DEC2 SN1," ",0
LCDOUT $FE,$C0,"AC :   ", DEC2 SAATT,":",DEC2 DAKK,":",DEC2 SNN,"    "

ELSE

LCDOUT $FE,$80,"CLS:   ", DEC2 SAAT1,":",DEC2 DAK1,":",DEC2 SN1,"   " 
LCDOUT $FE,$C0,"AC : ",1," ",DEC2 SAATT,":",DEC2 DAKK,":",DEC2 SNN," ",0
endIF
'-------------------------------------------------------------------------------
IF SNN=0 AND DAKK=0 AND SAATT=0 THEN
ROLE1=1
ELSE
ROLE1=0
ENDIF

IF SAATAYAR=0 THEN GOSUB ZAMAN_AYAR
gosub zamanoku 
gosub EKRAN_STANDBY


'-------------------------AÇMA ZAMANI AYARLAMA----------------------------------
IF CALIS=0 THEN 'Eğer cihaz run durumunda değilse
         IF AARTIR=0 THEN
         SNN=0
         DAKK=DAKK+1
         gosub DELAY  
             IF DAKK>=59 THEN
                DAKK =59
             ENDIF
         ENDIF
ENDIF  
'-------------------------------
IF CALIS=0 THEN 'Eğer cihaz run durumunda değilse
         IF AAZALT=0 THEN
         SNN=0
         DAKK=DAKK-1
         gosub DELAY  
             IF DAKK>=59 THEN
                DAKK =1
            ENDIF
         ENDIF
ENDIF   
'-----------------------ÇALIŞMA ZAMANI AYARLAMA---------------------------------
IF CALIS=0 THEN  'Eğer cihaz run durumunda değilse
         IF CARTIR=0 then
         SN1=0
         DAK1=DAK1+1
         gosub DELAY  
             IF DAK1>=59 THEN
                DAK1 =59
             ENDIF
         ENDIF
ENDIF                     
'------------------------------
IF CALIS=0 THEN   'Eğer cihaz run durumunda değilse
        IF CAZALT=0 then
        SN1=0 
        DAK1=DAK1-1
        gosub DELAY  
            IF DAK1>=59 THEN
               DAK1 =1
            ENDIF
        ENDIF
 ENDIF 



GOTO BASLA

'---------------------------EPROM OKUMA-----------------------------------------
EPROMOKU:
IF SN1=0 AND DAK1=0 AND SAAT1=0 THEN 
READ 0,SNN
READ 1,DAKK
READ 2,SAATT
READ 3,SN1
READ 4,DAK1
READ 5,SAAT1 
ENDIF
RETURN
'-------------------------------------------------------------------------------
DELAY:
FOR I=0 TO 100
PAUSE 3
NEXT
RETURN

BIP:
    HIGH buzer   
 pause 50
     LOW buzer  
  RETURN
BIPBIP:
     HIGH buzer   
    PAUSE 50
      LOW buzer 
    PAUSE 100
     HIGH BUZER
    PAUSE 50
      LOW BUZER 
RETURN

'-------------------------GERİ SAYIM saati---------------------------------------
DISABLE
KESME:
IF CALIS=1 THEN
IF SNN=0 AND DAKK=0 AND SAATT=0 THEN 
SAYAC1=SAYAC1 +1  
IF SAYAC1=61 then  
SAYAC1=0
SN1=SN1-1
 IF SN1>=59 THEN 
    SN1=59
      DAK1=DAK1 -1  
        IF DAK1>=59 THEN
          DAK1=59
           SAAT1=SAAT1-1
             IF SAAT1>=23 THEN
              SAAT1=0
             DAK1=0
            SN1=0
             ENDIF
           ENDIF
         ENDIF
      ENDIF  
'--------------------------------------
ELSE 
'--------------------------------------
SAYACC=SAYACC+1  
IF SAYACC=61 then  
   SAYACC=0
    SNN=SNN-1
      IF SNN>=59 THEN 
         SNN=59
         DAKK=DAKK -1  
          IF DAKK>=59 THEN
             DAKK=59
             SAATT=SAATT-1
               IF SAATT>=23 THEN
              SAATT=0
             DAKK=0
            SNN=0
          ENDIF
         ENDIF
       ENDIF  
    ENDIF
ENDIF
ENDIF
'------------------------------------------------------------------------------- 
INTCON.2=0  
RESUME
ENABLE

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Eproma kayıt işlemi basitçe WRITE adres,bilgi:pause 10  şeklinde olmalıdır.
Adres denilen kayıt adresi oluyor 0-255 arasında (işlemci cinsine bağlı olarak değişebilir), bilgi denilen ise kayıt edilecek bilgidir. Bilgi 8 bitlik olmalıdır. 16 bitlik bilgiler 2 peşpeşe adrese kayıt edilir. Her kayıt işlemi 10 ms lik gecikme ister. Bu kayıtın tamamlanabilmesi için gereklidir. Bu süreyi vermez isen bilgi kayt edilmeden işlem yarıda kesilebilir.
Örnek vereyim; Brogramında aşağıdaki satırlar var.
WRITE 0,SNN
WRITE 1,DAKK
WRITE 2,SAATT
WRITE 3,SN1
WRITE 4,DAK1
WRITE 5,SAAT1
LCDOUT $FE,$94,"KAYDEDILDI"
PAUSE 100
LCDOUT $FE,1
PAUSE 100


BU satırları ben olsam şöyle yazardım.
LCDOUT $FE,$94,"KAYDEDILDI"
WRITE 0,SNN:pause 10
WRITE 1,DAKK:pause 10
WRITE 2,SAATT:pause 10
WRITE 3,SN1:pause 10
WRITE 4,DAK1:pause 10
WRITE 5,SAAT1:pause 10
pause 50
LCDOUT $FE,1
PAUSE 100
Bu bilgileri tek bir write komutu ilede yazabilirsin.
LCDOUT $FE,$94,"KAYDEDILDI"
WRITE 0,SNN,DAKK,SAATT,SN1,DAK1,SAAT1:pause 10
PAUSE 100
LCDOUT $FE,1
PAUSE 100
Programına bakılırsa eproma kayıt yapabilmek için,
Öne CALIS=0 olmalı açıklamana göre ise "Eğer cihaz run durumunda değilse"
Sonra SEC=0 olmalı
Bu iki şart yerine gelirse program önce BIPBIP adresine gidiyor
   GOSUB BIPBIP adresine gidip 200 ms buzzer öttürüyor ve geri dönüp eproma kayıt yapıyor.
Sürekli söylediğim bir şey var. Bir programda kesme kullanılıyorsa o programda PAUSE komutu kullanılamaz!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Sebebinide söyledim. Kesmeye git emri geldiğinde program bir pause komutunu icra ediyor ise pause süresi bitmeden program kesmeye gidemez. Buda senin saatinin düzgün çalışmayacağı anlamına gelir. Gecikme gerekiyor ise süre pauseus 5 miktarı kadar dilimlere bölünüp bir döngü çalıştırılıp o kadarlık gecikme elde edilmelidir.
Böylece kesme emri geldiğinde program en fazla 5us bekler ve kesmeye geçer. Buda ihmal edilebilecek bir süredir.

Ete


elektro77

#11
Alıntı yapılan: ete - 15 Haziran 2020, 18:25:25Sürekli söylediğim bir şey var. Bir programda kesme kullanılıyorsa o programda PAUSE komutu kullanılamaz!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Sebebinide söyledim. Kesmeye git emri geldiğinde program bir pause komutunu icra ediyor ise pause süresi bitmeden program kesmeye gidemez. Buda senin saatinin düzgün çalışmayacağı anlamına gelir. Gecikme gerekiyor ise süre pauseus 5 miktarı kadar dilimlere bölünüp bir döngü çalıştırılıp o kadarlık gecikme elde edilmelidir.
Böylece kesme emri geldiğinde program en fazla 5us bekler ve kesmeye geçer. Buda ihmal edilebilecek bir süredir.

Ete


Evet hocam bunu bana belkide 10. kez soylediniz. Baska basliklar altinda da belki 50 kez okudum ama atlamisim özür dilerim.
Hocam bana gerekli olan 50ms,100ms ve 300ms  lik gecikmeler icin bu dediğiniz sartta nasil birer dongu kurmaliyim.
İkincisi ise eproma kayit konusunda soylediklerinizi dikkatle okudum. Cokta iyi anladim.
Fakat epromile ilgili asil sorunum şu;
Çalisma zamani, örneğin 3 ise, cazalt butonu ile sıfıra cektigim zaman o anda ekranda bazi gariplikler oluyor. Ekran Sifir ile kaydedilmis veri arasinda dönüyor. Bu durum son kullaniciyi yaniltabilir diye dusunuyorum. Bunu nasil cozecegimi bilemedim.
Umarım anlatabilmisimdir.
Saygilarimla.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Timer-1 sayacını kullanarak döngü sürelerini ölçmek ve istenilen sürelerde döngü yaratmak mümkün. BUnu senin için yaptım ve aşağıdaki sonuçları aldım.
           FOR TEMP=0 TO 6152   '50 ms
             PAUSEUS 5  
           NEXT
           FOR TEMP=0 TO 10502   '100 ms
             PAUSEUS 5 
             pauseus 5 
           NEXT
           
           FOR TEMP=0 TO 16100   '300 ms  
             PAUSEUS 5 
             pauseus 5 
           NEXT 

Programdaki sorunları görebilmem için devreyi çalıştırmam ve soruna göre çözüm bulmam gerekir. Buraya simulasyon dosyası koyarsan bakarım.
Ete

elektro77

#13
Teşekkürler hocam.
Bu durumda "TEMP" veya benim programımdaki "I" değişkeninini "WORD" olarak atayacağız değil mi Hocam?
yada şu for next olayını biraz açıklayabilirmisiniz hocam. Çünkü ben bugüne kadar hep ezbere ve deneme yanılma ile bu süreli ayarlamıştım.
Simülasyonu yukarıya, 5 mesaj öncesine rar olarak koymuştum .
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#14
Teşekkürler hocam.
Hocam gecikmeleri istediğim oranda sizinde verdiğiniz bilgiler ışığında deneme yanılma yöntemi ile ayarladım.
birkaç mesaj önce yazdığım : "Çalisma zamani, örneğin 3 ise, cazalt butonu ile sıfıra cektigim zaman o anda ekranda bazi gariplikler oluyor. Ekran Sifir ile kaydedilmis veri arasinda dönüyor. Bu durum son kullaniciyi yaniltabilir diye dusunuyorum. Bunu nasil cozecegimi bilemedim." Çünkü yazılıma adc ekleyip birde potansiyometre ile  yapmayı düşünüyorum. Bu durumda yukarıdaki sorunum dahada problem çıkarabilir.

Yazılıma birde role aktif ise kalp atış ritmi gibi bir ses çıkarması için kodlar ekledim.
Fakat bu kodlar kesmeyi etkilemese de ekranda, yazmayı aksatıyor . Bunu nasıl çözebilirim.

Yeni halini ve simülasyonu aşağıya yeniden ekliyorum hocam...
@ __config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF
DEFINE OSC 4
TRISA=%00000000
TRISB=%11111111
TRISC=%00000001
TRISD=%00000010
TRISE=%00000010
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
'--------------------------------------------------------------------------------
ADCON1=%00000111             'ADC KANALLARI DİJİTAL YAPILDI - ADC İPTAL
CMCON=7               'komparatör pinleri iptal hepsi giriş çıkış yapıldı.16F877 de yok.
'OPTION_REG.7=0        'portB deki dahili PULL-UP lar DAHİL edildi. 
OPTION_REG=%00000101  
INTCON=%10100000  
TMR0=0
'--------------------------------------------------------------------------------
DEFINE LCD_DREG		PORTD	
DEFINE LCD_DBIT		4		
DEFINE LCD_RSREG	PORTD	
DEFINE LCD_RSBIT	2	
DEFINE LCD_EREG		PORTD	
DEFINE LCD_EBIT		3		
DEFINE LCD_BITS		4	
DEFINE LCD_LINES	4
'DEFINE ADC_BITS 10     '(Bits)
'DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/32)
'DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)
'-------------------------------------------------------------------- 
SYMBOL AARTIR=PORTB.0
SYMBOL AAZALT=PORTB.1
SYMBOL CARTIR=PORTB.2
SYMBOL CAZALT=PORTB.3
SYMBOL SEC   =PORTB.4
SYMBOL RUN   =PORTB.6
SYMBOL STOPP =PORTB.7
SYMBOL ROLE1 =PORTC.2
'--------------------------------------------------------------------------------
SYMBOL SCL  =PORTE.0'DS1307 TANIMLARI
SYMBOL SDA  =PORTE.1
'--------------------------------------------------------------------------------
'ZAMAN ROLESİ DEĞİŞKENLERİ
SAYACC  VAR BYTE
SNN     VAR BYTE 
DAKK    VAR BYTE
SAATT   VAR BYTE
OK      VAR BYTE
SAYAC1  VAR BYTE
SN1     VAR BYTE
DAK1    VAR BYTE
SAAT1   VAR BYTE
CALIS   VAR BIT
I       var word' for next döngüsünde ve delayda kullanılan deger
BUZER  VAR PORTD.0
TIKALI VAR PORTC.0
'-------------------------------------------------------------------------------
'EKRAN ALTI SAAT DEĞİŞKENLERİ----
SYMBOL SAATAYAR=PORTD.1
SAAT    VAR BYTE  
DAK     VAR BYTE  
SN      VAR BYTE  
ESKISN  VAR BYTE
AYGUN   VAR BYTE 
AY      VAR BYTE 
YIL     VAR BYTE  
HAFGUN  VAR BYTE 
SECOND  VAR BYTE
HOUR    VAR BYTE
MINUTE  VAR BYTE
WEEK    VAR BYTE
DAY     VAR BYTE
MONTH   VAR BYTE
YEAR    VAR BYTE
TEMP    VAR BYTE
SIRA    VAR BYTE


LCDOUT $FE,$40,0,4,12,31,31,12,4,0'SAĞDAN VE SOLDAN OK İŞARETLERİ
LCDOUT $FE,$48,0,4,6,31,31,6,4,0  'SAĞDAN VE SOLDAN OK İŞARETLERİ
CLEAR
'----------------------------EKRAN TEMİZLE--------------------------------------
PAUSE 200
LCDOUT $FE,1
PAUSE 200
'------------------------------------------------------------------------------- 
GOSUB EPROMOKU
gosub zamanoku  'ALT EKRAN SAATİNİ OKU 
gosub EKRAN_STANDBY'ALT EKRAN SAATİNİ EKRANA YAZ
'---------------------------PROGRAM-BASLA---------------------------------------
ON INTERRUPT GoTo KESME


BASLA:'*************************************************************************
 
IF SN1=0 AND DAK1=0 AND SAAT1=0 THEN 
GOSUB EPROMOKU
ENDIF
'-------------------TIKANMA DURUMUNDA YAPILACAKLAR------------------------------
IF CALIS=1 THEN' AND ROLE1=1 THEN
       'CALIS=0
       IF TIKALI=0 THEN'TIKALI SENSÖRÜ
       LCDOUT $FE,$94,"ERR1"
       GOSUB BIP
    ENDIF
 ENDIF
'--------------------------CİHAZI-ÇALIŞTIRMA------------------------------------
IF RUN=0 THEN
      GOSUB BIP
      CALIS=1
      LCDOUT $FE,$94,"RUN "
      ENDIF
IF STOPP=0 THEN
      ROLE1=0
      GOSUB BIP
      CALIS=0
      LCDOUT $FE,$94,"STOP"
      ENDIF

'------------------------AYARLARI EPROMA YAZMA----------------------------------
IF CALIS=0 THEN'Eğer cihaz run durumunda değilse
   IF SEC=0 THEN
   GOSUB BIPBIP 
WRITE 0,SNN,DAKK,SAATT,SN1,DAK1,SAAT1:pause 10   
LCDOUT $FE,$94,"KAYDEDILDI"
FOR I=0 TO 2000'KAYDEDİLDİ YAZISINI 100ms EKRANDA TUT
PAUSEUS 5
PAUSEUS 5
NEXT

LCDOUT $FE,1 'EKRANI TEMİZLE

FOR I=0 TO 2000
PAUSEUS 5
PAUSEUS 5
NEXT
      ENDIF
   ENDIF

'-----------------------------ANA_EKRAN-----------------------------------------
IF SNN=0 AND DAKK=0 AND SAATT=0 THEN 
LCDOUT $FE,$80,"CLS: ",1," ", DEC2 SAAT1,":",DEC2 DAK1,":",DEC2 SN1," ",0
LCDOUT $FE,$C0,"AC :   ", DEC2 SAATT,":",DEC2 DAKK,":",DEC2 SNN,"    "

ELSE

LCDOUT $FE,$80,"CLS:   ", DEC2 SAAT1,":",DEC2 DAK1,":",DEC2 SN1,"   " 
LCDOUT $FE,$C0,"AC : ",1," ",DEC2 SAATT,":",DEC2 DAKK,":",DEC2 SNN," ",0
endIF
'-------------------------ROLE AÇMA KOMUTLARI-----------------------------------
IF SNN=0 AND DAKK=0 AND SAATT=0 THEN
ROLE1=1
ELSE
ROLE1=0
ENDIF
IF CALIS=0 THEN ROLE1=0
'---------------ROLE AKTİF İSE AKTİF SESİ ÇIKAR---------------------------------
IF ROLE1=1 THEN 
FOR I=0 TO 15000
PAUSEUS 5
NEXT
GOSUB AKTIFSES
ENDIF


'-------------------------AÇMA ZAMANI AYARLAMA----------------------------------
IF CALIS=0 THEN 'Eğer cihaz run durumunda değilse
         IF AARTIR=0 THEN
         DAKK=DAKK+1         
         SNN=0         
         gosub DELAY  
             IF DAKK>=59 THEN
                DAKK =59
                
             ENDIF
         ENDIF
ENDIF  
'-------------------------------
IF CALIS=0 THEN 'Eğer cihaz run durumunda değilse
         IF AAZALT=0 THEN
         SNN=0
         DAKK=DAKK-1
         gosub DELAY  
             IF DAKK>=59 THEN
                DAKK =1
            ENDIF
         ENDIF
ENDIF   
'-----------------------ÇALIŞMA ZAMANI AYARLAMA---------------------------------
IF CALIS=0 THEN  'Eğer cihaz run durumunda değilse
         IF CARTIR=0 then         
         SN1=0
         DAK1=DAK1+1
             gosub DELAY
             IF DAK1>=59 THEN
                DAK1 =59
             ENDIF
         ENDIF
ENDIF                     
'------------------------------
IF CALIS=0 THEN   'Eğer cihaz run durumunda değilse
        IF CAZALT=0 then
        SN1=0 
        DAK1=DAK1-1
        gosub DELAY  
            IF DAK1>=59 THEN
               DAK1 =1
            ENDIF
        ENDIF
 ENDIF 

'--------------ALT EKRAN SAATİNİ AYARLAMAK İÇİN KOMUTLAR------------------------
IF SAATAYAR=0 THEN GOSUB ZAMAN_AYAR
gosub zamanoku 
gosub EKRAN_STANDBY

GOTO BASLA

'***************************ALT_PROGRAMLAR**************************************

'----------------------------EPROM OKUMA----------------------------------------
EPROMOKU:
IF SN1=0 AND DAK1=0 AND SAAT1=0 THEN 
READ 0,SNN,DAKK,SAATT,SN1,DAK1,SAAT1
ENDIF
RETURN
'-------------------------------------------------------------------------------
DELAY:
FOR I=0 TO 3000'yaklaşık 50ms gecikme yaratır
PAUSEUS 5
PAUSEUS 5
NEXT
RETURN
'----------------------------------BIP------------------------------------------
BIP:
    HIGH buzer   
FOR I=0 TO 1000
PAUSEUS 5
PAUSEUS 5
NEXT
     LOW buzer  
  RETURN
'-------------------------------BIP_BIP-----------------------------------------
BIPBIP:
     HIGH buzer   
FOR I=0 TO 500'yaklaşık 10ms gecikme yaratır
PAUSEUS 5
PAUSEUS 5
NEXT
      LOW buzer 
FOR I=0 TO 300
PAUSEUS 5
PAUSEUS 5
NEXT
     HIGH BUZER
FOR I=0 TO 500
PAUSEUS 5
PAUSEUS 5
NEXT
      LOW BUZER 
RETURN
'----------------------------AKTIF_SESİ-----------------------------------------
AKTIFSES:
HIGH buzer   
FOR I=0 TO 500
PAUSEUS 5
PAUSEUS 5
NEXT
LOW buzer 
RETURN


'-------------------------GERİ SAYIM saati---------------------------------------
DISABLE
KESME:
IF CALIS=1 THEN
IF SNN=0 AND DAKK=0 AND SAATT=0 THEN 
SAYAC1=SAYAC1 +1  
IF SAYAC1=61 then  
SAYAC1=0
SN1=SN1-1
 IF SN1>=59 THEN 
    SN1=59
      DAK1=DAK1 -1  
        IF DAK1>=59 THEN
          DAK1=59
           SAAT1=SAAT1-1
             IF SAAT1>=23 THEN
              SAAT1=0
             DAK1=0
            SN1=0
             ENDIF
           ENDIF
         ENDIF
      ENDIF  
'--------------------------------------
ELSE 
'--------------------------------------
SAYACC=SAYACC+1  
IF SAYACC=61 then  
   SAYACC=0
    SNN=SNN-1
      IF SNN>=59 THEN 
         SNN=59
         DAKK=DAKK -1  
          IF DAKK>=59 THEN
             DAKK=59
             SAATT=SAATT-1
               IF SAATT>=23 THEN
              SAATT=0
             DAKK=0
            SNN=0
          ENDIF
         ENDIF
       ENDIF  
    ENDIF
ENDIF
ENDIF
'------------------------------------------------------------------------------- 
INTCON.2=0  
RESUME
ENABLE


"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Powered by EzPortal