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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

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

#if __DEBUG__ 
   debug_send_str("INIT:...");
#endif 

//...

void debug_send_str(char * str){
   if(debug_ON_OFF==ON){ // вкл/выкл по usart
      USART_SendStr(str);
   }
}
так?) чего вы добиться то хотите?
Ставим плюсы: )
Реклама
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

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

Сообщение menzoda »

Не так. Вот так:

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

extern void UartSend(const char *msg);

...

#ifdef __DEBUG
    #define Trace(x)    UartSend(x)
#else
    #define Trace(x)
#endif

...

void main(void)
{
    Trace("Hello");
    Trace("World");
}
Реклама
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

menzoda, во то что надо. А если UartSend(x) с переменным числом параметров ? Типа функции printf();

чего вы добиться то хотите?
Что бы можно было писать так.

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

DEBUG("ERROR1");
DEBUG("ERROR1",var1);
DEBUG("ERROR2",var2,var3);
DEBUG("ERROR3",var4,var5,var6);
А в готовом варианте что бы можно было убрать/вернуть с минимальными трудозатратами =)
Аватара пользователя
virus33
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Пт июн 29, 2012 23:48:11

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

Сообщение virus33 »

Вопрос тупенький, но все же.
есть два камня которые должны общатся по uart. изначально была следующая мысль - шлем 1 байт на скорости 9600 ввиде 0b0000xxxx, где хххх - состояние уровней на входах RB4-RB7, остальные биты пока не используются.
Создал массив типа short int, по таймеру (1 секунда) в нужные ячейки записывал состояние уровней, сформированный байт отправил в путешествие. По приходу данного байта через сдвиговый регистр хотел так же развалить в подобный массив, чтобы
обработать полученную информацию. Но к сожалению ничего не получилось, компилятор(HI-Tech) выдал следующие предупреждения:
Warning [360] C:\Users\Enter\Documents\pic\sender\main.c; 90.8 array index out of bounds
Warning [358] C:\Users\Enter\Documents\pic\sender\main.c; 111.17 illegal conversion of pointer to integer
банально не знаю как сформировать байт из массива. Подскажите кто знает, заранее благодарен.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

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

Судя по ругательствам компилятора, Вы запихиваете в массив больше переменных, чем его размер. И пытаетесь указатель (адрес) преобразовать в целое. Чтобы это сделать, нужно указатель разыменовать (т.е. получить значение по его адресу операцией *)
Fucking static initialization order fiasco
Реклама
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

virus33, сколько элементов в массиве? Не следует забывать что в PIC память распределена по банкам и индексный регистр 8 бит, так что ругается на ограничение непрерывного пространства в банке или индекс больше 255.
У HI-TECH short int 16 бит, так что размер массива таких элементов может быть не больше 32.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

pokk писал(а):Что бы можно было писать так.

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

DEBUG("ERROR1");
DEBUG("ERROR1",var1);
DEBUG("ERROR2",var2,var3);
DEBUG("ERROR3",var4,var5,var6);
А в готовом варианте что бы можно было убрать/вернуть с минимальными трудозатратами =)
GCC поддерживает макросы с переменным числом параметров:
#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
virus33
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Пт июн 29, 2012 23:48:11

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

Сообщение virus33 »

код убогий, но как то так.

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

unsigned short int array[8];
///////////////////////////////////////////////////////////////////////////////////
void send_Usart(unsigned char e) //	Отправка байта
{
	while(TXIF!=1)	//	Устанавливается, когда регистр свободен
	{}
	TXREG = e;	
}

unsigned char getch_Usart(void)//	Получение байта
{
	while(!RCIF)	//	Устанавливается, когда регистр не пуст.
		continue;
	return RCREG;
}


void interrupt send_data(void)
{
if (T0IF == 1)
	{
	RA2 = ~RA2;
	array[0]=0;
	array[1]=0;
	array[2]=0;
	array[3]=0;
	array[4]=0;
	array[5]=0;
	array[6]=0;
	array[7]=0;
		if (com_0==1)
		{
		array[0]=1;
		} 
	
		if (com_1==1)
		{
		array[1]=1;
		} 
	
		if (com_2==1)
		{
		array[2]=1;
		} 
	
		if (com_3==1)
		{
		array[3]=1;
		} 
	
	send_Usart(*array);
	TMR0 = 1;
	T0IF = 0;					
	}

//	if (TMR2IF == 1)										//таймер 2 - говорим что соединение присутствует
//	{
//	RA2 = ~RA2;			
//	send_Usart(0b00000001);
//	TMR2 = 1;
//	T2CKPS0 = 0; T2CKPS1 = 1; 								//делим тактовую частоту на 4
//	TOUTPS0 = 0; TOUTPS1 = 0; TOUTPS2 = 1; TOUTPS3 = 0; 	//выходной делитель на 5
//	TMR2IF = 0;												// сброс флага
//	}

}
но в протеусе не вижу изменений при подаче уровней на входы мк
вот кстати вопрос, терминал показывает только определенные символьные коды, осцилограф как то странно отображает передачу по uart, есть ли еще способы посмотреть что на выходе имеется?
Последний раз редактировалось virus33 Чт июл 03, 2014 17:30:43, всего редактировалось 1 раз.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

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

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

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

Сообщение virus33 »

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

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

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

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

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

Сообщение virus33 »

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

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

Сообщение 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
kelod
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

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

Сообщение 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));
вопрос как считать массив вообще и конкретный элемент в частности??
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение 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
Аватара пользователя
virus33
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Пт июн 29, 2012 23:48:11

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

Сообщение 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], где с - переменная, в которую вы будете записывать значение из десятой ячейки массива.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

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

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

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

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

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

Сообщение kelod »

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

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

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

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

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

Сообщение kelod »

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

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


int EEMEM b=123;

int main(void)
{

   int b;

   b = eeprom_read_byte(&b);

}
а как туже процедуру сделать, только для массива не понятно
Ответить

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