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

Başlatan arslan74, 31 Ocak 2008, 04:19:44

arslan74

Merhaba,

Kaldığımız yerden devam edelim. Daha önce otomatik sayan basit bir sayac yapmıştık.

Şimdi sayac değişkenimizi bir butona ilişkilendirilelim, butona her bastığımızda değerini bir artırsın.

Bunun için ISIS de aşağıda ki gibi değişiklik yaptım RA0 bacağına buton bağlatım. RA0 bacağının kendi iç Pullup direncleri olmadığı için harici direnc eklemek zorundayız. Tabii birde RA0 bacağı giriş bacağı yaptığımız için TRISA registerinden RA0 giriş olarak ayarlamız gerekiyor.



Eski kodu aşağıdaki gibi değiştirdim.

#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;
				
void main(void){ // Ana program
	
	TRISA = 0b00000001;	// RA0 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ü	
			
		while(RA0);	// Butona basılana kadar bekler.
		
		// Butona basılmış.
		DelayMs(50); // parazitleri önlemek için 50ms beklemek gerekir.
		
		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();
		
		while (!RA0);	// Buton basılı kalmış mı diye kontrol ediyor. Butonun tekrar bırakılmasını bekliyor. 
				
	}
}


Simulasyonun yaptığımızda karşımıza şöyle bir görüntü ortaya cıkıyor.



RA0 bağlı buton basılı mi diye kontrol ediyor. Butona basıldıktan sonraki komuta bir breakpoint koyarsak simulasyon butona basıldığında duracak, bundan sonraki işlemleri adım adım çalıştırarak görebiliriz.



Butona bastıktan sonra program koyduğumuz breakpointe durdu. Butonlarda bekleme süresi koymak gerek yoksa butona bastığımızda oluşan parazitlerden dolayı bir bir kere basmış olsak bile birkaç kere basılmış olarak algılayabilir. Bunu yazılım dışında buton bacaklarına birer 100nF kondansatörde eklense aynı flitre işlemini yapar. Bu konuda sakın simulasyonda bahs ettiğiniz olay olmuyor diye yanılmayın. Cünkü gercek hayatta böyle ideal buton yok.



En son "while (!RA0);" buton basilim diye kontrol ediyor. Elimizi butondan çektikten sonra tekrar program başa dönüyor.

while (!RA0);


Yukarda ki kod değişik şekilde yazılabilir. Örneğin.

Örnek1:

while ( RA0 == 0 );



Örnek2:

while ( RA0 == 0 ){}



Örnek2:

while ( RA0 == 0 ){;}


Şeklinde de yazılabilir ancak en kısası ben yazdığım gibi olduğu için onu tercih ediyorum. Bu 3 kodun derleyici yorumlanması acısında hiçbir fark yok.

Devrenin kaynak dosyaları aşağıdaki linkten indirebilirsiniz.

http://www.4shared.com/file/36457144/10c02e59/Blm4.html?dirPwdVerified=5a7b6e3a

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

Seferi

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