PIC24-CN interrupt(Buton)

PIC24-CN interrupt(Buton) Bu örneğimizde buton okumaya göre karaşimsek led akış hızını değiştireceğiz. Buton okuma işini ise interrupt ile gerçekleştiriyoruz. Umarım faydalı olur.

/* 
Buton okumayla karaşimşek hızını değiştirme
 
Aykut ULUSAN,Elektronik Mühendisi,IZMIR
www.uicroarm.com 
 
Uygulama boardu : EX16L-A (16bit development board)   
www.expkits.com'dan temin edebilirsiniz. 


Not : 
1)Bu programda tuş okuma için CN interrupt kullandım ama kenar algılamalı interrpt kullanırsanız
daha anlaşılır olur.
2) Karşimşek ledlerindeki RB4'ün yanması için SWDIP6'daki rb4 on konumuna geterilmeli
*/

/*
Çalışması RA0'a basılıp çekildiğinde karaşimşek hız değişir
*/

#include <p24Fxxxx.h>	// burada PIC24F serisi kullanacağımızı ifade ettik ama işlemciyi MPLAB içinde seçilir
_CONFIG1(0x3F20)  // JTAG, WDF, flash memory'ye yazma kullanılmayacak
_CONFIG2(0x78EF)	// Dahili fast rc osc enable, xtal uçları boş olacak

	
void __attribute__((interrupt, no_auto_psv)) _CNInterrupt(void);
void DLY_10US(unsigned int us);
void DLY_MS(unsigned int ms);


unsigned char asm_reg,akis_hizi;

int
main(void){
	PORTA=0;			// latch'leri temizle
	INTCON1 = 0;
  	INTCON2 = 0;
	AD1PCFG=0xFFFF;		// portlar dijital
	TRISA=1; asm("NOP");		// Ra0 giriş
	TRISB=0;
	IFS1bits.CNIF=0;
	CNPU1bits.CN2PUE=1;
	CNEN1bits.CN2IE=1;
	IEC1bits.CNIE=1;
	asm_reg=0x01;				// default olarak RB0=1 
	akis_hizi=35;
	while(1) {
			while(asm_reg!=0x10){
				PORTB=asm_reg;
				DLY_MS(akis_hizi);
				asm_reg<<=1;
			}
			while(asm_reg!=0x1){
				PORTB=asm_reg;
				DLY_MS(akis_hizi);
				asm_reg>>=1;
			}
			if(!_CN2IE&&_RA0){
				_CNIF=0;
  				_CN2IE=1;
  				_CNIE=1;
			}
	}
	return 0; 				
}

void 
__attribute__((interrupt, no_auto_psv)) _CNInterrupt(void){
  _CNIF=0;
  _CN2IE=0;									
  _CNIE=0;
  if(akis_hizi==35) akis_hizi=100;
  else akis_hizi=35;
  while(!_RA0);
}


// X*10US
void
DLY_10US(unsigned int us){
	while(us--) {
		__asm__ volatile ("repeat #33");
		__asm__ volatile ("nop");
	}
}


// 65536ms'ye kadar 
void
DLY_MS(unsigned int ms){
	while(ms--){
		DLY_10US(100);
	}
}

Yorum ekle

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir