led and switchs program failure Tiva C board

0

I'm trying to run this code on TIVA C board. sw2 connected to PF0, sw1 connected to PF4 and RGB LED connected to PF1, PF2 and PF3.

When I press sw2 it shall turn the led blue and if sw1 is pressed it shall turn the led green otherwise it shall be red.

The code doesn't function properly. I hope you can point out what I did wrong.

/*************************
PORT F Addresses
*************************/

#define RCGCGPIO (*((volatile unsigned long*)0x400FE608)) //CLOCK
#define PORTFDATA (*((volatile unsigned long*)0x400253FC)) //DATA
#define PORTFDIR (*((volatile unsigned long*)0x40025400)) //DIRECTION
#define PORTFDEN (*((volatile unsigned long*)0x4002551C)) //ENABLE
#define PORTFLOCK (*((volatile unsigned long*)0x40025520)) //LOCK (lock or       unlocks PF0)
#define PORTFCR (*((volatile unsigned long*)0x40025524)) //COMMIT (uncommit PF0)
#define PORTFPUR (*((volatile unsigned long*)0x40025510)) // PULL UP resistor
#define PORTFPDR (*((volatile unsigned long*)0x40025514)) // PULL Down resistor
/*************************/
int sw1;
int sw2;
int delay;
int main (void)
{
   RCGCGPIO = 0x20; //Enable clock for PORT F
   delay = RCGCGPIO;
   PORTFLOCK = 0x4C4F434B; // unlock commit reg
   PORTFCR   = 0x01; // unlock PF0
   PORTFDEN  = 0x1F; //Enable pins 0 to 4
   PORTFDIR  = 0x0E; // pins 0 and 4 input - pins 1,2,3 output
   PORTFPUR = 0x11;

   while (1)
   {
      sw2 = PORTFDATA & 0x00000001; 
      sw1 = PORTFDATA & 0x00000010;

      if (sw1 == 1)
         PORTFDATA |= 0x00000002;

      else if (sw2 == 1)
         PORTFDATA |= 0x00000004;

      else
         PORTFDATA |=  0x00000008;
   }
}
arm
embedded
microcontroller
asked on Stack Overflow Jul 23, 2016 by user247954 • edited Jul 26, 2017 by Andre Kampling

3 Answers

1

Here are two obvious problems with your code. There are probably more...

You set sw1 = PORTFDATA & 0x00000010, so the only possible values sw1 can have are 0x10 or 0x00. Then you test if (sw1 == 1). But this test will never be true because sw1 can never equal 1.

You use the |= operator to set the bits of PORTFDATA. But nowhere do you ever clear the bits of PORTFDATA. So your LEDs may turn on but they will never turn off.

answered on Stack Overflow Jul 23, 2016 by kkrambo
0

Have you tried the sample code comming with CCS to make sure that hardware are functional?

The sample code uses TI library instead of plain register Read & Write, however you can dig out the acutal register by go to defination. Anyway, I'm a bit curious about why you use plain register in the first place instead of TI library? ARM MCU is not 8051 anymore.

answered on Stack Overflow Jul 23, 2016 by jack
0

A couple of things to keep in mind: The launchpad buttons are negative logic, so if your switch1== 0x01, it is NOT being pressed.

Try something like:

If 
  sw1 == 0x01              //switch not pressed
    PORTFDATA &= ~(0x0E);    //ledz off
else
    PORTFDATA ^= 0x02;         //toggle red 

I am also learning ARM & C solely self-study, so I feel your pain. It took many hours of toggling single leds with bitwise operators just to fathom what is going on. Stick with it!!!

/e

answered on Stack Overflow Aug 1, 2016 by Etienne Stehelin • edited Aug 1, 2016 by Etienne Stehelin

User contributions licensed under CC BY-SA 3.0