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();
}
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.............
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
interrupt'ın içine sonsuz döngü atmışsın nasıl çalışsın ki?
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();
}
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();
}
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
ö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.......
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
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.
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
ş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
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 :)
"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