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.