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

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

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

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

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); // немного подождем
}
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

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

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

Сообщение 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
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение 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]);
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 374
Зарегистрирован: Сб июл 14, 2012 09:20:09
Откуда: Украина, город Полтава

Сообщение VHEMaster »

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

Сообщение korsaj »

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

Сообщение ut1wpr »

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

Сообщение vitalik_1984 »

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

Сообщение VHEMaster »

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

Сообщение vitalik_1984 »

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

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

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

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

Сообщение korsaj »

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

Сообщение 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% коктейля "Рекурсивный"...
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение unalex »

ut1wpr писал(а):что этот самый bit is received?
это уже не мои проблемы, я абстракционист :)))

Изображение

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

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

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

Сообщение VHEMaster »

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

Сообщение 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;

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

Сообщение Tolmi »

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

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

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

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