darbe genişliğini okumak

Başlatan mcan, 02 Kasım 2005, 14:22:02

mcan

darbe genişliğiini pic le okuma için şunu yazdım
#include <16F628a.h> 
#use delay(clock = 4000000) 
#fuses XT,NOWDT,NOPROTECT,NOPUT 
#byte  PORTA = 5 

int a=0; 

dongu() 
{while(True){ }} 


say() 
{ 
    set_timer0(0); 
    setup_counters( RTCC_INTERNAL, RTCC_DIV_256 | RTCC_8_BIT); 
    ext_int_edge(H_TO_L); 
    a=a+1; 
    dongu(); 
} 



ata() 
{ 
PORTA=get_timer0(); 
set_timer0(0); 
ext_int_edge(L_TO_H); 
a=0; 
dongu(); 
} 


#INT_EXT 

sec() 
   { if(a==0)say(); 
     if(a==1)ata(); 
   } 




void main() 
  { 
       set_tris_a(0b00000); 
       set_tris_b(0b00000001); 



       ext_int_edge(L_TO_H); 
       enable_interrupts(INT_EXT); 
       enable_interrupts(GLOBAL); 
       dongu(); 
  }

mcan

amacıda şu
ana programa gidilir; 

portların davranışı ayarlanır; 

dongude beklenir; 

kesme geldiğinde: 

sec fonksiyonuna gidilir; 

ilk bu fonksiyona geçince   a   sıfır olduğundan 

say fonksiyonuna gidilir; 

sayaç sıfırlanır; 

kurulur; kurunca saymaya başlarmı? 

kesmenin yönü değiştirilip , 
a  nın da değeri 1 artırılarak 

döngüye gidilir; 

kesmenin yönü değiştiğinden h_den_l ye geçiş olunca: 

sec fonksiyonuna geri gidilir 

a nın değeri bu sefer 1 olduğu için 

buradan , 

ata fonksiyonuna geçilir; 

porta ya timer değeri atanır; 

kemenin yönü değiştirlip 

a sıfırlanır; 

döngüye gidilir.............

mcan

bu kod neden çalışmıyor? acaba setup_counters   komutundan sonra timer sayamaya başlamıyormu? yoksa ext_int_edge(); bir kere belirlenip başka bir fonksiyon içinde değiştirilemiyormu neden çalışmaz ki bu kod

Erkan Gench

interrupt'ın içine sonsuz döngü atmışsın nasıl çalışsın ki?
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

mcan

kodu şöyle değiştirdim bişey farketmedi
#include <16F628a.h>
#use delay(clock = 4000000)
#fuses XT,NOWDT,NOPROTECT,NOPUT
#byte  PORTA = 5

int a=0;

dongu()
{while(True){ }}


say()
{
    set_timer0(0);
    setup_counters( RTCC_INTERNAL, RTCC_DIV_256 | RTCC_8_BIT);
    ext_int_edge(H_TO_L);
    a=a+1;

}



ata()
{
PORTA=get_timer0();
set_timer0(0);
ext_int_edge(L_TO_H);
a=0;

}


#INT_EXT

sec()
   { if(a==0)say();
     if(a==1)ata();
   }




void main()
  {
       set_tris_a(0b00000);
       set_tris_b(0b00000001);



       ext_int_edge(L_TO_H);
       enable_interrupts(INT_EXT);
       enable_interrupts(GLOBAL);
       dongu();
  }

mcan

bilgisayara bişey anlatmak zor :D  anlamıyor yaw,bilen biri hem bana hem ona anlatsın :D
ayrıca şöle bişeyde denedim buda olmadı
#include <16F628a.h>
#use delay(clock = 4000000)
#fuses XT,NOWDT,NOPROTECT,NOPUT
#byte  PORTA = 5

int a=0;


////////////////////////////////////////////////////////////////////////////////
say(){set_timer0(0);
     setup_counters( RTCC_INTERNAL, RTCC_DIV_256 | RTCC_8_BIT);
     ext_int_edge(H_TO_L);
     a=a+1;
     return;}
////////////////////////////////////////////////////////////////////////////////






////////////////////////////////////////////////////////////////////////////////
ata(){
     PORTA=get_timer0();
     set_timer0(0);
     ext_int_edge(L_TO_H);
     a=0;
     return;
     }    
    
////////////////////////////////////////////////////////////////////////////////



//////////////////////////////////////
dongu()
{
while(true){

if(a==1)say();

if(a==3)ata();}



}
//////////////////////////////////////






//////////////////////////////////////
#INT_EXT

sec()
   {a=a+1;
   }

//////////////////////////////////////





void main()
{
       set_tris_a(0b00000);
       set_tris_b(0b00000001);



       ext_int_edge(L_TO_H);
       enable_interrupts(INT_EXT);
       enable_interrupts(GLOBAL);
       dongu();
}

mcan

tamam sanırım son verdiğim kod örneği çalışıyor,sonunda başardım sanırım isis de denedim çalıştı ,dün sinirden bredbordu kırdığımdan gerçekde deneyemedim bayramdan sona deneyeceğim

mcan

öncelikle şunu belirteyim,ben bu son kodu 16f84a ya göre yazmışdım ve 628a ya sadece modeli değiştirip yükledikden sonra pikde bazı garipliklerle bazı hatalarla karşılaştım .daha sonra buna neyin sebep olduğunu kendi başıma deneyerek buldum. sorun NOLVP sigortasını belirtmememden kaynaklanıyormuş bunu belirtmeyince bendeki pik baya hatalı çalışmaya saçmalamaya başladı ,öyleki elimi rb4 pinine bağlı kabloya yaklaştırınca pik kendine reset atıyordu,aklınızda bulunsun belkide zaten biliyorsunuzdur paylaşayım dedim.......

