Hi-Tech PICC Eğitim Bölüm7 (Timer interrupt kullanımı )

Başlatan arslan74, 03 Şubat 2008, 23:13:49

arslan74

Merhaba,

Bölüm6 RB0 interrupt kullanıma örnek vermiştim. Şimdi Timer0 interuptunu nasıl kullanılacağına dair kısa kodlarla anlatacağım.

Bölüm6 daki şemanın aynısını kullanacağım.



Sadece koda değişiklik yaparak Bölüm3 de kine benzer bir otomatik sayıcı yapacağım.

Şimdi yapmam gereken şey Timer0 kesmesini nasıl ayarlarız ve devreye sokabiliriz. Bunun için yine bize yardımcı olarak en önemli kaynak PIC kendi datasheetleri olacaktır. Aradığımız bilgiler bölüm6 da göstediğim sayfa 25 ve sayfa26 datasheet kitabında var.

S.25


S.26


RB0 kesmesini kapatib, sadece timer0 kesmesini devreye sokmak istiyoruz o zaman bizim için aşağıdaki bitler önemli.

OPTION REGISTER DE:

1- bit5 T0CS (TMR0 Clock Source Select bit) : Bu bit TMR0 sayac registerine gelen bilginin kaynağını belirtmek için kullanılır. Kaynak olarak PIC'in kristali veya R4 bağağından harici olarak secilebilir.

2- bit4 T0SE (TMR0 Source Edge Select bit): Bu bit eğer sinyal girişi harici secilirse dıştan gelen puls'in düşen kenarda mı yoksa yükselen kenarda mı geldiğini belirtmek için kullanılır. harici clock girişini şimdi kullanmayacağımız için bizim için önemli değil.

3- bit3 PSA (Prescaler Assignment bit): Bu bit TMR0 nerede kullanılacağını belirler. Eğer Watchdog devreye sokarsanız o zaman TMR0 registeri Watchdog için kullanılmış olur.

4- bit2-0 PS2,PS1,PS0 (Prescaler Rate Select bits): Bu üç bit gelen frekansı böler. 1/2 ile 1/256 arasında 8 değişik kademeye bölünebilir.


INTCON REGISTER :

1- bit7 GIE (Global Interrupt Enable bit): kesmenin oluşabilmesi için onun aktif edilmesi gerek.

2- bit5 T0IE (TMR0 Overflow Interrupt Enable bit): TMR0 kesmesini devreye sokar.

3- bit 2 T0IF (TMR0 Overflow Interrupt Flag bit): TMR0 kesmesini olduğunu bildiren bayrak değişkeni. kesmeden cıkmadan önce sıfırlanmalıdır aksi takdirde kesmeden cıkılamaz.

Aşağıda iç yapısının genel bir şeması var.




Şimdi TMR0 ayarlarını yapalım.

OPTION REGISTER:

1- TMR0 puls kaynak olarak kristali secelim.

T0CS = 0;


2- Puls ön bölücüsünü TMR0 registerine atayalım.

PSA = 0;


3- Ön bölücü kademesi olarak bir en yüksek bölücü kademesini seciyoruz. Yani 1/256

PS0 = 1;
PS1 = 1;
PS2 = 1;


Şimdi "option" registerin ayarlarını yapmış oluyoruz. tek tek belirtmek yerine doğrudan option registerine değer atabiliriz.

örneğin:
OPTION = 0b00000111;


şeklinde da yazabiliriz. Orası size kalmış.


Şimdi de INTCON REGISTER ayarlarını yapalım.

1- Önce TMR0 syacını sıfırlıyalım.

TMR0 = 0;


2- TMR0 bayragını sıfırliyalım.

T0IF = 0;


3- TMR0 kesmesini acalım.

T0IE = 1;


4- Kesme işlemini devreye sokalım.

GIE = 1;


bu işlemden sonra TMR0 kesmesei devreye girmiştir.

Kesme alt programında ise gelen kesmenin TMR0 danmı geldiğine bakıp ona göre işlem yapacağız.

