Pic16f628 de Pot Komutu

Başlatan gnsotomasyon, 30 Kasım 2018, 19:50:10

gnsotomasyon

İsis de kurduğum pot komutunu devrede çalıştıramıyorum.

3 adet pot var, 3 adet çıkış var. Bu çıkışları PAUSE komutuyla sırayla kontrol edebiliyorum. potlarıda bu süreleri ayarlamak için kullanıyorum

isis de uzun uğraşlar sonucu ayarlamayı başardım bunu bread boarda kurduğumda potlar yokmuş gibi süreler hep sıfır.

İsis'deki devrede 5k pota seri bağlı 50k direnç üzerinden 5 volt veriyorum. Potun diğer ucu seri 100nF kondansatöre bağlı
potun ayar çıkışı direk pic in pinine gidiyor. İsis'te 0-255 arası gayet güzel ayarlayabiliyorum.Scale değerim 255.

Bread board üzerinde pota direk 5 volt vererek,potun bir ucunu boşta bırakarak gibi çeşitli şeyler denesemde bir türlü çalıştıramadım.Hatalıda olsa bir değer görebilsem sorunu devrede arayacağım ama ne devrede ne programda bir hata göremiyorum.YARDIMCI OLURSANIZ ÇOK SEVİNİRİM.

ete

İsisde çalışan devre mutlaka gerçeğinde de çalışması gerekir. Muhtemelen sen ya programı pic'e doğru yükleyemiyorsun yada sigorta ayarlarını vermiyor yada yanlış veriyorsun ve pic de kafasına göre bir şeyler yapıyordur.
Bu gibi durumlarda boş bir işlemci bacağına led bağlayıp programada ilk açılışta komut vererek ledin birkaç defa flash yaptırılması sağlanarak en azından programın doğru yüklendiğini ve çalıştığını anlayabilirsin. Bunu sağlıyorsan o zaman pot devresine ve program komutlarına odaklanabilirsin.

Her zaman söylerim program yada devre+program ile ilgili bir soru sorduğunuz zaman buraya hem programı hemde devre şemasını yada simule devresini koyun ki neyi nasıl yaptığınızı anlayabilelim. Yoksa soruyu havaya soruyorsunuz cevaplarda havada kalıyor.
Bu sitede aşağıdaki linkte simulasyonda çalışıp da gerçek devrelerinde çalışmayan devre veya programların olası kusurlarını açıklamıştım. Bir oku bak bakalım neyi yanlış yapmışsın kendin bulmaya çalış.

https://etepic.com/index.php/topic,1670.0.html

Ete

gnsotomasyon

öncelikle ilgilendiğin için teşekkürler sigorta ayarlarını DIY K182 üzerinden yapıyorum
ayrıca süreyi sabit değer girdiğimde devrem çalışıyor sadece potları okutamıyorum

burada da isis de yaptığım tasarım ile hex vs. mevcut
isterseniz bread boarddan resimde çekebilirim

https://mega.nz/#!wsJDRagA!D_pfYICnR9VU43V2s1olXxYtlTWfI8q_qGemHrKoTFk


TRISB.7=0
TRISB.6=0
TRISB.5=0
POTV1 VAR BYTE
POTV2 VAR BYTE
POTV3 VAR BYTE
POTV11 VAR WORD
POTV22 VAR WORD
POTV33 VAR WORD
POTV1=0
POTV2=0
POTV3=0
POTV11=0
POTV22=0
POTV33=0
PORTB.7=0
PORTB.6=0
PORTB.5=1
ON INTERRUPT GOTO DEVAM
PAUSE 50
MAIN:
INTCON=%10010000
POT PORTA.0,255,POTV1
POT PORTA.1,255,POTV2
POT PORTA.2,255,POTV3
PAUSE 200
POTV11=POTV1*10
POTV22=POTV2*10
POTV33=POTV3*10
GOTO MAIN

DISABLE
DEVAM:
INTCON=$80
PAUSE POTV11
PORTB.6=1
PORTB.7=1
PAUSE POTV22
PORTB.7=0
PAUSE 50
PORTB.5=0
PAUSE POTV33
PORTB.6=0
PORTB.5=1
RESUME
ENABLE
END

