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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
dnhftm
Родился
Сообщения: 11
Зарегистрирован: Чт янв 19, 2012 17:13:20

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

Сообщение dnhftm »

Привет всем подскажите как перекидывать из массива в переменную
скажем так у меня есть массив в формате ASCII char buffer[20] {$GS12345,00001} данный массив я уже представил как буковки и циферки а не код ASCII 251,200,12,15, итд .
задача производить с числом математические действия но с массивом это делать наверно не получиться поэтому я хочу перекинуть его в FLOAT чем мне воспользоваться ?
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

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

выделить из строки символы, задающие ваше число, а затем преобразовать эти символы в число, после чего делать с ним амтематические действия. число из строки можно получить, например, при помощи функции sscanf
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

в своей практике я уже мигал светодиодами............... а теперь задумался над тем каким макаром сделать так чтобы светодиод ПЛАВНО набирал яркость и также плавно тух..., и так с некой частотой........., как сие сделать ?
Последний раз редактировалось FreshMan Ср мар 21, 2012 21:12:23, всего редактировалось 2 раза.
Tell Me The Truth
dnhftm
Родился
Сообщения: 11
Зарегистрирован: Чт янв 19, 2012 17:13:20

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

Сообщение dnhftm »

FreshMan писал(а):в своей практике я уже мигал светодиодами............... а теперь задумался над тем каким макаром сделать так чтобы светодиод ПЛАВНО набирал яркость и также плавно тух..., и так с некой частотой........., как сие сделать ?
настраивай ШИМ есть счетчик выход счетчика выбираешь скорость шим и регулируешь шим регистром вроде OCR точно не помню настраивается от 0 до 255
Реклама
Эиком - электронные компоненты и радиодетали
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

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

Сообщение Лютик »

добрый. написал функцию форматированного вывода строки на экран lcd

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

void String1(const char *fmt, ...)
{
  va_list arg;
char str[17];
LCD_Goto(0,0);
LCD_SendString(EraseStr); 
LCD_Goto(0,0);

  va_start (arg, fmt);
  vsprintf (str, fmt, arg);
  va_end (arg);
	LCD_SendString(str);
}
все хорошо, только вот флот выводить не хочет, пишет "?". хексы и интеджеры выводит на ура, а вот с флотом непонятка какая-то. Вывожу следующим образом;

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

float a=1.5;
String1("a=%f",a);
пытался также "%e"и "%g", но опять таки выводит "?".
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

А чем вас принтф не устроила?
В поисках истины человек развивается.
Реклама
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

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

Сообщение Лютик »

тем что при настройке стрима выдает какую-то ошибку
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

у меня как у создателя темы, есть тупой вопрос :) не могу найти свой косяк.
код для работы с 74595

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

#define clk       PA0
#define data_out  PA1
#define trig      PA2

union out_me {
    uint8_t i;
    bool a[8];
};

void shift_out(uint8_t out)
{
    union out_me _out;
    _out.i = out;
    uint8_t i;
    for (i =0; i < 8; i++)
    {
        PORTA |= (1 << clk);
        if (_out.a[i])    PORTA |= (1 << data_out);
        else    PORTA &= ~(1 << data_out);
        PORTA &= ~(1 << clk);
        if (i==7)
        {
            PORTA |= (1 << trig);
            PORTA &= ~(1 << trig);
            PORTA &= ~(1 << data_out);

        }
    }
}

int main(void)
{
    DDRA = 0xFF;
    while(1)
    {
        shift_out(0xA5);
        _delay_ms(100);
    }
    return 0;
}

Код выдаёт выт такую хрень.

Изображение

я не втёр в каком месте я опять налажал. помогите свежим взглядом
Вложения
shift_out.JPG
(16.88 КБ) 402 скачивания
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Посмотри на прошлой странице в девятом посте я как раз для твоего случая выкладывал пример.Рабочий, проверено.
В поисках истины человек развивается.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

эмм.. а можно заголовки ? потому что вот эта строчка :

(gear&0x01)? PORTA|=_BV(data_out): PORTA&=~_BV(data_out);

вызывает у меня вопросы. я как бы пишу на си.. а это c++. но идею вы мне подали

благодарю. привел к нормальному виду, всё получилось. видимо действительно avr не воспринимает нормально тип bool и union.
Последний раз редактировалось Кислый Чт мар 22, 2012 18:29:28, всего редактировалось 3 раза.
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

