Adc ile Lm035 dan Sıcaklığı Ölçüp Belirlediğimiz Hedef sıcaklığa kadar Klima Motoru Çalıştırma

Adc ile Lm035 dan Sıcaklığı Ölçüp Belirlediğimiz Hedef sıcaklığa kadar Klima Motoru Çalıştırma
      Daha Önce Yapılmış olan 2 ayrı uygulamadan yararlanarak geliştirdiğim uygulama Sitede Var olan (ADC ile LM035 sensör kullanılarak sıcaklık ölçme uygulaması ve LCD Displaye Tersten Metin Yazdırma) uygulamalarından yararlanarak geliştirdiğim bu uygulamada; Bizim elimizde var olan A portuna bağlı Analog olarak sıcaklık ölçen Lm35 sensörünün ölçtüğü sıcaklık değerini ADC ile lcd de gösterip belirlediğimiz hedef sıcaklık ile arasında fark varsa RD4 üzerindeki Ledi Yakacaktır (Led motorun çalıştığını gösteren sembolik bir olay) hedef sıcaklık ve ölçülen sıcaklık eşitlendiğinde Led Sönecektir (Motor duracaktır) yeniden bir fark oluşursa led tekrar yanacaktır



								LIST P=16F877A
	#INCLUDE "P16F877A.INC"
	DEGER EQU 0X20
	DEGER2 EQU 0X21
	TEMP EQU 0X22
	BIRLER EQU 0X23
	ONLAR EQU 0X24
	YUZLER EQU 0X25
	OKUNAN_DEGER EQU 0X26
	HEDEFBIRLER EQU 0X27
	HEDEFONLAR EQU 0X28
	ORG 0X00
	GOTO MAIN
MAIN
	BANKSEL TRISB
	CLRF TRISB
	CLRF TRISC	

	MOVLW 0X0F
	MOVWF TRISD

	BANKSEL ADCON0		;A portu normalde analogdur hangi portlardan analog hangi portlardan dıjıtal çıkış alacağımızı adcon registeri ile belirleriz
	MOVLW B'11000001'		;Register ayarlaması ve port ayarlamarını yapıyoruz
	MOVWF ADCON0		

	BANKSEL ADCON1
	MOVLW B'10001000'
	MOVWF ADCON1

	BANKSEL TRISA
	MOVLW 0XFF
	MOVWF TRISA

	BANKSEL PORTB
	CLRF PORTB
	CLRF PORTA
	CLRF PORTD
	BSF PORTD,4
	MOVLW 0X30 			;hedef değerinin birler basamağı
	MOVWF HEDEFBIRLER 
	MOVLW 0X30 			;hedef basamağının onlar değeri
	MOVWF HEDEFONLAR 	;0x30 ascii kod duzeninde 0 sayısına denk gelmektedir

TEMIZLE	
	MOVLW 0X02			;lcd paneli ile igili kodlar 
	CALL KOMUT_YAZ		;örneğin 0x02 satır başına imleci getirir
	MOVLW 0X28			;Lcd ile ilgili işlem yapmadan önce bu tarz ayarlamaları
	CALL KOMUT_YAZ		;yapıp lcd yi kullanıma hazırlmamız gerekmektedir
	MOVLW 0X0C			
	CALL KOMUT_YAZ
	MOVLW 0X80	
	CALL KOMUT_YAZ

DONUSTUR
	BANKSEL ADCON0
	BSF ADCON0,GO	 ;A/D DONUSUME Basla
	CALL GECIKME
KONTROL
	BTFSC ADCON0,GO ;A/D DONUSUM BITTI MI
	GOTO KONTROL	;dönüştürme işlemi bittiyse adresL ye bir değer yüklenmiş olacaktır
	BANKSEL ADRESL  	;adresL yada AdresH a atanacak değer ADFM biti ile belirlenecektir
	MOVF ADRESL,W	;ADFM 1 olursa sağa dayalı (AdresH a yazar)
	BCF STATUS,RP0		;ADFM 0 olursa Sola Dayalı (AdresL ye yazar)
	MOVWF OKUNAN_DEGER
	
	BTFSC PORTD,0
	GOTO ARTTIR
	BTFSC PORTD,1
	GOTO AZALT	
	GOTO LOOP

