Вопросы по С/С++ (СИ)
А сам send_Usart?
Fucking static initialization order fiasco
- Реклама
- Сообщения: 175
- Зарегистрирован: Пт июн 29, 2012 23:48:11
Прошу прощения, поправил пост выше. Собственно там особо ничего нет - байт отправляем, байт получаем.
ЗЫ с таким кодом отправляется только 0b00000001, т.е. записывается только уровень с входа com_0, с других входов уровни не пишутся.
ЗЫ с таким кодом отправляется только 0b00000001, т.е. записывается только уровень с входа com_0, с других входов уровни не пишутся.
Естественно! Вы передаете в функцию значение первого элемента массива! Причем массив у Вас short int (2 байта), а функция - char - 1 байт. Будет преобразование типов, в результате которого Вы потеряете старшую часть значения элемента массива. Скорее всего, компилятор и ругается из-за этого, что размерность данных не совпадает в аргументе вызываемой функции.virus33 писал(а):ЗЫ с таким кодом отправляется только 0b00000001, т.е. записывается только уровень с входа com_0, с других входов уровни не пишутся.
Fucking static initialization order fiasco
- Сообщения: 175
- Зарегистрирован: Пт июн 29, 2012 23:48:11
мне и нужно передать всего один байт.
допустим, на входах com_0 и com_2 присутствует высокий уровень, поэтому в uart мы должны передать 0b00000101
отсюда и спрашиваю, как сформировать этот байт.
тогда поставлю вопрос по другому - КАК отправить все элементы массива 1м байтом?
да кстати, компилятор ругался из за моей тупости с нумерацией массива.
допустим, на входах com_0 и com_2 присутствует высокий уровень, поэтому в uart мы должны передать 0b00000101
отсюда и спрашиваю, как сформировать этот байт.
тогда поставлю вопрос по другому - КАК отправить все элементы массива 1м байтом?
да кстати, компилятор ругался из за моей тупости с нумерацией массива.
Тогда Вам придется создать одну переменную размером 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
подскажите как работать с еепром, в частности с массивами
объявляю массив так
заполняю
вопрос как считать массив вообще и конкретный элемент в частности??
объявляю массив так
Код: Выделить всё
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));
Работаете также, как с обычной переменной или массивом.
Код: Выделить всё
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
вот как то вчера уже спать лег, когда до меня дошло - почему бы просто не использовать логическое ИЛИ. дешево и сердито:
хоть и грубо, но все работает.
kelod, весь массив можно считать допустим через цикл for, обратиться к конкретной ячейке можно через ее индекс. не забываем что нумерация начинается с нуля, т.е. если в вашем случае необходимо обратиться к 10й ячейке необходимо записать c = t_og_r1[9], где с - переменная, в которую вы будете записывать значение из десятой ячейки массива.
Код: Выделить всё
#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], где с - переменная, в которую вы будете записывать значение из десятой ячейки массива.
почему бы просто не использовать логическое ИЛИ. дешево и сердито:
Код: Выделить всё
1<<3 == 0b00001000Fucking static initialization order fiasco
- Сообщения: 884
- Зарегистрирован: Пн июл 08, 2013 22:59:45
считать элемент массива из eepromvirus33 писал(а): если в вашем случае необходимо обратиться к 10й ячейке необходимо записать c = t_og_r1[9]
товарисч это и имел в виду.
Fucking static initialization order fiasco
- Сообщения: 884
- Зарегистрирован: Пн июл 08, 2013 22:59:45
не понимаю ничего, есть массив в еепроме, как мне из него элемент вытянуть? для простых переменных делаю так
а как туже процедуру сделать, только для массива не понятно
Код: Выделить всё
int EEMEM b=123;
int main(void)
{
int b;
b = eeprom_read_byte(&b);
}
в данном случае адрес массива брать не надо. имя массива - итак указатель на первый элемент.
Fucking static initialization order fiasco
весь массив сразу или часть его можно считать функцией eeprom_read_block.kelod писал(а):не понимаю ничего, есть массив в еепроме, как мне из него элемент вытянуть? для простых переменных делаю така как туже процедуру сделать, только для массива не понятноКод: Выделить всё
int EEMEM b=123; int main(void) { int b; b = eeprom_read_byte(&b); }
«И всё-таки она вертится!»
это мне? если да, то я и не брал адрес массива, я взял адрес элемента массива)Pink-Pank писал(а):в данном случае адрес массива брать не надо.
записи:
Код: Выделить всё
b = eeprom_read_byte(&array[5]);
b = eeprom_read_byte(array+5);Ставим плюсы: )
- Сообщения: 884
- Зарегистрирован: Пн июл 08, 2013 22:59:45
объясните как она работает?Apparatchik писал(а):его можно считать функцией eeprom_read_block.
Точняк.. Сам запутался. ))это мне?..я взял адрес элемента..
Fucking static initialization order fiasco
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


