H

pic portları aynı anda giriş ve çıkış olur mu ?

Başlatan huseyin, 09 Temmuz 2012, 16:11:16

ete

Program başka bir iş için yazılmış olsa gerek. Yapılması gerekenler şunlar.
ANSEL.2=1    '5 nou pin anlog yapıldı. 
INPUT GPIO.2 '5 nolu pin giriş yapıldı
ADCIN 2,ham
sure=(HAM+1)*/950
OUTPUT GPIO.2 '5 nolu pin çıkış yapıldı.
GPIO.2=1      'pine bağlı röle çektirildi
PAUSE SURE    'ADC den okunan süre kadar bekledi
GPIO.2=0      'Süre sona erdi ve RÖLE bıraktırıldı

Ete

muyat

Ete hocam
ANSEL = %0000100 ile ANSEL.2=1 komutu aynı mıdır?

ete

Aynı işi görür ama aynı değil. Çünki ansel.2=1 yalnızca 2 biti 1 yapar. Aöa diğeri ikinci biti 1 yaparken diğer bitleri sıfır yapar.
Ete

muyat

Ete hocam tekrar merhaba.
Konu başlığı ile ilgili bir konum oldugu için buraya yazmak istedim.
Yapmak istedigim bir devrede 12f675in pinleri doldugu için ve sadece boş 1 adet pine daha ihtiyacım oldugumdan bir büyük işlemciye geçmek yerine picin bir bacagını hem giriş hem çıkış olarak kullanmak istiyorum.Ve basitten zora ilerleyecegim,programda diger kısımları sildim,sadece bu kısmın olup olmayacagını görmek istiyorum.

Ekteki Simulasyon dosyasında,optonun baglı oldugu pinde,ayrıca bir adet de çıkış transistörü var ve röle sürüyor.
Simulasyonda 2 numaralı pindeki butona basınca;
3 numaralı pin girişten çıkışa dönüşecek,
3 numaralı pindeki röle çekicek,ve 7 numaralı pindeki led yanıcak..ve 3 saniye çekili ve yanık kalcaklar.
Eğer  3 saniye içinde hiçbir işlem yapılmazsa süre sonunda röle bırakcak,yeşil led söncek,ve rölenin baglı oldugu pin tekrar giriş olcak.
Ancak 3 saniyelik süre başladıgı an,3 numaralı pin tekrar girişe dönüşüp bu 3 numaralı  pindeki butona basılmışsa  ledi söndürüp röleyi bırakacak.
Bu program simulasyonda istedigim gibi çalışıyor.Şayet transistorun beyz direncini 1k yaparsam,röle çekili kalıyor..Ben de 20k kullandım simulasyonda.
Bu program acaba karta bastıgımda sizce burdaki gibi çalışır mı?Transistorun beyz direncini büyük seçersem röle çekmeyebilir,küçük direnç seçtigimde de röle çekili kalabilir.Orda tereddütteyim şu an.Simulasyon dosyası ekte olup,,kodlar aşagıdadır.

@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON &_MCLRE_OFF & _BODEN_OFF & _CP_ON
DEFINE OSCCAL_1K 1                                        
CMCON = 7 ' Comparators off
ANSEL =0' GPIO.1 A/D in, rest digital an1 ve an2
trisio = %00110000
GPIO=0 
SYMBOL LED= GPIO.0 
SYMBOL OPTOANDROLE= GPIO.4 
SYMBOL BUTON=GPIO.5


I VAR WORD


BASLA:

IF BUTON=0 THEN

HIGH LED
PAUSE 500
OUTPUT OPTOANDROLE
HIGH OPTOANDROLE

for I=0 TO 3000
INPUT OPTOANDROLE

IF OPTOANDROLE=0 THEN
LOW OPTOANDROLE
PAUSE 500
LOW LED
GOTO CIK
ENDIF

PAUSE 1
NEXT




LOW LED
PAUSE 500
OUTPUT OPTOANDROLE
LOW OPTOANDROLE
INPUT OPTOANDROLE
ENDIF
CIK:




GOTO BASLA











END



ete

