Go to Post resist the hive: As goofy as this may sound, wires do take up weight, several pounds of it. - Rickertsen2 [more]
Home
Go Back   Chief Delphi > Technical > Programming
CD-Media   CD-Spy  
portal register members calendar search Today's Posts Mark Forums Read FAQ rules

 
Closed Thread
Thread Tools Rate Thread Display Modes
  #1   Spotlight this post!  
Unread 08-02-2006, 19:38
theycallhimtom theycallhimtom is offline
Registered User
AKA: Tom Conerly
FRC #1540 (The Flaming Chickens)
Team Role: College Student
 
Join Date: Jan 2006
Rookie Year: 2005
Location: Lake Oswego, Oregon
Posts: 52
theycallhimtom has a spectacular aura abouttheycallhimtom has a spectacular aura abouttheycallhimtom has a spectacular aura about
Send a message via AIM to theycallhimtom Send a message via MSN to theycallhimtom
Encoders and putdata

So I'm getting the error: Timeout on Packet Number (Infinite Loop or no call to put data)

I got the latest version of Kevin's stripped down camera code and added his eeprom and interrupts(following his instructions for how to add them). I also added my code for encoders which I have tested on a different code base and it works. When I ran the encoders off of the new code base I get the above error ONLY when I move a wheel and the interrupt routines get called. They get called around 20 times before it crashes.

I have tried adding putdata in anywhere from twice instead of once to calling it during every interrupt and I still get the same error. I have no loops at all in my code. I have tried commenting out all the function calls in Process_Data_From_Master_uP so that function only calls getdata then putdata and I still get the same error.

Anyone have any ideas?

Here is the encoder code: (which again has been tested to work)
Code:
if(ENCODER2 == INPUTTRUE){                
      directionTravelingOne = FORWARD;
  }else{
    clockwise*/
    directionTravelingOne = BACKWARD;
     clickRotationsOne--;
  }
  #2   Spotlight this post!  
Unread 08-02-2006, 20:43
Joe Ross's Avatar Unsung FIRST Hero
Joe Ross Joe Ross is offline
Registered User
FRC #0330 (Beachbots)
Team Role: Engineer
 
Join Date: Jun 2001
Rookie Year: 1997
Location: Los Angeles, CA
Posts: 8,556
Joe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond repute
Re: Encoders and putdata

Quote:
Originally Posted by theycallhimtom
So I'm getting the error: Timeout on Packet Number (Infinite Loop or no call to put data)

I got the latest version of Kevin's stripped down camera code and added his eeprom and interrupts(following his instructions for how to add them). I also added my code for encoders which I have tested on a different code base and it works. When I ran the encoders off of the new code base I get the above error ONLY when I move a wheel and the interrupt routines get called. They get called around 20 times before it crashes.

I have tried adding putdata in anywhere from twice instead of once to calling it during every interrupt and I still get the same error. I have no loops at all in my code. I have tried commenting out all the function calls in Process_Data_From_Master_uP so that function only calls getdata then putdata and I still get the same error.

Anyone have any ideas?

Here is the encoder code: (which again has been tested to work)
Code:
if(ENCODER2 == INPUTTRUE){                
      directionTravelingOne = FORWARD;
  }else{
    clockwise*/
    directionTravelingOne = BACKWARD;
     clickRotationsOne--;
  }
Did you retype your code or cut and paste because you have an comment block terminator but no start in the code you have above.

Please cut and paste your entire interrupt handler and your InterruptHandlerLow function including all #pragmas.
  #3   Spotlight this post!  
Unread 09-02-2006, 00:54
theycallhimtom theycallhimtom is offline
Registered User
AKA: Tom Conerly
FRC #1540 (The Flaming Chickens)
Team Role: College Student
 
Join Date: Jan 2006
Rookie Year: 2005
Location: Lake Oswego, Oregon
Posts: 52
theycallhimtom has a spectacular aura abouttheycallhimtom has a spectacular aura abouttheycallhimtom has a spectacular aura about
Send a message via AIM to theycallhimtom Send a message via MSN to theycallhimtom
Re: Encoders and putdata

