Matematiğine güvenen var mı?

Başlatan est32, 23 Eylül 2011, 17:43:53

est32

Başlıktan korkmasın kimse,benim matematiğim zayıf olunca dandirik bişeyi hesaplayamadım kafam karıştı.
Konu şu;
Dün gece timer1 ile doğrudan 32.768KHz kristali işlemci pinlerine bağladım,timer'a da bir ön değer verdim(yoksa 0.5Hz de çalışıyor( saniye 2 saniyede 1 saniye artırıyor)) bir kaç deneme yaptım fakat kristal de dandik olunca bi türlü ayar tutturamadım.Bu işin yazılımla yani timer'a ön yükleme ile olabileceğini düşünüyorum.Ön yüklemem 32768 olması gerekirken uyduruk kristal yüzünden ben en yakın değeri 33280 olarak buldum(diğer değişmelerde birkaç dakika içinde fark belli oluyordu,hemen ileri gidiyor ya da geri kalıyordu).

Güvendiğim bir saat ile karşılaştırma yaptım,yine de 11 saat 51 dakika 22 saniye (toplamda 42682 saniye yapıyor)'de 7 dakika 6 saniye(toplamda 426 saniye) saatim geri kaldı.

işte burada belli değerler var,bunlardan bir orantı kurup en uygun değeri bulup timer'a kesme içerisinde yüklemek istiyorum.Ama benim matematik zayıf olunca çok bilinenli denklemden çıkamadım.
Yani ösym tarzı ile soracak olursam;

Timer1 değeri 33280 olarak yüklenmiş bir saat 42682 saniyede 426 saniye geri kalmıştır.Bu saatin geri kalmaması için Timer1'e hangi değer yüklenmelidir?

Ayrıca isis'te 32.768KHz kristal bulamadım xtal18 isimli kristalin de frekansını 32.768KHz olarak ayarladım ama yine de çalışmadı namussuz.Bunun yerine default değeri 1 hz olan clock isimli bir zımbırtı bulup içerisine 32768hz değerini yükleyip çalıştırdım oldu ama o da biraz cpu kullanıyor.Bu kristal işini bu şekilde mi aşabilirim,başka yolu var mı?

Diğer sorum ise işlemciye program yüklenmesi ile ilgili.Timer1 kullandığım için işlemcinin RB6 ve RB7(PGC-PGD) bacaklarına 32.768KHz kristal bağlı.Ben bunu ıcsp bağlantı ile programlamak istersem bu kristal yüzünden hatalı yükleme/programın yüklenememesi/programlayıcının zarar görmesi gibi bir durum ortaya çıkar mı?Sanırım üretici de bunu düşünmüştür.Kataloğa bakayım dedim ama ne diye arayacağım bunu bilemedim.

Buraya kadar okuyabilmişseniz bile teşekkür ederim...

inventor

#1
Hangi pic i kullandığınızı yazmamışsınız. Ama bazı sorularınıza yanıt vereyim. Öncelikle isiste deneme yaparken kristal bağlamanıza gerek yok. Isıs zaten kristali var sayar. Bu kristalede istediğiniz değeri girebilirsiniz. Tek yapmanız gereken isiste işlemcinin üzerine gelip özelliklere girmek. Orada clock frekans gibi bir ibare vardır. Genelde 1 MHZ yada 4 MHZ olarak bekler. O rakamı 32768Khz olarak değiştirin. Sorunun çözülmesi lazım.

RB6 ile ilgili sorunuza pic modelini öğrendikten sonra cevaplamak daha doğru olur.

Matematik sorunuza ise bir kaç defa okuduktan sonra cevap yazarım.
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

est32

Merhaba;
pic16f648 ve dahili 4MHz ile çalışıyor.Timer1 dahili osilatörden bağımsız rb6 ve rb7 pinlerine 32.768KHz kristal bağlı.
Fotoğraf ekledim,bakınca daha net anlaşılır umarım.


3mZ

Arkadaşım devrenin fotolarını ekleyeceğine komple dosyayı yüklesen sorunun çabuk çözülür aynı şey benimde başıma gelmişti bir makinenin panosuna bağladım haftalık makinanın ısıtıcılarının açma vakitlerini ayarlıyordum ve sorunum iki şekilde çözüldü önce devrede tmr0 kullanmıştım işlemcim 16f877a idi programdaki döngüde pause kullandım bu yüzden gecikiyordu düşürünce ekranda kırpma yapıyordu yükseltince saat geç kalıyordu ve programımın döngülerini gosub çağırma şeklinde yaptım ve pause yerinede for-next kullandım ikinci yaşadığım problem ise bana tecrübe oldu aynı devreyi yaparken isiste simule ettiğim zaman saat tam 7 saat geride kalıyordu n son işin içinden çıkamadım nasıl olsa baskı devremde değişecek noktalar yoktur dedim baskı devremi çıkardım aynı programı attım isiste 7 saat geri kalan program devremde gayet düzgün çalıştı akla mantığa sığmayan bir durum...

