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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18649
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

как быть? помнить о неявном приведении типов операндов в выражениях. ну и разбить сложную цепочку вычислений на несколько отдельных строк - оптимизатор все равно уберет избыточность, а свои ошибки найти будет проще. к тому же многократное обращение к функции чтения EEPROM - зачем?! можно же один раз считать в промежуточную переменную и затем ее использовать везде :) заодно и быстродействие повысится

запомните простые правила преобразования типов (вместо умножения любой арифметический знак):

int * int = int
int * char = int
char * char = int * int с последующим приведением к char
long * char = long
long * int = long
10 = int
10L = long

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

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6319
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

ARV писал(а):разбить сложную цепочку вычислений на несколько отдельных строк <..> к тому же многократное обращение к функции чтения EEPROM - зачем?! можно же один раз считать в промежуточную переменную и затем ее использовать везде :) заодно и быстродействие повысится
Да, приведенный код можно считать хрестоматийным и на нем учить новичков : вот так не делайте :(
Реклама
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

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

Сообщение Mishany »

кто подскажет?
Почему не передается второе значение 0xBB, только первое 0xAA проходит по SPI.
Спойлер

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

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define  DDR_SPI DDRB
#define MOSI 3
#define SCK 5

void SPI_MasterInit(void)
{
/* Установка MOSI, SS и SCK на вывод, все остальные на ввод */
DDR_SPI |= (1<<MOSI)|(1<<SCK);
/* Разрешение SPI в режиме мастера, установка скорости связи fck/4 */
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPIE)|(1<<CPOL)|(1<<CPHA);
}

void SPI_MasterTransmit(char cData)
{
/* Запуск передачи данных */
SPDR = cData;
/* Ожидание завершения передачи данных */
while((SPSR & 0x80) != 0x80 );
}

int main(void)
{
	sei();
_delay_ms(10);
SPI_MasterInit();
_delay_ms(1);
SPI_MasterTransmit(0xAA);
SPI_MasterTransmit(0xBB);
_delay_ms(1);
}
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

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

static void ls020WriteData(uint8_t data)
{
        SPDR = data;
        while(!(SPSR & (1<<SPIF)));
        return;
}
Это рабочий код из моего проекта. Похоже, вам нужно проверять на равенство нулю в цикле, а не на неравенство.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

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

Сообщение Mishany »

так тоже самое, похоже после первой отправки происходит зацыкливание передачи, + на SCK длительность одного из 8-ми импульсов плавающая
убрал прерывания, вроде заработало, но почему нет стабильности в длительности импульсов на SCK?
Реклама
mastech
Грызет канифоль
Сообщения: 269
Зарегистрирован: Чт мар 11, 2010 17:45:37
Откуда: г.фрязино

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

Сообщение mastech »

день добрый. как сделать разные задержки(разную скорость моргания) на двух портах, ставлю разные задержки в итоге получается поочередное мигание. частота стоит 4Мгц.
Спойлер#include <avr/io.h>
#include <util/delay.h>

static void PORTIANKA(void)
{
PORTB &= ~(1 << PB2);
_delay_ms(70);
PORTB |= (1 << PB2);
_delay_ms(20);
}

static void ZADERZKA(void)
{
PORTB &= ~(1 << PB4);
_delay_ms(100);
PORTB |= (1 << PB4);
_delay_ms(200);
}


int main(void)
{
//DDRD = 0b00000000;
//PORTD = 0b11111111;
DDRB = 0b00010100;
PORTB = 0b00101011;


while(1)
{
while ((PINB&(1 << PB0)) == 1){}
_delay_ms(1);
if ((PINB&(1 << PB2)) == 0)
{
PORTB |= (1 << PB2);
}
else
while(1){

PORTIANKA();
ZADERZKA();
}
}
}
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Ну так естественно, ведь в maine() обе функции мигания светодиодами вызываются по очереди одна за другой, с той только разницей, что у светодиодов будет отличаться время свечения/гашения.

По вопросу - если нужно действительно независимое мигание, надо избавляться от _delay_ms() и переходить к аппаратному таймеру.
Аватара пользователя
ks0
Прорезались зубы
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

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

Сообщение ks0 »

Имена функций доставляют

Если без таймера, то делать delay, например, порядка сотой доли от времени зедаржки, а между вызовами этой delay декрементировать счетчики задержек каждого светодиода
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Как на Си организовать нечто подобное...

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

struct Menu{
	uint8_t MainTxt [] = {"меню1 траляля траляля"};
	uint8_t MainLim [] = {1,2};

	uint8_t SetupTxt [] = {"меню2 траляля траляля"};
	uint8_t SetupLim [] = {1,3};

	uint8_t LearnTxt [] = {"меню3 траляля траляля"};
	uint8_t LearnLim [] = {2,2};

	uint8_t KeysTxt [] = {"меню4 траляля траляля"};
	uint8_t KeysLim [] = {2,4};
};
Я имею ввиду чтобы не нужно было несколько раз писать имена переменных - сначала объявляя их в объявлении структуры, а потом опять писать их присваивая значения... или чтобы не было так: переменные перечисляются в одном месте, а присваивание в другом...
В общем, чтобы было наглядно, переменная и тут же присваивание...
Последний раз редактировалось shads Пт ноя 07, 2014 12:18:51, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18649
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

я вообще не понял, в чем смысл этой структуры - работать с ней все равно неудобно.
имхо, меню должно строиться на обезличенном наборе (массиве, списке) пунктов, а каждый пункт уже описывается структурой с полями "имя", "номер" и т.п.
в этом случае работа с любым пунктом меню из массива/списка ведется совершенно одинотипно. а в вашем случае уже нельзя, например, циклом перебрать все пункты и вывести их на дисплей...

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