ete

POT komutu aslında çok iyi çalışan bir komut değil. Tek pot kullanırsanız belki sonuç alırsınız ama 2-3 pot birden kullanmak programı bloke eder. Çünki aslında analog olmayan bir pini zoraki analog çalıştırmak gibi bir şey bu olay.
Sistem şöyle çalışıyor. Potun bağlı olduğu pini program önce HIGH yaparak kondansatörün şarj olmasını sağlıyor. Sonra aynı pini giriş yaparak zaman tutuyor ve o pinin HIGH dan LOW a ne kadar zamanda düştüğünü sayıyor. Bulduğu sayac değerinide sana POT değeri olarak veriyor. Bu değeri hesaplarken senin verdiğin scala değerine paralel bir hesap yaparak o skalada kalmaya çalışıyor. Bir yerde maksimum pot değerin skala kadar oluyor.
Bu komut her şeyden önce kesme oluşmasını engelliyor. Bu nedenle kesme ile birlikte kullanılması pek uygun değil. Hele 3 adet pot aynı devrede kullanmak da pek akıllıca değil. Okuma zaman alıyor ve program bir yerde bloke oluyor.
Pot okuma gibi bir ihtiyaç var ise en güzel ADC si olan bir işemci kullanmaktır. 628 ile aynı kılıfta 16F88 veya 16F1827 bu iş için ideal olurdu.

Programa gelince, Kusurların şunlar,
- Sigorta ayar komutların yanlış.
- bir programın çalışma frekansı mutlaka programa bildirilmelidir. Komutu DEFINE OSC 4 (4 burada 4 Mhz ile çalışılacağını gösteriyor farklı osc ler için uygun rakam kullanılmalıdır.) Aksi halde pause komutları düzgün çalışmayacaktır.
- 16F628 de A portunda komparatör vardır ve açılışta default olarak etkindir bu nedenle iptali gerekir komutu CMCON=7
- Kesme kullanılan programlarda Pause komutunu kullanmak sakıncalıdır. Kesme içinde belki kullanabilirsin zira global kesmeler iptal edilmiştir. Ama kesme dığında kullanamazsın. Çünki kesme oluşsa bile Pause komutu süre bazında bitmeden program kesmeye gidemez Halbuki kesme anında gidilmesi gereken bir alt birimdir. Bu durumda ya çok kısa aralıklı pauseus 5 gibi zaman gecikmelerinden bir sürü verip programın bir kesmeye gidebilmesi için en fazla 5us beklemesini sağlamak gerekir. Bu komutları bir döngü ile verebilirsin.
- Kesme aktif edildiğinde program o kesmeye ait bayrağın set edilip edilmediğini kontrol eder. Kesme bayrağı set edilmiş ise hemen kesmeye gider. Kesme içinde bu bayrağın sıfırlanması gerekir aksi taktirde program kesmeden çıkamaz.
Programda daka küçü bir skala kullanarak ve kesmeyide iptal ederek bir düzeltme yaptım bu şekilde çalışabiliyor. Bilmem işini görürmü. Potların bağlantı şeklide verdiğim şemadaki gibi olmalıdır.
Her şey ilişikteki rar dosyasında görülebilir. Pot değeri 10K uygundur ayrıca direnç kullanmaya gerek yoktur.

Ete


İlyas KAYA

Muhtemelen kullandığınız kondansatör kutupsuz dur. Kutuplu 0.1uf kullanıp tekrar deneyin. Bir de pot komutu tek seferde çalışmaya Biliyor. For içinde 10 defa okuyup ortalama alın. Pot komutundan hemen sonra pause kullanırsanız ve bu pause öncesinde kontrol yaparsanız değeriniz yanlış olabiliyor.
Bence kendinize bir iyilik yapın bu mcu dan kurtulun :)
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

gnsotomasyon