Bu haliyle TRM0 kesmenini süresini bulalım. Bu işlemin bir hesabı var. Ama daha basidi ISIS sümulasyonundan cıkartabiliriz.

Kodun düzenlenmiş hali aşağıda gibi oldu:

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

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

							 //   GFEDCBAx
const unsigned char dijit[] = {	0b01111110, // 0
								0b00001100, // 1
								0b10110110, // 2
								0b10011110, // 3
								0b11001100, // 4
								0b11011010, // 5
								0b11111010, // 6
								0b00001110, // 7
								0b11111110, // 8
								0b11011110, // 9
							  };							  

unsigned char sayac = 0;
	
void main(void){ // Ana program
	
	TRISA = 0b00000000;	
	TRISB = 0b00000001;// RB0 giriş olarak ayarlandı.
	
	PORTA = 0b00000000;
	PORTB = 0b00000000;
	
	CMCON = 0x07;	// PORTA  analog pinlerini kapatır. Dijital prota dönüştür.

	OPTION = 0b00000111;	// PullUp dirençleri devreye sokar. 
	
	TMR0 = 0;	// TMR0 sayacını sıfırla.
	T0IF = 0;	// interrupt flagini sıfırla
	T0IE = 1;	// RB0 interuprunu devreye sok.
	GIE  = 1;	// Acık olan bütün interupları devreye sok.
	
	while (1){ // program döngüsü	
		
	}
}

static void interrupt
isr(void)			// Here be interrupt function - the name is
				// unimportant.
{
	
	if(T0IF) {			// timer interrupt
		

		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.
	

		T0IF = 0;		// clear the interrupt flag
	}
	
	
	if(INTF) {			// did we see a button press?
				

		INTF = 0;			// clear the interrupt
	}
}


ISIS simülasyonunda TMR0 kesmesine bir tane brakpoint koyuyorum. En alta brakpoint time süresini belirtiyor.



Görüldüğü gibi 65.609ms yaziyor. Tekrar F12 simulasyonnu başlatalım bu sefer oluan ikinci breakpoint işleminde süreye bakalım.



aralarında ki farkı alırsak TMR0 süresi ortaya cıkmış olur.

131.14 - 65.609 = 65.531 ms cıktı. Bu süre çok hızlı olduğu için. Sayma işlemi cok hızlı gercekleşecektir.

TMR0 süresi donamısal olarak daha fazla artıma şansımız yok. Ancak içine yazılım ekleyecerek istediğimiz kadar süreyi uzatabiliriz. Bunun için Ramden sadece bir byte değişken kullacağaım.

if(T0IF) {			// timer interrupt
		
		static unsigned char tmr0_sayac = 10;
		
		if ( !tmr0_sayac--){
			tmr0_sayac = 10;
			
			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.
		}

		T0IF = 0;		// clear the interrupt flag
	}


"tmr0_sayac" değişkeni 10 değeri derdiğimiz için bu durumda ortalama 720ms de bir sayac değişkenimiz artmaya başlayacaktır.

Bu timer kesme işlemlerim cok önemli bir konu o yüzden iyi kavranmalı. Frekansmetre veya taramalı ekran süremede timer kesmeleri bu iş için bicilmiş kaftandır.

Projenin kaynak kodları:

http://www.4shared.com/file/36773667/cd86bd7d/Blm7.html?dirPwdVerified=5a7b6e3a

Çalışmalarınızda başarılar

Digimensch

Cok tesekkürler cok güzel bir Ders

Yanliz bu Ders'i PDF Dosyasina cevirebilcek arkadas yokmu?

arslan74

Alıntı yapılan: "Digimensch"Cok tesekkürler cok güzel bir Ders

Yanliz bu Ders'i PDF Dosyasina cevirebilcek arkadas yokmu?

Merhaba,

Bu ders notları bu şekilde yayınlamadan önce gorund beye mesaj attım. Hatta önce bu dökümanları word dosyasında hazırladım. İlk bölümler o şekilde dir. Bu gönderdiğim yazıların sayfa düzenini hazırlayıb, ana sayftada ki makeler bölümünde yayımlamasını rica ettim. Ancak bu konuda şimdiye kadar bana hiç bir yanıt gelmedi. Ben de bu yazdıklarım boşa gitmemesi için bu şekilde yayınlamaya başladım.

Malesef PICPROJE yetkilerinden bu konuda hiçbir ilgi göremedik.

Selamlar

erkan614

ben yazılanları pdf olarak kaydediyorum buyrun. 1-2-6-7 ve bir başka arkadaşımızın yazdığı makale var bonus olarak linkte tabi onu da arslan74 vermişti

@arslan74 ellerine sağlık 3 aydır böyle bi kaynak bekliyordum. eğer yazılanlar daha sonra derlenip dergide yayınlancaksa veya tek bi başlıkta toplancaksa veya istemezsen" :)  "ben pdfleyip rapide yüklemeyeyim publisher sensin nihayetinde :)

hi-tech bölüm 1-2 6-7 + bonus

Digimensch

Her ikinizede verdiginiz emekler iicn tesekkürler.
Derslerin devamini dileriz.Özellikle
PIC ile Serial Iletisim
PIC ile LCD'ye veri gönderme
PIC ile Servo Motor kontrolü gibi konulari öncelikle anlatmaya calisirsan cok ama cok güzel olur.

arslan74

Alıntı yapılan: "Digimensch"Her ikinizede verdiginiz emekler iicn tesekkürler.
Derslerin devamini dileriz.Özellikle
PIC ile Serial Iletisim
PIC ile LCD'ye veri gönderme
PIC ile Servo Motor kontrolü gibi konulari öncelikle anlatmaya calisirsan cok ama cok güzel olur.

Merhaba,

İleryen konularda LCD ve usart konuları anlatmayı düşünüyorum ancak. Ancak Servo motor kontrolü cok derin ve baya ileri bir konu olduğu için onu anlatmayi şimdilik düşünmiyorum. Çünkü bu anlattıklarım giriş seviyesinde ki PICC konularıdır. Ama Eğer servo motor olarak bahs ettiğin maket oyuncaklarda kullanılan servolar ise. O zaman ilerde PWM konusunu anlatmak nasib olursa öğrenmiş olursunuz.

Selamlar

mmuhittin

Aslında zor birşey yok bilakis öğrendikten sonra çok bile kolay gelebilir
nasılki on-off butonlarla lcd ekranı çalıştırabiliyorsak servo motor sürücüsünüde bu şekilde dürtükliyebiliriz. Maket servo motor sürmekten daha kolay.   ;)

arslan74

Alıntı yapılan: "mmuhittin"Aslında zor birşey yok bilakis öğrendikten sonra çok bile kolay gelebilir
nasılki on-off butonlarla lcd ekranı çalıştırabiliyorsak servo motor sürücüsünüde bu şekilde dürtükliyebiliriz. Maket servo motor sürmekten daha kolay.   ;)

Bahs ettiğiniz konu servo motorları puls motunda sürme şeklidir. Servo motor yanlız puls modunda değil aynı, zamanda başka modlarda da çalışma özelliklerine sahibdirler. Bu özellik kullanılan servo sürücüne göre değişebilir. Bu yüzden fazla girmek istemiyorum. Ayrıca servo motorları ve özellikle sürücüleri cok pahalıdır.
PIC'le servo motor sürücü yapmak için cok ileri matematik ve eletronik bilgisi gerektirir. Ayrıca bunu basit bir PIC'le de yapamassınız, dsPIC'leri kullanmak gerek.

Suanda onları kullanmadığım için, o alt yapıya sahip değilim. İlerde sahip olsam bile böyle bir sayfaya sığmayacak kadar geniş bir konu olur.

Selamlar

cenkishan

cok yararlı ugrası hocam sagolun.birde adc okuma ile ornek verirmisiniz.
Bir bit olsam dolaşsam C de byte byte

Digimensch

Alıntı yapılan: "arslan74"
Alıntı yapılan: "Digimensch"Ama Eğer servo motor olarak bahs ettiğin maket oyuncaklarda kullanılan servolar ise. O zaman ilerde PWM konusunu anlatmak nasib olursa öğrenmiş olursunuz.

Selamlar

Evet Hocam bende maket oyncaklarda kullanilan servo motorlardan bahsediyorum.Su PWM sinyallerle calisan kücük motorlar...

mihri

Kesme alt programında kesme bayrakları kontrol edilip hangi kemenin oluştuğu anlaşılmaya çalışılıyo bu biraz saçma değil mi? ASM de kesme vektör adresleri bellidir kesme old. program oraya dallanır.  CCS de her kesme ayrı alt programa dallanıyor. Hi-Tech' te niye bütün kesmeler aynı alt programa gidip orda bayraklar kontrol ediliyo?
"Eppur si muove!"

arslan74

Alıntı yapılan: "mihri"Kesme alt programında kesme bayrakları kontrol edilip hangi kemenin oluştuğu anlaşılmaya çalışılıyo bu biraz saçma değil mi? ASM de kesme vektör adresleri bellidir kesme old. program oraya dallanır.  CCS de her kesme ayrı alt programa dallanıyor. Hi-Tech' te niye bütün kesmeler aynı alt programa gidip orda bayraklar kontrol ediliyo?

Merhaba,

Öncelikle hoş geldiniz. Şimdi sorularınızı yanıtlayalım.

Alıntı Yap
ASM de kesme vektör adresleri bellidir kesme old. program oraya dallanır.

Öylemi öyle ise bunu bir kodla gösterebilirmisiniz. Ben uzun yıllardır PIC'e kod yaziyorum ama 12 ve 16 serisinde kesme için tek bir adresden başka bir adrese dallandığını ilk defa sizden duyuyorum. Baka uC ilk karıştırıyor olmayın.

Alıntı Yap
CCS de her kesme ayrı alt programa dallanıyor. Hi-Tech' te niye bütün kesmeler aynı alt programa gidip orda bayraklar kontrol ediliyo?

Sizin öyle zannetmenizle gercekte öyle olması faklı şeylerdir. CCS size sanki öyle imiş gibi bir görüntü verebilir, ancak bu sizi yanılmasın. Nedenine gelince; Bir kere CCS %100 C uyumlu bir derleyici değil. C diline benzeyen ama kendine haz özellikleri olan bir derleyicidir. bu kendine haz özelliklere gelince. En başka bir cok işlemin hazır kütüphanesi var, aynı şeklide interrupt işlemleri içinde yapmışlar. Ama bunlar acık kod kaynaklı olmadığı için gercekte işlemin nasıl yapıldığı göremiyorsun.

Hazır kodlu kütüphaneli derleyiciler ilk başlayanlar içn güzel gözüküyor. Çünkü işini bayağı kolaylaştırıyor. Ama bu yeni başlayanlar ilk ciddi projede ve karşılaştığı ilk hata da içinde cıkmaları bayağı zorlaşiyor. Cünkü herşeyi hazır kod'a göre yapmışlar ve bu kütüphanelere fazlada hakim olmadıkları zaman, fazla derinlere dalamiyorlar.

O yüzden ben olayın işlemcide nasıl gerceklediğini anlatmaya çalışıyorum. sonra Hi-Tech anlatmaya çalışıyorum. Burada dikkat ederseniz, kullandığım her işlemcini datasheetlerini inceleyerek acıklama yapiyorum, bunları kendi kafamdan uydurmuyorum.

Önce işlemcide nasıl işlemler yapmılması gerektiğini, sonra da bu işlemleri Hi-Tech nasıl yazılabileceğini örneklerle anlatiyorum.

Amaç burda C anlatmak değil, PIC tanımak ve C bilenler için PIC ile C'de nasıl kodu hazırlanır onu anlatmaktır.

Eğer benim anlatıklarımın özünü kavrarsanız, o zaman hi-tech'de derleyicisinide bir önemi kalmiyor. Bütün Ansi-C uyumlu C derleyiclerinde C kodu hazırlayabilirsiniz.

