Светофор в Кейле для программирования Tiva Series- c - PullRequest
0 голосов
/ 19 сентября 2019

Предполагается, что программа определяет, какой переключатель включен, и оттуда меняет светофор на красный, желтый или зеленый.Я застрял и не знаю, правильна ли моя инициализация для порта A и порта E. мы должны только изменить DEN и DIR.Когда я запускаю его на отладке, ничего не происходит.Это должно начаться с красного света.

// Input/Output:
//   PE2 - Red
//   PE1 - Yellow
//   PE0 - Green
//   PA3 - South
//   PA2 - West

// Preprocessor Directives
#include <stdint.h>
#include "tm4c123gh6pm.h"

// Global Variables
uint8_t In0, In1;
uint8_t Out;

// Function Prototypes - Each subroutine defined
void Delay(void);

int main(void) { 
    // Initialize GPIO on Ports A, E
    unsigned long int delay;
    SYSCTL_RCGC2_R |= 0x11; // enables clock for e and a
    delay = SYSCTL_RCGC2_R;
    GPIO_PORTE_AMSEL_R = 0x00; //diables analog
    GPIO_PORTE_AFSEL_R = 0x00;  //disable alternate function
    GPIO_PORTE_PCTL_R = 0x00000000;  //enable GPIO
    GPIO_PORTE_DEN_R = 0x07; // Ports E0-2
    GPIO_PORTE_DIR_R = 0x07; //inputs PE0-2

    GPIO_PORTA_AMSEL_R = 0x00;  //disables analog
    GPIO_PORTA_AFSEL_R = 0x00;  //disable alternate function
    GPIO_PORTA_PCTL_R = 0x00000000; //enable GPIO
    GPIO_PORTA_DEN_R = 0x0C;  // Ports A2 and A3
    GPIO_PORTA_DIR_R = ~0x0C; //outputs PA2 and PA3

    // Initial state: Red LED lit
  Out = (GPIO_PORTE_DATA_R & 0x04); //red starting


    while(1) {
        In0 = GPIO_PORTA_DATA_R&0x08 ; // Read value of south
        In1 = GPIO_PORTA_DATA_R&0x04 ;  // read west
        // Check the following conditions and set Out appropriately:
        //   If south is enabled and red LED is on, then red LED turns off and green LED turns on.
        //   If west is enabled and green LED is on, then green LED turns off and yellow LED turns on.
        //   If yellow LED is on, then yellow LED turns off and red LED turns on.
        if ((In0 == 0x08) & ((Out&0x04) == 0x04)){ // south and red
            GPIO_PORTE_DATA_R = 0x01; //green light turns on
            Delay();
            Out = GPIO_PORTE_DATA_R;

        }
        if ((In1== 0x04) & ((Out&0x01) == 0x01)){ //west and green
            GPIO_PORTE_DATA_R = 0x02;  //yellow light turns on
            Delay();
            Out = GPIO_PORTE_DATA_R;
        }
        if ((Out&0x02) == 0x02){ //if yellow
            GPIO_PORTE_DATA_R = 0x04;  //red light turns on
            Delay();
            Out = GPIO_PORTE_DATA_R;
        }
        Out = GPIO_PORTE_DATA_R;

    //  ??? = Out; // Update LEDs based on new value of Out
    }
}

// Subroutine to wait about 0.1 sec
// Inputs: None
// Outputs: None
// Notes: the Keil simulation runs slower than the real board
void Delay(void) {
    volatile uint32_t time;
  time = 727240*200/91;  // 0.1sec
  while(time) {
    time--;
  }
}

1 Ответ

0 голосов
/ 19 сентября 2019

вы уверены в прямых изменениях регистров? Попробуйте дважды проверить, правильно ли вы меняете биты в регистрах.Также проверьте правильность написанных вами шестнадцатеричных значений.Возьмите мультиметр и измерьте напряжение на упомянутом GPIO, оно меняется как положено? Если нет, то в вашей электрической цепи есть ошибка или inits ().

...