devreyi bekliyorum

saygılar
3mZ

est32

#4
hocam zaten devre bitmiş değil,eklesem bile ne ayar düğmeleri var ne de zamanı ayarlamak için menüsü,şu an sadece saat timer1'e dayalı olarak sıfırdan başlayıp kesme ile sayıyor,şu an başka bi özelliği yok.
Karşılaştırmayı isiste yapmadım,isise bu konuda güvenmem zaten.
Devreyi borda kurmuştum ve programını da parça parça yazıyordum,dün gece de programın timer kesmesi kısmını yazdım ve işlemciye yükledim.
Zamanlama ile ilgili denemelerim oldu bir kaç kez işlemciyi bord üzerinde programlayıp denedim ve en uygun gördüğüm noktada dijital casio kol saatim ile ikisini gece yan yana çalışır vaziyette bıraktım.Aradan geçen 11-12 saat sonra benim el yapımı saat 7dk kadar geri kalmıştı.
İşte bu noktada timer'a yüklemem gereken değeri hesaplamaya çalışıyorum.hepsini kaydedip yukarıda yazdım nasıl olsa.Komut gecikmesi varsa bile bu mutlaka standart olacak,timer'a sadece yüklediğim değerle çözülecek diye umuyorum.Bunun için nasıl bir hesaplama ile sorunu deneme yanılmada fazla vakit kaybetmeden çözebilirim diye bakıyorum.Diğer seçenek ise osilaskop ve trimmer ama elimde ne frekansmetre var ne osilaskop,bu iş yazılım ile çözülebilecekse bu benim için daha pratik olacak,ne de olsa seri üretim yapmıyorum.Ayrıca menüye kalibrasyon bölümü koymayı,timer'a değeri buradan yüklemeyi ve değeri buradan artırıp eksiltmeyi de düşünüyorum.Bu yöntem olmazsa öyle yapacağım mecbur.
iyi geceler görüşmek üzere...

inventor

#5
TMR0 için ön yükleme değerini bu kadar yüksek vermek zorunda kaldığınıza göre programda mutlaka zaman gecikmesi olan bir yer vardır. Aksi halde her program satırı için mikro sn bazında gecikme hesaplanır ve tmr0 ön değerine ilave edilmesi yeterdi. Tanımlamalar olmadan pice yüklediğiniz hali ile programı ekleyebilirseniz bir bakalım derim. Sonuçta öndeğeri oynayarak uygun rakamı bulsanız bile yüksek değer nedeniyle çok hoş olmayacaktır.

Ayrıca 255 e kadar sayan TMR0 a niçin 32768 değeri yüklemeye çalıştığınızı anlayamadım. Kısaca onuda açıklarsanız sevinirim
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

ete

Est32,
Derdini tam olarak anlatamayınca arkadaşlarda anlamakta zorlanmışlar.
Burada TMR1 sayacının harici osilatörle saydırılması olayı mevcut.
Pic dahili yada harici bir kristal ile çalışırken TMR1 sayacının harici osc bacaklarına bir kristal bağlayarak orada ikinci bir osilatör çalıştırabilirsiniz. Tabiiki çalışan osilatör yalnızca TMR1 sayacını saydırır. TMR1 önyükleme ve kesmesini kullanarakda yapmak istediğiniz bir iş yaptırabilirsiniz. Burada anladığım kadarı ile her 1 sn de bir clk palsi alınmaya çalışılıyor.

EST32,  TMR1 ayarlamalarını söylememişsin. Yani bölme oranı nedir? Normalde hesap şöyle yapılmalı idi,
TMR1 osilatörü 32768 Hz olacak (beklenen değer) . Bu 1 sn de 32768 lik bir sayac değeridir. Ancak TMR1 16 bitlik br sayac olduğuna göre saayc 65536 (65535 den 65536 ya geçerken kesme oluşursa) saydığında 2 snlik süre geçmiş olacak demektir. O halde TMR1 sayacına önyükleme değerini 32768 olarak verirsen yaklaşık 1 sn sonra kesme oluşacak demektir. Bu durumda her kesme oluştuğunda TMR1 sayacına yeniden 32768 değerini verir ve kesme oluşmasını beklersen 1 sn süre geçmiş olur.
Ancak kristal tam olarak 32768 Hz değilde farklı bir değerse sorunlar başlar. Şimdi bunu inceleyelim.
Diyelimki frekans 32600 gibi düşük bir değer o zaman 1 sn süre geçmesi için TMR1 önyükleme değeri olarak 65536-32600=32936 gibi bir değer vermen gerekir. Kristal hızlı çalıyorsa mesela 32850 Hz de çalışıyor ise yapılacak işlem aynıdır. 65536-32850=32686 değeri TMR1 e verilmelidir.
Şimdi sen karşımıza farklı bir soru ile çıkıyorsun;
42626 saniyede 422 saniye geri kalmış bir saat için TMR1 değeri ne olmalıdır?
Aklıma basitçe şöyle bir hesap geldi 422/42626=0,0099, Bu değer 1 sn de geri kalma süresidir.
normalde 1 sn de 32768 lik bir sayac değeri olması gerekirken olması gereken yada 1 sn 32768 sayarken 0,0099 ne saymalıdır dersek 32768*0,0099=324 gibi bir değer buluruz. Saat geri kaldığına göre sayma süresi azaltılacak demektir.
O halde on yükleme değer 32768 değil 32768+324=33092 ve TMR1 değeri olarak da 65536-33092=32444 olarak verilmelidir.
Bunu direk 32768-324=32444 olarakda bulmak mümkün idi.
Bu şekilde bir dene istersen.

