Отговори на тема  [ 7 мнения ] 
STM32F401RE изпълнява код само един път. 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 01, 2023 9:59 am
Мнения: 302
Мнение STM32F401RE изпълнява код само един път.
Здрасти,
В main.c имам това:

Код:
#include <stdio.h>
#include "stm32f4xx_hal.h"
#include "ais2ih.h"

int main()
{
  HAL_Init();
  i2c1_init();
  ais2ih_init();

  while(1)
  {
   rawDataRead ();
  }
}


В rawDataRead (); прочитам нулирам един uint8_t (readReg[1]), който ползвам за буферна променлива, която съхранявата даден регистър.

Правя една маска uint8_t = 1, тъй като мисля че ме интересува най десния бит 00000001, но не съм на сто процента сигурен дали всъщност не тябва да е 10000000.
После проверявам дали стойността на дадения бит е 1 и ако е, прочитам два регистъра и ги обединявам в int16_t.
Криво-ляво то тук работи. Проблемът е че в режим на дебъг, а май и в нормално изпълнение rawDataRead (); се изпълнява само един път, по някога два, но в крайна сметка замира. Не разбирам защо се случва това нещо.
Ако имате съвети благодаря предварително!

Код:
void rawDataRead (){
   uint8_t readRegH;
   uint8_t readRegL;

   readReg[0]=0;

   //Прочитане на Статус регистъра
   ais2ih_read_register (STATUS_Reg);

    // Маска за проверка на
   uint8_t mask = 1;

    if ((readReg[0] & mask) != 0){
       //read high and low values on X
       ais2ih_read_register (OUT_X_H_Reg);
       readRegH = readReg[0];
       ais2ih_read_register (OUT_X_L_Reg);
       readRegL = readReg[0];
       CombData = ((int16_t)readRegH << 8) | readRegL;
    }


Сря Авг 16, 2023 3:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: STM32F401RE изпълнява код само един път.
Светни един диод преди да викнеш функцията и го угаси след това. Може да свържеш скоп към него да гледаш какво става.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Сря Авг 16, 2023 6:50 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 01, 2023 9:59 am
Мнения: 302
Мнение Re: STM32F401RE изпълнява код само един път.
syscop написа:
Светни един диод преди да викнеш функцията и го угаси след това. Може да свържеш скоп към него да гледаш какво става.


Благодаря, мисля че ще мога да пусна бордовия, на PA5. Карам го стъпка по-стъпка, в смисъл че съм сложил брейкпоинт-а в началото на функцията и после с F6 напредвам докато спре. Обикновено спира след като излезе от функцията, по някога влиза повторно в нея и до там. Понеже ползвам джъмпер кабели се чудя дали пък нещо да не прави добър контакт? Ако "скоп" стои за осцилоскоп то нямам лесен достъп до такъв, да не говорим че въобще не знам как се ползва :)


Сря Авг 16, 2023 9:26 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Съб Фев 06, 2016 8:29 pm
Мнения: 237
Мнение Re: STM32F401RE изпълнява код само един път.
Както са ти препоръчали вече - със светкането на диод може да се хванат проблемите много бързо, например светкаш го преди ais2ih_read_register и го гасиш на следващия ред, така при изпълнение ако остане да грее значи изпълнението не е изляло от горната фунция.
Обаче да ти обърна внимание на други неща: readRegH/readRegL няма нужда да са uint8_t, направо ги сложи да са uint16_t (или по точно да са толкова uintXX_t колкото е CombData). То зависи какво е точно CombData? Защо не направо:
Код:
ais2ih_read_register (OUT_X_H_Reg);
CombData = ((uint16_t)readReg[0]) << 8;
ais2ih_read_register (OUT_X_L_Reg);
CombData |= ((uint16_t)readReg[0]);

Освен това твоето кастване с int16_t (число със знак или signed) може да доведе до интересни ефекти.

И най-добрият съвет вече са ти го дали (без лоши чувства!):
I don't recommend using ChatGPT for programming advice. It will produce some very confident-sounding but absolutely incorrect answers. :D


Сря Авг 16, 2023 10:22 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 01, 2023 9:59 am
Мнения: 302
Мнение Re: STM32F401RE изпълнява код само един път.
iss написа:
Както са ти препоръчали вече - със светкането на диод може да се хванат проблемите много бързо, например светкаш го преди ais2ih_read_register и го гасиш на следващия ред, така при изпълнение ако остане да грее значи изпълнението не е изляло от горната фунция.
Обаче да ти обърна внимание на други неща: readRegH/readRegL няма нужда да са uint8_t, направо ги сложи да са uint16_t (или по точно да са толкова uintXX_t колкото е CombData). То зависи какво е точно CombData? Защо не направо:
Код:
ais2ih_read_register (OUT_X_H_Reg);
CombData = ((uint16_t)readReg[0]) << 8;
ais2ih_read_register (OUT_X_L_Reg);
CombData |= ((uint16_t)readReg[0]);

Освен това твоето кастване с int16_t (число със знак или signed) може да доведе до интересни ефекти.

И най-добрият съвет вече са ти го дали (без лоши чувства!):
I don't recommend using ChatGPT for programming advice. It will produce some very confident-sounding but absolutely incorrect answers. :D


Прав си друже, обаче учещ се човек има стотици въпроси, не мое да спамим форумите за всички. Работим с каквото има, ако се "закучат" много нещата тогава викаме неволята. Вярно че го предпочитам пред Гугъл и вярно че бота бърка работите и всеки път като го поставя под съмнение ми пише че съм бил абсолютно прав :), което носи още повече объркване, но в много неща дава добри отправни точки. В общи линии гледам да го питам за по-общи неща. Конкретно за кодът гледам от едни туториали за програмиране на регистри.

Благодаря ти за съветите! Принципно чета 8 битови регистри и поради тази причина полагам съдържанието в 8 битови променливи (това от туториала който гледах, за друг тип сензор). На края ги обединявам в 16 битова променлива, защото така го дават в един документ предназначен да подпомогне програмирането, за този сензор - application notes. Всъщност там не е обяснено точно това, използват термина конкатенация и добавят примерни пресмятания, в които примери обаче имаше минусови стойности, от там и обединението в число със знак.
Разбирам че предложението ти е да извърша конкатенация като запиша 8 битовите регистри последователно в 16 битовата променлива и най-вероятно така е по-добре, най-малкото защото ще пропуснем използването на readRegH&L. Да ти кажа право мина ми през акъла, но остана висящо. Ще го направя.


Чет Авг 17, 2023 9:49 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: STM32F401RE изпълнява код само един път.
Той тоя код как въобще се компилира?
Половината променливи не са декларирани....

Ползвай union за прочитането на данните. Така ще спестиш шифтването.

Код:
union
{
u8 readData[2];
u16 combData;
} uData;


Четеш 2 пъти в readData[0] и readData[1], u после взе аш резултата от combData.


Вто Авг 22, 2023 12:35 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: STM32F401RE изпълнява код само един път.
relsys написа:
Той тоя код как въобще се компилира?
Половината променливи не са декларирани....

Ползвай union за прочитането на данните. Така ще спестиш шифтването.

Код:
union
{
u8 readData[2];
u16 combData;
} uData;


Четеш 2 пъти в readData[0] и readData[1], u после взе аш резултата от combData.

С едно на ум за индианците, големи, малки ...

_________________
Мразя да мразя ...


Вто Авг 22, 2023 2:53 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 7 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни