avatar_efeworld

tmr0 kesmesi varken pause komutu kullanmadan süre belirlemek

Başlatan efeworld, 27 Nisan 2015, 22:58:31

efeworld

saygıdeğer ete hocam evvela sizden,forumda oluşan istenmeyen durumlardan dolayı özür dilerim.
ben bir kurutma makinasını önce 30 sn veya değişkene atanacak değer kadar döndürdükten sonra 5 sn yada baska bir değişkene atanacak değer kadar durdurmak ve aynı işlemleri diğer yön içinde tekrarlamak istiyorum.sola dönecek duracak sağa dönecek beklicek.bu işlemi y değikenindeki dk cinsinden miktar kadar yapacak.tmro kesmesi kullandım bu sayede saat oluşturdum .benim asıl derdim bekleme sürelerini ve dönüş sürelerini pause komutu kullanmadan nasıl yaparım.yardımcı olursanız çok sevinirim

DEFINE LCD_DREG PORTB 
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
define LCD RWREG PORTB
define LCD_RWBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 100
low portb.2
symbol yukari=portc.0:symbol asagi=portc.1:symbol sag =portd.3:symbol sol =portd.4
trisc=0:trisd=0:trisb=0:portb=0:portc=0:portd=0:trisa=0
ON INTERRUPT GoTo KESME
OPTION_REG=%10000101
INTCON=%10100000
TMR0=0
CMCON=7
dk var byte
sn var byte
y var byte
s var byte
r var byte
w var byte
q var byte
SAYAC VAR BYTE
CLEAR
PAUSE 200
LCDOUT $FE,1
y=25
basla:

lcdout $fe,1," harekat basladi"
pause 50

low sag
high sol
for s=1 to 3000

  if yukari=1 then y=y+1
  if asagi=1 then y=y-1
   lcdout $fe,$c0,dec2 y,"dk ",dec2 dk,":",dec2 sn

next
low sol
for r=1 to 6000

   if yukari=1 then y=y+1
  if asagi=1 then y=y-1                                                 
lcdout $fe,$c0,dec2 y,"dk ",dec2 dk,":",dec2 sn

  if y=0 then git

next
high sag
for w =1 to 3000


   if yukari=1 then y=y+1
  if asagi=1 then y=y-1
   lcdout $fe,$c0,dec2 y,"dk ",dec2 dk,":",dec2 sn

  if y=0 then  git

next
low sag
for q =1 to 60000 

  if sn=60 then y=y-1
   if yukari=1 then y=y+1
  if asagi=1 then y=y-1
   lcdout $fe,$c0,dec2 y,"dk ",dec2 dk,":",dec2 sn

  if y=0 then git

next
goto basla

DISABLE
KESME:
SAYAC=SAYAC+1
IF SAYAC=61 then
SAYAC=0
sn=sn+1
IF sn=60 THEN
sn=0
y=y-1
dk=dk+1
IF dk=60 THEN
dk=0

ENDIF
ENDIF     
endif
INTCON.2=0
RESUME
ENABLE
END
git:
end


ete

Pause kullanmadan Tmr0 sayacını kullanarak saat oluşturdum diyorsun sonra pause kullanmadan nasıl yaparım diye soruyorsun bu çelişki değilmi sence. .?

Her neyse iki alternatifin var ya Tmrx kullanarak süre tıtacaksınki en iyi yollarından birisi tmr1 sayacını 500 ms lik süre için kurup bekleyeceğin sn x 2 kadar bu sayacı çalıştırmaktır.
Diğer alternatifin ise RTC denilen saat entegresi kullanmaktır.

Ete

efeworld

Hocam cevabiniz icin tesekkur ederim fakat tmr1 i nasil kullanacagima dair küçük bir izahat yaparmisiniz.

ete

TMR1, 16 bitlik bir sayaçtır. TMR0 ın aksine yalnızca aktif edildiği zaman saymaya başlar. Her şeyi T1CON isimli register ayarlar.
500 ms lik gecikme yaratabilmek için ne yapmamız lazım onu düşünelim.
500 ms demek 500.000us demektir. Sayac en fazla 65535'e kadar sayabildiğine göre 500.000 'i nasıl saydıracağız. Burada sayacın bölerek sayma özelliğini kullanacağız. T1CON registerinin 5-4 bitleri bölme oranını ayarlar. Verilebilecek bölme oranları 1/1-1/2-1/4 ve 1/8 dir. Önce 500.000 2 ye bölsek 250.000 eder ki bu 65535 sınırının çok dışındadır işimize yaramaz demektir.
4 e bölsek 125000 çıkar buda işimize yaramaz. O halde çaresiz 8 e bölmemiz gerekecek. 8 e bölersek  62500 sayısını elde ederiz. Demekki bölme oranını 1/8 alıp sayacı 0 dan 62500'e kadar saydırırsak geçecek süre 8*62500= 500.000us yada 500 ms olacaktır. Sayacı sıfırdan başlatırsak 62500'e ulaştığını görüp durdurmamız gerekir. Bu ise çok zordur. Ama sayacı 0 dan değilde 65536-62500=3036 dan başlatırsam otomatikman sayac değeri maksimum değer olan 65535 den 65536 ya geçerken kesme oluşturur ve bende bunu test edersem kolaylıkla yakalarım. Nasılmı? Tabiiki TMR1 aşma kesmesi bayrağını test ederek. Zira kesme özelliğini aktive etmeseniz bile kesme bayrakları aşma olduğunda set edilir işlemci tarafından. Bu şu demektir. TMR1=3036 verip T1CON resgiterine de T1CON=%00110001 değerini verirsem sayac saymaya başlar ve 65535 değerini aşıp tekrar sıfır değerini alırken PIR1.0 biti 1 olur. Bu benim kalkan bayrağımdır.
O halde timer'ı kurup, PIR1.0=0 yapıp aşağıdaki döngüyü çalıştırırsam
WHILE PIR1.0=0
...
... buralara yapılacak işleri koyarsın
WEND
Program bu noktaya geldiği anda 500 ms geçmiş olacaktır.
Burada tekrar başa gönderip bir kez daha 500 ms geçmesini sağlarsan otomatikman 1000 ms yani 1 sn lik hassas ayarlanmış bir süre elde edersin.
Sayacın tekrarlanması işini bir bit değişkeni kolaylıkla yapabilir. SAY=0 ile başlarsın. WEND komutundan sonra,
TOGGLE SAY: IF SAY=1 then TEKRAR dersin olur biter.
Böylece üçüncü defa program tekrar yapmaz ve aşağı devam eder sende orada yapacaklarını ayarlar sonra tekrar programı başa yönlendirirsin.

Ete

efeworld

Hocam cok tesekkur ederim.keske tesekkur etmekten daha fazlasini yapabilsem.verdiginiz bilgiler altin degerinde

Powered by EzPortal