PIC18F46K22 TIMER2 Kesmeye Gitmiyor?

Başlatan ahmetgokce01, 18 Haziran 2014, 10:57:40

ahmetgokce01

Merhaba arkadaşlar 18f46k22 mcuda timer2 1ms ayarlayıp kesmeye gitmesini istiyorum fakat bir türlü kesmeye gitmiyor timer0 ve timer1 sistemde çalışıyor fakat timer2 bir türlü çalışmıyor örnek kod aşağıdadır timer2 kesmeye gitmesi için ne yapabilirim teşekkürler.


#include <18f46K22.h> 
#device adc=10         
#device *=16                                   
#FUSES INTRC_IO,PROTECT,NODEBUG,NOLVP,NOSTVREN,NODELAYINTOSC   
#FUSES NOXINST,NOEBTR,NOIESO,NOFCMEN,NOWDT,NOPUT,NOMCLR 
#FUSES NOCPB,NOCPD,NOWRT,NOWRTC,NOSTVREN,BROWNOUT_NOSL,NOLPT1OSC

#use delay(clock=64000000) 


#INT_TIMER2      
void timer2_kesme(){
	output_toggle(PIN_a0);//sinyal deneme
}

void main(void) 
{ 

        setup_oscillator(OSC_64MHZ);
	setup_adc_ports(sAN4 | sAN5 |  VSS_VDD );	
	setup_adc(ADC_CLOCK_INTERNAL);	
	setup_comparator(NC_NC_NC_NC);	                          
	setup_ccp1(ccp_off);         
	setup_ccp2(ccp_off);                              
	SETUP_SPI(SPI_SS_DISABLED);
	SETUP_WDT(WDT_OFF);
	SETUP_DAC(DAC_OFF);
	setup_timer_0(T0_INTERNAL | T0_DIV_8);                                                                               
	setup_timer_1(T1_EXTERNAL | T1_ENABLE_SOSC | T1_DIV_BY_1);//timer1 harici kristalden 	 
	setup_timer_2(T2_DIV_BY_16,64,16);		//64.0 us overflow, 1.0 ms interrupt
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1); 
   setup_timer_4(T4_DISABLED,0,1); 
   setup_timer_5(T5_DISABLED); 
   setup_timer_6(T6_DISABLED,0,1);
   
   enable_interrupts(INT_TIMER2);
   enable_interrupts (GLOBAL); 		// Aktif edilen kesmelere izin verildi

while(true);
 
}

Bayramsumbul

46k22'nin yapısını tam olarak bilmiyorum ama çevresel kesmelere de izin vermeniz gerekmiyor mu? Burada sadece global kesmelere izin verilmiş
Bir Elektronik Meraklısının Serüveni...

Erol YILMAZ

13.2 Timer2/4/6 Interrupt

Timer2/4/6 can also generate an optional device interrupt.
The Timer2/4/6 output signal (TMRx-to-PRx match) provides the input for the 4-bit counter/postscaler.
This counter generates the TMRx match interrupt flag which is latched in TMRxIF of the PIR1/PIR5 registers.
The interrupt is enabled by setting the TMRx Match Interrupt Enable bit, TMRxIE of the PIE1/PIE5 registers.
Interrupt Priority is selected with the TMRxIP bit in the IPR1/IPR5 registers.


TMR2 yi aktive etmek için PIE1/PIE5 registerleri ile uğraşman gerekiyormuş.

PIE1 register içeriği:

ADIE
RC1IE
TX1IE
SSP1IE
CCP1IE
TMR2IE
TMR1IE


Daha ayrıntı için Bkn Datasheet : DS41412F

ahmetgokce01

Hocam peki ccs c de PIE1 registerı nasıl aktif edebilirim.

Erol YILMAZ

Kodunda fuse ayarlarından dolayı derleme yapamadım.
Onları sildim veya düzelttim, kodun F9D.1 bitini set ediyor. Yani normal görünüyordu.

....................    enable_interrupts(INT_TIMER2); 
00160:  BSF    F9D.1
....................    enable_interrupts (GLOBAL);       // Aktif edilen kesmelere izin verildi 
00162:  MOVLW  C0
00164:  IORWF  FF2,F


isis te hemen çalıştı.



#include <18f46K22.h> 
#device adc=10         
#device *=16                                   
#FUSES INTRC_IO,PROTECT,NODEBUG,NOLVP,NOSTVREN
#FUSES NOXINST,NOEBTR,NOIESO,NOFCMEN,NOWDT,NOPUT,NOMCLR 
#FUSES NOCPB,NOCPD,NOWRT,NOWRTC,NOSTVREN,BROWNOUT_NOSL

#use delay(clock=64Mhz) 


#INT_TIMER2      
void timer2_kesme(){
   output_toggle(PIN_a0);//sinyal deneme
}

