Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Re: Вопросы по С/С++ (СИ)

Вт май 01, 2018 19:30:36

Народ, подскажите, задан 8-битный массив, к примеру:
Код:
uint8_t Test_Buffer1 [] = { 0x00,0x01,0x02,0x03,0x04,0x05};

Как его прочитать 16-битной переменной? Это для MAX7219 - инициализация и данные - в 8-битнов виде (так удобнее), а SPI у него 16-бит?

Re: Вопросы по С/С++ (СИ)

Вт май 01, 2018 19:42:00

uint16_t x=*((uint16_t *)&array[n]);

Как то так наверное.

Re: Вопросы по С/С++ (СИ)

Вт май 01, 2018 19:47:19

uint16_t x=*((uint16_t *)&array[n]);
Как то так наверное.

Благодарю, буду пробовать.

Re: Вопросы по С/С++ (СИ)

Вт май 01, 2018 19:54:43

Можно еще вот так.
uint16_t *array16;
array16=(uint16_t *)&array8[0];
uint16_t x = array16[n];

Re: Вопросы по С/С++ (СИ)

Вт май 01, 2018 19:58:40

Это для MAX7219 - инициализация и данные - в 8-битнов виде (так удобнее)

Удобнее будет единая функция на все случаи, компонующая 16-битную посылку из своих параметров - адреса и данных в требуемой спецификацией порядке. А инициализационные таблицы переоформите в виде:

Код:
struct {
  uint8_t addr;
  uint8_t data;
} aInitTable[] = {
  { 0x01, 0xFF },
  { 0x02, 0xAF },
  { 0x03, 0xCD }
};


Можно, конечно, и кувалдочкой *((uint16_t*)Test_Buffer1 + n) - но это, в зависимости от платформы, грозит преждевременным знакомством с понятием endianness используемой аппаратной части.

Re: Вопросы по С/С++ (СИ)

Вт май 01, 2018 20:17:27

Удобнее будет единая функция на все случаи, компонующая 16-битную посылку из своих параметров - адреса и данных в требуемой спецификацией порядке. А инициализационные таблицы переоформите в виде:
Код:
struct {
  uint8_t addr;
  uint8_t data;
} aInitTable[] = {
  { 0x01, 0xFF },
  { 0x02, 0xAF },
  { 0x03, 0xCD }
};

Можно, конечно, и кувалдочкой *((uint16_t*)Test_Buffer1 + n) - но это, в зависимости от платформы, грозит преждевременным знакомством с понятием endianness используемой аппаратной части.

Благодарю

Re: Вопросы по С/С++ (СИ)

Ср май 02, 2018 16:58:31

Пытаюсь изучить работу таймера и прерываний. MK AT89C2051, кварц 4 МГц. Компилятор языка Си ICC8051. По задумке таймер должен перезагружаться каждые 0,05 с (предустановка таймера 0xBEE5 - 48869). .... Но что-то пошло не так... Не могу разобраться сам в чём косяк.

Спасибо всем просмотревшим моё сообщение :) Разобрался сам...

Re: Вопросы по С/С++ (СИ)

Ср май 02, 2018 17:39:02

Спасибо всем просмотревшим моё сообщение :) Разобрался сам...

Разберись заодно и с тем, что если изучаешь работу таймеров с прерываниями, но программа на Си не работает, то это еще не означает, что есть какие-то вопросы по C/C++ :)

Re: Вопросы по С/С++ (СИ)

Ср май 02, 2018 19:08:20

Трабл был исключительно программный... Чутка не дописал в обработке прерывания.

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 15:22:32

Приветствую!!! Задача состоит в том,что в области EEPROM нужно разместить структуру, полями которой являются тоже структуры с двумя полями типа uint8.Зетем с помощью указателей уже работать с ними.
Но что-то делаю неверно и не могу понять.

Объявляю два новых типа структур:
Код:
typedef struct
{
   uint8_t Rashod;               
   uint8_t Temperatura;           
   
}Dannie_Mecyac; 

 typedef struct
{
   Dannie_Mecyac Yanvar;
   Dannie_Mecyac Fevral;
   Dannie_Mecyac Mart;
   ....
        Dannie_Mecyac Dekabr
}Mecyac ;


2. Определяю их
Код:
 
EEMEM Dannie_Mecyac GWS_Yanvar={0};
EEMEM Dannie_Mecyac GWS_Fevral={0};
EEMEM Dannie_Mecyac GWS_Mart={0};

EEMEM Mecyac GWS_Dannie={GWS_Yanvar,GWS_Fevral,GWS_Mart}; // на такую строчку компилятор ругается на какую то константу ссылается

