Hi-Tech PICC Eğitim Dökümanı Bölüm5

Başlatan arslan74, 31 Ocak 2008, 06:57:31

arslan74

Merhaba,

Bölüm4 deki kodu geliştirelim şimdi. Devreye ikinci bir buton daha ekleyelim. Birinici buton yukarı, ikinici buton aşağı sayma işlemini yapsın.

ISIS devresnin aşağıdaki gibi düzenledim.



Bu RA0 ve RA1 e buton bağlandı, dolaysıyla bu bacakları kodda giriş olarak ayarlamak zorundayız. Bu kodu bir cok değişik şekiller de yazabiliriz. Ancak ben tuş kontrol işlemini ayrı bir fonksiyona yaptırmak istiyorum. böylece yeni fonksiyon yazma işlemini de öğrenmiş bulunuruz.

Fonksiyona "tus_oku" isimini verdim. Bu fonksiyonu çağırdığımızda eğer tuşa basılmış ise ona göre bir değerle geri dönecek. Eğer buton1 basılmış ise 1 ile geri dönecek eğer buton2 basılmış ise 2 ile geri dönecek. Eğer hiçbir tuşa basılmamış ise o zaman 0(sıfır) değeri ile geri dönecek.

Kodumuzun bildirimi şöyle olacak,

unsigned char tus_oku(void);


Programımızın tamamı aşağıdaki gibi oldu şimdi.

#include	<pic.h>
#include	"delay.h"

// Sigorta ayarlarının yapıldığı yer
__CONFIG(PROTECT & CPD & INTIO & MCLRDIS & WDTDIS & LVPDIS & PWRTEN & BOREN );


							 //   xGFEDCBA
const unsigned char dijit[] = {	0b00111111, // 0
								0b00000110, // 1
								0b01011011, // 2
								0b01001111, // 3
								0b01100110, // 4
								0b01101101, // 5
								0b01111101, // 6
								0b00000111, // 7
								0b01111111, // 8
								0b01101111  // 9
							  };							  

unsigned char sayac = 0;


unsigned char tus_oku(void){

 static unsigned char tus_durumu = 0;
 
	if (!RA0){ // RA0 tuşuna basılmış.
		if (!tus_durumu){// tuş bundan önce basılmamış durumdamı?
			tus_durumu = 1;
			DelayMs(50); // parazitleri önlemek için 50ms beklemek gerekir.
			return 1;
		}
		else
			return 0;
	 
	}
	else if (!RA1){ // RA1 tuşuna basılmış.
		if (!tus_durumu){ // tuş bundan önce basılmamış durumdamı?
			tus_durumu = 2;
			DelayMs(50); // parazitleri önlemek için 50ms beklemek gerekir.
			return 2;
		}
		else
			return 0;
	 
	}
	else { // Hic bir tuşa basılmamış.
		
		tus_durumu = 0;
		return 0;
		
	}
	
	
	
}
				
void main(void){ // Ana program
	
	TRISA = 0b00000011;	// RA0 ve RA1 giriş olarak ayarlandı.
	TRISB = 0b00000000;
	
	PORTA = 0b00000000;
	PORTB = 0b00000000;
	OPTION = 0b00000000;	// PullUp dirençleri devreye sokar. 
	CMCON = 0x07;	// PORTA  analog pinlerini kapatır. Dijital prota dönüştür.


	PORTB = dijit[sayac];

	while (1){ // program döngüsü	
		
		unsigned char tus_durumu;
		
		tus_durumu = tus_oku();
			
		if ( tus_durumu == 1){
					
			sayac++;	// Sayacı bir artır.
			if (sayac > 9 ) // Eğer sayac 9 dan byüyk ise sayacı sıfırlar
				sayac = 0;
			
			PORTB = dijit[sayac];	// sayac değerini ekrana yaz.
			NOP();
		}
		else if (tus_durumu == 2){
			
			sayac--;  // Sayacı bir azalt
			if ( sayac == 255 ) // Eğer sayac 9 dan byüyk ise sayacı sıfırlar
				sayac = 9;
			
			PORTB = dijit[sayac];	// sayac değerini ekrana yaz.
			NOP();
		}
			
				
	}
}