void main(void){ 

   setup_oscillator(OSC_64MHZ);
   setup_adc_ports(sAN4 | sAN5 |  VSS_VDD );   
   setup_adc(ADC_CLOCK_INTERNAL);   
   setup_comparator(NC_NC_NC_NC);                             
   setup_ccp1(ccp_off);         
   setup_ccp2(ccp_off);                              
   SETUP_SPI(SPI_SS_DISABLED);
   SETUP_WDT(WDT_OFF);
   SETUP_DAC(DAC_OFF);
   setup_timer_0(T0_INTERNAL | T0_DIV_8);                                                                               
   setup_timer_1(T1_EXTERNAL | T1_ENABLE_SOSC | T1_DIV_BY_1);//timer1 harici kristalden     
   setup_timer_2(T2_DIV_BY_16,64,16);      //64.0 us overflow, 1.0 ms interrupt
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1); 
   setup_timer_4(T4_DISABLED,0,1); 
   setup_timer_5(T5_DISABLED); 
   setup_timer_6(T6_DISABLED,0,1);
   
   enable_interrupts(INT_TIMER2);
   enable_interrupts (GLOBAL);       // Aktif edilen kesmelere izin verildi

while(true);
 
}

ahmetgokce01

#5
O zaman benim derleyicimde mi sıkıntı var acaba, siz hangi versiyon kullanıyorsunuz.

mesaj birleştirme:: 18 Haziran 2014, 12:22:37

Benim derleyici belkide TMR2IE  registerini aktif edemiyor olabilir, biz ccs c de TMR2IE  registerini nasıl aktif edebiliriz.

Erol YILMAZ

4.140 bendeki,

yalnız sen kendi kodunu nasıl derleyebiliyorsun onu da anlamıyorum...

LST dosyasını inceler misin? Benimkinden farklı mı bir gör.

ahmetgokce01

#7
bendede aynı fakat çalışmıyor anlamadım sadece timer2 değil timer3, timer4, timer5 hiçbirini çalıştıramadım ama timer0 ve timer1 çalışıyor.

....................    enable_interrupts(INT_TIMER2); 
00170:  BSF    F9D.1
....................    enable_interrupts (GLOBAL);       // Aktif edilen kesmelere izin verildi 
00172:  MOVLW  C0
00174:  IORWF  FF2,F
....................




mesaj birleştirme:: 18 Haziran 2014, 13:59:16

Derleyip çalıştırdığınız .hex dosyasını gönderebilir misiniz bende çalışacakmı ilginç bir problem ne yaptıysam timer2 kesmeye gitmiyor farklı versiyon derleyiciler ile denedim olmuyor

xoom

#include <main.h>
        
                                
#FUSES INTRC_IO,PROTECT,NODEBUG,NOLVP,NOSTVREN  
#FUSES NOXINST,NOEBTR,NOIESO,NOFCMEN,NOWDT,NOPUT,NOMCLR 
#FUSES NOCPB,NOCPD,NOWRT,NOWRTC,NOSTVREN,BROWNOUT_NOSL

#use delay(clock=64000000) 


#INT_TIMER2      
void timer2_kesme(){
    output_toggle(PIN_a0);//sinyal deneme
}

void main(void) 
{ 

        setup_oscillator(OSC_64MHZ);
    setup_adc_ports(sAN4 | sAN5 |  VSS_VDD );   
    setup_adc(ADC_CLOCK_INTERNAL);   
    setup_comparator(NC_NC_NC_NC);                             
    setup_ccp1(ccp_off);         
    setup_ccp2(ccp_off);                              
    SETUP_SPI(SPI_SS_DISABLED);
    SETUP_WDT(WDT_OFF);
    SETUP_DAC(DAC_OFF);
    setup_timer_0(T0_INTERNAL | T0_DIV_8);                                                                               
    setup_timer_1(T1_EXTERNAL | T1_ENABLE_SOSC | T1_DIV_BY_1);//timer1 harici kristalden     
    setup_timer_2(T2_DIV_BY_16,64,16);      //64.0 us overflow, 1.0 ms interrupt
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1); 
   setup_timer_4(T4_DISABLED,0,1); 
   setup_timer_5(T5_DISABLED); 
   setup_timer_6(T6_DISABLED,0,1);
   
   enable_interrupts(INT_TIMER2);
   enable_interrupts (GLOBAL);       // Aktif edilen kesmelere izin verildi

while(true);
 
}


Yukarıdaki Kodu derledim ve timer2 çalışıyor.

ahmetgokce01

yukarıdaki kodu bende derledim bende çalışmıyor sebebini bulamadım sizde çalışan hex kodunu bana gönderirseniz bende denemiş olurum eğer bende çalışırsa o hex, benim derleyicide sıkıntı var başka aklıma birşey gelmiyor.


ahmetgokce01

Gönderdiğiniz hex dosyası bende de çalıştı demek ki benim derleyicide sıkıntı var teşekkür ederim.