16F88 de cisim algılama-yardım

Başlatan emre1512, 22 Ekim 2012, 19:43:53

Tagli

PIC'in kendisi ısınıyor mu? Evet ise kısa devrenin kaynağı PIC olabilir. Output olarak ayarlanan bacaklarda yapılan yanlış yönlendirmeler buna sebep olabilir ama senin vermiş olduğun şemada böyle bir durumun oluşabilmesi mümkün gözükmüyor. Bu durum örneğin doğrudan toprağa çektiğin bir bacağı çıkışa ayarlayıp PORT'una da 1 yazdığın zaman olabilir. PIC ısınıyorsa bozulmuş olma ihtimali de var. Kesin birşey söylemek zor, bazen bozulmadan kalabiliyorlar ama ısınmış bir PIC'e şüpheyle yaklaşmak ve bozulmuş olabileceği ihtimalini göz önünde bulundurmak gerekir.
Gökçe Tağlıoğlu

emre1512

#16
Yok hocam PIC'te tık yok,hiç ısınmıyor. PIC komple bozuk olabilirmiki?

Bu arada gözüme çarptı Osilatör girişlerinin birini giriş diğerini çıkış olarak ayarlamam gerekiyormu acaba?İkiside giriş olarak ayarlı bende

mesaj birleştirme:: 25 Ekim 2012, 04:21:22

Bu arada hazır aklıma gelmişken sorayım.Böyle bir dijital sensör kullansam yine aynı işlemleri yapmam gerekirmi yoksa bunu bağlayınca CNY70 misali direk 1 veya 0 mı üretir. Link: http://www.robitshop.com/Sharp-GP2Y0D340K-Digital-Distance-Sensor-40cm,PR-1690.html

Tagli

Bazı dijital çıkışlı sensörler I2C gibi iletişim protokolleri kullanarak veri paketleri gönderebiliyor ama bağlantıda gözüken GP2Y0D340K sadece 1 ve 0 veren türden bir sensör. Yani cisim menzil içindeyse 1, değilse 0 veriyor (ya da tam tersi, emin değilim).
Gökçe Tağlıoğlu

emre1512

#18
Hocam 7805 teki ısınma sorununu çözdüm.Şuanda sensör çıkışından istediğim gibi data alabiliyorum.Fakat bu seferde çıkış gerilimi 1.7V oluyor.Halbuki ben çıkış uçlarını dijital belirledim.Direk +5V vermesi gerekmiyormu?

mesaj birleştirme:: 25 Ekim 2012, 18:17:46