Simulasyonu çalıştırdığımızda gayet düzgün çalıştığını görüyoruz. Şimdi de bu tus fonksiyonu main programın olduğu yere yazmayalım da ayrı yazılmış bir kod olsun bir o ayrı yazılmış tuş kaynak kodunu kendi projemize dahil edelim.

O zaman MPLAB da yeni bir sayfa acalım ve tus kodumuzu bu sayfaya taşıyalım.



Kayıt edilmediği için yazılar siyah olarak gözüküyor. Projemizin bulunduğu klasöre "tus_okuma.c" olarak kayit ettim. Dikkat edilirse ayırca kodun en başına bazı başlık dosyalarını ekledim.

#include	<pic.h>


Bunu eklememizin sebebi RA0 ve RA1 ne olduğunu bilmesi için gerekli. Cünkü bunlar PIC'e ait registerler dolaysıyla mutlaka eklemek gerkiyor.

#include	"delay.h"


Eklemizin sebebi "DelayMs(50);" fonksiyonu çağırdığımız için eklememiz gerkiyor.

En son eklediğim ise,

#include	"tus_okuma.h"


Bu koda ait başlık dosyası onu daha yapmatık ama şimdiden ekledim, cünkü kodla ilgili başlık dosyaların isimleri aynı olmak zorunda. Yoksa hata verir.





Şimdi bu kodumuzu projemize dahil edelim.




Proje "tus_okuma.c" dahil ettikten sonra şimdide yeni bir dosya acip "tus_okuma.h" diye kayit edelim ve projemize ekliyelim. İçine de size gösterdiğim kalıbı doğrudan yazın.



" _TUS_OKUMA_H " ismini ben kendim belirledim illa bu şeklide olacak diye bir kural yok ama burada dikkat etmeniz gereken tek nokta diğer başlık dosyalarıdaki isimlerim birbiriyle aynı olmaması yoksa. İlk görduğu dosyayı ekler sonrakı dosyayı eklemez oda hataya sebep verir.

Başlık dosyasının içine sadece fonksiyonlarımızın bildirimi yapiyoruz. Tek bir fonksiyonumuz olduğu için sadece onu bildiriyoruz. Amaç linkerin birleştirme işleminde görmesi için.

Son olarak "ana_program.c" dosyamızın başına sadece.

#include	"tus_okuma.h"


kodu eklememiz kaliyor.

Projeyi derlediğimizde hiçbir hata vermediğini görüyoruz. ana programın görümü şimdi bu şeklide oldu.



En alta mavi ile gösterdiğim yer tuş okuma programının çağrıldığı yeri gösteriyor.

Simulasyonda da görülduğu gibi tus_oku fonksiyonu ayrı bir dosyadan işleniyor.




Kaynak dosyaları:

http://www.4shared.com/file/36468898/bcca4d36/Blm5.html?dirPwdVerified=5a7b6e3a


Çalışmalarınzda başarılar.

Mod Notu: Bu güzel dökümanlar arasına teşekkür veya lüzumsuz sorular ile girilmesin, aksi taktirde dökümanı korumak için silinecektir.

erkan614

ellerinize sağlık
ben daha sora incelemek için bölüm 3-4-5 i pdf olarak derledim.
belki ihtiyac olur diye veriyim
http://rapidshare.com/files/88094240/3-4-5.rar.html

cetinkaya

evet bu olursa gayet iyi olur hepimiz icin tesekkürler

KAZIMUGUR

Daha önce bir kaç arkadaşımız , muhtelif çeşit türlü şekillerde vermişti...

KARIŞIK <<<

Seferi

Hocam link çalışmıyor. Yenileyebilir misin?