Alıntı yapılan: İlyas KAYA - 01 Aralık 2018, 14:48:53
Muhtemelen kullandığınız kondansatör kutupsuz dur. Kutuplu 0.1uf kullanıp tekrar deneyin. Bir de pot komutu tek seferde çalışmaya Biliyor. For içinde 10 defa okuyup ortalama alın. Pot komutundan hemen sonra pause kullanırsanız ve bu pause öncesinde kontrol yaparsanız değeriniz yanlış olabiliyor.
Bence kendinize bir iyilik yapın bu mcu dan kurtulun :)

Evet bunu düşündüm. Elimde çalışan daha önceden yapılmış bir kart var. Bu kartı kopyalamaya çalıştım ama beceremeyince kendi devremi yapayım dedim. Orada bu malzemelerle gayet güzel çalışıyor ama programı alamayınca işe yaramaz. O devrede yapan kişi tek kondansatörden okuma yapıyor muhtemelen sırayla okuma yapıyor ama sıralamayı neye göre verdiğini çözemedim. Ete hocamı verdiği kodları denicem ama dükkanda değilim artık ptesi denerim. Yine olmazsa 628den vazgeçmek zorunda kalacağım.

gnsotomasyon

ete hocam adresinizi verinde size bi baklava yolliyim :)

şimdi sensörle çalıştırmam gerekiyor ona bi çözüm düşünücem. çünkü böyle bu devre işime yaramaz.

demekki sigorta ayarları yüzünden çalışmıyormuş. teşekkür ederim.

ete

Gerek yok baklavaya kilo yapıyor. Düşündüğün için teşekkür ederim,
Sağol
Ete

gnsotomasyon

variable tanımlarken oraya bazı sayılar girmişsiniz anlamı nedir ?


POTV1 VAR BYTE 56
POTV2 VAR BYTE 57
POTV3 VAR BYTE 58
POTV11 VAR WORD 70
POTV22 VAR WORD 72
POTV33 VAR WORD 74

ete

Simulasyonda bu değişkenlerin aldıkları değerleri izleyebilmek için değişken adreslerini yanlarına verdiğim rakamlarla ben belirliyorum ve sonra simulasyonda çalışırken onları izeleybiliyorum. Program açısından bir değeri yok zararıda yok.
Ete

gnsotomasyon

#10
anladım zaten zararı olmadı

bu arada config ayarlarını benim pbp derlemedi tekrar elle girmek zorunda kaldım oda çok sorun değil çalıştı ama şimdide kesme sorun oldu

kesme içindeyken butondan tekrar sinyal gelince kesme komutlarını tamamlayıp bırakıyor. tekrar kesme aktif olmuyor

edit: kopyalamak istediğim kartta portb.3 ten buton tanımlanmış. yani kesme kullanmamış. kesme kullanmadan ben nasıl döngüyü taşıyabilirim ? if kullansam pot taramasını hızlı yapmam gerekir. bu pot okumasına zarar verir mi ? bunu denicem.


DEFINE OSC 4       
DEFINE BUTTON_PAUSE 2
CMCON=7
PORTA=0:portb=0
TRISB=0   
TRISA=%00000000

POTV1 VAR BYTE 56
POTV2 VAR BYTE 57
POTV3 VAR BYTE 58
POTV11 VAR WORD 70
POTV22 VAR WORD 72
POTV33 VAR WORD 74

POTV1=0
POTV2=0
POTV3=0
POTV11=0
POTV22=0
POTV33=0
PORTB.7=0
PORTB.6=0
PORTB.5=1

ON INTERRUPT GOTO DEVAM

PAUSE 250

MAIN:

INTCON=%10010000

POT PORTA.0,100,POTV1
POT PORTA.1,100,POTV2
POT PORTA.2,100,POTV3
PAUSE 500
POTV11=POTV1*20+50
POTV22=POTV2*20+50
POTV33=POTV3*20+50       
       
GOTO MAIN

DISABLE
DEVAM:
INTCON=%00000000
PAUSE POTV11
PORTB.6=1
PORTB.7=1
PAUSE POTV22
PORTB.7=0
PAUSE 200
PORTB.5=0
PAUSE POTV33
PORTB.6=0
PORTB.5=1
 
