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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

А сам send_Usart?
Fucking static initialization order fiasco
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 175
Зарегистрирован: Пт июн 29, 2012 23:48:11

Сообщение virus33 »

Прошу прощения, поправил пост выше. Собственно там особо ничего нет - байт отправляем, байт получаем.
ЗЫ с таким кодом отправляется только 0b00000001, т.е. записывается только уровень с входа com_0, с других входов уровни не пишутся.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

virus33 писал(а):ЗЫ с таким кодом отправляется только 0b00000001, т.е. записывается только уровень с входа com_0, с других входов уровни не пишутся.
Естественно! Вы передаете в функцию значение первого элемента массива! Причем массив у Вас short int (2 байта), а функция - char - 1 байт. Будет преобразование типов, в результате которого Вы потеряете старшую часть значения элемента массива. Скорее всего, компилятор и ругается из-за этого, что размерность данных не совпадает в аргументе вызываемой функции.
Fucking static initialization order fiasco
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 175
Зарегистрирован: Пт июн 29, 2012 23:48:11

Сообщение virus33 »

мне и нужно передать всего один байт.
допустим, на входах com_0 и com_2 присутствует высокий уровень, поэтому в uart мы должны передать 0b00000101
отсюда и спрашиваю, как сформировать этот байт.
тогда поставлю вопрос по другому - КАК отправить все элементы массива 1м байтом?
да кстати, компилятор ругался из за моей тупости с нумерацией массива.
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Тогда Вам придется создать одну переменную размером unsigned char и в ручную устанавливать биты в ней:

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

unsigned char array;
.............
array |= 1 << 0; // установить 0-й бит
array |= 1 << 5; // установить 5-й бит
array &= ~(1 << 2); // сбросить 2-й бит
array &= ~(1 << 7); // сбросить 7-й бит
array = 0xFF; // 255 // установить все биты
array = 0x00; // 0    // сбросить все биты
 
Fucking static initialization order fiasco
Контактная информация:
Реклама
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

подскажите как работать с еепром, в частности с массивами
объявляю массив так

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

volatile uint32_t EEMEM t_og_r[SIZE_TERM];
заполняю

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

	uint32_t t_og_r1[15]={177,241,332,467,667,973,145,2238,3520,5670,9420,16180,28680,52700,100700};
	eeprom_update_block(t_og_r1,&t_og_r,sizeof(t_og_r1));
вопрос как считать массив вообще и конкретный элемент в частности??
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Работаете также, как с обычной переменной или массивом.

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

uint32_t  X;
uint32_t  Y[SIZE_TERM];
...
X = t_og_r[0]; // 0-й элемент пошел в X

for (unsigned char i=0; i<=SIZE_TERM-1; i++) {Y [i] = t_og_r [i];} // копируете весь массив
Fucking static initialization order fiasco
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 175
Зарегистрирован: Пт июн 29, 2012 23:48:11

Сообщение virus33 »

вот как то вчера уже спать лег, когда до меня дошло - почему бы просто не использовать логическое ИЛИ. дешево и сердито:

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

 #define com_0 RB4
#define com_1 RB5
#define com_2 RB6
#define com_3 RB7
unsigned short int d;
///////////////////////////////////
d = 0b00000000;
if (com_0 == 1){
d |= 0b00000001;
}
 if (com_1 == 1){
d |= 0b00000010;
}
 if (com_2 == 1){
d |= 0b00000100;
}
 if (com_3 == 1){
d |= 0b00001000;
}
send_Usart(d); 
хоть и грубо, но все работает.

kelod, весь массив можно считать допустим через цикл for, обратиться к конкретной ячейке можно через ее индекс. не забываем что нумерация начинается с нуля, т.е. если в вашем случае необходимо обратиться к 10й ячейке необходимо записать c = t_og_r1[9], где с - переменная, в которую вы будете записывать значение из десятой ячейки массива.
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

почему бы просто не использовать логическое ИЛИ. дешево и сердито:
:))) Вы не поверите, в моем примере именно ОНО и используется. ;)

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

1<<3 == 0b00001000
Только Вы опять переменную d объявили размером большим, чем байт.
Fucking static initialization order fiasco
Контактная информация:
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

virus33 писал(а): если в вашем случае необходимо обратиться к 10й ячейке необходимо записать c = t_og_r1[9]
считать элемент массива из eeprom
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

товарисч это и имел в виду.
Fucking static initialization order fiasco
Контактная информация:
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

не понимаю ничего, есть массив в еепроме, как мне из него элемент вытянуть? для простых переменных делаю так

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


int EEMEM b=123;

int main(void)
{

   int b;

   b = eeprom_read_byte(&b);

}
а как туже процедуру сделать, только для массива не понятно
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

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

b = eeprom_read_byte(&array[5]);
Ставим плюсы: )
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

в данном случае адрес массива брать не надо. имя массива - итак указатель на первый элемент.
Fucking static initialization order fiasco
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

kelod писал(а):не понимаю ничего, есть массив в еепроме, как мне из него элемент вытянуть? для простых переменных делаю так

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


int EEMEM b=123;

int main(void)
{

   int b;

   b = eeprom_read_byte(&b);

}
а как туже процедуру сделать, только для массива не понятно
весь массив сразу или часть его можно считать функцией eeprom_read_block.
«И всё-таки она вертится!»
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Pink-Pank писал(а):в данном случае адрес массива брать не надо.
это мне? если да, то я и не брал адрес массива, я взял адрес элемента массива)
записи:

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

b = eeprom_read_byte(&array[5]);
b = eeprom_read_byte(array+5);
идентичны
Ставим плюсы: )
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

Apparatchik писал(а):его можно считать функцией eeprom_read_block.
объясните как она работает?
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

это мне?..я взял адрес элемента..
Точняк.. Сам запутался. ))
Fucking static initialization order fiasco
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

kelod писал(а): объясните как она работает?
eeprom_read_block()

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

void eeprom_read_block (void *dst, const void *src, size_t n)
Параметры:
void *dst – указатель на начало области в ОЗУ
const void *src – указатель на начало области EEPROM
size_t n – количество байт
Возвращаемое значение: нет.
Описание: функция выполняет считывание n байтов из EEPROM по адресу src и размещает их в ОЗУ, начиная с адреса dest.
«И всё-таки она вертится!»
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

а так что бы программист на си чуствовал тебя программистом на си??
Ответить

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