12f683 aynı anda 2 pini high yapmak.

Başlatan secilcemal, 12 Eylül 2014, 22:42:46

secilcemal

12f683 ile 3 adet ponömatik valf kontrol ediyorum, sorunum 2 adet valfi aynı anda açık tutamamak.

high GPIO.0
PAUSE 100
HIGH GPIO.2
pause 1000
şeklinde bir kısmını yazdığım kodda gpio.2 yi high yapmadan önce gpio.0 ı low a çekiyor.
Sorun nerede anlamadım, acaba pbp ile mi ilgili yoksa config ayarlarından mı ?

ipek

forumda şöyle bir açıklama buldum.

soru : her ikisininde en sonda aynı anda yanıp aynı anda sönmesini istiyorum



Porta.0=1 gibi komutlar bit bazında komutlardır.
Tek bite hükmeder.
Bir led'i aynı anda yakmak isterseniz byte bazında komut vermeniz gerekir.
PortA da çalıştığımıza göre ve Ledler PortA.0 ve PortA.1 de bağlı olduğuna göre önce PortA nın 0 ve 1 nolu bitlerinin dışındaki bitlerinin durumunu değiştirmememiz gerekiyor.
Bu nedenle;
Önce PortA=PORTA & %11111100 şeklinde porta nın diğer bitlerinin kopyasını alırız.
Sonra
PortA=PORTA+%00000011 şeklinde bir komut vermek yada PortA=(PORTA&%11111100) OR %00000011 şeklinde bir komut verirsek ilk iki biti HIGH yapmış oluruz.

Söndürmek için ise PORTA=(PORTA & %11111100) komutunu vermek yeterli olacaktır.
Böylece yalnızca 0 ve 1 nolu bitleri değiştirmiş diğerlerini olduğu gibi bırakmış oluruz.

secilcemal

Yani
gpio=%000011
şeklinde bir satır sorumun cevabımıdır?

F.T

#3
program bu kadarmı?

mesaj birleştirme:: 13 Eylül 2014, 00:51:17

GPIO.0=1
PAUSE 100
GPIO.2=1
pause 1000

bide böyle dene.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

mustafa_cmbz

şemanı görmeden programın kalan kısmını görmeden birşey söylemek zaman kaybı olur.

TRIS yazmaçlarını bir kontrol et.Geçen başıma geldi.

ete

İşin içinde selenoid olunca pic'in ilk selenoidi aktif etmesinin ardından Reset alması kuvvetle muhtemeldir.
Bana kalırsa iki selenoid de aynı anda aktif edilmelidir. Komutu önceden de belirtildiği üzere GPIO=%00000011 şeklindedir. Ancak daha doğrusu şöyle olmalıdır GPIO=(GPIO & %11111100) + 3 . Bu komut ile diğer pinlerin konumunu bozmadan yalnızca iki pini high yaparsınız.
Bir konuyada açıklık getireyim.
HIGH GPIO.0 komutu ile GPIO.0=1 komutu sonuç olarak aynı işi yapar. İkiside sıfır nolu port pinini HIGH yapar.
Ancak HIGH GPIO.0 komutu önce o pini çıkış yapar sonra pini high yapar. Diğeri ise pini çıkış kabul eder ve direk pini high yapar.

Olaya mantık açısından bakınca her iki komutunda aynı işlevi görüp ilgili pinlerin HIGH yapılmasını bekleriz. Ancak ilk pin LOW a çekiliyor ise ortada başka bir sorun var demektir. Programın gerisini görmeden fazla bir yorum yapılması imkansız.
Zira aynı sorunu komparatör pinleride yaratabilir. Tabiiki işlemcide Komparatör iptal edilmelidir. Analog pinlerde aynı sorunu yaratabilir dolayısıyla analog pinlerde iptal edlmelidir. Yapılmışmı? bilemiyoruz.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

fbkaya

ete hocama katılıyorum.
İzolasyon için optokuplör ve schottky diyot kullandınız mı ? Pic ile selenoid in beslemeleri ayrı mı ? Eğer yapmadı iseniz yapıp tekrar deneyin.
Ama önce bir simülasyonunu yapın. Selenoid yerine led kullanarak isisde bir deneyin. Eğer aynı sorun oluyorsa yazılımsaldır.
Birde selenoidi neyle sürüyorsunuz ?
kolay gelsin

secilcemal

Tüm cevaplar için çok teşekkür ederim.
Gpio.0=1 komutu nedense çalışmıyor, Ete Bey in buna benzer bir yazısını daha önce gördüğüm için ilk onu denemiştim lakin hiç çalışmadı.
Kodun başına config ayarlarını
ASM
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF
endasm
şeklinde ekleyip,
çıkış olarak
gpio=%000101 komutunu kullanınca aynı nda 2 pini birden high yapabildim.

secilcemal

Ete Bey su komut dizinini anlamadım.

"GPIO=(GPIO & %11111100) + 3 . Bu komut ile diğer pinlerin konumunu bozmadan yalnızca iki pini high yaparsınız."

GPIO & %11111100 su bölüm ilk 2 pin hariç çıkışları terslemez mi?

sonuca +3 eklediğimizde ise ilk 2 pin terslenir, ve sonuçta tüm çıkışları terslemiş olmaz mıyız?

siyah12

MUHTEMELEN ŞEMADA PROBLEM VAR
Pic çıkışına 1K lık pullup direnci ve pik çıkışı ile transistor base arasına 10k seri direnc sorunu çözer diye düşünüyorum.

ete

Secilcemal,

GPIO=(GPIO & %11111100) + 3  Bu komut satırnda GPIO bitlerinin ilk ikisini set etmek ama diğerlerinin konumunu değiştirmemek amacı ile kullanılır.
GPIO & %11111100  komut satırı GPIO bitlerini alıp ilk iki bitini sıfırlar diğerlerini aynen bırakır. Bitleri terslemez.
Dolayısıyla ilk iki biti sıfırlayıp porta 3 eklersen ilk iki biti set etmiş olursun yalnızca diğerlerine dokunmadan tabiiki.

Ete


Bilgi hazinedir paylaştıkça büyür.            http://etepic.com