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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Может заработало бы, а может и нет.
Вообще, негоже сравнивать что-то неопределённое, хоть в макросе, хоть в коде. Странно, что компилятор на это не матерится.
Правильней было бы сделать через :

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

#if !defined( COMMAPOS )  // или #ifndef
  ....  // Тут действия, при неопределённом "COMMAPOS"
#else
  ....  // Тут действия, при определённом "COMMAPOS"
#endif 
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="uldemir",url="/forum/viewtopic.php?p=3244653#p3244653"]Ага, тогда если бы я перед этим определил

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

#define LEFT 1
#define RIGHT 2
то это заработало бы?[/uquote]

да, в основном должно
Реклама
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

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

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

#define SEG_A_ON GPIOD->ODR |= GPIO_PIN_5
#define SEG_B_ON GPIOA->ODR |= GPIO_PIN_2
#define SEG_C_ON GPIOC->ODR |= GPIO_PIN_7
#define SEG_D_ON GPIOD->ODR |= GPIO_PIN_3
#define SEG_E_ON GPIOD->ODR |= GPIO_PIN_1
#define SEG_F_ON GPIOA->ODR |= GPIO_PIN_1
#define SEG_G_ON GPIOC->ODR |= GPIO_PIN_6
#define SEG_DP_ON GPIOD->ODR |= GPIO_PIN_2
Есть массив для цифр, не пойму как это работает, как вывести например там символ F

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

uint8_t _SYM[][3] =
{
  {1 << 2 | 1 << 1, 1 << 5 | 1 << 1 | 1 << 3, 1 << 7},         // 0
  {1 << 2, 0, 1 << 7},                                         // 1
  {1 << 2, 1 << 5 | 1 << 1 | 1 << 3, 1 << 6},                  // 2
  {1 << 2, 1 << 3 | 1 << 5, 1<<6 | 1 << 7},                    // 3
  {1 << 2 | 1 << 1, 0, 1 << 6 | 1 << 7},                       // 4
  {1 << 1, 1 << 5 | 1 << 3, 1 << 6 | 1 << 7},                  // 5
  {1 << 1, 1 << 1 | 1 << 5 | 1 << 3, 1 << 6 | 1 << 7},         // 6
  {1 << 2, 1 << 5, 1 << 7},                                    // 7
  {1 << 1 | 1 << 2, 1 << 5 | 1 << 1 | 1 << 3, 1 << 6 | 1 << 7},// 8
  {1 << 1 | 1 << 2, 1 << 5 | 1 << 3, 1 << 6 | 1 << 7},         // 9
  {0x00, 0x00, 0x00},                                          //
};
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

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

{1 << 1 | 1 << 5, 1 << 6 | 1 << 7},         // F
Вообще, вместо магических чисел, лучше обозначить сегменты - "A", "B", ....
Тогда символ "F" будет уже выглядеть примерно так :

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

{1 << A | 1 << E, 1 << F | 1 << G},         // F
что более наглядней.
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

Не получается так F, вот остаток кода,связанный с этим-

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

uint8_t _SYM_MASK[3] = {0xF9, 0xD1, 0x3F}; // A, D, C маски чтобы не затронуть остальные биты портов
uint8_t LED[3] = {0x00, 0x00, 0x00};
uint8_t LED_CURR = 0;

  // занесем новые данные по сегментам
  GPIOA->ODR = GPIOA->ODR & _SYM_MASK[0];
  GPIOD->ODR = GPIOD->ODR & _SYM_MASK[1];
  GPIOC->ODR = GPIOC->ODR & _SYM_MASK[2];

  GPIOA->ODR = GPIOA->ODR | _SYM[LED[LED_CURR]][0];
  GPIOD->ODR = GPIOD->ODR | _SYM[LED[LED_CURR]][1];
  GPIOC->ODR = GPIOC->ODR | _SYM[LED[LED_CURR]][2];

  // включаем нужный разряд
  if (LED_OFF[LED_CURR] == 0)
  {
    GPIOB->DDR = GPIOB->DDR | _DIG_MASK[LED_CURR][0];
    GPIOD->ODR = GPIOD->ODR & _DIG_MASK[LED_CURR][1];
  }

  if (LED_DP[LED_CURR] & 0x01) // точку включаем отдельно
     SEG_DP_ON;

  LED_CURR++;
  if (LED_CURR > 2)
    LED_CURR = 0;