ARTTIR
	MOVLW 0X39			;Hedef birler basamağı 9 olduysa (Asci de 0x39 a denk gelir)
	SUBWF HEDEFBIRLER,W 	;9 dan sonra 0 yaz 
	BTFSS STATUS,C      		 
	INCF HEDEFBIRLER
	BTFSS STATUS,C      
	GOTO LOOP			;birler basamağı 9 olduktan sonra onlar basamağının 1 artıp birler basamağının tekrar 0 olması gerekmektedir
	INCF HEDEFONLAR		;ve hedef onlar onlar basamağını arttır
	MOVLW 0X30			;9 sayısıdan sonra tekrar 0 değerini birler basamğına atamamız gerekiyor
	MOVWF HEDEFBIRLER
	GOTO LOOP
	
AZALT
	MOVLW 0X31			;azaltma değeri için birler basamğının 0 olduğu durumda tekrar 9 değerini atayarak yapıyoruz 
	SUBWF HEDEFBIRLER,W ; HEDEFBIRLER-0X30
	BTFSC STATUS,C       ; C=1 DEGER3 > 0X30
	DECF HEDEFBIRLER
	BTFSC STATUS,C			;örneğin değerimiz 45 44 43 42 41 40 diye azalıyor
	GOTO LOOP			;40 sayısında onlar basamğı 4 birler basamağı 0 dır (2 parça halinde düşünmek zorundayız zira asci kodlamada 40 diye bir sayı yoktur biz rakamları yan yana yazabiliriz)
	DECF HEDEFONLAR		;şimdi burada onlar basamağı 1 azalacaktır ve birler basamağı 9 olacaktır
	MOVLW 0X39			;40 dan sonraki değerimiz 39 olacaktır (2 parça halinde düşünürsek onlar basamağı 1 azaldı birler basamağıda 0 dan sonra 9 değerini aldı)
	MOVWF HEDEFBIRLER	;pic kodlamak düşük seviye kodlama olduğu için hangi adımda hangi değişimin olacağını detaylı şekilde düşünüp kodlamamız gerekmektedir


LOOP
	CALL OKU
	MOVLW 0X02
	CALL KOMUT_YAZ
	
	MOVLW 'S'		;LCD nin ilk satırına adc den gelecek sıcaklık değeri Sıcaklık: şeklindeki metni yazıradağız
	CALL VERI_YAZ		;her adımda bir harf yazdırabildiğimiz için harf harf yazmak zorundayız
	MOVLW 'I'
	CALL VERI_YAZ
	MOVLW 'C'
	CALL VERI_YAZ
	MOVLW 'A'
	CALL VERI_YAZ
	MOVLW 'K'
	CALL VERI_YAZ
	MOVLW 'L'
	CALL VERI_YAZ
	MOVLW 'I'
	CALL VERI_YAZ
	MOVLW 'K'
	CALL VERI_YAZ
	MOVLW ':'
	CALL VERI_YAZ

	MOVF YUZLER,W		;Sıcaklık: yazdırdıktan sonra yanına sıcaklık değerini yazmamız gerekmektedir
	CALL VERI_YAZ			;yuzler onlar birler basamağına gelen değerleri sırayla yazarak 3 basamaklı sıcaklık ölçme değerini yazmış olacağız
						;ancak ben çalışmada hedef sıcaklığı 0-99 derece arasında tuttum daha ust sıcaklık değerleri normal şartlarda görmeyeceğimiz için kod kalabalığı yapmadan biraz daha sade olsun istedim
	MOVF ONLAR,W		
	CALL VERI_YAZ

	MOVF BIRLER,W
	CALL VERI_YAZ

	MOVLW ' '
	CALL VERI_YAZ
	MOVLW 0XDF
	CALL VERI_YAZ
	MOVLW 'C'		;C harfi Derece nin Sembolik İfadesi Olan C dir 
	CALL VERI_YAZ
	CALL GECIKME2

	MOVLW 0X06		;2.satıra geçmeden önce 0x06 değerini workinge atarak işe başlıyoruz
	CALL KOMUT_YAZ	;belki farklı 2.satıra geçme değerleride vardır
	CALL SATIR2		;ancak yaptığım birçok araştırmadan sonra bu değeri buldum ve kullandım
	MOVLW 'H'
	CALL VERI_YAZ
	MOVLW 'E'
	CALL VERI_YAZ
	MOVLW 'D'
	CALL VERI_YAZ
	MOVLW 'E'
	CALL VERI_YAZ
	MOVLW 'F'
	CALL VERI_YAZ
	MOVLW ':'
	CALL VERI_YAZ

	MOVF HEDEFONLAR,W		;hedef değerimizi 2 basamaklı olarak yazacağımız için onlar ve birler basamaklarından oluşmaktadır 
	CALL VERI_YAZ

	MOVF HEDEFBIRLER,W 
	CALL VERI_YAZ

	MOVLW ' '			;Hedef Değerinin artması azalması için kontrol kullanıp
	CALL VERI_YAZ			;daha fazla kod yazıp karıştırmak istemedim
	MOVLW 0XDF			;hedef sıcanlık 00 derece olduğunda hedef sıcaklık azaltmaya bastığımızda
	CALL VERI_YAZ			;yada hedef 99 derece olduğunda hedef sıcaklık artırmaya bastığınızda
	MOVLW 'C'			;durmayacaktır 00 daki hedefde eksiltme yaparsanız /9
	CALL VERI_YAZ			;99 daki hedefte artırmaya bastığınızda :0 değerini alacaksınız
	MOVLW ' '			;birler basamağı için kontrol yapısı kullanıldı 0-9 arası saysın diye
	CALL VERI_YAZ			;onlar basamağı için 0-9 arası bir kısıtlama yapısı konulmadı


	CALL GECIKME2
	GOTO DONUSTUR


OKU
	CLRF YUZLER
	CLRF ONLAR
	CLRF BIRLER
	CLRF PORTB

	MOVF OKUNAN_DEGER,W
	BANKSEL PORTC
	MOVWF PORTC
	MOVWF OKUNAN_DEGER
	
	
YUZLER_ARTIR
	MOVLW D'100'					;okunan değer 100 den buyuk mu status carry bitine baktığımızda aritmetik işlem sonucu negatif yada pozitif olarak değerlenir ve carry biti buna göre değer alır
	SUBWF OKUNAN_DEGER,W		;okunan değerimiz kontrol etiketi altındaki adresl nin değeridir
	BTFSS STATUS,C  ;C=1 Mİ ARITMETIK SONUC + MI POZİTİF Mİ ?
	GOTO ONLAR_ARTIR			;işlem sonucu negatif ise carry biti 0 değerini alır pozitif ise 1 değerini alır	
	MOVWF OKUNAN_DEGER
	INCF YUZLER,F
	GOTO YUZLER_ARTIR
ONLAR_ARTIR					;okunan değerimiz örneğin 55 biz burda her 10 eksilttiğimizde onlar basamğı değerini 1 arttıracağız
	MOVLW D'10'				;54-10 = 44 onlar değeri 1 oldu
	SUBWF OKUNAN_DEGER,W	;44-10 = 34 onlar değeri 2 oldu
	BTFSS STATUS,C				;34-10 = 24 ... 24-10=14 ... 14-10=4 onlar değeri 5 kere artmış oldu
	GOTO BIRLER_ARTIR			;elimizde kalan değer 4 oldu onlar basamğınndan arta kalan 
	MOVWF OKUNAN_DEGER		;kalan değeride direk birler basamağına yazılır
	INCF ONLAR,F				
	GOTO ONLAR_ARTIR