Alıntı YapSimulasyonda 2 numaralı pindeki butona basınca;
3 numaralı pin girişten çıkışa dönüşecek,
3 numaralı pindeki röle çekicek,ve 7 numaralı pindeki led yanıcak..ve 3 saniye çekili ve yanık kalcaklar.
Eğer  3 saniye içinde hiçbir işlem yapılmazsa süre sonunda röle bırakcak,yeşil led söncek,ve rölenin baglı oldugu pin tekrar giriş olcak.
Ancak 3 saniyelik süre başladıgı an,3 numaralı pin tekrar girişe dönüşüp bu 3 numaralı  pindeki butona basılmışsa  ledi söndürüp röleyi bırakacak.
Bir pin hem giriş hem çıkış olamıyor aynı anda ama sistem hızlı çalışınca paylaşımlı olarak giriş ve çıkış olabiliyor. Demek istediğin bu sanırım. Teorik olarak istediğini yapmak mümkün.
Açıklamana bakınca bir noktada sıkıntı olduğunu görüyorum.
"Eğer  3 saniye içinde hiçbir işlem yapılmazsa süre sonunda röle bırakcak"
3 sn içinde işlem yapılıp yapılmadığı nasıl anlaşılacak. Bunu anlamanın yolu buton üzerinden olacak ise sorun yok. Ama giriş olarak ayarladığın 3 nolu pine bir şey giriyormu diye bakacak isen bu isteklerine ters düşer. Neden açıklayayım.
- BUtona bastık. 3 nolu pin (ortak pin diyelim) giriş iken çıkış oldu. Buda tama.
- Ortak pine bağlı röleyi çektirdi.3 sn çekili kalması gerekiyor. Ancak 3 sn sonunda aynı pini röleyi kapatıp girişe çevirip bir şey geliyormu diye bakman gerekir. Aksi halde senin yazdığın şekilde olmaz. Yazdıklarının kenarına açıklama yazarak veriyorum anlayacaksın neden olmayacağını.
    IF BUTON=0 THEN         'butona basılmış ise
      HIGH LED           'ledi on yap
      PAUSE 500          '500 ms bekle bu gereksiz.!!   
      OUTPUT OPTOANDROLE 'ortak pini çıkış yap
      HIGH OPTOANDROLE   'ortak pini HIGH yap     
      for I=0 TO 3000    '0-3000 arası bir döngü kur
        INPUT OPTOANDROLE'ortak pini giriş yap!!! işte bu noktada sistem bozuldu. 3sn beklemeden çıkış olan pini giriş yapmış oldu ve röle de otomatikman bırakmış oldu.     
        IF OPTOANDROLE=0 THEN 'bundan sonrası önemli değil artık.
        LOW OPTOANDROLE
        PAUSE 500
        LOW LED
        GOTO CIK
    ENDIF
Görüldüğü gibi bir pini aynı anda hem çıkış gibi (röleyi sürer halde beklemesini istiyorsun en azından 3 sn) hemde giriş olarak kullanmak istiyorsun (giriş olduğuda LOW olmuşmu diye bakarak) bu mümkün değil işte.
Dediğim gibi en azından 3 sn bekleyip (ortak pin çıkış olarak bekleyecek) süre sonunda giriş varmı diye bakabilirsin. Başka türlü olmaz.
Yada rölenin açılıp kapanması mikro saniye seviyesinde  gözle fark edilmez. Bu avantajı kullanarak istediğini şöyle yapabilirsin.
    IF BUTON=0 THEN     
      HIGH LED
      PAUSE 500
      OUTPUT OPTOANDROLE
      HIGH OPTOANDROLE     
      FOR I=0 TO 3000
        INPUT OPTOANDROLE:pauseus 2 'ortak pini giriş yaptık 2 us bekledik.
          IF OPTOANDROLE=0 THEN     'giriş LOW olmuşmu baktık ve olmuş ise
            OUTPUT OPTOANDROLE      'ortak pini tekrar çıkış yapıp
                LOW OPTOANDROLE         'röleyi bıraktırdık. Aslında pin giriş yapınca                                           zatenbırakmış idi.
            PAUSE 500               '500 ms bekledik
            LOW LED                  'ledi kapattık
            GOTO CIK                 'çık etiketine gittik.
              ENDIF
              OUTPUT OPTOANDROLE:HIGH ROLE 'ortak pin giriş olduğunda LOW olmamış ise yeniden
aynı pini Çıkış yapıp Röleyi yeniden çektirdik.
              pause 1
           NEXT
    ENDIF
Tabiiki o ortak pini etkileyebilecek bir sürü şey var. Pin giriş olarak çalıştığında Pullup da durması gerekiyor. Bu işi 10K ile pullup yaparak çözdün. Aynı direnç bu sefer röleyi otomatik çektirebilir. Bunuda röle giriş seri direncini 20K yaparak çözmüşsün gibi gözüküyor ama ne derece başarılı olur bilemiyorum denemek lazım.
Üstelik ortak pin nasıl LOW olacak? burasıda bir başka sorun. Zira onu LOW yapabilecek sinyal Opto çıkışından geliyor ve o çıkışın low olması için ortak pin giriş iken butona yada anahtara basılması gerekecek. Zaten yapman gerekende bu ama bütün bunlar hepsi bir araya geldiğinde sistem nasıl tepki verecek ancak deneyerek bulabilirsin hemde gerçek devrede.
Devrede MCLR pininde bir şey bağlı gözükmüyor. Bu pin yanlızca giriş olarak kullanılabilir. Ben olsam giriş işlemini o pinden yapardım ve 3 nolu pini sadece çıkış olarak kullanırdım. Şayet MCLR başka işlere kullanılmamış ise tabiiki.

