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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
смит
Родился
Сообщения: 1
Зарегистрирован: Ср апр 24, 2013 08:57:18

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

Сообщение смит »

2.zip
(118.97 КБ) 119 скачиваний
Не как не могу вывести время на первую строчку, а дату на вторую. У меня все на одной первой строчки
В чем мая ошибка?

while (1)
{

lcd_clear(); //очистим экран
rtc_get_time(&hour,&min,&sek); //загружаем данные времени
sprintf(buffer,"%02i %02i:%02i",hour,min,sek); // перенесем значение переменных в буфер
lcd_gotoxy(0,0);
lcd_puts(buffer);// выведем на экран первую строчку
delay_ms(450); // немного подождем
rtc_get_date(&dow,&day,&month,&year); // для даты
sprintf(buffer,"%02i.%02i.%02i",day,month,year,dow); // перенесем значение переменных в буфер
lcd_gotoxy(0,1);
lcd_puts(buffer);// выведем на экран
delay_ms(450); // немного подождем
}
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

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

lcd_init(8);
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Надо передать по USART переменную типа float
хотел выделить её битовыми операциями а компилятор ругается чего
делаю так:

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

float floatM;
unsigned int floatH;

floatM=data&0x3FFFFF;


тип float что ли с битовыми операциями не работает?

\function.h(272), included from: ADC.c: operand types 'float' and 'long' are incompatible with the '&' or '&=' operator
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Надо передать по USART переменную типа float
http://www.chitay.org/c/07/0706.htm
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Аlex, Благодарю за подсказку долго понимал что это такое =) но после как нашёл пример всё стало на свои места :)

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

typedef union {
              float fn;
              char bytes[4];
              }
ufloat;
.........
ufloat fnum;
.......
          fnum.fn = 1234.56789;
......
          SendByte(fn.bytes[0]);
          SendByte(fn.bytes[1]);
          SendByte(fn.bytes[2]);
          SendByte(fn.bytes[3]);
Аватара пользователя
VHEMaster
Потрогал лапой паяльник
Сообщения: 374
Зарегистрирован: Сб июл 14, 2012 09:20:09
Откуда: Украина, город Полтава

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

Сообщение VHEMaster »

помогите! Мне нужно сделать последовательную передачу данных с одного контроллера на другой. Пишу на Си использую HITECH C Compiler.
На вход контроллера последовательно идёт 8 бит информации. Каждый бит по очереди записывается в свою переменную: data0, data1 и т.д.
Позже эти 8 бит нужно совместить в 1 байт, который будет записан в переменную data. Но как это сделать, я не пойму.. Помогите!
И ещё, как сделать так чтобы контроллер отправил код, который в самой прошивке записан в 16ричной кодировке?
Знаю, записывать данные паралельно удобнее, но нету свободного порта.. I2C и другие типы шин отпадают.. Мне нужно передать и получить по своему. Контроллер PIC16F628A. Заранее спасибо!
Всем канифоли :)
https://vk.com/maks_naumchuk
Аватара пользователя
korsaj
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Чт июн 23, 2011 07:55:51

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

Сообщение korsaj »

Для 8 бит нужна только одна переменная. Заполняется она с помощью сдвига влево (вправо). Записываете состояние порта в нулевой бит и после сдвигаете. Сделав 7 сдвигов получите нужные данные. Насчет 16 ричной системы не волнуйтесь. Если вам нужно выводить на дисплей, то преобразование делайте табличным методом.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

VHEMaster писал(а):На вход контроллера последовательно идёт 8 бит информации. Каждый бит по очереди записывается в свою переменную: data0, data1 и т.д.
Позже эти 8 бит нужно совместить в 1 байт, который будет записан в переменную data. Но как это сделать, я не пойму.. Помогите!
Откровенный бред. Бит информации во времени есть величина безразмерная. Каким образом вы определите, где этот самый бит начался, а где кончился? В этом главная ваша проблема. Когда вы поймете, что любые последовательные действия это производная от времени, тогда сможете понять и остальное. А пока манипуляции терминами "биты", "байты", "переменные" выглядят сотрясением воздуха и не говорят, что вы понимаете, о чем говорите.
И ещё, как сделать так чтобы контроллер отправил код, который в самой прошивке записан в 16ричной кодировке?
При последовательной передаче нет разницы, передавать восемь бит, 16 или 164. Как вы сами с собой договоритесь, так и будет
Знаю, записывать данные паралельно удобнее, но нету свободного порта..
Для обмена данными по параллельному порту шириной в восемь бит вам понадобятся еще несколько разрядов, скорее всего других портов. Зачем? Предоставляю удовольствие подумать самому.
одних I2C и другие типы шин отпадают.. Мне нужно передать и получить по своему. Контроллер PIC16F628A. Заранее спасибо!
Последний вопрос. Почему "отпадают" и что значит "по своему"? Последнее заявление предполагает знание КАК ПО СВОЕМУ. Но ведь вы именно с этим вопросом и обратились. Что имеем? Я хочу по своему, но не знаю как. Смешно? На мой взгляд - грустно. Вы какую-то литературу читали перед подходом к МК?
С уважением,
Виктор.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Совершенно согласен с Виктором, чем, к примеру, не устраивает интерфейс и протокол обмена 1wire.
Насчет того, что своим - это только спец службы занимаются разработкой "своих" интерфейсов, а так все стандартизированно стараются делать.
К тому же на некоторых Мк встроена поддержка такой шины как I2C (у Atmel TWI) вам этой одной шины достаточно будет для обмена со всеми вашими приборами.
Аватара пользователя
VHEMaster
Потрогал лапой паяльник
Сообщения: 374
Зарегистрирован: Сб июл 14, 2012 09:20:09
Откуда: Украина, город Полтава

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

Сообщение VHEMaster »

vitalik_1984 писал(а):Совершенно согласен с Виктором, чем, к примеру, не устраивает интерфейс и протокол обмена 1wire.
Насчет того, что своим - это только спец службы занимаются разработкой "своих" интерфейсов, а так все стандартизированно стараются делать.
К тому же на некоторых Мк встроена поддержка такой шины как I2C (у Atmel TWI) вам этой одной шины достаточно будет для обмена со всеми вашими приборами.


вобщето у меня передача данных будет идти по 2м проводам Один из них data, другой DTE или Data Transfender Enabled. Я просто попросил, чтобы вы помогли мне с кодом, а не с тем что лучше :(
Всем канифоли :)
https://vk.com/maks_naumchuk
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

так вам конкретно написали, что нужно делать. нужна одна переменная и все - сдвигом влево и операцией | получается байт.
Ваша data enabled сложно реализуется, если только по таймеру, то можно делать примерно так:

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

//в прерывании таймера 
if (bit_count<7){data<<=(data|CURRENT_BIT);
     bit_count++;}
else do_calculate(data);
 
Лучше, конечно, второй тактирующий сигнал вместо enable.

PS, по вашему мнению все должны догадываться что у вас там конкретно не получается.
Аватара пользователя
korsaj
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Чт июн 23, 2011 07:55:51

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

Сообщение korsaj »

Вполне пойдет данный метод передачи, а дата энабл можно использовать для синхронизации. Можно было обойтись 1 проводом..
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

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

//receive
if(bit_received)
{
   r_data |= data[r_count] << r_count;
   (r_count <= 7) ? (r_count++) : (r_count = 0);
}

//transmit
send(start_bit);
for(t_count = 0; t_count <= 7; t_count++)
{
   if((0x01 << t_count) & t_data == 0) send(0);
   else send(1);
}
send(stop_bit);
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

unalex писал(а):

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

//receive
if(bit_received)
{
   r_data |= data[r_count] << r_count;
   (r_count <= 7) ? (r_count++) : (r_count = 0);
}

//transmit
send(start_bit);
for(t_count = 0; t_count <= 7; t_count++)
{
   if((0x01 << t_count) & t_data == 0) send(0);
   else send(1);
}
send(stop_bit);