Ete

est32

Arkadaşlar hepinize ayrı ayrı teşekkür ederim ilgilendiğiniz için.Bu zamana kadar bir çok pic programı yazmışımdır ama bu projemde ilk kez timer kullandım.Sizler mutlaka yapmışsınızdır,tecrübeniz vardır diye detaya girmeden sadece sorunumu yazmıştım ama anlaşılan oldukça karışık anlatmışım ki tam anlaşılamamış.

Benim sorunum tam olarak ete hocamın yazdığı gibi.Yani timer1'i harici osilatörle saydırmak ve saat darbesi alarak az malzeme ile doğruluğu yüksek dijital saat yapmaktı.Ete hoca bu işlerle çok uğraştığından olsa gerek çözümü hemen sundu.

İlk denememde 32.768KHz kristali timer1 sayması için gerekli bacaklara bağladım,hiç bölme olmadan(gerçek ortamda bord üzerinde) denedim baktım ve saatin saniyesi 2 saniyede bir artıyor.Zaten internette de okumuştum öyle olduğunu bu yüzden bölme kullanmaya gerek olmadığına karar verdim.Bu konuda yazılmış yazılarda timer1 65536'ya kadar saydığı için timer1'e 32768 ön yükleme yapılması gerektiğini okumuştum.Dedkleri gibi yaptım ve saniye istediğim gibi artıyordu ama tabii kısa süre içinde saat geri kalıyordu.Ben de deneye deneye iyi kötü bir değer bulmuştum ama bu sorunu deneme yanılma yoluyla değil de matematiksel olarak aşmak istemiştim.

benim de size sorduğum hesaplama;
422/42626=0,0099
32768*0,0099=324
işte buydu.Ama matematiğim zayıf olduğundan,böyle bir çözüm yöntemi aklıma gelmediğinden/tecrübesizliktenmiş.
aslında oldukça basit bir hesap ama akla gelmeyince olmuyor.

neyse,aşağıda tanımlama ve kesme kısmını veriyorum.Şu an şehir dışındayım,sanırım pazartesi gibi evimde olur bu hesap yöntemiyle orada denerim artık.
hepinize çok teşekkür ederim,sağolun,ellerinize sağlık...
Tanımlama bölümü
DEVICE=16F648A
CONFIG CP_OFF,DATA_CP_OFF,WDT_OFF,INTRC_OSC_NOCLKOUT,MCLRE_OFF,LVP_OFF,BODEN_OFF,PWRTE_ON
XTAL=4
CMCON=7
INTCON =%11000000'diğer tüm kesmelere ve çevresel (PEIE)
PIE1 =  %00000001'TIMER1 kesmesini aktif et(TMR1IE)
T1CON = %00001011'TIMER1 aktif


Kesme bölümü
DISABLE 
        KESME:
        TIMER1=33604
        INTCON.7=0'diğer kesmelere izin verme
       
        SN=SN +1
        IF SN>59 THEN SN=0:DK=DK +1
        IF DK>59 THEN DK=0:SA=SA +1
        IF SA>23 THEN SA=0
       
        PIR1.0=0'TIMER1 taşma bayrağını sıfırla
        INTCON.7=1'diğer kesmelere izin ver
       
        CONTEXT SAVE
        RESUME





ete

Sonradan bir başka hesap şekli daha aklıma geldi,

42682 sn de olan gecikme miktarı 426 sn imiş. O halde 1 sn deki gecikme miktarı ;
426/42682 =0,009980 sn. Bu durumda Tmr1 sayacı ,(65536-33280)= 32256 defa sayınca (1-0,009980)=0,99002 sn lik bir süre geçiyor.
O halde 1 sn lik süre geçmesi için sayacın
32256/0,99002=32581 defa sayması gerekir. Bu durumda TMR1 ön yükleme değeri ise;
65536-32581=32955 olması gerekir.
Buda başka bir mantık ama sanırım daha doğru olanı budur. Zira ilk hesaplamada sayaca yüklenen 33280 değerini dikkate almamış oluyoruz.
İkinci hesapta bu dikkate alındığı için bu dahada doğru olması gerekir.