Aşağıdaki programı denedim. Çalışıyor gözüküyor. Gereksiz satırları çıkardım.
Yer gelmişken belirteyim.
LOW PIN komutu bir pini LOW yapar. Ama yapmadan önce o pini ÇIKIŞ yapar. Kısaca komut şöyle çalışır
OUTPUT PIN
PIN=0
Benzer şekilde HIGH PIN de önce pini çıkış ardından HIGH yapar. Bu avantajı kullanarak pek çok komut satırını çıkardım.
#config
 __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON &_MCLRE_OFF & _BODEN_OFF & _CP_ON
#endconfig 
	DEFINE OSCCAL_1K 1                                        
	CMCON = 7 ' Comparators off
	ANSEL =0' GPIO.1 A/D in, rest digital an1 ve an2
	trisio = %00110000
	GPIO=0 
	SYMBOL LED= GPIO.0 
	SYMBOL OPTOANDROLE= GPIO.4 
	SYMBOL BUTON=GPIO.5	 
	I VAR WORD
	
	pause 300
	 
	 
	BASLA:	 
       IF BUTON=0 THEN	 
		  HIGH LED
	   	  PAUSE 50
		  HIGH OPTOANDROLE	 
		  FOR I=0 TO 3000
		    INPUT OPTOANDROLE:pauseus 2 'ortak pini giriş yaptık 2 us bekledik.
            IF OPTOANDROLE=0 THEN     'giriş LOW olmuşmu baktık ve olmuş ise
               LOW OPTOANDROLE         'röleyi bıraktırdık. Aslında pin giriş yapınca                                           zatenbırakmış idi.
		       LOW LED                  'ledi kapattık
		       GOTO CIK                 'çık etiketine gittik.
	        ENDIF
            HIGH OPTOANDROLE 'ortak pin giriş olduğunda LOW olmamış ise yeniden
	                                          'aynı pini Çıkış yapıp Röleyi yeniden çektirdik.
	        pause 1	      
          NEXT
	   ENDIF
	CIK:
	GOTO BASLA
	END
Ete

muyat

Ete hocam teşekkür ederim.
mclr pinine de normalde opto baglı..
Ben programı sadeleştirmek ve bunu basit bir örnek üzerinden gösterip sormak için dedigim gibi o kısımları sildim.
Bahsettiginiz yöntemi karta basıp yazılımda eklediğiniz düzeltmeleri de ekleyeip birkaç hafta içinde sonucunu buraya yazacagım

ahmet_zxc

mikroçipin forumuna baktım;

display sürmek için Charlieplexing metodu kullanılabilir. dolayısıyla bir pinin giriş çıkış yapılmasına gerek kalmayabilir demişler.
https://www.instructables.com/Charlieplexing-7-segment-displays-1/

butona bastığınızda led in yanması sıkıntı değilse bir pinin hemgiriş çıkış olması uygulanabilir demişler.
ince bir ayarla 2 dirençle led yanmadan da bu iş çözülebilirmiş..

ayrıca bir de uygulama şeması paylaşılmış.

https://www.microchip.com/forums/download.axd?file=0;1171940

picforum da cosep amca da paylaşım yapmış. o da 4148 le çözmüş..

http://picforum.ric323.com/viewtopic.php?f=38&t=28


muyat

Tekrar merhaba
İstedigimi şu şekilde çözdüm.
Pic-BEYZ seri direncini 60k ohm kullandım..Mini küp 12v röle kullandım.Direnç degeri düşük olursa röle kendi kendine çekiyor ve çekili kalıyor.Yüksek olursa da röle çekmeyebiliyor.
Seri direncin hemen önüne 1n4148  yerine uf4001 hızlı diyot kullandım.
Bu şekılde  aynı pini hem giriş hem çıkış olarak çalıştırabiliyorum.
Şayet diyotu kullanmazsam isem röle kendi kendine çekiyor.
Bir de program yukardaki senaryoyu tamamladıktan sonra aynı giriş başka bir yeri tetikletmesi gerekiyor  bu durumda çıkış olarak kalmaması için giriş olarak ETE hoca'nın son ekledigi kodlarda çık isimli etiketin hemen altına "INPUT OPTOANDROLE"ekledim.Böylelikle o döngüden çıktıktan sonra tekrar giriş oluyor.
Her ne kadar simulasyonda 18-20k ohm ile  güzel çalışsa da kart üzerinde deneyince seçilecek direnç degerleri röle bobinin çektigi akıma göre değişiyor.Bu nedenle bu tekniği kullanacaklar var ise tezgah üzerinde deneyerek istediklerini yapabilirler.

Powered by EzPortal