сделать моргание n раз - PullRequest
       21

сделать моргание n раз

0 голосов
/ 04 октября 2019

Я использую tiva c 1294, идея состоит в том, чтобы мигать индикатор определенное количество раз, я уже сделал это здесь , но сейчас не работает, все, что он делает, этомигает один из светодиодов пользователя (PF4) и при нажатии вместо 5 раз мигает, а затем выключается, включается другой светодиод (PF0). Когда вы перестанете нажимать переключатель 1, он снова начнет мигать первым светодиодом.

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "driverlib/debug.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include <inc/tm4c1294ncpdt.h>




uint32_t i,j; //int 1

int main(void) {
    SYSCTL_RCGCGPIO_R=0X1100; // set clock portn
    i=SYSCTL_RCGCGPIO_R; // delay (more than 3 cycles)
     j=0;
    GPIO_PORTN_DIR_R=0X03;      //enable the GPIO pin for the LED-PN0, set the direction as output, and
    GPIO_PORTN_DEN_R=0X03;  //enable the GPIO pin for digital function
    GPIO_PORTJ_AHB_DIR_R=0;
    GPIO_PORTJ_AHB_DEN_R=0X03;
    GPIO_PORTJ_AHB_PUR_R=0X01;

    while(1){
        GPIO_PORTN_DATA_R &=~0X02; //turn led off
        while (GPIO_PORTJ_AHB_DATA_R & 0X01){
            GPIO_PORTN_DATA_R |=0X01; //turn led on
            SysCtlDelay(2666666);
            GPIO_PORTN_DATA_R &=~0X01; //turn led off again
            SysCtlDelay(2666666);
        }
          for (j=0; i<5; i++)
                {
                    GPIO_PORTN_DATA_R |=0X01; //turn led on
                SysCtlDelay(2666666);
                GPIO_PORTN_DATA_R &=~0X01; //turn led off again
                SysCtlDelay(2666666);
                }
        GPIO_PORTN_DATA_R |=0X02;  //clear the interrupt flag before return
    }

}

1 Ответ

2 голосов
/ 04 октября 2019

Вместо

  for (j=0; i<5; i++)

напишите

  for (j=0; j<5; j++)

Вы видите свою опечатку?


РЕДАКТИРОВАТЬ

Давайте посмотрим на ваш бесконечный цикл. Вы написали это так (я немного исправил пробелы):

    while (1) {
        GPIO_PORTN_DATA_R &= ~0X02; //turn led off

        while (GPIO_PORTJ_AHB_DATA_R & 0X01) {
            GPIO_PORTN_DATA_R |= 0X01; //turn led on
            SysCtlDelay(2666666);
            GPIO_PORTN_DATA_R &= ~0X01; //turn led off again
            SysCtlDelay(2666666);
        }

        for (j = 0; j < 5; j++) {
            GPIO_PORTN_DATA_R |= 0X01; //turn led on
            SysCtlDelay(2666666);
            GPIO_PORTN_DATA_R &= ~0X01; //turn led off again
            SysCtlDelay(2666666);
        }

        GPIO_PORTN_DATA_R |= 0X02;  //clear the interrupt flag before return
    }

Сначала мы исправим последний комментарий и добавим номера светодиодов, основываясь на их битовой позиции. Тогда давайте заменим GPIO_PORTN_DATA_R |= 0x01 на SwitchLedOn(0) и GPIO_PORTN_DATA_R &= ~0x01 на SwitchLedOff(0). И давайте сделаем то же самое с GPIO_PORTN_DATA_R / 0x02 и SwitchLedO*(1). Далее мы можем заменить GPIO_PORTJ_AHB_DATA_R & 0X01 на IsSwitchUp(0).

    while (1) {
        SwitchLedOff(1); //turn led 1 off

        while (IsSwitchUp(0)) {
            SwitchLedOn(0); //turn led 0 on
            SysCtlDelay(2666666);
            SwitchLedOff(0); //turn led 0 off again
            SysCtlDelay(2666666);
        }

        for (j = 0; j < 5; j++) {
            SwitchLedOn(0); //turn led 0 on
            SysCtlDelay(2666666);
            SwitchLedOff(0); //turn led 0 off again
            SysCtlDelay(2666666);
        }

        SwitchLedOn(1);  //turn led 1 on
    }

Теперь все ясно. Когда источник записан, есть две равные последовательности операторов, которые мигают светодиодом 0 один раз. Внутренний while -петль повторяет это до тех пор, пока переключатель 0 не нажат. Если выключатель нажимается после периода мигания, петля остается влево и начинается цикл for. Это позволяет одному светодиоду мигать 5 раз. Затем включается светодиод 1. Но только на очень короткое время, потому что повторяется внешний while -петль, который в самом начале выключает светодиод 1.

Если переключатель все еще нажат, внутренний while -петль будет пропущенпрямо к for -циклу. Если он больше не нажимается, внутренний while -петль будет ждать следующего нажатия.

В любом случае, мы можем не видеть на светодиоде 0, где мы находимся в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...