Mecyac *PtrGWS_Dannie=&GWS_Dannie;


если написать просто
Код:
EEMEM Mecyac GWS_Dannie;

то компилятор молчит.

Проблемы:
1. Адреса полей,структур не совпадают с содержимым указателей на них...
2. Чет на подобную запись компил ошибку выдает.
Код:
GWS_Dannie.GWS_Yanvar.Rashod


Заранее благодарен!

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 16:33:19

компилятор ругается на какую то константу ссылается
...
2. Чет на подобную запись компил ошибку выдает.
Код:
GWS_Dannie.GWS_Yanvar.Rashod

...

да, сообщения компилятора особо не важны и вообще не несут полезной информации :facepalm:

по второму пункту - поле структуры не так называется.

ЗЫ а чего за контроллер?

ЗЗЫ
1. Адреса полей,структур не совпадают с содержимым указателей на них...

каких указателей? у вас их ровно одна штука, на которую "компилятор ругается".

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 17:09:18

ЗЫ а чего за контроллер?

Atmega16A

Добавлено after 6 minutes 50 seconds:
по второму пункту - поле структуры не так называется.
посмотрел пару статей там так и обращаются, у меня вот так не катит, а как надо?

основная структура GWS_Dannie в ней поле структурного типа GWS_Yanvar в которой поле Rashod типа uint... и пишу так
Код:
GWS_Dannie.GWS_Yanvar.Rashod

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 17:20:40

честно говоря особо не помню чего там в атмегах, но имхо так вольно обращаться с EEPROM-ом не особо позволяется.

смотрите, что происходит по коду: вы объявляете, размещаете в EEPROM (утрированно) и инициализируете три структуры (GWS_Yanvar, GWS_Fevral, GWS_Mart). Затем объявляете, размещаете в EEPROM структуру Mecyac и заполняете три первые ее поля значениями соответствующих полей предыдущих структур. Это не имеет особого смысла.

Добавлено after 2 minutes 23 seconds:
посмотрел пару статей там так и обращаются, у меня вот так не катит, а как надо?
основная структура GWS_Dannie в ней поле структурного типа GWS_Yanvar

имя поля - не то, что вы туда положили, а то, как объявили тип. В typedef-е у вас просто Yanvar, Fevral, Mart - вот это и есть имена полей.

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

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 17:20:57

каких указателей? у вас их ровно одна штука, на которую "компилятор ругается".

вот во вложении часть кода и контрольные значения...
Вложения
2018-05-08_18-22-32.png
(107.71 KiB) Скачиваний: 411

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 17:22:42

судя по префиксу EEMEM, у вас WinAVR или другой вариант AVR-GCC. так вот, эти компиляторы напрямую с данными в EEPROM работать не умеют, соответственно, никаких указателей на данные в EEPROM быть не может со всеми вытекающими обращениями.
судя по названиям, вы выбрали крайне неудачный способ структурирования данных.
а главная проблема ваша в том, что первичная инициализация структур должна быть явной, т.е. в качестве данных для одной структуры нельзя указывать содержимое другой структуры.
то есть вам надо для GWS_Dannie использовать явную инициализацию {{0,0}, {1,1}, {2,2}, ... };

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 17:26:36

Вместо годовой структуры сделайте массив.

Массив структур имеете ввиду? я думал про это, но пока на ознакомительном этапе решил так же оставить....

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 17:27:46

в качестве данных для одной структуры нельзя указывать содержимое другой структуры

чойта? можно.

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 17:35:26

в качестве данных для одной структуры нельзя указывать содержимое другой структуры

чойта? можно.

см. выше - ROMan2947 пытался, не вышло.

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 17:42:16

эти компиляторы напрямую с данными в EEPROM работать не умеют

Вот этот момент мне не понятен, читал на форумах,что нужно подключить файл.... а что за файл как подключить не ясно..
судя по названиям, вы выбрали крайне неудачный способ структурирования данных.
по ходу названия меня и запутали...

Добавлено after 1 minute 22 seconds:
пытался, не вышло.
может нужно сначала компилятор научить работать с EEPROM,после выйдет?

Re: Вопросы по С/С++ (СИ)

Вт май 08, 2018 17:45:21

ROMan2947 писал(а):а что за файл как подключить не ясно..
нате вам здрасте! вы что, не делали в начале #include <avr/eeprom.h>?!
ROMan2947 писал(а):по ходу названия меня и запутали
дело не в названиях. судя по вашему коду, вам нужен массив структур, а не структура из 12 полей, каждое из которых тоже структура.

Добавлено after 42 seconds:
Но в любом случае при работе с EEPROM точечная нотация не прокатит, т.к. компилятор не умеет...
Ответить