Skocz do zawartości

[C] [STM32] Błędnie obliczana wartość sumy logicznej


Pomocna odpowiedź

Napisano

Witam

Pytanko odnośnie kursu programowania:

https://forbot.pl/blog/artykuly/programowanie/kurs-stm32-f4-9-obsluga-i2c-akcelerometr-id13474

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

//Rejestry
#define LSM303_ACC_ADDRESS (0x19 << 1) // adres akcelerometru: 0011001x
#define LSM303_ACC_CTRL_REG1_A 0x20 // rejestr ustawien 1
#define LSM303_ACC_Z_H_A 0x2D // wyzszy bajt danych osi Z

// Maski bitowe
// CTRL_REG1_A = [ODR3][ODR2][ODR1][ODR0][LPEN][ZEN][YEN][XEN]
#define LSM303_ACC_Z_ENABLE 0x07 // 0000 0100
#define LSM303_ACC_100HZ 0x50 //0101 0000

// Zmienne
uint8_t Data = 0; // Zmienna do bezposredniego odczytu z akcelerometru
int16_t Zaxis = 0; // Zawiera przeksztalcona forme odczytanych danych
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
// wypelnienie zmiennej konfiguracyjnej odpowiednimi opcjami
uint8_t Settings = LSM303_ACC_Z_ENABLE | LSM303_ACC_100HZ;

// Wpisanie konfiguracji do rejestru akcelerometru
HAL_I2C_Mem_Write(&hi2c1, LSM303_ACC_ADDRESS, LSM303_ACC_CTRL_REG1_A, 1, &Settings, 1, 100);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1) {
// Pobranie wyzszego bajtu danych osi Z
HAL_I2C_Mem_Read(&hi2c1, LSM303_ACC_ADDRESS, (LSM303_ACC_Z_H_A), 1, &Data, 1, 100);
Zaxis = Data << 8;
}
/* USER CODE END WHILE */

Zmienna Settings przechowuję sumę bitową z dwóch zdefiniowanych wartości 0x07 i 0x50 czyli 0x54. W moim przypadku eclipse zgłasza błąd składni w linijce

uint8_t Settings = LSM303_ACC_Z_ENABLE | LSM303_ACC_100HZ;

, więc zrobiłem to na około

uint8_t set1 = LSM303_ACC_Z_ENABLE;
uint8_t set2 = LSM303_ACC_100HZ;
uint8_t Settings = set1 | set2;

Program skompilował się bez błędów. Zaprogramowałem STM32F3Discovey (tak mam inna płytkę niż w kursie) uruchomiłem STM Studio i nic się nie dzieje ze zmienną Zaxis. Uruchomiłem debugera w eclipse i tam ku mojemu zdziwieniu zmienna Settings przyjmuje wartość A7 (0b1010111). Dlaczego taki błąd występuje i dlaczego nie moę bezpośrednio do zmiennej settings wpisać operacji logicznej na zdefinowanych wartościach?

#include "main.h"
#include "stm32f3xx_hal.h"

I2C_HandleTypeDef hi2c1;

#define LSM303_ACC_ADDRESS (0x19 << 1) // adres akcelerometru
#define LSM303_ACC_CTRL_REG1_A 0x20 // rejestr ustawień 1
#define LSM303_ACC_Z_ENABLE 0x07; // włączenie osiz z
#define LSM303_ACC_100HZ 0x50; //
#define LSM303_ACC_Z_H_A 0x2D // wyzszy bajt danych osi Z

uint8_t Data = 0;
uint16_t Zaxis = 0;

void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);

int main(void)
{
 HAL_Init();

 SystemClock_Config();

 MX_GPIO_Init();
 MX_I2C1_Init();

 uint8_t set1 = LSM303_ACC_Z_ENABLE;
 uint8_t set2 = LSM303_ACC_100HZ;
 uint8_t Settings = set1 | set2;

 //uruchomienie akcelerometru
 //printf("start \n");
 HAL_I2C_Mem_Write(&hi2c1, LSM303_ACC_ADDRESS, LSM303_ACC_CTRL_REG1_A, 1, &Settings, 1, 100);

 while (1)
 {
  HAL_I2C_Mem_Read(&hi2c1, LSM303_ACC_ADDRESS, (LSM303_ACC_Z_H_A), 1, &Data, 1, 100);
  Zaxis = Data << 8;
//	  printf("%u\n",Zaxis);

}

}

Zmienna Settings przechowuję sumę bitową z dwóch zdefiniowanych wartości 0x07 i 0x50 czyli 0x54.

Ale suma bitowa 0x07 i 0x50 to nie 54, tylko 57 🙂

Description Resource Path Location Type

expected expression before '|' token main.c /STM32F3_Acc/Src line 95 C/C++ Problem

gdy zastosuje:

  uint8_t Settings = LSM303_ACC_Z_ENABLE | LSM303_ACC_100HZ;

Rzeczywiście coś źle policzyłem w tej sumie bitowej bo 0x07 | 0x50 to:

0000 0111

0101 0000

-------------

0101 0111 (0x57)

Wynika z tego, że w kursie jest błąd. Włączenie osi Z powinno mieć wartość 0x04 a nie 0x07 (0x07 włącza wszystkie osie X,Y,Z). Juto przeanalizuje wszystko od początku bo dziś nie zdołam temu zadaniu 👹

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Description Resource Path Location Type

expected expression before '|' token main.c /STM32F3_Acc/Src line 95 C/C++ Problem

gdy zastosuje:

  uint8_t Settings = LSM303_ACC_Z_ENABLE | LSM303_ACC_100HZ;

Rozwińcie te define'y w miejscu ich użycia, a problem sam się objawi:

  uint8_t Settings = 0x07; | 0x50;;

Jak widać mamy tu średnik przed '|' - to co po średniku uważane jest za nową instrukcję. Ponieważ '|' jest operatorem dwuargumentowym, a przed nim nic nie ma to kompilator zgłasza błąd.

  • Pomogłeś! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...