Реклама
Друг Кота
Сообщения: 9589
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Да в бинарном виде запишите в массив пины порта (к котрому подключён 7-ми сегментник) да и всё))

char LED[3] = {0x0b01110010, 0x0b01000010, 0x0b00010010}; // A, B, C, ...

Для вывода наберите:

PORTB=LED[0]; // вывод A. (вместе с точной)
...
PORTB=LED[1]; // вывод B. (вместе с точной)
...
PORTB=LED[2]; // вывод C. (вместе с точной)
...
и т.д. ))

дефайны ещё всякие.. нафиг они тут нужны))
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

dm211 писал(а):вот остаток кода,связанный с этим-
Что-то у Вас какая-то путаница в коде.
Маски какие-то, массив символов из 3-х рядов (причём одинаковых), ... Зачем это всё ?
Создали одномерный массив для символов и выбираем из него нужный символ, записывая в порт. Всё.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Аlex писал(а):Создали одномерный массив для символов и выбираем из него нужный символ, записывая в порт. Всё.
массив-то можно одномерный, а вот на счет записи в порт - не выйдет: у него сегменты по разным портам разбросаны:
dm211 писал(а):#define SEG_B_ON GPIOA->ODR |= GPIO_PIN_2
#define SEG_C_ON GPIOC->ODR |= GPIO_PIN_7
#define SEG_D_ON GPIOD->ODR |= GPIO_PIN_3
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="dm211",url="/forum/viewtopic.php?p=3256664#p3256664"]Есть массив для цифр, не пойму как это работает, как вывести например там символ F[/uquote]
похоже STM8 - тут посмотреть может понятнее будет:
http://caxapa.ru/795691.html
F:

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

   case 'F':
             GPIOD->ODR|=  (1<<1);  // PD1 (A)  
             GPIOA->ODR&=  ~(1<<3);  // PA3 (B)  
             GPIOC->ODR&=  ~(1<<3);  // PC3 (C)  
             GPIOC->ODR&=  ~(1<<6);  // PC6 (D)  
             GPIOC->ODR|= (1<<7); // PC7 (E)  
             GPIOC->ODR|=  (1<<4);  // PC4 (F)  
             GPIOA->ODR|=  (1<<2);  // PA2 (G)  
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ARV писал(а):а вот на счет записи в порт - не выйдет:
Ну значит запись в несколько портов :)
Не вижу проблемы...
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

[uquote="Аlex",url="/forum/viewtopic.php?p=3256722#p3256722"]Маски какие-то, массив символов из 3-х рядов (причём одинаковых), ... Зачем это всё ?
Создали одномерный массив для символов и выбираем из него нужный символ, записывая в порт. Всё.[/uquote]

Угу, при нынешней дешивезне изготовления pcb, "кулибинство" в разводке пинов под 7сегментник -лишний геморрой в софте.
Это было оправдано ещё лет так 5 назад, при рассово-верном лутЪ.

Сейчас и софтовый ногодрыг для LED -лишь блажь и УГ.
В юзаемых тобой 32пЫк есть же DMA?
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="dosikus",url="/forum/viewtopic.php?p=3257066#p3257066"]Угу, при нынешней дешивезне изготовления pcb, "кулибинство" в разводке пинов под 7сегментник -лишний геморрой в софте.[/uquote]
ну я например извращался для stm8s103f3 - там тупо нет ни одного целого порта gpio, физически разведенного на ноги) максимум порт D, от него есть 6 пинов
Спойлер

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

....
typedef struct {
	GPIO_TypeDef* port;
	GPIO_Pin_TypeDef pin;
}segment_t;
...
segment_t seg[8]={
		{GPIOD, GPIO_PIN_1}, // A
		{GPIOD, GPIO_PIN_2}, // B
		{GPIOD, GPIO_PIN_3}, // C
		{GPIOD, GPIO_PIN_4}, // D
		{GPIOC, GPIO_PIN_4}, // E
		{GPIOC, GPIO_PIN_5}, // F
		{GPIOC, GPIO_PIN_7}, // G
		{GPIOC, GPIO_PIN_6}  // DP
};

#define SEG_DP_MASK 0b10000000