typedef struct{
   uint8_t id;
   uint8_t name[10];
   void (eventhandler*)(void);
} menu_item;

menu_item my_menu[] = {
   {1, "меню 1", null}, 
   {2, "меню 2", null}, 
   {3, "меню3", null}
}
как-то так
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

ARV писал(а):в вашем случае уже нельзя, например, циклом перебрать все пункты и вывести их на дисплей...
Можно...
Хотел сделать так: передавать функции номер менюшки, а функция уже сама перебором находит в памяти вход в нужное меню...

При этом достаточно будет всего 2-х сущьностей, перечислителя названий функций, типа

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

enum {
	MenuMain,
	MenuSetup,
	MenuLearn,
	MenuKeys,
	MenuNumTotal
};
и самого наполнения менюшек, типа того что привел выше...

Думаю в таком виде редактировать, добавлять\убавлять будет проще...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18649
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

возможно в силу своей ограниченности я чего-то недопонимаю, но покажите пример кода функции, которая по номеру пункта выберет из вашей структуры нужные поля...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

ARV писал(а):возможно в силу своей ограниченности я чего-то недопонимаю, но покажите пример кода функции, которая по номеру пункта выберет из вашей структуры нужные поля...
Хе... возможно в силу своей ограниченности я чего то неправильно предполагаю :)...

Но представлял себе это как то так: функция берет адрес начала структуры и перебором находит первый 0, это будет конец текста первой менюшки, соответственно к этому адресу прибавляем количество информационных байт (в нашем случае 2) и попадаем на начало второй менюшки... ну и т.д.
Хотя тут возможны грабли с особенностями четного выравнивания в AVR... но думаю и это можно разрулить...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

А для чего весь этот ананизм ? :)
Создайте свой тип-структуру с данными, указателями на строки, и всякими другими свойствами. Объявите массив с этим типом и выбирайте из него по индексу необходимую структуру.
Собственно, это любезно продемонстрировал ARV несколькими постами выше.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18649
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

shads писал(а):функция берет адрес начала структуры и перебором находит первый 0, это будет конец текста первой менюшки, соответственно к этому адресу прибавляем количество информационных байт (в нашем случае 2) и попадаем на начало второй менюшки... ну и т.д.
чем-то напоминает процесс вырезания гланд через прямую кишку...

когда-то я этими меню был маленько озабочен... если нужно - гуглите на моем сайте "TUI" - Text User Interface - делал библиотечку для меню на текстовом ЖКИ... среди основных фич:
- почти любая вложенность "подменю" (ограничение - объем памяти)
- возможность динамически менять текст пунктов меню (например, "подсветка вкл" на "подсветка выкл")
- возможность встраивания в меню числовых изменяемых параметров (например, "яркость 15%") - параметр меняется прямо в пункте меню
- ориентация на WinAVR
что-то там еще было, сейчас уже и не упомню...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Спасибо, гляну...
Просто я и структуры особо не юзал и вложенные структуры (как вы предложили) не особо представляю как использовать... Вот то что пришло в голову, и выдал :)
В общем - попробую это правильно сделать... а не через прямую к....
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

ARV писал(а):"TUI" - Text User Interface - делал библиотечку для меню на текстовом ЖКИ...
Посмотрел... Сложновато честно говоря, для 0216 дисплея...
Может оно и универсально конечно, но у меня совершенно не нашлось сил вникать... лентяй наверное... или просто не привык вникать в чужую писанину :)..

По твоему предложению - минус в том что поле uint8_t name[10]; должно быть равно максимально длинной записи... а я все это затеваю для NOKIA3310 дисплея... там как известно страница = 84 байта... я конечно буду применять уплотнение, но тем не менее, как то не оптимально получится если на каждую страницу будет отводится одинаково большое неэффективно используемое поле...
Например в моем случае эта проблема как раз решается тем что каждая строка индивидуальна... что в этом плане подскажете?

И еще вопросик... зачем у вас поле id ? Ведь порядковый номер пункта меню итак следует из нумерации в массиве...
Последний раз редактировалось shads Пт ноя 07, 2014 21:28:40, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

shads писал(а):что в этом плане подскажете?
Заюзать указатель на строку, вместо массива.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Аlex писал(а):Заюзать указатель на строку, вместо массива.
Это - да.... более менее компромиссный вариант...
но возникает неудобство редактиования\удаления\добавления страниц меню... т.к. тексты и параметры страниц - будут сгруппированы в разных местах...

В моем случае тоже есть две сущности, это 1) нумерация страниц (enum) и 2) само наполнение страниц с параметрами (по крайней мере все для каждой отдельной менюшки - держится в кучке)... Тоже конечно не фантан из-за enum... Но по крайней мере при редактировании одного параметра легко видны зависимости, т.к. все в кучке...

В идеале можно было бы (я имею ввиду мой случай) и от enum освободится и оставить только структуры с наполнением... и обращаться к ним через указатели... но в таком случае не организуешь в оперативке динамические массивы с переменными для каждой менюшки, все ручками придется прописывать...



В обчем попробую пока именно так сделать
Аlex писал(а):Заюзать указатель на строку
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

shads писал(а):но в таком случае не организуешь в оперативке динамические массивы с переменными для каждой менюшки, все ручками придется прописывать...
А что если замучить malloc() / free() ?
Ведь даже в плюсах всякие классы, на подобии String, основаны на том же динамическом выделении/освобождении памяти.
Ответить

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