Pals genişliğinden high yada low değer elde etmek

Başlatan oyhan, 29 Nisan 2007, 15:24:39

oyhan

Merhabalar
Ben 10ms palsleri 1 (HIGH), 5ms palsleride 0 (LOW) olarak işlemci içinde değerlendirmek istiyorum. Örneğin bir portdan gelen  palslerden 10ms uzunlukta olanları 1 olarak 5ms olanlarıda  0 olarak bir değişkene atamak ve bunları işlemek gerekiyor. Bunu nasıl yapabilirim. Yani sadece yöntem ne olabilir. Tamamıyla software metodu ile olması gerekiyor. Portum kalmadı çünkü. kod değilde yöntem konusunda yardımcı olursanız sevinirim. Teşekkür ederim...
BİRLİKTEN KUVVET DOĞAR:

Klein

eğer portun kesme üreten bir portsa koly. değilse de kolay. öncelikle pulse başlangıcını tespit etmek gerek.  portu  dinlemelisin. eğer port 0 ya da 1  oldu ise   timer kesmesi içerisinde değeri sürekli artan bir değişkenin değerini sıfırlarsın. sonra portun değerinin değiştiği anı yakalarsın. değer değiştiğinde değişkeniş okursun. eğer portun kesme üretebiliyorsa zaten sorun yok. eğer sıradan bir port ise , programının genel akışında hiçbir yerde uzun gecikme olmamalı.

oyhan

Peki porta gelen işaretleri if yada while gibi bir şart komutları ile sürekli takipmi etmeli gelen data 10ms ise 1,  5 ms ise 0 ve 0 seviyesinde ise senkronizasyon amaçlı kabul et gibi.. (palsin süresini  ölçemede timer0 kullanılcak. Birde bu arada zamanı nasıl alıcam. kullanacağım işlemci 12c508 olmak zorunda. Genelde interrupt ile herşeyi tasarlama rahatlığına alışmışken interruptsız nasıl başlıyacağımı kestiremedim. Portu dinlemelerin haricindede ufak tefek işlerde var. Zamanı nasıl ayarlıycam. İnterruptsız!!! 8O  :(
BİRLİKTEN KUVVET DOĞAR:

MURSEL

arkadaşlar  picte capture (yakala modu ) var  bu konu üzerinde araştırırsanız daha rahat ve dogru sonuç olur timer1 deki deger  ccpr1h: ccpr1l saklayıcısına atılıyor bu degerleri okuyun ne kadar süreyse koşulları girin bilgileri bu sekilde okuyun umarım yardımcı olabilmişimdir böyle bi uygulamam yok sadece düşüncemi yansıttım saygılar

oyhan

Dedim ya 12c508 kullanmak zorundayım. Başka işlemci kullanabilse idim sorun olmayacaktı. interrupt ile çözerdim 2 dakikada ama işte.. Neyse uğraşayım biraz daha yavaş yavaş olur herhalde..İlginiz için sağolun arkadaşlar..
BİRLİKTEN KUVVET DOĞAR:

Klein

önceki mesajımda bahsettim biraz. Burada dikkat edilecek en önemli husus programı hiçbir yerde bekletmemek. Gerek port dinleme gerekse programdaki diğer kontrollerin hiçbirinde döngü ya da delay olmamalı. portu ana döngü içerisinde dinleyebilirsin. osilatör frekansın nedir bilmiyorum. ama ana döngü zamanı yetecektir. şöyle basit bir kod yazılabilir

bit portflag=1;
unsigned int pulsewidth=0;

void main(void){
 
 if(!port && portflag){
     portflag=0;
     timer0=0; // timer  sıfırlanır.
     timer0enable=1;
 }
 
  if(port) {timer0enable=0; portflag=1;pulsewidth=timer0;}

}

oyhan

Merhaba
Şimdi 10ms palsleri porttan alıp 1 ve 5ms lik palsleride 0 olarak değerlendirip int16 olarak tanımladığım bir değişkenin içine yazıyorum ama her defasında yazılan bilginin sorunlu olduğunu görüyorum. 16bitlik bir değişken içindeki bitleri bit_reset yada bit_set komutları ile tek  tek işlemek ile ilgili bir soun mu yaşıyorum. yani değişkenin 16 bitlik olmasından kaynaklanan bir sorunmu acaba.
BİRLİKTEN KUVVET DOĞAR:

erhanmete

bu süreleri ölçerken belli oranlarda tolerans koymak gerekir.problem bundan kaynaklanıyor olabilir.

oyhan

Merhaba Erhanmete toleransları koydum. Yani tam dediğim zamanlarda değil belli bir tolerans aralığında okuyorum palsleri.  Ancak kodda int16 tanımlı değişkenden kaynaklanan bir sorun var gibi geliyor Bu nedenle sordum. Acaba bit_clear yada bit_set komutlarını kullanak int16 bir değişken açısından sorun oluştururmu?



(önceki mesajımda bit_reset demişim doğrusu bit_clear olacaktı pardon.)
BİRLİKTEN KUVVET DOĞAR: