USB ile çalisirken TIMER çalışmıyor yardim lutfen

Başlatan computerboy, 19 Şubat 2013, 11:59:11

computerboy

Merhaba, arkadaşlar pic18f4550 kullanıyorum. usb aktif iken timeri hiçbir şekilde ayarlayamıyorum nasıl yaparız bilen varmı ?

usb devre dışı iken sorun yok ama timer aktif olduğu anda aygıt tanınmıyor diye yazıyor. bir yolu olmalı diye düşünüyorum bilenler yardım ederse sevinirim.

usb kesmesini araştırdım 10 ms aralıklarla çalışıyor belki işşime yarar dedim TMR1 diye bir sayaç tanımladım 200 e gelince ledi yak dedim hiç bir tıkyok malesef.

örnek kod:
#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode(){
if (INTCONbits.TMR0IF) {
TMR1++;
if ( TMR1 == 200 )
mLED_2_On();
}
}


ayar yapayım diye timer2 ile çalışayım dedim onuda ekleyince usb tamamen duruyor - eski arabalar gibi istop ediyor :)
static void Initialize_System(void)
{
 	//ADCON1 |= 0x0F;     	// Default all pins to digital
     UserInit();
     USBDeviceInit();		//usb_device.c.  Initializes USB module SFRs and firmware

    OpenTimer2(TIMER_INT_ON  & T2_PS_1_16 & T2_POST_1_16);
    PR2 = 250;

    RCONbits.IPEN = 1;
    INTCONbits.GIE = 1;
    PIE1bits.TMR2IE = 1;


}

computerboy

arkadaşlar deneme yapıyorum timer0 low öncelikli interruptları algılasın diye aşağıdaki kodu initilaized kısmına yazdım ama olmuyor nasıl yaparız fikri olan ?

INTCON2bits.TMR0IP = 0; // timer0 low periyodu yakala
     INTCONbits.TMR0IF = 0;  // Timer0 temzile
     INTCONbits.TMR0IE = 1;  // timer0 aktifleştir.


buda interrupt kodu.

unsigned long sayac;

#pragma code 
// ISR de interrupciones:
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode(){
if(INTCONbits.TMR0IF){ 
}
	#if defined(USB_INTERRUPT)
		USBDeviceTasks();
    #endif
}

#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode(){
Usb_Interrup_Test(); 	
}
#pragma code

void Usb_Interrup_Test(void) 
 { 
LATBbits.LATB6=1;
     if (INTCONbits.TMR0IF) 
     { 
         INTCONbits.TMR0IF = 0; 
         sayac ++; 
         if ( sayac == 150 ) { 
            	//sayac = 0; 
		 		LATBbits.LATB7=1;
         }     
     } 
 }   

computerboy

#2
arkadaşlar stack taşmasından dolayı resetleniyormuş 18f4550.lkr dosyasında ve kodda örnekte verdiğim  düzenlemeleri yapıp timeride  low modda iken çalıştırıyorum. ayrıca grafik lcd vb. donanımlarıda kullanırken  kesme bayrağını sıfırlamak gerekiyor.

18f4550.lkr

LIBPATH .  
FILES c018i.o
FILES clib.lib
FILES p18f4550.lib  
CODEPAGE   NAME=bootloader START=0x0          	   END=0xFFF          PROTECTED
CODEPAGE   NAME=vectors    START=0x1000       	   END=0x1029         PROTECTED
CODEPAGE   NAME=page       START=0x102A            END=0x7FFF
CODEPAGE   NAME=idlocs     START=0x200000          END=0x200007       PROTECTED
CODEPAGE   NAME=config     START=0x300000          END=0x30000D       PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE          END=0x3FFFFF       PROTECTED
CODEPAGE   NAME=eedata     START=0xF00000          END=0xF000FF       PROTECTED
  
ACCESSBANK NAME=accessram  START=0x0            END=0x5F
DATABANK   NAME=gpr0       START=0x60           END=0xFF
DATABANK   NAME=gpr1       START=0x100          END=0x1FF
DATABANK   NAME=gpr2       START=0x200          END=0x2FF
DATABANK   NAME=gpr3       START=0x300          END=0x3FF
DATABANK   NAME=usb4       START=0x400          END=0x4FF          PROTECTED
DATABANK   NAME=usb5       START=0x500          END=0x5FF          PROTECTED
DATABANK   NAME=usb6       START=0x600          END=0x6FF          PROTECTED
DATABANK   NAME=usb7       START=0x700          END=0x7FF          PROTECTED
ACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF          PROTECTED  
SECTION    NAME=CONFIG     ROM=config  
STACK SIZE=0x100 RAM=gpr3  
SECTION     NAME=USB_VARS   RAM=usb4 


// ISR de interrupciones:
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode(){
if(INTCONbits.TMR0IF){}
	#if defined(USB_INTERRUPT)
		PIR1bits.TMR1IF = 0;
		USBDeviceTasks();
    #endif

}


#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode(){
if(PIR1bits.TMR1IF == 1){
	PIR1bits.TMR1IF = 0;
     interrupt_flag=0;
   }
}
#pragma code



timer init kod:

static void Initialize_Timer(void)
{
        OpenTimer1( TIMER_INT_ON    &  // Turn on TMR1
                    T1_8BIT_RW     &  // 16 bit timer 
                    T1_SOURCE_INT   &  // Internal clock source
                    T1_PS_1_8       &  // 1:1 prescale
                    T1_OSC1EN_OFF   &  // Disable oscillator
                    T1_SYNC_EXT_OFF ); // Disable sync of external clock
        
        RCONbits.IPEN   = 0; // Enable interrupt prioritizing
       	INTCONbits.GIEH = 1; // Enable high priority interrupts

        IPR1bits.TMR1IP = 1; // Set TMR1 interrupt priority
        PIE1bits.TMR1IE = 1; // Enable TMR1 interrupts
        PIR1bits.TMR1IF = 0; // Clear TMR1 interrupt flag
		
        TMR1H = 0x85;                 //Timer Reload to count 1s
        TMR1L = 0xEE;                    
        INTCONbits.GIEL = 1; // Enable low priority interrupts
}