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