This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123GH6PM: Odd Numbered Writes To Data Get Switched To Even

Part Number: TM4C123GH6PM

Tool/software:

I seem to have some sort of problem writing a one to Bit 0 of my Data Register and I can't find the fault. 9 gets changed to 8 and 3 gets changed to 2. When I correct it to an even number it shows up fine in my Debug Watch window. I rechecked my pin setup lines for PortE and I do believe they are correct. I also swapped out Tive Lunchpad Boards but damn, nothing works. Source code attached. Thank you.

/* Stepper.c Driving stepper in C using registers by addresses */
/* This program will start with a simple rotation of a stepper and get refined to include keypad input and LCD
   output .*/

/*We are going with Port E pins: 9 >PE0, 8 >PE1, 7 >PE2 and 6 >PE3 because their default is GPIO */


/* PORTE data register */
#define PORTEDAT (*((volatile unsigned int*)0x400243FC)) // DS pg 662, GPIO Port E (APB) base: 0x4002.4000
	// 3FC is needed to write to all 8 bits of Data Register at once. SEE Text pg 28
	
	/* PORTE data direction register , 3FC is 0B001111111100 masked bits 9:2 means set all Port E outputs */
#define PORTEDIR (*((volatile unsigned int*)0x40024400)) // DS pg 662, GPIO Port E (APB) base: 0x4002.4000 */
	
/* PORTF digital enable register */
#define PORTEDEN (*((volatile unsigned int*)0x4002451C)) // DS pg 683, GPIO Port E (APB) base: 0x4002.4000
	//0x51C is the offset for GPIODEN
	
/* run mode clock gating register */
#define RCGCGPIO (*((volatile unsigned int*)0x400FE608)) // DS pg 340. Clock gate. base: 0x400F.E000
	//Bit 4 will be sey to enable the clock on Port E.

/* coprocessor access control register */
#define SCB_CPAC (*((volatile unsigned int*)0xE000ED88)) // Coprocessor access priviledge

void delayMs(int n);     /* function prototype for delay, argument is delay in ms */

int main(void)
{
    /* enable clock to GPIOE at clock gating register */
    RCGCGPIO |= 0x10; // RCGCGPIO Or'd with 0x10 or 0b0001 0000 meaning bit 4 enables Port E clock
	
    /* set PORTE pin3-1 as output pins */
    PORTEDIR = 0x0E;	// 0x0E is 0b0000 1110 Sets DIR on PortE to output.
	
    /* set PORTE pin3-1 as digital pins */
    PORTEDEN = 0x0E;	// 0x0E is 0b0000 1110
    PORTEDAT=0X00;    
    int x;

    for (x = 0; x < 360; x++) 

    {
        PORTEDAT = 0X09;
				delayMs(500);
				PORTEDAT = 0X0C;
				delayMs(500);
				PORTEDAT = 0X06;
				delayMs(500);
				PORTEDAT = 0X03;
				delayMs(500);
    }
}

/* delay n milliseconds (16 MHz CPU clock) */
void delayMs(int n)
{
    int i, j;
    for(i = 0 ; i < n; i++)
        for(j = 0; j < 3180; j++)
            {}  /* do nothing for 1 ms */
}

/* This function is called by the startup assembly code to perform system specific initialization tasks. 
 void SystemInit(void)
{
     Grant coprocessor access
     This is required since TM4C123G has a floating point coprocessor 
   SCB_CPAC |= 0x00F00000; 
} 
*/

  • Hi Charles,

    I seem to have some sort of problem writing a one to Bit 0 of my Data Register

    I don't really see a problem with your code to set a register bit using the bit-band area. However, reading your below code, you are not enabling pin0 for output. I think that is the reason you can't set the PE0 high, isn't. 

    /* set PORTE pin3-1 as output pins */
    PORTEDIR = 0x0E; // 0x0E is 0b0000 1110 Sets DIR on PortE to output.

    /* set PORTE pin3-1 as digital pins */
    PORTEDEN = 0x0E; // 0x0E is 0b0000 1110

  • Yes I  found that out a couple days ago after posting. I don't know how I missed such an obvious error. I switched to 0x0F on Dir and Den and my registers count properly now. Damned if my stepper motor still doesn't work though, but that's another issue.