Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
nullknightnull
0 / 0 / 1
Регистрация: 04.11.2018
Сообщений: 7
1

Ошибка с if else

02.12.2019, 23:38. Просмотров 1578. Ответов 9

Здравствуйте, прошу помочь с проблемой. В конструкции if else, в зависимости от значения переменной, зажигаю или выключаю светодиод. Когда условие в if неверное - выполняется соответственно else, но когда значение верное - выполняется и if и else, в чём может быть проблема? Бред какой-то

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stm32f407xx.h"
 
 
 
    
    
 
 
void USART1_IRQHandler(void)
{
 
       if (USART1->SR & USART_SR_RXNE)
       {
         
              if(USART1->DR == '1')
                {
                    GPIOE -> ODR |= GPIO_ODR_OD3;
                    
                }
                else
                {
                    GPIOE -> ODR &=~ GPIO_ODR_OD3;
                }
                
       } 
     
}
 
 
 
 
хз..
0
_SayHello
788 / 474 / 156
Регистрация: 30.07.2015
Сообщений: 1,579
02.12.2019, 23:52 2
nullknightnull, что отправляете и через что? если отправляется несколько символов то вполне нормальная ситуация
0
nullknightnull
0 / 0 / 1
Регистрация: 04.11.2018
Сообщений: 7
02.12.2019, 23:54  [ТС] 3
Да, надо бы код приложить. Принимаю 1 байт через uart

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "stm32f407xx.h"
 
 
void GPIO_init()
{
 
    RCC -> AHB1ENR |= RCC_AHB1ENR_GPIOEEN;   // Включения тактирования 
    
    GPIOE -> MODER |= GPIO_MODER_MODER3_0 | GPIO_MODER_MODER2_0; // Свеодиод
    GPIOE -> OTYPER &=~ GPIO_OTYPER_OT3 | GPIO_OTYPER_OT2; // Светодиод
    
 
    
    
}
    
    
void UART1_init()
{
    
    RCC -> AHB1ENR |= RCC_AHB1ENR_GPIOAEN;  // Тактирование порта А   
    
    
    // TX PA9
  GPIOA -> MODER |= GPIO_MODER_MODER9_1; // Режим работы
    GPIOA -> OTYPER &=~GPIO_OTYPER_OT9; // Режим выхода
    GPIOA -> OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9_1 | GPIO_OSPEEDER_OSPEEDR9_1; // Скорость работы
    GPIOA -> AFR[1] |= 0x00000070;
    
    // RX PA10
    GPIOA->MODER |= GPIO_MODER_MODE10_1;  // Режим работы
  GPIOA -> OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10_1 | GPIO_OSPEEDER_OSPEEDR10_1; // Скорость работы
    GPIOA -> AFR[1] |= 0x0000700;
    
  
    
    RCC -> APB2ENR |= RCC_APB2ENR_USART1EN; // Тактирование USART1
    USART1 -> BRR = 0x683; // 9600 
    USART1 -> CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE;
  USART1 -> CR1 |= USART_CR1_UE;
    
}
 
void USART1_IRQHandler(void)
{
 
       if (USART1->SR & USART_SR_RXNE)
       {
         
              if(USART1->DR == '1')
                {
                    GPIOE -> ODR |= GPIO_ODR_OD3;
                    
                }
                else
                {
                    GPIOE -> ODR &=~ GPIO_ODR_OD3;
                }
                
       } 
     
}
 
 
 
 
int main()
{
    NVIC_EnableIRQ (USART1_IRQn);
    __enable_irq ();
    
    GPIO_init();
    UART1_init();
    
  while(1)
    {
     
  }     
 
}
0
_SayHello
788 / 474 / 156
Регистрация: 30.07.2015
Сообщений: 1,579
02.12.2019, 23:58 4
nullknightnull,
Цитата Сообщение от nullknightnull Посмотреть сообщение
Отправляю 1 байт через uart
откуда отправляете? Перемычкой Tx-Rx? Или с другого устройства?
0
02.12.2019, 23:58
nullknightnull
0 / 0 / 1
Регистрация: 04.11.2018
Сообщений: 7
02.12.2019, 23:59  [ТС] 5
С пк, через переходник usb uart
0
_SayHello
788 / 474 / 156
Регистрация: 30.07.2015
Сообщений: 1,579
03.12.2019, 00:02 6
nullknightnull, через какой терминал? Или самописная утилита? Скрин того как отправляете можете приложить?
0
nullknightnull
0 / 0 / 1
Регистрация: 04.11.2018
Сообщений: 7
03.12.2019, 00:12  [ТС] 7
....
0
Миниатюры
Ошибка с if else  
nullknightnull
0 / 0 / 1
Регистрация: 04.11.2018
Сообщений: 7
03.12.2019, 00:14  [ТС] 8
Вот
0
Миниатюры
Ошибка с if else  
_SayHello
788 / 474 / 156
Регистрация: 30.07.2015
Сообщений: 1,579
03.12.2019, 00:14 9
Лучший ответ Сообщение было отмечено nullknightnull как решение

Решение

nullknightnull, у вас при отпраке +CR установлен. Это значит что отправляется ваш байт а потом еще символ перевода каретки. Снимите чек бокс. и тогда будет уходить один символ.
А так получается что первый символ попадает под первое условие и устанавливает пин в 1, а за ним идет CR и снимает пин в 0.
0
nullknightnull
0 / 0 / 1
Регистрация: 04.11.2018
Сообщений: 7
03.12.2019, 00:19  [ТС] 10
Лучший ответ Сообщение было отмечено Voland_ как решение

Решение

Да, надо быть внимательнее. Спасибо за ответ. Посмотрел пару минут назад лог. анализатором
и думаю, что то много всего отправляется, для 9 бит.
0
03.12.2019, 00:19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.