Ete

est32

evet bu hesap daha mantıklı görünüyor ama bana kalırsa bu sonuç yanlış hocam.
Çünkü 33280 yüklü iken bile saat geri kalmıştı,şimdi çıkan hesaba bakılırsa 32955 daha küçük bir rakam.

önceki hesaba göre 65536-33280=32256 sayarak geç kalan timer şimdi 65536-32955=32581 sayarak daha da geç kalacak.
Benim de biraz kafam karıştı açıkçası

ete

Haklısın, çünki mantığı ters kurmuşum. Yani ileri gitmiş gibi hesap yaptık tam tersi olacak. Hesabı yeniden yapıyoruz.

42682 sn de olan gecikme miktarı 426 sn imiş. O halde 1 sn deki gecikme miktarı ;
426/42682 =0,009980 sn. Bu durumda Tmr1 sayacı ,(65536-33280)= 32256 defa sayınca (1+0,009980)=1,009980 sn lik bir süre geçiyor.
O halde 1 sn lik süre geçmesi için sayacın
32256/1,009980=31937 defa sayması gerekir.
Bu durumda TMR1 ön yükleme değeri ise; (65536 - 31937=)  33599 olması gerekir.

Bu sefer tamamdır sanırım. Uzun süreli ölçümler yaparsan belkide sayac önyükleme değeri bir fazla yada bir eksik çıkabilir. Ancak unutmaki bunu etkileyen ortam sıcaklığıda olabilir.
Ete

est32

evet hocam şimdi oldu gibi görünüyor.memlekete dönünce devre üzerinde deneme fırsatım olacak,ama bu değer işimi görecek gibi görünüyor.tabii ki uzun süreçte,sıcak soğukta yine ileri geri durumları olacak ama en aza indirdikten sonra önemli değil,günde 1 saniye bile şaşmış olsa 2 ayda 1 dk yapar çok sorun değil,hatta normal bile sayılır.

Ayrıca bu değeri eeproma yazıp daha sonra işlemciyi yeniden programlamaya gerek kalmadan menüden değeri değiştirip eeproma kaydetmeyi düşünüyorum.Sanırım zamanla en doğru değer bulunabilecektir.

ellerinize sağlık hocam allah razı olsun,teşekkür ederim...

ete

Deneme sonucunu burada verirsen memnun olurum.

Ete

est32

merhaba hocam,
Şehir dışında bulunduğum sırada boş durmadım yanımda bilgisayarım da olunca programa sürekli eklemeler yaptım.Doğal olarak kendi oluşturduğum kütüphane fazla kod kullanıyor,bu nedenle 648'in belleği yetmedi ve 877'ye geçtim.tabii detaylara girmeye başlayınca kısa sürede onun da yetmeyeceği anlaşıldı.Az sonra resmini vereceğim haliyle bile 7462 kelime kullanıldı

Şu an evdeyim ve bu hafıza sorununa çözüm bulmaya çalışıyorum bu nedenle 877'li halini de borda kurmamıştım.Şu an program tamamlanmış değil fakat programı yeniden düzenleyip deneyebilirim.Yalnız 1-2 gün sonra sonuç bildirebilirim.

Sanırım 18f2550'ye geçmeliyim bu bellek sorunu yüzünden,eğer bildiğiniz 16f serisi veya 18f serisi en az 16Kb uygun fiyatlı (biraz maddi sıkıntım var,aksi gibi dolar da yüksek herşey pahalandı) işimi görecek SMD işlemci varsa öneride bulunabilir misiniz?

Elimde öncelerden sırf bu iş için aldığım(o zamanlar atmel'e de çok ilgim vardı) SMD atmega32 var.Onu kullanmak için bascom avr ile de uğraşıyorum.Eğer pic alamazsam/bulamazsam sanırım atmele geçeceğim.Onu denemek için kodları bascom'a taşıdım fakat hem derleyici sorun çıkardı hem de pic basic de kullandığım DIG0-DIG1-DIG2 komutları bascom da yok sanırım orada sorun çıkardı.Tamam sorunu çözerim ama iş matematiğe dönecek ve kodlar uzayacak.İçimizde bascom ile uğraşan var mıdır acaba?Bu soruna nasıl bir çözüm bulunabilir?Bascom ile uğraşan varsa yardımcı olabilir mi acaba?








ete

Maalesef ben yardımcı olamayacağım.
Daha fazla hafıza için zorunlu olaak 18F serisine geçmen gerekiyor.
Ete

Powered by EzPortal