mcan

yardımınız gerekli ya bendeki 2 pikde bozuk yada atladığım bir nokta var bu verdiğim son kodu 16f84 veya 16f628 ile deneyebilecek biri varmı,ben isisde denedim bi sorun yok gibi port a ya değerleri atıyor değişen darbe genişliğine göre fakat gerçekde öle bişey olmuyor aksine elimi değdirmeden piklere 1-2 cm yaklaştırdığımda lambalar garip garip yanıp sönüyor (porta ya led bağladım) yardımınız gerekli bu kodu gerçekde deneyebilirmisiniz neden böle garip davranıyor pikler?kaynak olarak pil kullanıyorum 7805 ile devrede röle hoparlör motor gibi hiç bir eleman yok sadece led var birde giriş girişi toprağa bağlasam bile böyle oluyor

elinde 18f84 veya 16f628 olan birileri bu kodu deneyebilirmi acaba

Erkan Gench

devre şemasını verirsen yardımcı olmaya çalışayım. büyük ihtimalle pullup direnci olması gereken yere pullup takmamışsın gibi geldi bana.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

mcan

devre şöyle bredbord üzerine kurulu bildiğimiz pic devresi yani kristal ve reset tuşu rb0 ucuna 1ms darbe genişlikli 4-5v luk bir sinyal yada yoksa öyle bişey direk toprağada bağlaanabilir porta ya ise hep led bağladım ra4 e bir pull up direnci bağladım yani devre porta nın hepsine led bağlı rb0 da sinyal var kesme oluşması için port b nin diğer bütün uçları boşta ve çıkış olarak tanımlılar eğer tanımlaya bildiysem

mcan

şema gerçekden çok basit aslında şema bile değil sadece picin port a sının hepsine birer led rb0 da sinyali girdim port bnin kalan uçları da boşda isis de ise sadece rb0 a sinyali girdim diğer tüm uçlar boşta porta nında değerini debugger ile gözlüyorum isis de çalışıyo gerçekde ise anlattığım gibib oluyor

Erkan Gench

bu bahsettiğin hata ya giriş olarak kullandığın hatlardan birini boşta bıraktığından olur yada reset girişini boşta bıraktığından olur ben böyle birşey yapmışmısın diye bakmak için devre şemanı istedim ama bu şekilde anlatınca pek bi işe yaramadı.

sen olaya "herşeyi doğru yaptım ben niye çalışmıyor bu alet" şeklinde yaklaşıyorsun. zaten olaya bu şekilde yaklaştığın için bu kadar zamandır basit bi projeyi yapamadın gibi geliyor bana. bu işte yeni olmanın elbette etkisi vardır ama bu kadarda uğraştırmazdı heralde :)

hayır herşeyi doğru yapsaydın alet zaten çalışırdı. olaya yaklaşımın "bu alet çalışmadığına göre bir yerde yanlış yapıyorum ama nerede" şeklinde olmalı. öncelikle elemanlarının sağlamlığından emin olmalısın. mesela pic ile daha önce çalıştığından emin olduğun basit bi devreyi yeniden kur ve picin çalışıp çalışmadığından emin ol. aynı işleri diğer parçalar içinde yap. daha sonra herseferinde bir değişkeni değiştirerek meydana gelen değişiklikleri gözlemle (deneysel çalışma). arasıra dur ve yaptığın şeye bir bak bazen işi bırakıp kafan boşaldıktan sonra tekrar bakarsan daha önce göremediğin şeyleri görebilirsin. eğer işin çalışmamasının sebebinin senin bilmediğin bir şeyden olduğuna emin olursan o zaman yardım iste.

aslında herşeyden önce arıza çözme tekniğini kavramamız lazım sanırım :)
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

mcan

"herşeyi doğru yaptım ben niye çalışmıyor bu alet" şeklinde yaklaştığımı düşünüp "bu kadar zamandır bu kadar basit bi alet çalışmadığına göre bir yerde yanlış yapıyorum ama nerede :roll: "diye düşünmeye başladım

elemanların sağlamlığından emin olmak için, her zamanki yapıtığım gibi ,ilk yazdığım led yakıp söndüren dosyayı yine piklere yükledim ve çalışıyorlar diğer parçalardan sadece ledler olduğundan onlarıda denedim

ayrıca pikin resetinin boşda olup olmadığını kontrol ettim,isisde değişkeni değiştirip simüle ettim orada normal çalıştığını düşünüyorum şünki portA daki değerler önceden istediğim değerler.... zaten buraya kadarını önceden yapmıştım ama bir daha yapayım dedim

şu an çalışmıyor, aynı sorunlar var bu kadar basit bir konuyu bu kadar uzun  zamandır yapamadığıma göre bende bir eksiklik var ve ben bunu  bu kadar zaman uğraştıkdan sonra aşamadığım içinde sizlere sormuşdum

çalışmamasının sebebini kısa süre uğraştıkdan sonra düşünseydim mutlaka atladığım bişey var derdim,ama uzun süre uğraştıktan sonra atladığım birşeyin yerini yavaş yavaş bilmediğim birşeymi var sorusu alıyor

fazla yazdım aslında ,en iyisi ben bunu birazdaha çalıştırmaya çalışayım
nede olsa basit bir konu elbet bi şekilde aşarım :D
akşama yeni bir pikle deneyeceğim belki piklerimde bir sorun vardır

tavsiyelerinizi dikkate aldım teşekkürler