Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
Привет всем подскажите как перекидывать из массива в переменную
скажем так у меня есть массив в формате ASCII char buffer[20] {$GS12345,00001} данный массив я уже представил как буковки и циферки а не код ASCII 251,200,12,15, итд .
задача производить с числом математические действия но с массивом это делать наверно не получиться поэтому я хочу перекинуть его в FLOAT чем мне воспользоваться ?
скажем так у меня есть массив в формате ASCII char buffer[20] {$GS12345,00001} данный массив я уже представил как буковки и циферки а не код ASCII 251,200,12,15, итд .
задача производить с числом математические действия но с массивом это делать наверно не получиться поэтому я хочу перекинуть его в FLOAT чем мне воспользоваться ?
- Реклама
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
выделить из строки символы, задающие ваше число, а затем преобразовать эти символы в число, после чего делать с ним амтематические действия. число из строки можно получить, например, при помощи функции sscanf
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Вопросы по С/С++ (СИ)
в своей практике я уже мигал светодиодами............... а теперь задумался над тем каким макаром сделать так чтобы светодиод ПЛАВНО набирал яркость и также плавно тух..., и так с некой частотой........., как сие сделать ?
Последний раз редактировалось FreshMan Ср мар 21, 2012 21:12:23, всего редактировалось 2 раза.
Tell Me The Truth
Re: Вопросы по С/С++ (СИ)
настраивай ШИМ есть счетчик выход счетчика выбираешь скорость шим и регулируешь шим регистром вроде OCR точно не помню настраивается от 0 до 255FreshMan писал(а):в своей практике я уже мигал светодиодами............... а теперь задумался над тем каким макаром сделать так чтобы светодиод ПЛАВНО набирал яркость и также плавно тух..., и так с некой частотой........., как сие сделать ?
-
Лютик
- Нашел транзистор. Понюхал.
- Сообщения: 161
- Зарегистрирован: Вт мар 25, 2008 22:10:23
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
добрый. написал функцию форматированного вывода строки на экран lcd
все хорошо, только вот флот выводить не хочет, пишет "?". хексы и интеджеры выводит на ура, а вот с флотом непонятка какая-то. Вывожу следующим образом;
пытался также "%e"и "%g", но опять таки выводит "?".
Код: Выделить всё
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);
- Реклама
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
-
Лютик
- Нашел транзистор. Понюхал.
- Сообщения: 161
- Зарегистрирован: Вт мар 25, 2008 22:10:23
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
тем что при настройке стрима выдает какую-то ошибку
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
у меня как у создателя темы, есть тупой вопрос
не могу найти свой косяк.
код для работы с 74595
Код выдаёт выт такую хрень.

я не втёр в каком месте я опять налажал. помогите свежим взглядом
код для работы с 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
@hobbyelectronics
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Посмотри на прошлой странице в девятом посте я как раз для твоего случая выкладывал пример.Рабочий, проверено.
В поисках истины человек развивается.
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
эмм.. а можно заголовки ? потому что вот эта строчка :
(gear&0x01)? PORTA|=_BV(data_out): PORTA&=~_BV(data_out);
вызывает у меня вопросы. я как бы пишу на си.. а это c++. но идею вы мне подали
благодарю. привел к нормальному виду, всё получилось. видимо действительно avr не воспринимает нормально тип bool и union.
(gear&0x01)? PORTA|=_BV(data_out): PORTA&=~_BV(data_out);
вызывает у меня вопросы. я как бы пишу на си.. а это c++. но идею вы мне подали
благодарю. привел к нормальному виду, всё получилось. видимо действительно avr не воспринимает нормально тип bool и union.
Последний раз редактировалось Кислый Чт мар 22, 2012 18:29:28, всего редактировалось 3 раза.
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
хелп, собственно должно получиться подобие счётчика, по прерыванию на INT0 (PIND.2) - отнимает от ввёдённого значения 1+коэфицент. По окончанию счёта (counter=0) срабатывает звуковая сигнализация.
Немогу разобраться с прерываниями - т.е. с отключенным int0. подаю на PIND.2==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: Вопросы по С/С++ (СИ)
уважайте людей форума зачем такое большое полотно впихиваете?делайте вложением.Инициализации пустые с нулями хоть бы удалили.
В поисках истины человек развивается.
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
понял, исправил
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
volatile забыли.Нужно
Сегодня только такой баг исправил в своем коде тоже глобальную переменную в прерывании менял.
Добавил и заработало.
Код: Выделить всё
volatile unsigned int count; Добавил и заработало.
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
Да, volatile это правильно. А еще main использует свой локальный float count, а не глобальный volatile unsigned int count, т.е. это разные переменные. Так что float count из main надо убрать.
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
не помогло, никакой разницы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: Вопросы по С/С++ (СИ)
Сделал так
стал работать счёт по прерыванию, но если зажать на INT0 "0", то счёт почемуто идёт в фоне с интервалом в 100мс
надо наверное по спаду настроить...
Код: Выделить всё
interrupt [EXT_INT0] void ext_int0_isr(void)
{
count=count-1;
delay_ms(100);
}надо наверное по спаду настроить...
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Вчера парился с одним проектом.
Выдало мне размер в 4 байта.
На сколько мне известно, что тип char состоит из одного байта.
Из за этого, у меня не работала процедура обработки буфера. Дошло до того, что я закрыл среду и снова открыл проект. Скомпилировал, запустил. Ответ - 1 байт.
Как я понял, компилятор тупанул? Или я чего-то не понял? (наверное транслятор перепутал размер адреса с размером переменной)
Код: Выделить всё
char ch[64]; cout<<sizeof(ch[0]);Из за этого, у меня не работала процедура обработки буфера. Дошло до того, что я закрыл среду и снова открыл проект. Скомпилировал, запустил. Ответ - 1 байт.
Как я понял, компилятор тупанул? Или я чего-то не понял? (наверное транслятор перепутал размер адреса с размером переменной)
I am DX168B and this is my favourite forum on internet!
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Эта строчка делает то же самое что и вашаКислый писал(а):потому что вот эта строчка :
Код: Выделить всё
(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: Вопросы по С/С++ (СИ)
Есть нетривиальная (для меня) задача.
Есть массив, типа 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 в конец пакета.
Есть массив, типа 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!