Başka C derleyicilerine örnek verirken Ansi-C uyumlumu diye kontrol edin. Yoksa bu uyum yoksa kıyas yapmak tam doğru olmaz.

Cünkü gercek mana kıyas yapamassın. Sadece kodun sonucun da programı kıyaslayabilirsiniz. RAM , ROM kullanımı işlem hızı gibi.

CCS bu işi gerckete nasıl yaptığını göstermiyor. Sadece kolay anlamanız için bir fonksiyon veriyor ama bu fonksiyonlarının içini acmadığı için olayın gercekte nasıl duğunu bilmeyebilirsiniz veya onların gösterdiği gibi o kadar basid olduğunu zannedebilirsiniz. Ama gecekte öyle değil onu bilin. Yoksa ilerde cok büyük hayal kırıklığına uğrayabilirsiniz.

PIC de kod yazmadan önce ben arkadaşlara kullanacağı PIC'in datasheetini güzelce okuyub ezberlemesini tavsiye ediyorum. Ama satır satır değil sadece ana hatlarını öğrenmesi yeterli. ayrıntılarını datasheeten bakabilirsiniz.


Selamlar

CLR

Alıntı yapılan: "mihri"Kesme alt programında kesme bayrakları kontrol edilip hangi kemenin oluştuğu anlaşılmaya çalışılıyo bu biraz saçma değil mi? ASM de kesme vektör adresleri bellidir kesme old. program oraya dallanır.  CCS de her kesme ayrı alt programa dallanıyor. Hi-Tech' te niye bütün kesmeler aynı alt programa gidip orda bayraklar kontrol ediliyo?

Merhaba

Bildiklerin yanlış, doğrusu şöyledir, CCS  C , hi-tech C'ye göre çok kolaylaştırılmış bir C dilidir. Alt programları hazırdır ama istersen sende kendine özgü kütüphaneler hazırlayabilirsin fakat bu programı kullanan insanların çoğu kendi kütüphanelerini yazmak yerine hazır kütüphaneleri kulllanmayı tercih ediyor. Çünkü kendi kütüphaneni oluşturmak o kadar da kolay değildir. Pic microcontroller donanımına tamamen hakim olacağın gibi haberleşeceğin IC donanım ve haberleşmesinede hakim olmalısın. Yapılacakları bit bit bilmen gerekiyor. İşte burada CCS C'nin kütüphanesi devreye girer ve seni bu eziyetten kurtarır.

Pic16 serisinde tek interrupt adresi vardır ve CCS C senin yerine ilgili flagleri kontrol eden altprogramı sayesinde sanki farklı bir interrupt adresine dallanıyormuşsun gibi hissettirir. Oysa interrupt adresi tektir ve 0x04 dir. ( C programları önce asm'ye sonra hex'e çevrilirler, 16 serisinde asm'de tek int. adresi var)

Pic18 serisinde ise 2 tane interrupt adresi vardır. İstediğin interruptı veya interruptları diğerlerine göre öncelikli yapabiliyorsun.

Ayrıca zamanını ve bilgisini sizin gibi arkadaşlara bilgi vermeye çalışan aslan74 gibi faydalı insanların paylaşma heveslerini kırmamak gerekir.

Umarım faydalı olmuştur, Kolay gelsin
Knowledge and Experience are Power

Seferi


kaganayanoglu

Alıntı yapılan: erkan614 - 04 Şubat 2008, 22:30:26ben yazılanları pdf olarak kaydediyorum buyrun. 1-2-6-7 ve bir başka arkadaşımızın yazdığı makale var bonus olarak linkte tabi onu da arslan74 vermişti

@arslan74 ellerine sağlık 3 aydır böyle bi kaynak bekliyordum. eğer yazılanlar daha sonra derlenip dergide yayınlancaksa veya tek bi başlıkta toplancaksa veya istemezsen" :)  "ben pdfleyip rapide yüklemeyeyim publisher sensin nihayetinde :)

hi-tech bölüm 1-2 6-7 + bonus

Link verirseniz sevinirim. Teşekkürler