18F252 SAYAÇ SORUNU

Başlatan trilian, 22 Mart 2021, 23:52:35

trilian

forumdan bazı kodları birleştirdim zaman çalışıyor ama istediğim bu değil kodlarda belirttiğim şey için ne yapabilirim
20dk süre sayacak fakat program sabit süreyle iş yapmayacak döngüler değişken zamanlı olacak ama program örnegin 20 dk çalışmasını istiyorum veya 10 dk ama her döngüdeki süre 1sn veya 5 saniye gibi değişken sürelerde tamamlanıyor sabit deger yok umarım anlatabildim
'*************************************************
'*        18F252                    *
'*************************************************


DEFINE  LCD_DREG        PORTB
DEFINE  LCD_DBIT        4
DEFINE  LCD_RSREG       PORTB
DEFINE  LCD_RSBIT       0
define LCD RWREG        PORTB
define LCD_RWBIT        1
DEFINE  LCD_EREG        PORTB
DEFINE  LCD_EBIT        2
' Define ADCIN parameters
DEFINE  ADC_BITS        10        
DEFINE  ADC_CLOCK       4        
DEFINE  ADC_SAMPLEUS    50
DEFINE OSC 4       
               

'Inputs/outputs-----------------------------------------------------------------
trisb=0
TRisc=0                       
TRISA = %11111111
adcon1 = %10000010
portc=0                       
PORTB=0                       


       INTCON = %11000000
       T1CON  = %10110101
       PIR1.0 = 0
       PIE1.0 = 1
       IPR1.0 = 1
       On Interrupt GoTo KESME
       TMR1L = $DC : TMR1H = $0B
'—————————————————————————-
SAYAC VAR BYTE
SN VAR BYTE
DAK VAR BYTE
SAAT VAR BYTE
GUN VAR BYTE
'—————————————————————————–
CLEAR                       'tüm degiskenler  sıfırlandı
PAUSE 200
LCDOUT $FE,1
LOW PORTB.1                  'LCD -R/W bacagı LOW'a çekildi.
'—————————————————————————–
BASLA:
LCDOUT $FE,$84
lcdout DEC2 SAAT, ":" ,DEC2  DAK, ":" ,DEC2 SN
PAUSE 100 ' BURDA BİRİŞLEM YAPILDIGINDA SAYAÇ YAVAŞLAYIP HIZLANIYOR BEN ALT ALANDA NE YAPARSAM YAPİM SAYACIN SAYMASI DEĞİŞMESİN İSTİYORUM
GOTO BASLA

DISABLE
KESME:
SAYAC=SAYAC+1               'kesme sayacı 1 sn= 61(sayac) x 256 (Tmr0) x 64  (bölme)
IF SAYAC=61 then            '61 adet  kesme olunca 1 sn. süre geçiyor.(999424 us)
SAYAC=0                      'sayaç sıfırlanıyor
SN=SN+1                      'saniye degeri bir  artırılıyor
IF SN=60 THEN                'saniye 60  olmus ise 1 dakika süre geçti o halde
SN=0                         ' saniye sıfırlanıyor
DAK=DAK+1                    ' dakika degeri  bir artırılıyor
IF DAK=60 THEN               'dakika 60  olmus ise 1 saat süre geçti
DAK=0                        ' dakika sıfırlanıyor
SAAT=SAAT+1                  ' saat degeri  bir artırılıyor
IF SAAT=24 THEN               'saat 24  olmus ise 1 gün geçti
SAAT=0                        'saat sıfırlanıyor
GUN=GUN+1                     'gün degeri bir  artırılıyor
IF GUN=365 THEN GUN=0          'gün  365 olmus ise
ENDIF                          'gün sıfırlanıyor 1  yıl geçti
ENDIF
ENDIF
ENDIF
INTCON.2=0                      'TMR0 Kesme bayragı sıfırlanıyor
RESUME
ENABLE
END

ete