Code:
/*******************************************************************************
*
*	FUNCTION:		Int_1_Handler()
*
*	PURPOSE:		If enabled, the interrupt 1 handler is called when the
*					interrupt 1/digital input 1 pin changes logic level. The 
*					edge that the interrupt 1 pin reacts to is programmable 
*					(see comments in the Initialize_Interrupts() function, 
*					above).
*
*	CALLED FROM:	user_routines_fast.c/InterruptHandlerLow()
*
*	PARAMETERS:		None
*
*	RETURNS:		Nothing
*
*	COMMENTS:		The PIC18F8520's RB2/INT2 pin on port b is mapped to
*					interrupt 1 on the EDU-RC and digital input 1 on the
*					FRC-RC [108].
*
*******************************************************************************/
//CATLIN FUCNTION
void Int_1_Handler(void)
{
	//printf("int1");
	    if(ENCODER2 == INPUTTRUE){
                //A came second so its going clockwise
      //     printf("TRUE \r");
           directionTravelingOne = FORWARD;
        }else{
	     //   printf("FALSE subtract from varible \r");
                /*b came first so its going counter clockwise*/
           directionTravelingOne = BACKWARD;
           clickRotationsOne--;
        }
		//printf("%d",clickRotations );
// this function will be called when an interrupt 1 occurs
}

/*******************************************************************************
*
*	FUNCTION:		Int_2_Handler()
*
*	PURPOSE:		If enabled, the interrupt 2 handler is called when the
*					interrupt 2/digital input 2 pin changes logic level. The 
*					edge that the interrupt 2 pin reacts to is programmable 
*					(see comments in the Initialize_Interrupts() function, 
*					above).
*
*	CALLED FROM:	user_routines_fast.c/InterruptHandlerLow()
*
*	PARAMETERS:		None
*
*	RETURNS:		Nothing
*
*	COMMENTS:		The PIC18F8520's RB3/CCP2/INT3 pin on port b is mapped
*					to interrupt 2 on the EDU-RC and digital input 2 on the
*					FRC-RC [108].
*
*******************************************************************************/
//CATLIN FUNC
void Int_2_Handler(void)
{
	//printf("int2");
	//callPutData();
	if(ENCODER1 == INPUTTRUE){
                //A came second so its going clockwise
           directionTravelingOne = BACKWARD;
           //printf("TRUE \r");
    }else{
	    	printf("False add one to counter \r");
                /*b came first so its going counter clockwise*/
           directionTravelingOne = FORWARD;
           clickRotationsOne++;
           printf("%d", clickRotationsOne);
    }	// this function will be called when an interrupt 2 occurs
	//printf("Encoder 1: " + directionTraveling);
	//printf("Total Distance: " + clickRotations);
}

/*******************************************************************************
*
*	FUNCTION:		Int_3_Handler()
*
*	PURPOSE:		If enabled, the interrupt 3 handler is called when the
*					interrupt 3/digital input 3 pin changes logic level. 
*
*	CALLED FROM:	user_routines_fast.c/InterruptHandlerLow()
*
*	PARAMETERS:		RB4_State is the current logic level of the
*					interrupt 3 pin.
*
*	RETURNS:		Nothing
*
*	COMMENTS:		The PIC18F8520's RB4/KBI0 pin on port b is mapped to
*					interrupt 3 on the EDU-RC and digital input 3 on the
*					FRC-RC [108].
*
*******************************************************************************/
//CATLIN FUNC
void Int_3_Handler(unsigned char RB4_State)
{
	//printf("int3");
	//	printf("\n");
	//	printf("%d", (int) RB4_State);
	if(RB4_State == 1){
	    if(ENCODER4 == INPUTTRUE){
                //A came second so its going clockwise
           directionTravelingTwo = FORWARD;
        }else{
                /*b came first so its going counter clockwise*/
           directionTravelingTwo = BACKWARD;
           clickRotationsTwo--;
        }
		//printf("%d",clickRotations );
	}
	// this function will be called when an interrupt 3 occurs
}

/*******************************************************************************
*
*	FUNCTION:		Int_4_Handler()
*
*	PURPOSE:		If enabled, the interrupt 4 handler is called when the
*					interrupt 4/digital input 4 pin changes logic level. 
*
*	CALLED FROM:	user_routines_fast.c/InterruptHandlerLow()
*
*	PARAMETERS:		RB5_State is the current logic level of the
*					interrupt 4 pin.
*
*	RETURNS:		Nothing
*
*	COMMENTS:		The PIC18F8520's RB5/KBI1/PGM pin on port b is mapped
*					to interrupt 4 on the EDU-RC and digital input 4 on the
*					FRC-RC [108].
*
*******************************************************************************/
//CATLIN FUNC
void Int_4_Handler(unsigned char RB5_State)
{
	//	printf("\n");
	//printf("%d", (int) ENCODER3);
	if(RB5_State == 1){
		if(ENCODER3 == INPUTTRUE){
	                //A came second so its going clockwise
	           directionTravelingTwo = BACKWARD;
	    }else{
	                /*b came first so its going counter clockwise*/
	           directionTravelingTwo = FORWARD;
	           clickRotationsTwo++;
	    }
	}
		//printf("Encoder 1: " + directionTraveling);
		//printf("Total Distance: " + clickRotations);
		// this function will be called when an interrupt 4 occurs
}

/*******************************************************************************
*
*	FUNCTION:		Int_5_Handler()
*
*	PURPOSE:		If enabled, the interrupt 5 handler is called when the
*					interrupt 5/digital input 5 pin changes logic level. 
*
*	CALLED FROM:	user_routines_fast.c/InterruptHandlerLow()
*
*	PARAMETERS:		RB6_State is the current logic level of the
*					interrupt 5 pin.
*
*	RETURNS:		Nothing
*
*	COMMENTS:		The PIC18F8520's RB6/KBI2/PGC pin on port b is mapped
*					to interrupt 5 on the EDU-RC and digital input 5 on the
*					FRC-RC [108].
*
*******************************************************************************/
void Int_5_Handler(unsigned char RB6_State)
{
	printf("int5");
	//	printf("\n");
	//	printf("%d", (int) RB4_State);
	if(RB6_State == 1){
	    if(ENCODER6 == INPUTTRUE){
                //A came second so its going clockwise
           directionTravelingThree = FORWARD;
        }else{
                /*b came first so its going counter clockwise*/
           directionTravelingThree = BACKWARD;
           clickRotationsThree--;
        }
		//printf("%d",clickRotations );
	}
	// this function will be called when an interrupt 5 occurs
}

/*******************************************************************************
*
*	FUNCTION:		Int_6_Handler()
*
*	PURPOSE:		If enabled, the interrupt 6 handler is called when the
*					interrupt 6/digital input 6 pin changes logic level. 
*
*	CALLED FROM:	user_routines_fast.c/InterruptHandlerLow()
*
*	PARAMETERS:		RB7_State is the current logic level of the
*					interrupt 6 pin.
*
*	RETURNS:		Nothing
*
*	COMMENTS:		The PIC18F8520's RB7/KBI3/PGD pin on port b is mapped
*					to interrupt 6 on the EDU-RC and digital input 6 on the
*					FRC-RC [108].
*
*******************************************************************************/
void Int_6_Handler(unsigned char RB7_State)
{
		//	printf("\n");
	printf("int6");
	//printf("%d", (int) ENCODER5);
	if(RB7_State == 1){
		if(ENCODER5 == INPUTTRUE){
	                //A came second so its going clockwise
	           directionTravelingThree = BACKWARD;
	    }else{
	                /*b came first so its going counter clockwise*/
	           directionTravelingThree = FORWARD;
	           clickRotationsThree++;
	    }
	}
		//printf("Encoder 1: " + directionTraveling);
		//printf("Total Distance: " + clickRotations);
		// this function will be called when an interrupt 6 occurs
}
Code:
/*******************************************************************************
* FUNCTION NAME: InterruptHandlerLow
* PURPOSE:       Low priority interrupt handler
* If you want to use these external low priority interrupts or any of the
* peripheral interrupts then you must enable them in your initialization
* routine.  Innovation First, Inc. will not provide support for using these
* interrupts, so be careful.  There is great potential for glitchy code if good
* interrupt programming practices are not followed.  Especially read p. 28 of
* the "MPLAB(R) C18 C Compiler User's Guide" for information on context saving.
* CALLED FROM:   this file, InterruptVectorLow routine
* ARGUMENTS:     none
* RETURNS:       void
*******************************************************************************/
#pragma code
#pragma interruptlow InterruptHandlerLow save=PROD,section(".tmpdata")

