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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

MS24 писал(а):Спасибо за помощь, реализовал проще:
void study()
{
while (!(PIND & (1<<PD2)))
{
if(UCSR0A & (1<<RXC0))
{
char r_Data, status;
status=UCSR0A;
r_Data = UDR0;
if (r_Data == 0)
{ PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTA = PORTA|(1<<0);
}

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

	  char r_Data, status;
	  status=UCSR0A;
Для чего вам нужна переменная status, если вы ее нигде не используете?
Последний раз редактировалось ut1wpr Чт апр 05, 2012 11:25:11, всего редактировалось 1 раз.
С уважением,
Виктор.
Реклама
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср янв 12, 2011 13:10:37
Откуда: Якутск

Сообщение UA0QQE »

vitalik_1984 писал(а):При динамической индикации нужно использовать таймеры.Где у вас таймер?
дело было не в неиспользовании таймеров.
Просто аноды были через ключи и происходило инвертирование.
Убрал ключи все норм заработало.
Все равно спасибо за ответ, пришлось разобраться как использовать таймер ))
I=U/R :)))
Реклама
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Сообщение slavik.ksu »

Извиняюсь что вмешиваюсь в обсуждение, о хочу задать маленький вопрос:
Хочу кнопку в главном цикле опрашивать нет ли нажатия, на ассемблере это команда SBIC (SBIS). А на Си это как лучше написать? я сделал так
#define MASKA 0b00000100 // маска для кнопки, он на PB2 выводе.
while(1)
{
a=VHOD_PIN;
a = a & MASKA;
if (a!=4)
{
a++; \\здесь просто задержка если нажата кнопка
}
}
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

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

#define KN1   (1 << PB2)
#define Pin_KN1 (PINB & KN1)

if(!Pin_KN1)
{
  Do_Something();
}
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Леонид Иванович, но ведь сначала нужно обmявить

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

#define PB2 2
Tell Me The Truth
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

не нужно, обычно в заголовочном файле контроллера это определение уже есть.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

urry писал(а):не нужно, обычно в заголовочном файле контроллера это определение уже есть.
добавляйте: для нормальных компиляторов. для CVAVR таких объявлений нет по умолчанию.
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Вопрос по объединению

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

union
{
unsigned char byte[2];
unsigned int   word;
}MyData;

Существует ли какая нибудь возможность организовать распределение word старшим байтом вперед?
т.е к примеру при
MyData.byte[0] = 0x12;
MyData.byte[1] = 0x34;
получить в
MyData.word = 0x1234 а не 0x3412
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Без сдвигов - нет.
Существует 2 вида компиляторов - big-endian и litl-endian - способ представления многобайтовых переменных.
В одном случае он ставит младший байт первым, в другом - старший.
Переубедить его нельзя.
Контактная информация:
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Все понял. Спасибо urry. Сделал со сдвигом.
Я все таки надеялся что можно собрать какой нибудь новый тип данных из структур объединений.
И вот еще макрос без сдвигов, но это уже не то.

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

#define LowB(x) (*((unsigned char*)  &(##x)+1))
#define HighB(x) (*((unsigned char*) &(##x)+0))
 
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

а чем вам сдвиги не угодили? умный компилятор сдвиг на 8 и кратное восьми все равно заменит новым адресом байта без всяких сдвигов
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Опишу полностью. Принимаю 38 байт данных по юсарту, от "прибора"(СТОК 101) измерения загрязнения воды, которая в свою очередь отделилась от нефти.
Прибор постоянно передает с интервалом примерно 300 мсек.
пакет таков
FF FF FF 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 04 00 00 09 - crc

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

union
{
unsigned char BUFFER[Stock_Bytes]; // сюда по юсарту принимаю пакет

struct
{
  unsigned long HEAD;//FF FF FF 55 заголовок  для чего он нужен не понятно. может из спячки выводить.
  
  unsigned int VALUE[(38-6)/2];// значения 16 битный тип данных которые тоже просто складываем и получаем загрязнение в усл единицах

  unsigned int CRC;//контрольная сумма с  5 по 36 байт просто сумма  байт

};

}STOCK;
Далее передаю это сумму VALUE[0..16] в работающую систему по шине I2C, Как виртуальный модуль измерения тока и температуры.
Т.е некий адаптер между существующей телемеханикой и "прибором" (СТОК 101).
Так вот, все получается перевернутым и STOCK.CRC VALUE HEAD а почему уже объяснили выше.А хотелось бы сделать просто через объединение. Теперь понимаю что ни как.
И сделал через сдвиг.
main.c
(14.3 КБ) 266 скачиваний
Еще вопрос как в СИ может выглядит перестановка тетрад байта чтоб в авр -ке выполнялось за 1 такт (asm SWAP)?
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