RESUME
ENABLE
END

ete

#11
Bunu bende görüp ikaz etmiştim. Komutun kendisi kesmeyi engelliyor. Muhtemelen komut çalışırken kesmeleri iptal ediyor. Etmez ise ölçüm yapamaz zaten. Çok hassas bir işi kovalıyor. Ölçüp yaptığı pinin low olmasını takip ediyor ve zaman sayıyor. O esnada kesme gelirse bütün ölçüm işi berbat olur. O nedenle komutun kendisi kesmeyi kapatıyor.
Belki kesme içinde yeniden aktif edilebilir.
Zaten kesme içinde INTCON=%00000000 komutunu vererek bütün kesmeleri kapatmış oluyorsun kendin yapıyorsun bunu ve yeniden aktif etmiyorsun. Ana program içinde aktif etmeye çalışmışsın ama bu iş kesmeden çıkmadan önce yapılmalı bence.
Bu arada aktive ettiğin kesme INT kesmesi yani PORTB.0 kesmesi halbuki timer0  kesmesi çalıştırmak istiyorsun gibi bir his var içimde. Zira INT kesmesi için PORTB.0 pinini giriş yapman gerekirdi halbuki programda çıkış olarak duruyor.
Aksaklıklar var anlayacağın. Ne yapmak istediğini tam olarak açıklada ona göre düşünelim.
Neden kesme kullandığınıda anlamış değilim. Bu iş için kesmeye gerek yok. POT komutu ile kesme bir biri ile bağdaşmayan iki işlem gibi gözüküyor teknik olarak ve kesmeden bu nedenle kaçınmak gerekir.
Sistemin TMR0 ile çalışacak ise INTCON=%10100000 INT kesmesi ile çalışacak ise INTCON=%10010000 vermen gerek ama bu durumda TRISB=%00000001 komut satırını programın başlarına eklemen gerekir.

Kesmeden çıkmadan önce aynı INTCON komutunuda vermende yarar var.
Ete


gnsotomasyon

ÇALIŞTI SONUNDAAA

şimdi ete ustam pot komutuna pause koymaya gerek yok hiç sorun olmuyor. direk portb.0'ı giriş tanımladım dediğin gibi, ifle devam döngüsüne gönderiyorum hiç programım aksamıyor. o kadarda hıza ihtiyacım yokmuş. benim zaten devam döngüsünün girişinde zaman var gecikme gözüme görünmüyor bile. onun dışında potlarım 5k ve skala değerleride güzel. okuyan arkadaşların ihtiyacı olursa diye çalışan kodları buraya bırakıyorum.

tamam baklava kilo yapar bari bi saat alayım neye ihtiyacın varsa :)


DEFINE OSC 4       
DEFINE BUTTON_PAUSE 2
CMCON=7
PORTA=0:portb=0
TRISB=%00000001   
TRISA=%00000000

POTV1 VAR BYTE 56
POTV2 VAR BYTE 57
POTV3 VAR BYTE 58
POTV11 VAR WORD 70
POTV22 VAR WORD 72
POTV33 VAR WORD 74

POTV1=0
POTV2=0
POTV3=0
POTV11=0
POTV22=0
POTV33=0
PORTB.7=0
PORTB.6=0
PORTB.5=1

PAUSE 250

MAIN:

IF PORTB.0=1 THEN
WHILE PORTB.0=1
WEND
GOTO DEVAM
ELSE
POT PORTA.0,100,POTV1
POT PORTA.1,100,POTV2
POT PORTA.2,100,POTV3
POTV11=POTV1*20+50
POTV22=POTV2*20+50
POTV33=POTV3*20+50               
GOTO MAIN
ENDIF

DEVAM:

PAUSE POTV11
PORTB.6=1
PORTB.7=1
PAUSE POTV22
PORTB.7=0
PAUSE 200
PORTB.5=0
PAUSE POTV33
PORTB.6=0
PORTB.5=1
GOTO MAIN 
END

ete

Saat falan da gerekmez. Teşekkür ederim.

Ete

Powered by EzPortal