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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

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

Сообщение Frogfot »

Народ, подскажите, задан 8-битный массив, к примеру:

Код: Выделить всё

uint8_t Test_Buffer1 [] = { 0x00,0x01,0x02,0x03,0x04,0x05};
Как его прочитать 16-битной переменной? Это для MAX7219 - инициализация и данные - в 8-битнов виде (так удобнее), а SPI у него 16-бит?
Хорошему коту и в декабре - март :)
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

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

Как то так наверное.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

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

Сообщение Frogfot »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3366884#p3366884"]uint16_t x=*((uint16_t *)&array[n]);
Как то так наверное.[/uquote]
Благодарю, буду пробовать.
Хорошему коту и в декабре - март :)
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Можно еще вот так.
uint16_t *array16;
array16=(uint16_t *)&array8[0];
uint16_t x = array16[n];
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

[uquote="Frogfot",url="/forum/viewtopic.php?p=3366869#p3366869"]Это для MAX7219 - инициализация и данные - в 8-битнов виде (так удобнее)[/uquote]
Удобнее будет единая функция на все случаи, компонующая 16-битную посылку из своих параметров - адреса и данных в требуемой спецификацией порядке. А инициализационные таблицы переоформите в виде:

Код: Выделить всё

struct {
  uint8_t addr;
  uint8_t data;
} aInitTable[] = {
  { 0x01, 0xFF },
  { 0x02, 0xAF },
  { 0x03, 0xCD }
};
Можно, конечно, и кувалдочкой *((uint16_t*)Test_Buffer1 + n) - но это, в зависимости от платформы, грозит преждевременным знакомством с понятием endianness используемой аппаратной части.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

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

Сообщение Frogfot »

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3366900#p3366900"]Удобнее будет единая функция на все случаи, компонующая 16-битную посылку из своих параметров - адреса и данных в требуемой спецификацией порядке. А инициализационные таблицы переоформите в виде:

Код: Выделить всё

struct {
  uint8_t addr;
  uint8_t data;
} aInitTable[] = {
  { 0x01, 0xFF },
  { 0x02, 0xAF },
  { 0x03, 0xCD }
};
Можно, конечно, и кувалдочкой *((uint16_t*)Test_Buffer1 + n) - но это, в зависимости от платформы, грозит преждевременным знакомством с понятием endianness используемой аппаратной части.[/uquote]
Благодарю
Хорошему коту и в декабре - март :)
Аватара пользователя
Amigosam
Встал на лапы
Сообщения: 94
Зарегистрирован: Пт фев 14, 2014 20:45:33
Откуда: Северный Кавказ

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

Сообщение Amigosam »

[uquote="Amigosam",url="/forum/viewtopic.php?p=3365619#p3365619"]Пытаюсь изучить работу таймера и прерываний. MK AT89C2051, кварц 4 МГц. Компилятор языка Си ICC8051. По задумке таймер должен перезагружаться каждые 0,05 с (предустановка таймера 0xBEE5 - 48869). .... Но что-то пошло не так... Не могу разобраться сам в чём косяк.[/uquote]
Спасибо всем просмотревшим моё сообщение :) Разобрался сам...
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Amigosam",url="/forum/viewtopic.php?p=3367573#p3367573"]Спасибо всем просмотревшим моё сообщение :) Разобрался сам...[/uquote]
Разберись заодно и с тем, что если изучаешь работу таймеров с прерываниями, но программа на Си не работает, то это еще не означает, что есть какие-то вопросы по C/C++ :)
Аватара пользователя
Amigosam
Встал на лапы
Сообщения: 94
Зарегистрирован: Пт фев 14, 2014 20:45:33
Откуда: Северный Кавказ

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

Сообщение Amigosam »

Трабл был исключительно программный... Чутка не дописал в обработке прерывания.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

Приветствую!!! Задача состоит в том,что в области 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
Заранее благодарен!
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3371923#p3371923"]компилятор ругается на какую то константу ссылается
...
2. Чет на подобную запись компил ошибку выдает.

Код: Выделить всё

GWS_Dannie.GWS_Yanvar.Rashod
...[/uquote]
да, сообщения компилятора особо не важны и вообще не несут полезной информации :facepalm:

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

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

ЗЗЫ [uquote="ROMan2947",url="/forum/viewtopic.php?p=3371923#p3371923"]1. Адреса полей,структур не совпадают с содержимым указателей на них...[/uquote]
каких указателей? у вас их ровно одна штука, на которую "компилятор ругается".
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3371987#p3371987"]ЗЫ а чего за контроллер?[/uquote]
Atmega16A

Добавлено after 6 minutes 50 seconds:
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3371987#p3371987"]по второму пункту - поле структуры не так называется.[/uquote] посмотрел пару статей там так и обращаются, у меня вот так не катит, а как надо?

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

Код: Выделить всё

GWS_Dannie.GWS_Yanvar.Rashod
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

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

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

Добавлено after 2 minutes 23 seconds:
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3372013#p3372013"]посмотрел пару статей там так и обращаются, у меня вот так не катит, а как надо?
основная структура GWS_Dannie в ней поле структурного типа GWS_Yanvar[/uquote]
имя поля - не то, что вы туда положили, а то, как объявили тип. В typedef-е у вас просто Yanvar, Fevral, Mart - вот это и есть имена полей.

и предупрежу сразу, что так работать с календарем чудовищно неудобно. Вместо годовой структуры сделайте массив.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3371987#p3371987"]каких указателей? у вас их ровно одна штука, на которую "компилятор ругается".[/uquote]
вот во вложении часть кода и контрольные значения...
Вложения
2018-05-08_18-22-32.png
(107.71 КБ) 430 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3372027#p3372027"]Вместо годовой структуры сделайте массив.[/uquote]
Массив структур имеете ввиду? я думал про это, но пока на ознакомительном этапе решил так же оставить....
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

[uquote="ARV",url="/forum/viewtopic.php?p=3372032#p3372032"]в качестве данных для одной структуры нельзя указывать содержимое другой структуры[/uquote]
чойта? можно.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3372039#p3372039"][uquote="ARV",url="/forum/viewtopic.php?p=3372032#p3372032"]в качестве данных для одной структуры нельзя указывать содержимое другой структуры[/uquote]
чойта? можно.[/uquote]
см. выше - ROMan2947 пытался, не вышло.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

[uquote="ARV",url="/forum/viewtopic.php?p=3372032#p3372032"]эти компиляторы напрямую с данными в EEPROM работать не умеют[/uquote]
Вот этот момент мне не понятен, читал на форумах,что нужно подключить файл.... а что за файл как подключить не ясно..
[uquote="ARV",url="/forum/viewtopic.php?p=3372032#p3372032"]судя по названиям, вы выбрали крайне неудачный способ структурирования данных.[/uquote] по ходу названия меня и запутали...

Добавлено after 1 minute 22 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3372044#p3372044"]пытался, не вышло.[/uquote] может нужно сначала компилятор научить работать с EEPROM,после выйдет?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Ответить

Вернуться в «Разные вопросы по МК»