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);
}
}