Pic i 1 saat bekletmek

Başlatan tekniker çağdaş, 08 Nisan 2013, 23:23:51

tekniker çağdaş

Merhaba arkadaşlar
Ben yaptığım bir uygulamada mikro işlemciye bir saat bekleme yani pause vermek istiyorum nasıl yapabilirim.
şimdiden  teşekkür ederim

Mucit23

#1
3600 tane döngü kurup döngü içerisine pause 1000 yazarak bekletebilirsin

örn:

for x=0 to 3600
  pause 1000
next

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

kotan04

peki bu döngü gerçek zamanlımı olur yoksa zamanla sürede bir kayma meydana gelirmi ?

mg1980

PAUSE 1000 olursa fazla olmuyor mu ? Galiba PAUSE 1 olursa 1 saat olacak.Saygılar.mg1980

ete

#4
Galiba ile olmaz bu işler. Doğrusunu öğrenip ona göre cevap verin lütfen.
1saniye=1000 ms dir. 1 saati önce saniye cinsinden hesaplayın.
1 saat=60 dakika = 60 x 60 = 3600 saniye= 3600 x 1000= 3.600.000 ms dir.
Demekki 1 to 3600 kadar döngü kurup arada 1000ms bekleme koyarsanız işlemci orada 1 saat bekler.
Yada 7200 tane döngü kurup 500ms bekleme koyarsanız yine 1 saat bekler. Ama döngü arttıkça komut gecikmeleri etkin rol oynamaya başlar ve süre 1 saatten biraz fazla olur. Bunu önlemek için döngü 1000ms gecikme vererek değil 998 ms lik bir gecikme ile yapılabilir. Yine fazla geliyor ise 995 verilir.
Bu işlem size 1 saatlik süre sağlar. Ancak işlemci başka hiç bir iş yapamaz orada. İş böyle ise direk Sleep komutu kullanmak daha uygun olur. Sleep parametresi zaten saniye cinsindendir.
Sleep 60 derseniz 1 dakika işlemci uykuya dalar. Sleep 3600 derseniz 1 saat uykuya dalar. Bu süre döngü ile lede edilenden  daha net bir süredir. O halde döngü yerine direk SLEEP 3600 yazın olsun bitsin.

1 saatlik süre esnasında bazı şeyleride kontrol edeyim derseniz o zaman kesin çözüm döngü yada kesme kullanarak saat elde etmek olur derim.
Döngü metodunda döngü içine bir kaç if yerleştirerek konrol etmek istediklerinizi kontrol edebilirsiniz. Bu durumda komut gecikmeleri artacağı için pause süresinden biraz daha kesinti yapabilirsiniz.

Kesme ile saat elde edilmesinin örneklerini daha önce vermiştim. Süre başladığında kesme aktive edilir. Ve saat sayısına yada dakika sayısınına bakılarak karar verilir.

Ete


mustafa

1 saat bekletmek pause ile yapılabilir ancak bu 1 saat içinde pic e hiç bir işlem yaptıramazsın. Bunun yerine Bir hesaplama yaparak timer ı kurabilirsin ama onda da süre kaymaları olabilir. En kaliteli çözüm bir rtc kullanmak olacaktır.

mg1980

Evet Ete hocam haklısınız. Uygulamada yaptık yapıyoruz ama aceleyle bir anlık gaflet böyle bir hataya düşürüyor.Saygılar.mg1980

tekniker çağdaş

Bilgiler için çok teşekkür ederim Allah razı olsun...

xoom

#8
Merakımdan soruyorum.. "pici Sleep komutu ile uykuya alıp.. bir tuşla uyandırmak istesek uyanma anı için ne kadar beklemek gerekir.."
Bu soruyu şunun için sordum bir ara kumanda devresi yapmıştım ve kumandanın şarjı kısa bir sürede bitiyordu.. yazıyı okuyunca aklıma geldi..mesela tuşa 30dk basılmazsa Pic'i uyutup sonraki ilk tuş basımında uyandırmak.. bu uyanma anı ve kumandanın tekrar bilgi göndermesi için nasıl bir beklemeye ihtiyacı olur.

ete

İki türlü sleep var. Birincisi , sleep sure. Şeklinde kullanılıyor. Sure birimi saniye cinsinden verilmeli. Sure dolduğunda pic otomatik an uyanır.
İkinci şekil asm komutudur. Direk @ sleep şeklinde verilir. Parametresi yoktur. Pic uykuya girer ve ancak kesme ile uyanır. Kesme olarak Tmr0 kesmesi rb0 kesmesi , usart kesmesi gibî kesmeler kullanılabilir.
Ete

greatgonzo

