Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Programming (http://www.chiefdelphi.com/forums/forumdisplay.php?f=51)
-   -   Problems Initializing Serial Driver... (http://www.chiefdelphi.com/forums/showthread.php?t=34593)

neilsonster 13-02-2005 23:27

Problems Initializing Serial Driver...
 
Hi, after getting my automous scripting and autonomous camera codes working independently, I have been having quite a bit of trouble putting the two together. The problems have seemed to start coming in User_Initialization when I call Serial_Driver_Initialize() along with Initialize_Encoders() and Initialize_Gyro() (from Kevin Watson's code).

I examined this and noticed it deals with interrupts, which I have had no experience with (It's my first and only year since I'm graduating this year :( ). Would anyone please be able to explain to me where the conflict lies? Here is the code from the three functions:

Serial_Driver_Initialize()
Code:

void Serial_Driver_Initialize(void)
{
  Initialize_uart(); 
}

(which calls this) ---v

static void Initialize_uart(void)
{
  uword8 flush;
 
  /* Setup the device control block (dcb) */
  dcb[PROGRAM_PORT].myRCREG = &RCREG1;
  dcb[PROGRAM_PORT].myTXREG = &TXREG1;
  dcb[PROGRAM_PORT].portId = 1;        /* setup unique ID for PROGRAM_PORT */
  Reset_Control_Block(&dcb[PROGRAM_PORT]);

  dcb[TTL_PORT].myRCREG = &RCREG2;
  dcb[TTL_PORT].myTXREG = &TXREG2;
  dcb[TTL_PORT].portId = 2;            /* setup unique ID for TTL_PORT */
  Reset_Control_Block(&dcb[TTL_PORT]);

  /* Initialize the PROGRAM_PORT port */
#if USE_BUFFERED_PRINTF
  Open1USART(USART_TX_INT_ON & USART_RX_INT_ON & USART_ASYNCH_MODE &
    USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, baud_115);
#else
  Open1USART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE &
    USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, baud_115);
#endif
 
  IPR1bits.TXIP = PRIORITY;     
  IPR1bits.RCIP = PRIORITY;   
  TRISCbits.TRISC6  = 0;        /*TX1 output*/
  TRISCbits.TRISC7 = 1;        /*RX1 input */
 
  flush = RCREG1;              /* flush data */
  flush = RCREG1;              /* flush data */
  RXINTF = 0;

  /* Initialize the TTL_PORT port */

  Open2USART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE &
    USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, baud_115);
 
  IPR3bits.RC2IP = PRIORITY;   
  IPR3bits.TX2IP = PRIORITY;   
  TRISGbits.TRISG1 = 0;        /*TX2 output*/
  TRISGbits.TRISG2 = 1;        /*RX2 input */

  flush = RCREG2;              /* flush data */
  flush = RCREG2;              /* flush data */
  RXINTF2 = 0;
  aBreakerWasTripped = FALSE;
}

Initialize_Encoders()
Code:

void Initialize_Encoders(void) 
{
        // Initialize the left encoder's interrupt. INT2 on the user PIC18F8520
        // is mapped to the interrupt one pin on the EDU-RC and digital I/O one 
        // on the FRC-RC.
        TRISBbits.TRISB2 = 1;                // make sure the RB2/INT2 pin is configured as an input [108]
                                                                //
        INTCON3bits.INT2IP = 0;                // 0: interrupt 1 is low priority (leave at 0 for IFI controllers) [91]
                                                                // 1: interrupt 1 is high priority
                                                                //
        INTCON2bits.INTEDG2 = 1;        // 0: trigger on the falling-edge [90]
                                                                // 1: trigger on the rising-edge
                                                                //
        INTCON3bits.INT2IE = 1;                // 0: disable interrupt        1 [91]
                                                                // 1: enable interrupt 1

        // Initialize the right encoder's interrupt. INT3 on the user PIC18F8520
        // is mapped to the interrupt two pin on the EDU-RC and digital I/O two
        // on the FRC-RC.
        TRISBbits.TRISB3 = 1;                // make sure the RB3/CCP2/INT3 pin is configured as an input [108]
                                                                //
        INTCON2bits.INT3IP = 0;                // 0: interrupt 2 is low priority (leave at 0 for IFI controllers) [90]
                                                                // 1: interrupt 2 is high priority
                                                                //
        INTCON2bits.INTEDG3 = 1;        // 0: trigger on the falling-edge [90]
                                                                // 1: trigger on the rising-edge
                                                                //
        INTCON3bits.INT3IE = 1;                // 0: disable interrupt        2 [91]
                                                                // 1: enable interrupt 2
}

Initialize_Gyro()
Code:

void Initialize_Gyro(void)
{
        // reset the heading angle
        Reset_Gyro_Angle();

        // force a gyro bias calculation
        Calc_Gyro_Bias();

        // initialize the analog to digital converter
        Initialize_ADC();

        // initialize and start timer 2
        Initialize_Timer_2();
}

Then Initialize_Timer_2() does this:
void Initialize_Timer_2(void) 
{
        //
        // use these parameters for a 200Hz gyro sample rate
        //
        #ifdef GYRO_SAMPLE_RATE_200HZ
        // use a 1:16 prescaler
        T2CONbits.T2CKPS0 = 0;
        T2CONbits.T2CKPS1 = 1;

        PR2        = 221; // 223.21 - 2 is ideal

        // use a 1:14 postscaler
        T2CONbits.T2OUTPS0 = 1;
        T2CONbits.T2OUTPS1 = 0;
        T2CONbits.T2OUTPS2 = 1;
        T2CONbits.T2OUTPS3 = 1;
        #endif

        //
        // use these parameters for a 400Hz gyro sample rate
        //
        #ifdef GYRO_SAMPLE_RATE_400HZ
        // use a 1:16 prescaler
        T2CONbits.T2CKPS0 = 0;
        T2CONbits.T2CKPS1 = 1;

        PR2        = 140; // 142.05 - 2 is ideal

        // use a 1:11 postscaler
        T2CONbits.T2OUTPS0 = 0;
        T2CONbits.T2OUTPS1 = 1;
        T2CONbits.T2OUTPS2 = 0;
        T2CONbits.T2OUTPS3 = 1;
        #endif

        //
        // use these parameters for a 800Hz gyro sample rate
        //
        #ifdef GYRO_SAMPLE_RATE_800HZ
        // use a 1:16 prescaler
        T2CONbits.T2CKPS0 = 0;
        T2CONbits.T2CKPS1 = 1;

        PR2        = 69; // 71.02 - 2 is ideal

        // use a 1:11 postscaler
        T2CONbits.T2OUTPS0 = 0;
        T2CONbits.T2OUTPS1 = 1;
        T2CONbits.T2OUTPS2 = 0;
        T2CONbits.T2OUTPS3 = 1;
        #endif

        //
        // use these parameters for a 1600Hz gyro sample rate
        //
        #ifdef GYRO_SAMPLE_RATE_1600HZ
        // use a 1:4 prescaler
        T2CONbits.T2CKPS0 = 1;
        T2CONbits.T2CKPS1 = 0;

        PR2        = 140; //142.05 - 2 is ideal

        // use a 1:11 postscaler
        T2CONbits.T2OUTPS0 = 0;
        T2CONbits.T2OUTPS1 = 1;
        T2CONbits.T2OUTPS2 = 0;
        T2CONbits.T2OUTPS3 = 1;
        #endif

        // make sure the timer 2 register starts at zero
        TMR2 = 0x00;

        // timer 2 interrupt is low priority
        IPR1bits.TMR2IP = 0;

        // to prevent a spurious interrupt, make sure the interrupt flag is reset
        PIR1bits.TMR2IF = 0;

        // enable the timer 2 interrupt
        PIE1bits.TMR2IE = 1;

        // enable timer 2
        T2CONbits.TMR2ON = 1;
}

Ok well.. thank you very much for any help you have to offer.


All times are GMT -5. The time now is 23:59.

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