Öncelikle hemen belirteyim. Kesme kullanılan basic programları özen ve dikkat ister. Dikkat edilmesi gereken işlerin başında PAUSE komutunu kullanmamak gelir. Zira bu komut çalıştığı süre boyunca programın kesmeye gitmesini engeller. Sebebi ise basit Basic komutunun işlenmesi bitmeden program kesmeye gidemez.Pause de süre komutu olup süre dolmadan programkesmeye gidemeyeceği için pause kullanılması neredeyse yasaktır demek lazım. Peki gecikme lazım olursa ne yapacağız dersen döngüsel gecikmeler kullanılabilir. 100 ms yi her biri 5us olan dilimlere bölersen ve bir döngü kurup bu şekilde gecikme yaratırsan programın kesmeye gidebilmesi için bekleme süren 5us'ye düşecektir.
Gelelim asıl meseleye, Zamana ve özellikle değişken zamanlara bağlı işler için Timer-1 zaman sayacı ile sabit bir zaman diliminde gecikme yaratılır. 4 Mhz lik osc frekansı için önereceğim zaman dilimi ise 500us dir yani saniyenin yarısı kadar bir süre. Bu dilimlerin sayısını artırarak uzun zamanlar elde etmek mümkün olabiliyor.
Diyelimki 5 dak lık bir süre yaratacaksın. ELinde 500 ms lik dilim var. 5 dak içinde kaç adet 500ms lik dilim var hesaplayalım. Her saniyede 2 tane 60 snd 120 tane ve 5 dak içinde ise 120x5=600 adet dilim mevcut. O halde ana programı öncelikle 500 ms lik dilim içinde çalıştırıp dilimleri sayarsan 5 dak lık süre sonunda işin bitmiş olur.
Diyelimki arada süre artırman gerekti. Hemen dilim sayısını yeni hesaba göre artırırsın olur biter. Uygulaması çok kolaydır ve çoğu zaman programlarımda bu mantığı kullanırım.
4 Mhz OSC frekansında 500 ms lik TMR1 zaman dilimi elde etmek için bölme oranın 1/8 olacak.
TMR1 değişkenlerine ön yükleme değeri olarak TMR1H=$0B:TMR1L=$DC değerlerini vereceksin.
Bölme oranı T1CON registerinden ayarlanıyor. 500 ms lik süre sonunda kesme bayrağı olan PIR1.0=1 olur sende bunu kollarsın. Kısaca bir While-Wend döngüsü kurarsın PIR1.0=0 olduğu müddetçe ana program bloğu alıştırılır. süre sonunda PIR1.0=1 olur ve wend döngüsünden çıkar program. Zamanı (dilim sayısını) bir eksiltir ve sıfır oluncaya kadar ana döngüyü sürekli çalıştırırsın.
Örnek şöyle;
T1CON=%00110001:ZAMAN=600  (dilim adedi 5 dak için hesapladık) 
DONGU:
PIR1.0=0:TMR1H=$0B:TMR1L=$DC
WHILE PIR1.0=0
Buraya ana program komutlarını koyacaksın
WEND
ZAMAN=ZAMAN-1:IF ZAMAN>0 THEN DONGU
Diğer kesmelerle işin yok bana kalırsa. Gerek yok. Bu sistem her işini görecek esnekliğe sahip zaten.
Umarım anlamışsındır. Bu sistemde de pause kullanımından sakınman gerek. Çok lazım ise dilim süresini 100ms ye kadar düşürebilir onu gecikme olarak kullanabilirsin.

Ete

İlyas KAYA

Direk yazılım ile keskin sonuclar elde etmek güç. Tavsiyem RTC kullanmanız olacak.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ahmet_zxc

istediğin zamana alarm set edebildiğin rtc ler var onları kullanabilirsin, yada bu rtc lerin işlemcinin içerisinde olanı var o tür bir işlemciye geçebilirsin..


ete

RTC kullanımının düşündüğünüz kadar kolay olmadığını düşünüyorum. Dakika ve sn deki sınırlar (59 rakamı) sizi zorlayabilir. Üstelik kod çalışırken sürenin değişme ihtimalide işin cabası olur. Elbete iyi bildiğin sistem senin için en iyi olandır. Hani eskiler söylemiş ya bildiğin yol en kısadır diye ona benziyor.
Yine de kullanıcı iyi düşünmeli. Hangisi kendisi için daha doğru diye incelemeli metodları.
RTC her türlü zamanı tutuyor bu kısmı çok güzel. Ama diyelimki dakika değeriniz 58 iken 6 dakika tutmanız gerekti ne yapacaksınız bir sürü kod yazmanız gerekecek. Kısaca o dakika önce 59 olacak ardından sıfırlanacak bu durumda sizin dak=4 oluncaya kadar zamanı saymanız gerekecek. Bunu kafadan yapınca hemen söyleyebiliyorum. Ama otomatikleştirilmiş (kod ile) bir süre tutma algoritmasında bu tür kısıtlamalar sorun yaratabilir. Bana dakika 58 iken 6 dakika zaman tutmanın senaryosunu yazabilirmisiniz? AYnı senaryoyu dakika=15 iken test edin bakalım kod doğru çalışabilecekmi.