void InterruptHandlerLow ()     
{
	unsigned char Port_B;
	unsigned char Port_B_Delta;       
	
	if (INTCONbits.TMR0IF && INTCONbits.TMR0IE) // timer 0 interrupt?
	{
		INTCONbits.TMR0IF = 0; // clear the timer 0 interrupt flag [89]
		Timer_0_Int_Handler(); // call the timer 0 interrupt handler (in interrupts.c)
	}
	else if (PIR1bits.TMR1IF && PIE1bits.TMR1IE) // timer 1 interrupt?
	{
		PIR1bits.TMR1IF = 0; // clear the timer 1 interrupt flag [92]
		Timer_1_Int_Handler(); // call the timer 1 interrupt handler (in interrupts.c)
	}  
	else if (PIR1bits.TMR2IF && PIE1bits.TMR2IE) // timer 2 interrupt?
	{
		PIR1bits.TMR2IF = 0; // clear the timer 2 interrupt flag [92]
		Timer_2_Int_Handler(); // call the timer 2 interrupt handler (in interrupts.c)
	}  
	else if (PIR2bits.TMR3IF && PIE2bits.TMR3IE) // timer 3 interrupt?
	{
		PIR2bits.TMR3IF = 0; // clear the timer 3 interrupt flag [93]
		Timer_3_Int_Handler(); // call the timer 3 interrupt handler (in interrupts.c)
	}  
	else if (PIR3bits.TMR4IF && PIE3bits.TMR4IE) // timer 4 interrupt?
	{
		PIR3bits.TMR4IF = 0; // clear the timer 4 interrupt flag [94]
		Timer_4_Int_Handler(); // call the timer 4 interrupt handler (in interrupts.c)
	}  
	else if (INTCON3bits.INT2IF && INTCON3bits.INT2IE) // external interrupt 1?
	{ 
		INTCON3bits.INT2IF = 0; // clear the interrupt flag [91]
		Int_1_Handler(); // call the interrupt 1 handler (in interrupts.c)
	}
	else if (INTCON3bits.INT3IF && INTCON3bits.INT3IE) // external interrupt 2?
	{
		INTCON3bits.INT3IF = 0; // clear the interrupt flag [91]
		Int_2_Handler(); // call the interrupt 2 handler (in interrupts.c)
	}
	else if (INTCONbits.RBIF && INTCONbits.RBIE) // external interrupts 3 through 6?
	{
		Port_B = PORTB; // remove the "mismatch condition" by reading port b            
		INTCONbits.RBIF = 0; // clear the interrupt flag [89]
		Port_B_Delta = Port_B ^ Old_Port_B; // determine which bits have changed
		Old_Port_B = Port_B; // save a copy of port b for next time around
	 
		if(Port_B_Delta & 0x10) // did external interrupt 3 change state?
		{
			Int_3_Handler(Port_B & 0x10 ? 1 : 0); // call the interrupt 3 handler (in interrupts.c)
		}
		if(Port_B_Delta & 0x20) // did external interrupt 4 change state?
		{
			Int_4_Handler(Port_B & 0x20 ? 1 : 0); // call the interrupt 4 handler (in interrupts.c)
		}
		if(Port_B_Delta & 0x40) // did external interrupt 5 change state?
		{
			Int_5_Handler(Port_B & 0x40 ? 1 : 0); // call the interrupt 5 handler (in interrupts.c)
		}
		if(Port_B_Delta & 0x80) // did external interrupt 6 change state?
		{
			Int_6_Handler(Port_B & 0x80 ? 1 : 0); // call the interrupt 6 handler (in interrupts.c)
		}
	}
	
	if (PIR1bits.RC1IF && PIE1bits.RC1IE) // rx1 interrupt?
	{
		#ifdef ENABLE_SERIAL_PORT_ONE_RX
		Rx_1_Int_Handler(); // call the rx1 interrupt handler (in serial_ports.c)
		#endif
	}                              
	else if (PIR3bits.RC2IF && PIE3bits.RC2IE) // rx2 interrupt?
	{
		#ifdef ENABLE_SERIAL_PORT_TWO_RX
		Rx_2_Int_Handler(); // call the rx2 interrupt handler (in serial_ports.c)
		#endif
	} 
	else if (PIR1bits.TX1IF && PIE1bits.TX1IE) // tx1 interrupt?
	{
		#ifdef ENABLE_SERIAL_PORT_ONE_TX
		Tx_1_Int_Handler(); // call the tx1 interrupt handler (in serial_ports.c)
		#endif
	}                              
	else if (PIR3bits.TX2IF && PIE3bits.TX2IE) // tx2 interrupt?
	{
		#ifdef ENABLE_SERIAL_PORT_TWO_TX
		Tx_2_Int_Handler(); // call the tx2 interrupt handler (in serial_ports.c)
		#endif
	}



//  ***  IFI Code Starts Here***
//                              
//  unsigned char int_byte;       
//  if (INTCON3bits.INT2IF && INTCON3bits.INT2IE)       /* The INT2 pin is RB2/DIG I/O 1. */
//  { 
//    INTCON3bits.INT2IF = 0;
//  }
//  else if (INTCON3bits.INT3IF && INTCON3bits.INT3IE)  /* The INT3 pin is RB3/DIG I/O 2. */
//  {
//    INTCON3bits.INT3IF = 0;
//  }
//  else if (INTCONbits.RBIF && INTCONbits.RBIE)  /* DIG I/O 3-6 (RB4, RB5, RB6, or RB7) changed. */
//  {
//    int_byte = PORTB;          /* You must read or write to PORTB */
//    INTCONbits.RBIF = 0;     /*     and clear the interrupt flag         */
//  }                                        /*     to clear the interrupt condition.  */
//  else
//  { 
//    CheckUartInts();    /* For Dynamic Debug Tool or buffered printf features. */
//  }
}
Thanks for whatever help you can offer. Excuse my comments of printfs that I used for debugging.
  #4   Spotlight this post!  
Unread 09-02-2006, 19:24
Joe Ross's Avatar Unsung FIRST Hero
Joe Ross Joe Ross is offline
Registered User
FRC #0330 (Beachbots)
Team Role: Engineer
 
Join Date: Jun 2001
Rookie Year: 1997
Location: Los Angeles, CA
Posts: 8,556
Joe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond repute
Re: Encoders and putdata

Quote:
Originally Posted by theycallhimtom
Thanks for whatever help you can offer. Excuse my comments of printfs that I used for debugging.
I noticed that there are a few printfs in the interrupt routines that are not commented out. Calling a big complicated, slow function like printf in a interrupt handler is probably the fastest way to crash the controller.
Closed Thread


Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump


All times are GMT -5. The time now is 09:24.

The Chief Delphi Forums are sponsored by Innovation First International, Inc.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi