Buton Interrupt'ı

Başlatan o1avcioglu, 22 Temmuz 2014, 16:45:29

o1avcioglu

Elimdeki pic'le mili saniye cinsinden butonun açma kapama sürelerini ölçmek istiyorum. Bunu interrupt'ı kullanarak döngü içinde değilde interrupt'tan halletmek istiyorum. mikro c derleyicisinde yazdım programı da


#define   led   portb.f6

sbit LCD_RS at RA4_bit;                    /*LCD bağlantıları ayarlanıyor*/
sbit LCD_EN at RA5_bit;
sbit LCD_D4 at RA0_bit;
sbit LCD_D5 at RA1_bit;
sbit LCD_D6 at RA2_bit;
sbit LCD_D7 at RA3_bit;

sbit LCD_RS_Direction at TRISA4_bit;
sbit LCD_EN_Direction at TRISA5_bit;
sbit LCD_D4_Direction at TRISA0_bit;
sbit LCD_D5_Direction at TRISA1_bit;
sbit LCD_D6_Direction at TRISA2_bit;
sbit LCD_D7_Direction at TRISA3_bit;      //LCD BAĞLANTILARI TAMAMLANDI A PORT U KULLANILDI.

unsigned int timersteps=0, timersecond=0;   // SAYICI İÇİN ADIMLAR VE SANİYE DEĞİŞKENİ ATANDI.
char txt [7];                              // EKRANA YAZDIRMAK İÇİN TEXT HAZIR.
char text [7];

void interrupt(){
INTCON.GIE = 0;
if(INTCON.RBIF)
{
                  if(PIR1.TMR1IF == 1){
                           PIR1.TMR1IF = 0;
                                      T1CON.TMR1ON = 0;
                                      TMR1L = 0b00110000;             //sanırım 1 msn'yeye ayarlandı
                                      TMR1H = 0b11111000;
                                      T1CON.TMR1ON = 1;
                                       if(led==1)
                                      {
                                      timersteps++; //altta dursun
                                      }
                                      if(timersteps >= 1000)
                                      {
                                      timersteps = 0;
                                      timersecond++;
                                      }
                                      }
}
INTCON.RBIF=0;
INTCON.GIE=1;
}

void kurulum()
{
  led=0;
  OSCCON.B6 = 1;         //İNTERNAL OSİLATÖR 16 MHz' E AYARLANDI.
  OSCCON.B5 = 1;
  OSCCON.B4 = 1;

  OSCCON.B0 = 0;          //internal blok için primary ve secondary devredışı bırakıldı
  OSCCON.B1 = 1;

  ANSELA = 0X00;                   //18f26k22 içindeki analog select
  ANSELB = 0X00;
  ANSELC = 0X00;                   //ethernet haberleşmesi için C portunun mutlaka dijital olduğuna dikkat et!

  TRISA = 0B00000000;
  LATA=0;

  LATB = 0X00;
  TRISB = 0b01000000 ;          // PORT B BUTON İNPUTLARI İÇİN SET EDİLDİ.

//TİMER_İNİT;
INTCON.GIE = 0;
INTCON.PEIE = 0;
T1CON = 0b00010000;
TMR1L = 0b00110000;
TMR1H = 0b11111000;
T1CON = 0b00010001;
PIR1.TMR1IF = 0;               // clear TMR1IF
PIE1.TMR1IE = 1;               // enable interrupts
INTCON2.RBPU=0;                // ENABLED PULL UPS
PIE3.TMR1GIE=0;
IOCB.IOCB6 = 1;              //PORTB.B6 PULL UP ENABLE
INTCON.RBIF=1;      // RB4..RB7 kesme bayrağı temizlenir
INTCON.RBIE=0;      //RB4..RB7 kesme izinleri set edilir

timersteps = 0;
timersecond = 0;
INTCON.PEIE = 1;
INTCON.GIE = 1;
delay_ms(30);

   Lcd_Init();
   Delay_ms(100);
   Lcd_cmd(_LCD_CURSOR_OFF);
   Delay_ms(20);
   Lcd_cmd(_lcd_clear);
   delay_ms(20);
   
   if(led==1){
   IntToStr(timersteps, txt);
   lcd_out(1,1,txt);
   delay_ms(30);
   INTCON.RBIF=1;
   }
}

void main() {

kurulum();

while(1);

}

böyle yazdım. Yani ben bu butona bastığımda ve elimi çektiğimde aradaki süreyi milisaniye cinsinden void'i hiç karıştırmadan nasıl lcd'ye yazdırabilirim. Çok küçük bir hatamdan dolayı yapamadığımı düşünüyorum. Şimdiden teşekkürler.