Bu işin kararını Trilian versin bakalım. Hangisi kendisine daha kolay geliyor bende merak ediyorum doğrusu.

ahmet_zxc

ETE hocam söylediğiniz eski rtc ler için doğru..

ama şimdi; şu gün şu saatte şu saniyede şu milisaniyede bana alarm ver diye alarm lar atayabildiğiniz rtc ler var..

başlangıç seviyesi için daha kolay olur zannındayım. tabiiki karar arkadaşımızın..

trilian

gerkese teşekkürler aslında ihtiyacım olan bagımsız bir zaman sayacı yani en fazla 90dk o bir tarafta çalışacak diger tarafta makinanın döngüleri sabit değil değişken işler yapıyor yani sabit iş yapsa döngüler arasındaki süreler eşit olsa zaten yapacam yada 2nci bir işlemci kullanıp sayaç yapacam bunu tek işlemciyle yapabilirmiyim diye düşünüyordum timer konusunda bilgim malesef yok acaba dedim alt alanda tamamen bagımsız çalışan bir kodmu gibi düşünmüştüm anladıgım kadarıyla değilki kodlar etkiliyor fikirlerinizi bekliyorum bir makina var işlemci pulslar göndererek hızlanıp yavaşlıyor pot yardımı ile yanı bu durumda biz hızı arttırıp düşürüyoruz bu durumda döngü hızlanıp yavaşlıyor ama sayacın bundan etkilenmesini istemiyorum ne önerirsiniz 2 lcd 2 işlemci ne önerirsiniz

aRci

Merhaba
Burada projeni biraz daha basit anlatabilirsen daha kolay çözümler bulunabilir. anladığım bir sistem var ve bu sistemin çalışma süresi kullanıcı tarafından yapılan ayarla değişiyor. Siz de çalışan makinenin çalışma süresini LCD ekranda göstermek istiyorsunuz galiba.
paylaştığınız kod aslında çalışan bir kod ama hatanız ete bey inde bahsettiği kesme olan projelerde pause gibi sistemi kilitleyen duraksatan her komut timer kesme de gecikme ve zaman kaymasına sebep olur.
timer ile saniyeyi binlere ve hatta daha fazlasına bölebilirsiniz. hassas işlemlerde dikkat etmek gerek.

programında pause 100 yazan yere örneğin yazılımla çalışmayı belirli bir olay gerçekleşesiye kadar kilitlemek bir çözüm olabilir ben de bunu kullanırım bazen.

örnek olarak her sn de bir lcd yenilensin bu durumda pause 100 yazan yere

while Sn = Onceki
wend
Onceki = Sn

yazarak hem timer kesmede gecikme yaşamazsınız hemde lcd ekran her saniyede bir kere değişir.

not programa Onceki adında byte değişkeni eklemelisiniz.

iyi çalışmalar.


trilian

Alıntı yapılan: aRci - 27 Mart 2021, 02:05:48Merhaba
Burada projeni biraz daha basit anlatabilirsen daha kolay çözümler bulunabilir. anladığım bir sistem var ve bu sistemin çalışma süresi kullanıcı tarafından yapılan ayarla değişiyor. Siz de çalışan makinenin çalışma süresini LCD ekranda göstermek istiyorsunuz galiba.
paylaştığınız kod aslında çalışan bir kod ama hatanız ete bey inde bahsettiği kesme olan projelerde pause gibi sistemi kilitleyen duraksatan her komut timer kesme de gecikme ve zaman kaymasına sebep olur.
timer ile saniyeyi binlere ve hatta daha fazlasına bölebilirsiniz. hassas işlemlerde dikkat etmek gerek.

programında pause 100 yazan yere örneğin yazılımla çalışmayı belirli bir olay gerçekleşesiye kadar kilitlemek bir çözüm olabilir ben de bunu kullanırım bazen.

örnek olarak her sn de bir lcd yenilensin bu durumda pause 100 yazan yere

while Sn = Onceki
wend
Onceki = Sn

yazarak hem timer kesmede gecikme yaşamazsınız hemde lcd ekran her saniyede bir kere değişir.

not programa Onceki adında byte değişkeni eklemelisiniz.

iyi çalışmalar.


anlayamadım

Powered by EzPortal