Маленькая незадача. Как система определит, что этот самый bit is received? Интуитивно? Ну и не мешало бы раскрыть тайну функции send(). А она здесь решающая при передаче. Бить байт на биты и шифтовать здесь и пионеры умеют.
Выше предложили какой-то там инэйбл использовать для синхронизации. И что получили? Синхронный усарт, не привязанный к таймингам и стандартным скоростям. Если усарт занят в МК или его нет, реализуйте софтовый усарт. Нет таймеров - на время передачи слова организуйте программные задержки (пожертвовав прерываниями, которые придется запретить). Словом, велосипед был изобретен не помню в каком веке, но достаточно давно.
Здесь проблема в другом. В полном непонимании вопрошателя принципов обмена. Я уже намякивал, что даже параллельная шина все равно потребует какой-то синхронизации. Либо тайминговой, либо проводной. Иначе принимающая сторона не будет знать главного - "данные на шине достоверны, можно сосчитывать". А сказать это можно либо по проводу, либо во времени. Понятно? :)
С уважением,
Виктор.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

ut1wpr писал(а):что этот самый bit is received?

это уже не мои проблемы, я абстракционист :)))

Изображение

просто показал человеку примитивнейший корявенький UART

я б вообще не заморачивался, зачем изобретать велосипед, когда есть SPI, I2C, 1-wire, CAN и иже с ними
Вложения
link.PNG
(10.47 КБ) 634 скачивания
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

VHEMaster писал(а):вобщето у меня передача данных будет идти по 2м проводам Один из них data, другой DTE или Data Transfender Enabled. Я просто попросил, чтобы вы помогли мне с кодом, а не с тем что лучше :(
Либо упорно продолжаем избегать чтения, либо не все буквы знаем.
DTE - сигнал, позволяющий УПРАВЛЯТЬ потоком данных. А у вас еще не придумано, как организовать эти данные в процессе обмена. Как отделить бит от бита в слове. Нет у вас еще потока, управлять нечем :)
Более чем странно, 628-й PIC имеет USART. Десятилетиями проверенный протокол. В одном направлении один битовый канал. Что сдерживает его применение?
Вот цитата из Микрочиповского ДШ:
The Universal Synchronous Asynchronous Receiver Transmitter (USART) is also known as a Serial Communications Interface (SCI).
The USART can be configured as a full-duplex asynchronous system that can communicate with peripheral devices such as CRT
terminals and personal computers, or it can be configured as a half-duplex synchronous system that can communicate with peripheral devices such as A/D
or D/A integrated circuits, Serial EEPROMs, etc.

Сложно выделить два пина по рисунку ниже (если линк односторонний, то и одного достаточно) ? :
Изображение
Объясните причины вашего полного нигилизма, коллегам легче будет рекомендации выработать.
С уважением,
Виктор.
Аватара пользователя
VHEMaster
Потрогал лапой паяльник
Сообщения: 374
Зарегистрирован: Сб июл 14, 2012 09:20:09
Откуда: Украина, город Полтава

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

Сообщение VHEMaster »

Попробую ваши варианты. ;) Я ещё кое что придумал, как попробую, отпишусь ;)
Всем канифоли :)
https://vk.com/maks_naumchuk
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

Кто подскажет как перевести 8 байтовую переменную в 4 байтовую?

Т.е. есть число вида 00 00 00 0D BB B8 DD 69 = 58984029545. Им представлено число с фиксированной запятой 58984,029545

Всё хорошо на калькуляторе и на ПК, а как на С , AVRке это сделать?

Делаю так
FL32.C[3]=u0_buff[29];
FL32.C[2]=u0_buff[28];
FL32.C[1]=u0_buff[27];
FL32.C[0]=u0_buff[26];
temp=FL32.L/1000000;
FL32.C[3]=u0_buff[33];
FL32.C[2]=u0_buff[32];
FL32.C[1]=u0_buff[31];
FL32.C[0]=u0_buff[30];
temp+=FL32.L*4294.967295;

Но так теряется точность. И число становится меньше, чем на самом деле.
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

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

Сообщение Tolmi »

А число обязательно переводить во float ? Подозреваю, что работа с long long int всё же быстрее, чем эмуляция плавающей точки.
In theory, theory and practice are the same. In practice, they're not.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Подозреваю, demiurg301 сам толком не знает что ему нужно, иначе вопросы были бы корректные.
Ответить

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