// set bit represents live segments: DP G  F  E  D  C  B  A
//                               0b  0  0  0  0  0  1  1  0
uint8_t digit_mask[10]={
		0b00111111, // 0
		0b00000110, // 1
		0b01011011, // 2
		0b01001111, // 3
		0b01100110, // 4
		0b01101101, // 5
		0b01111101, // 6
		0b00000111, // 7
		0b01111111, // 8
		0b01101111  // 9
};
...
#define writeHigh(port,pins) port->ODR |= (pins)
#define writeLow(port,pins) port->ODR &= ~(pins)
#define ValBit(VAR,Place)         ((uint8_t)(VAR) & (uint8_t)((uint8_t)1<<(uint8_t)(Place)))
...
void led_setbuf(uint16_t newval){
	buf[0]=digit_mask[newval%10];
	newval/=10;
	buf[1]=digit_mask[newval%10];
	newval/=10;
	buf[2]=digit_mask[newval%10]|SEG_DP_MASK;
}
...
void led_display_digit(uint8_t seg_mask) {
		uint8_t i;
		for (i = 0; i < 8; i++) {
			if (ValBit(seg_mask,i) == 0) {
				writeLow(seg[i].port, seg[i].pin);
			} else {
				writeHigh(seg[i].port, seg[i].pin);
			}
		}
}
...
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="dosikus",url="/forum/viewtopic.php?p=3257066#p3257066"]В юзаемых тобой 32пЫк есть же DMA?[/uquote]
Есть. Они и в 24-ых есть. Только я их как-то "проехал" - сразу выбрал 32-ые.
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

Ну разобрался я в том коде, вывожу на 7-сегм.,что хочу, но.. Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть! Обслуживание индикатора и кнопок только полпамяти занимает, я остальное своё добавил.тем более с библиотекой math.h- всё- памяти не хватает, придется отдирать 7-сегм. оттуда и убирать библу ос.
"ltkrn.h" и в майне несколько бесконечных циклов-это же ось-как я понимаю? Как у вас там у си-шников-несколько нитей чтоли.. :)
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="dm211",url="/forum/viewtopic.php?p=3257979#p3257979"]Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть![/uquote]
а что, собственно, такого? Предположу, что автору памяти вполне хватало)
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3258044#p3258044"][uquote="dm211",url="/forum/viewtopic.php?p=3257979#p3257979"]Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть![/uquote]
а что, собственно, такого? Предположу, что автору памяти вполне хватало)[/uquote]
Ничего. просто встретил впервые ОС в МК. Автор конечно опытный и написал как знает для готовой платы своё.
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Добрый день, подскажите пожалуйста как сделать, чтобы компилятор не ругался
warning: #188-D: enumerated type mixed with another type
Подразумеваю приведение типа или типо того)))
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

телепатирую: вы где-то присваиваете переменной с типом enum значение какого-то из int-ов, или наоборот.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Здравствуйте.

Нужно циклически сдвинуть массив типа int16_t вправо, как думаете какая из реализаций будет работать быстрее:

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

void reverse_arr(int16_t *arr, uint16_t size) { // развернуть массив
	uint16_t i;
	int16_t temp;

	for (i = 0; i < size / 2; i++) {
		temp = arr[i];
		arr[i] = arr[size - 1 - i];
		arr[size - 1 - i] = temp;
	}
}

void shift_arr(int16_t *arr, uint16_t shift, uint16_t size) { // циклически сдвинуть массив размером size на shift элементов
	reverse_arr(&arr[size - shift], shift);
	reverse_arr(arr, size - shift);
	reverse_arr(arr, size);
}
или

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

void shift_arr(int16_t *arr, uint16_t shift, uint16_t size) { // циклически сдвинуть массив размером size на shift элементов
	int16_t buf[100];	

	memcpy(buf, &arr[size - shift], shift * 2); // копируем последние елементы в буфер
	memmove(&arr[shift], arr, (size - shift) * 2); // сдвигаем
	memcpy(arr, buf, shift * 2); // копируем из буфера в начало
}
P.S. контроллер STM32 компилятор GCC, на AVR под GCC тоже интересно.
«И всё-таки она вертится!»
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Apparatchik писал(а):контроллер STM32 компилятор GCC
по идее memcpy для 32-битной платформы должна активно использовать именно 32-битные пересылки, поэтому должна выигрывать у 16-битного копирования... хотя кто знает, сделано это в arm-libc или нет... да и я не в курсе, есть ли разница у ARM-ов...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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