ETE hocamın affına sığınarak bir düzeltme yapmak isterim. Yanlışım varsa affola... @sleep komutu kullanıldığında sadece timer1 sayacı kesme üretir. Çünkü bu komutla beraber osilasyonda durur. Timer0 yada timer2 iç osilatörden saat vuruşu alır ki osilasyon olmadığından dolayı sayaçta durmuş olur. Timer1 içinde belli bacaklar vardır ve bu bacaklara rezonatör bağlanıp iç osilayon ki daha doğru tanımlamak gerekirse ana osilatör kapansada kendi özel osilatöründen saat vurusu alır. Tabi bu arada timer0 (belki timer2 dede bu özellik vardır ) harici kaynağa bağlanırsa çalışmaya devam edebilir. Bu konuda şunu okumustum basit ve enerji ekonomisiyle bekleme yapmak isteniyorsa  "watch dog timer" ı kullanmak en mantıklı çözüm. Haricen osilatör ihtiyacı olmayabiliyor ki 16f88 gibi mcu larda dahili osilatör 31 - 32 kHz seviyelere kadar yavaşlayabiliyor.  12f675 gibi birşey tercih edilirsede sleep modu için 31 kHz harici osilatör. Uyanmadan sonrada 4 mHz dahili osilatöre geçip yüksek hızda çalışma sağlanabilir. 2 volt gerilim altında nanoamper seviyeyelerine düştüğü datasheetlerde yazar. Aslında çok teferruatlu konu ki 2 tane 16F88 imi brenner tanımıyor . Bozulmadılar ama kodla ilgili bir şeyler var. Dikkatli olmakta fayda var.

Usart kesmeside 16f628 lerde 2 byte  veriden sonra ancak mcu yu uyandırıyor. Böyle garip bir huyu varmı diye kullandığın mcunun datasheetlerine bakmakta fayda var.


İyi çalışmalar.....

ete

#11
Pek çok projede rb0 kesmesi ile sleep komutundan uyandırma yaptım. Usart ile ıyandırma yaptım. Tmr0 hatırlamıyorum ama onunda çalışması gerekir. Sleep komutunda ana osc susmaz. Ama asgari bir seviyeye düşerek işlemciyi çalışr vaziyette tutar.  Şimdi rastgele bir işlemci datasheeti açtım ve inceledim(16F877). Görünen oki yalnızca TMR0 sleep durumundan çıkartamıyor işlemciyi. Onun dışındaki her kesme uyandırma yapmaktadır. Usart konusunda söylediğin şeyde yalnızca Tx konumu için özel bir açıklama olarak verilmiş. 2 byte yollayıp işlemciyi sleep konumuna alırsan diyor ilk byte TSR registerine yerleştirilip hemen yollanır . Ikınci byte Txreg registerinde kalır. TXIF set edilmez. Şayet ilk byte TSR den yollanıp gitmiş ise TXRREG elindeki byte TSR ye aktarır ve bu konumda TXIF set edilir diyor. Ama alma konumu için her hangi bir açıklama göremedim. Aksine şöyle denilmiş. Sleep mod da bir data gelirse RSR bu datayı alır ve RCREG registerine bu datayı aktarırlen RCIE bayragıda set edilir diyor.
Durum böyle. Data sheetler hem ingilizce hemde bir amatör için epeyce karmaşık sayılır. Bazı ince noktalar dışında genel açıklamalar anlaşılır durumda ancak dediğim gibi bazı kritik ince noktalar çok fazla anlaşılır değil. Bu nedenle hata yapılması yada yanlış anlaşılması normaldir.

Ete

torlaktr

Zaman var word yap

zaman= zaman-1
pause yıde ona göre hesaplat geri geri düş gitsin fantazıye gerek yok bence

pwm.c

#13
ASM gömerek de çok uzun ve kararlı gecikmeler yapabilirsiniz.
örneğin 1 saat bekleyen kod:
; Gecikme 3 600 000 000 saykıl
; Gecikme süresi 1 saat
; Osilatör Frekansı 4 MHZ

            movlw       .10
            movwf       Reg_1
            movlw       .206
            movwf       Reg_2
            movlw       .87
            movwf       Reg_3
            movlw       .72
            movwf       Reg_4
            decfsz      Reg_1,F
            goto        $-1
            decfsz      Reg_2,F
            goto        $-3
            decfsz      Reg_3,F
            goto        $-5
            decfsz      Reg_4,F
            goto        $-7
            nop

not: Reg_1, Reg_2, Reg_3,Reg_4 adında 4 tane byte tanımlamayınız.

bu yöntemi alternatif fikir olsun diye göstermek istedim.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

xoom

#14
@Pwm.c Hocam...Bekleme zamanı belli olmayan uygulamalarda ( Kumanda gibi)  sleep komutu kullanmayı ccs c için örnek verebilir misiniz?

Powered by EzPortal