phanis писал(а):Еще вопрос как в СИ может выглядит перестановка тетрад байта чтоб в авр -ке выполнялось за 1 такт (asm SWAP)?
ну, если компилятор достаточно умный, то так:

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

unsigned char value = 0xAB;

value = (value << 4) | (value >> 4); // теперь value == 0xBA
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Спасибо Мастер Ломастер, надеюсь IAR достаточно умный компилятор..
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

код вижн

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

 
    .CSEG
                 _main:
                 ; 0000 0004 volatile unsigned char value = 0xAB;
                 ; 0000 0005 while (1) {
00002f 9721          SBIW R28,1
000030 eaeb          LDI  R30,LOW(171)
000031 83e8          ST   Y,R30
                 ;    value -> Y+0
                 _0x3:
; 0000 000E value = (value << 4) | (value >> 4); // теперь value == 0xBA
00003a 81e8          LD   R30,Y
00003b 95e2          SWAP R30
00003c 7fe0          ANDI R30,0xF0
00003d 2fae          MOV  R26,R30
00003e 81e8          LD   R30,Y
00003f 95e2          SWAP R30
000040 70ef          ANDI R30,0xF
000041 2bea          OR   R30,R26
000042 83e8          ST   Y,R30
avr studio :

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

volatile unsigned char value = 0xAB;
  52:    8b ea           ldi    r24, 0xAB    ; 171
  54:    89 83           std    Y+1, r24    ; 0x01
value = (value << 4) | (value >> 4);// теперь value == 0xBA
  5a:    89 81           ldd    r24, Y+1    ; 0x01
  5c:    99 81           ldd    r25, Y+1    ; 0x01
  5e:    82 95           swap    r24
  60:    80 7f           andi    r24, 0xF0    ; 240
  62:    92 95           swap    r25
  64:    9f 70           andi    r25, 0x0F    ; 15
  66:    89 2b           or    r24, r25
  68:    89 83           std    Y+1, r24    ; 0x01
В поисках истины человек развивается.
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск

Сообщение Rimsky »

Здравствуйте Уважаемые.


Есть код AVRGCC:

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

#include <avr/io.h>
#include <string.h>


PGM_P   bru_600[]	PROGMEM ={"600"};

uint8_t result;
data[4] = "600";

int main(void)
{



	while(1)
	{
	        result = strncmp_P((const char*)data, *bru_600, 3))
		uart_write(result);	
        }
return 0;

}
функция strncmp_P вместо ожидаемого 0х00 возвращает 0X97, как её правильно использовать?
Прошу сильно не пинать, я только начинаю изучать С.
спасибо.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Как то странно у вас вызывается функция можно посмотреть на ее описание?

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

strncmp_P((const char*)data, *bru_600, 3))
В поисках истины человек развивается.
Контактная информация:
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

vitalik_1984 писал(а): код вижн
avr studio :
В ИАР-е тоже самое нашел только эту примочку __swap_nibbles

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

/  245  unsigned char value ;
//  246  
//  247  value =PORTB;
        IN      R18, 0x18
//  248 
//  249 PORTA= (value << 4) | (value >> 4); 
        MOV     R17, R18
        SWAP    R17
        ANDI    R17, 0xF0
        MOV     R16, R18
        SWAP    R16
        ANDI    R16, 0x0F
        OR      R17, R16
        OUT     0x1B, R17
//  250  
//  251 PORTC =__swap_nibbles(value);
        SWAP    R18
        OUT     0x15, R18
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск

Сообщение Rimsky »

vitalik_1984 писал(а):Как то странно у вас вызывается функция можно посмотреть на ее описание?

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

strncmp_P((const char*)data, *bru_600, 3))
Разобрался, нужно было так:

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

strncmp_P((char const*)&data[1], PSTR("600"), 3)
это библиотечная функция WINAVR, <pgmspace.h>
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

в этом выражении еще и скобка лишняя похоже:-)

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

strncmp_P((const char*)data, *bru_600, 3))
а точно адрес первого элемента массива нужно передать в функцию?может нулевой?

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

Код:
strncmp_P((char const*)&data[1], PSTR("600"), 3)
В поисках истины человек развивается.
Контактная информация:
Ответить

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