Kodun son hali bu,neyi yanlış yapıyorum anlamıyorum :(

LIST P=16F88,R=DEC
 INCLUDE "P16F88.inc"
 __CONFIG _CONFIG1, _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _LVP_OFF

		CBLOCK H'20'
        SAYAC1
        SAYAC2
        IS
        BEK
        NUM
		D1
        ENDC

		BSF	  STATUS,RP0
		MOVLW B'11111111'
		MOVWF TRISA
		MOVLW B'00000000'
		MOVWF TRISB
		MOVLW B'00000010' 		; ANALOG GIRISLER AYARLANDI
        MOVWF ANSEL
		MOVLW H'07'
        MOVWF CMCON 
		BCF	  STATUS,RP0
		
	BASLA
		BCF ADCON1,6 			; A/D CLOCK BOLUCU DEVRE DISI BIRAKILDI
		BCF ADCON1,7 			; a/d den gelen sonuc sola dayali oldu,artık adresh dekİ 8 BİTLİK degerİ KULLANABİLİRSİN		
		MOVLW B'01001001'
		MOVWF ADCON0			; KANAL SECILDI,DONUSUM CLOCK'U AYARLANDI,MODUL ACILDI
        
	
		MOVLW	0x06  			; 20us BEKLENDI
   		MOVWF	D1
	DELAY
    	DECFSZ	D1, f
    	GOTO	DELAY
	    NOP
		
		BSF ADCON0,2 			; ADCON0'IN GO/DONE BITI SET EDILDI

	AD_TEST
		BTFSC ADCON0,2 			; GO/DONE BITI 0 İSE DONUSUM BITMIS DEMEKTIR
		GOTO AD_TEST

		MOVF ADRESH,W 			; CISIM YAKINMI UZAKMI KONTROLU
		SUBLW B'11111111'
		BTFSS STATUS,0
		GOTO YAK
		GOTO SON

	YAK
		MOVLW B'11111111'
		MOVWF PORTB
		GOTO BASLA

	SON
		MOVLW B'00000000' 
		MOVWF PORTB
		GOTO BASLA
		END

Tagli

Öncelikle, ısınma sorununu nasıl çözdün? Merakımdan soruyorum.

1.7 voltu nerede gördüğünü anlamadım. PIC'in çıkış bacaklarında mı 1.7 volt görüyorsun? Bunun bir sebebi bacaktan fazla akım çekmeye çalıştığın için voltajın düşmesi olabilir ama buna pek ihtimal vermiyorum. Özellikle de boştaki çıkış bacaklarında bu durumu gözlemliyorsan, bacak sürekli 0 ile 5 volt arasında gidip geliyor demektir ve multimetre ortalama bir değer gösteriyor olabilir.

Bu carry bitinin ve çıkarma komutunun nasıl çalıştığını hep karıştırırım ve her seferinde datasheet'ten bakmak zorunda kalırım ama SUBLW B'11111111' kodu kontrol için pek yer bırakmıyor gibi. Daha önce eklemiş olduğun koddaki şekli daha doğru idi. Kolay yoldan yarı yarıya karşılaştırma istersen, ADRESH'nın sadece 7. bitine bakman yeterli olacaktır. Bu durumda sensör çıkışının 2.5 volttan büyük olup olmadığını kontrol etmiş olursun.

Ayrıca, PIC'in sürekli olarak resetlenmediğinden emin ol. Bunun için programın başında 1 saniye bekle, sonra bir LED'i yak ve 1 saniye sonra tekrar söndür. Ve bu LED'i programın normal işleyişi sırasında kullanma. Böylece PIC'te bir resetlenme olursa bunu farkedebilirsin. Benim bu sensörlerle ilk deneyimimde yaşadığım sorun buydu. Gerçi o zaman 7805 çıkışına kapasitör koymak gerektiğini bilmeyecek kadar acemiydim ama senin verdiğin şemada kapasitör gözüküyor. Yine de PIC'in düzgün çalıştığından emin olmak lazım.
Gökçe Tağlıoğlu

emre1512

7805'in ısınmasının sebebi PIC'in Vss ucuna +5V vermemmiş :) Klasik acemi hatası.Derslerde Vss ucunu hep pozitif kabul ettiğimiz için Datasheet'ten kontrol etmemiştim.Pozitif uç Vdd'miş.

İkinci olarak programın karşılaştırma algoritmasını şu şekilde değiştirdim.Tam olarak istediğimi elde etmiş olamasamda şimdilik yeterli.

MOVF ADRESH,W 			; CISIM YAKINMI UZAKMI KONTROLU
		SUBLW B'00011111'
		BTFSC STATUS,0
		GOTO SON
		GOTO YAK


Bu şekilde yaklaşık 45 cm'lik bir mesafede engel algılayabiliyorum.

Şimdi sırada yapmam gereken şey, alınan uzaklık bilgisiyle orantılı olarak LED'leri belli bir süre yakıp dhaa sonra söndürmek.Maalesef IR sensörün lineer bir grafiği yokmuş.Önerebileceğiniz bir yöntem varmı acaba?

Tagli

Sorun sensör çıkışının doğrusal olmaması ise, mesafeleri okuduğun gerilimle eşleştiren bir tablo kullanabilirsin (bu tür talolar lookup table olarak bilinir). Bu tür bir tabloyu ASM'de yazmak için "retlw tablosu" oluşturabilirsin. Daha önce forumda bir başlıkta ayrıntılı olarak açıklamıştım. Arama bölümünden "retlw tablosu" (tırnak işaretleriyle birlikte) yazarsan bulabilirsin.
Gökçe Tağlıoğlu

emre1512

Teşekkürler bir araştırayım.