хелп, собственно должно получиться подобие счётчика, по прерыванию на INT0 (PIND.2) - отнимает от ввёдённого значения 1+коэфицент. По окончанию счёта (counter=0) срабатывает звуковая сигнализация.
Немогу разобраться с прерываниями - т.е. с отключенным int0. подаю на PIND.2==0 и программа работает. Но стоит подключить прерывания и нет никакого эффекта.
сорри
Вложения
kod.txt
(3.69 КБ) 108 скачиваний
Последний раз редактировалось levaclaus Чт мар 22, 2012 19:21:24, всего редактировалось 1 раз.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

уважайте людей форума зачем такое большое полотно впихиваете?делайте вложением.Инициализации пустые с нулями хоть бы удалили.
В поисках истины человек развивается.
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

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

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

Сообщение vitalik_1984 »

volatile забыли.Нужно

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

volatile unsigned int count; 
Сегодня только такой баг исправил в своем коде тоже глобальную переменную в прерывании менял.
Добавил и заработало.
В поисках истины человек развивается.
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

Да, volatile это правильно. А еще main использует свой локальный float count, а не глобальный volatile unsigned int count, т.е. это разные переменные. Так что float count из main надо убрать.
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

vitalik_1984 писал(а):volatile забыли.Нужно

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

volatile unsigned int count; 
Сегодня только такой баг исправил в своем коде тоже глобальную переменную в прерывании менял.
Добавил и заработало.
не помогло, никакой разницы
BorisSPB писал(а):Да, volatile это правильно. А еще main использует свой локальный float count, а не глобальный volatile unsigned int count, т.е. это разные переменные. Так что float count из main надо убрать.
помогло отчасти
код уменьшился раза в 2, стали срабатывать прерывания,
но выводится мусор, значения прыгают по обе стороны нуля, счёта нет
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

Сделал так

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

interrupt [EXT_INT0] void ext_int0_isr(void)
{  
 count=count-1;
 delay_ms(100);
}
стал работать счёт по прерыванию, но если зажать на INT0 "0", то счёт почемуто идёт в фоне с интервалом в 100мс
надо наверное по спаду настроить...
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Вчера парился с одним проектом.

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

char ch[64]; cout<<sizeof(ch[0]);
Выдало мне размер в 4 байта. :shock: На сколько мне известно, что тип char состоит из одного байта.
Из за этого, у меня не работала процедура обработки буфера. Дошло до того, что я закрыл среду и снова открыл проект. Скомпилировал, запустил. Ответ - 1 байт.
Как я понял, компилятор тупанул? Или я чего-то не понял? (наверное транслятор перепутал размер адреса с размером переменной)
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Кислый писал(а):потому что вот эта строчка :

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

(gear&0x01)? PORTA|=_BV(data_out): PORTA&=~_BV(data_out); 
Эта строчка делает то же самое что и ваша

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

if (_out.a[i])    PORTA |= (1 << data_out);
        else    PORTA &= ~(1 << data_out); 
должна была делать
В поисках истины человек развивается.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Есть нетривиальная (для меня) задача.
Есть массив, типа unsigned char buff[32]. В этом массиве лежит пакет, формата ADR[1] CMD[1] SIZE_OF_DATA[1] DATA[SIZE_OF_DATA]
С разбором и обработкой пакета всё понятно и разобрать его несложно.
А вот с данными не могу разобраться. У данных есть свой формат. В основном, это числа.
Формат данных:
U_OUT[2] I_OUT[2] FLAGS[1]
Проблема с U_OUT и с I_OUT, точнее, с их преобразованием. U_OUT представляет собой целое двухбайтное число ( по порядку, сначала младший байт, за тем старший)
Например: 0x28, 0x0A = 0x0A28
Если его представить, как dec - то это будет число 2600. Вот это число надо разделить запятой с точностью до десятых и сотых и передать в переменную, типа float или double.
То есть 2600 = 26,00

Как можно реализовать на Си?
За такой идиоццкий формат пакета прошу не бить, так как девайс заводской и этот формат определил разработчик\производитель девайса. Я добавил бы ещё и CRC16 в конец пакета.
I am DX168B and this is my favourite forum on internet!
Ответить

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