BIRLER_ARTIR
	MOVF OKUNAN_DEGER,W
	MOVWF BIRLER
	
	MOVLW 0X30			;ex-or işlemi yaparak lcd panelde hesaplanan değerleri yazmasını sağlıyoruz
	IORWF YUZLER,F
	IORWF ONLAR,F
	IORWF BIRLER,F

ESITLIKBIRLER					;bu kısımda ust teki adc nen okunan değer gibi hedef değeri için oluşturulmuş satırlardır
	MOVF HEDEFBIRLER,W ;0X35
	SUBWF BIRLER,W ;BIRLER-HEDEFBIRLER
	BTFSC STATUS,Z ;Z=1
	GOTO ESITLIKONLAR
	BSF PORTD,4
RETURN
ESITLIKONLAR
	MOVF HEDEFONLAR,W
	SUBWF ONLAR,W ;BIRLER-HEDEFBIRLER
	BTFSC STATUS,Z ;Z=1
	BCF PORTD,4
RETURN

KOMUT_YAZ
	MOVWF TEMP
	SWAPF TEMP,W ;EN ANLAMLI 4 BİT İLE EN ANLAMSIZ 4 BİTİ DEĞİŞTİR
	CALL KOMUT_GONDER	;swap yapma amacımız 4 bit çalıştığımız içindir
	MOVF TEMP,W
	CALL KOMUT_GONDER
	RETURN

KOMUT_GONDER			;komut yaz komut gönder temelde aynıdır
	MOVWF PORTB			;port üzerinden gelen veriyi işler
	BCF PORTB,4			;harf gönderirsek harf yazdıracağı
	BSF PORTB,5			;komut gönderirsek komut yazdıracağı ayarlaması
	CALL GECIKME			;RS piniyle yapılır (PortB,4.pin)
	BCF PORTB,5			;RS pinini clear yaparsak 0 gönderirsek komut işler
	RETURN				;RS pinini 1 yaparsak Karekter işler
						;karekter dediğimiz işlem Asci tablosundaki herhangi bir
VERI_YAZ					;sembolun LCD üzerine yazmaktır
	MOVWF TEMP			;komut işleme olayı ise
	SWAPF TEMP,W		;lcd yi silmek --- lcd de imleci başa getirmek
	CALL VERI_GONDER		;lcd de 2.satıra geçmek --- bunlar komuttur.
	MOVF TEMP,W
	CALL VERI_GONDER
	RETURN

VERI_GONDER
	ANDWF 0X0F
	MOVWF PORTB
	BSF PORTB,4
	BSF PORTB,5		;LCD de yaptığımız işlemlerin tamamlanması için E pinini
	CALL GECIKME		;RB,5 pini olmaktadır set edip bekleyip sonra clear etmemiz gerekmetedir
	BCF PORTB,5		;E pini içinde en az 450 NanoSaniye beklememiz gerekmektedir
	RETURN

SATIR2
	MOVLW 0XC0			;2.satırın başlaması için gerekli komut
	CALL KOMUT_YAZ
	MOVLW 0X14
	CALL KOMUT_YAZ
	MOVLW 0X14
	RETURN

GECIKME2				;lcd nin komut veya karekter işlemesi için gerekli gecikme ayarlamaları
	MOVLW 0XFF		;19,72 mikro saniyeyi yaklaşık olarak tutturmaya çalışıyoruz
	MOVWF DEGER		;8mhz hızında çalışıyoruz farklı değerlerde farklı gecikme alınabilir
	GOTO DON
GECIKME
	MOVLW 0X04 
	MOVWF DEGER
DON
	MOVLW 0X8F 
	MOVWF DEGER2
DON2
	DECFSZ DEGER2,1
	GOTO DON2
	DECFSZ DEGER,1
	GOTO DON
	RETURN				; ~~ WWW.mikroislemcim.com ~~
END
	
						



Proje kodlarını ve Proteus ISIS Tasarımını İndirmek İçin Aşağıdaki Bağlantıya Tıklayınız
download





Gönderen : Erdoğan CANBAY
983
21-09-2018