Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
Не как не могу вывести время на первую строчку, а дату на вторую. У меня все на одной первой строчки
В чем мая ошибка?
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); // немного подождем
}
В чем мая ошибка?
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: Вопросы по С/С++ (СИ)
Код: Выделить всё
lcd_init(8);Re: Вопросы по С/С++ (СИ)
Надо передать по USART переменную типа float
хотел выделить её битовыми операциями а компилятор ругается чего
делаю так:
тип float что ли с битовыми операциями не работает?
\function.h(272), included from: ADC.c: operand types 'float' and 'long' are incompatible with the '&' or '&=' operator
хотел выделить её битовыми операциями а компилятор ругается чего
делаю так:
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
http://www.chitay.org/c/07/0706.htmНадо передать по USART переменную типа float
Re: Вопросы по С/С++ (СИ)
А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: Вопросы по С/С++ (СИ)
помогите! Мне нужно сделать последовательную передачу данных с одного контроллера на другой. Пишу на Си использую HITECH C Compiler.
На вход контроллера последовательно идёт 8 бит информации. Каждый бит по очереди записывается в свою переменную: data0, data1 и т.д.
Позже эти 8 бит нужно совместить в 1 байт, который будет записан в переменную data. Но как это сделать, я не пойму.. Помогите!
И ещё, как сделать так чтобы контроллер отправил код, который в самой прошивке записан в 16ричной кодировке?
Знаю, записывать данные паралельно удобнее, но нету свободного порта.. I2C и другие типы шин отпадают.. Мне нужно передать и получить по своему. Контроллер PIC16F628A. Заранее спасибо!
На вход контроллера последовательно идёт 8 бит информации. Каждый бит по очереди записывается в свою переменную: data0, data1 и т.д.
Позже эти 8 бит нужно совместить в 1 байт, который будет записан в переменную data. Но как это сделать, я не пойму.. Помогите!
И ещё, как сделать так чтобы контроллер отправил код, который в самой прошивке записан в 16ричной кодировке?
Знаю, записывать данные паралельно удобнее, но нету свободного порта.. I2C и другие типы шин отпадают.. Мне нужно передать и получить по своему. Контроллер PIC16F628A. Заранее спасибо!
Re: Вопросы по С/С++ (СИ)
Для 8 бит нужна только одна переменная. Заполняется она с помощью сдвига влево (вправо). Записываете состояние порта в нулевой бит и после сдвигаете. Сделав 7 сдвигов получите нужные данные. Насчет 16 ричной системы не волнуйтесь. Если вам нужно выводить на дисплей, то преобразование делайте табличным методом.
Re: Вопросы по С/С++ (СИ)
Откровенный бред. Бит информации во времени есть величина безразмерная. Каким образом вы определите, где этот самый бит начался, а где кончился? В этом главная ваша проблема. Когда вы поймете, что любые последовательные действия это производная от времени, тогда сможете понять и остальное. А пока манипуляции терминами "биты", "байты", "переменные" выглядят сотрясением воздуха и не говорят, что вы понимаете, о чем говорите.VHEMaster писал(а):На вход контроллера последовательно идёт 8 бит информации. Каждый бит по очереди записывается в свою переменную: data0, data1 и т.д.
Позже эти 8 бит нужно совместить в 1 байт, который будет записан в переменную data. Но как это сделать, я не пойму.. Помогите!
При последовательной передаче нет разницы, передавать восемь бит, 16 или 164. Как вы сами с собой договоритесь, так и будетИ ещё, как сделать так чтобы контроллер отправил код, который в самой прошивке записан в 16ричной кодировке?
Для обмена данными по параллельному порту шириной в восемь бит вам понадобятся еще несколько разрядов, скорее всего других портов. Зачем? Предоставляю удовольствие подумать самому.Знаю, записывать данные паралельно удобнее, но нету свободного порта..
Последний вопрос. Почему "отпадают" и что значит "по своему"? Последнее заявление предполагает знание КАК ПО СВОЕМУ. Но ведь вы именно с этим вопросом и обратились. Что имеем? Я хочу по своему, но не знаю как. Смешно? На мой взгляд - грустно. Вы какую-то литературу читали перед подходом к МК?одних I2C и другие типы шин отпадают.. Мне нужно передать и получить по своему. Контроллер PIC16F628A. Заранее спасибо!
С уважением,
Виктор.
Виктор.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Совершенно согласен с Виктором, чем, к примеру, не устраивает интерфейс и протокол обмена 1wire.
Насчет того, что своим - это только спец службы занимаются разработкой "своих" интерфейсов, а так все стандартизированно стараются делать.
К тому же на некоторых Мк встроена поддержка такой шины как I2C (у Atmel TWI) вам этой одной шины достаточно будет для обмена со всеми вашими приборами.
Насчет того, что своим - это только спец службы занимаются разработкой "своих" интерфейсов, а так все стандартизированно стараются делать.
К тому же на некоторых Мк встроена поддержка такой шины как I2C (у Atmel TWI) вам этой одной шины достаточно будет для обмена со всеми вашими приборами.
- VHEMaster
- Потрогал лапой паяльник
- Сообщения: 374
- Зарегистрирован: Сб июл 14, 2012 09:20:09
- Откуда: Украина, город Полтава
Re: Вопросы по С/С++ (СИ)
vitalik_1984 писал(а):Совершенно согласен с Виктором, чем, к примеру, не устраивает интерфейс и протокол обмена 1wire.
Насчет того, что своим - это только спец службы занимаются разработкой "своих" интерфейсов, а так все стандартизированно стараются делать.
К тому же на некоторых Мк встроена поддержка такой шины как I2C (у Atmel TWI) вам этой одной шины достаточно будет для обмена со всеми вашими приборами.
вобщето у меня передача данных будет идти по 2м проводам Один из них data, другой DTE или Data Transfender Enabled. Я просто попросил, чтобы вы помогли мне с кодом, а не с тем что лучше
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
так вам конкретно написали, что нужно делать. нужна одна переменная и все - сдвигом влево и операцией | получается байт.
Ваша data enabled сложно реализуется, если только по таймеру, то можно делать примерно так:
Лучше, конечно, второй тактирующий сигнал вместо enable.
PS, по вашему мнению все должны догадываться что у вас там конкретно не получается.
Ваша data enabled сложно реализуется, если только по таймеру, то можно делать примерно так:
Код: Выделить всё
//в прерывании таймера
if (bit_count<7){data<<=(data|CURRENT_BIT);
bit_count++;}
else do_calculate(data);
PS, по вашему мнению все должны догадываться что у вас там конкретно не получается.
Re: Вопросы по С/С++ (СИ)
Вполне пойдет данный метод передачи, а дата энабл можно использовать для синхронизации. Можно было обойтись 1 проводом..
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: Вопросы по С/С++ (СИ)
Код: Выделить всё
//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% коктейля "Рекурсивный"...
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);
Маленькая незадача. Как система определит, что этот самый bit is received? Интуитивно? Ну и не мешало бы раскрыть тайну функции send(). А она здесь решающая при передаче. Бить байт на биты и шифтовать здесь и пионеры умеют.
Выше предложили какой-то там инэйбл использовать для синхронизации. И что получили? Синхронный усарт, не привязанный к таймингам и стандартным скоростям. Если усарт занят в МК или его нет, реализуйте софтовый усарт. Нет таймеров - на время передачи слова организуйте программные задержки (пожертвовав прерываниями, которые придется запретить). Словом, велосипед был изобретен не помню в каком веке, но достаточно давно.
Здесь проблема в другом. В полном непонимании вопрошателя принципов обмена. Я уже намякивал, что даже параллельная шина все равно потребует какой-то синхронизации. Либо тайминговой, либо проводной. Иначе принимающая сторона не будет знать главного - "данные на шине достоверны, можно сосчитывать". А сказать это можно либо по проводу, либо во времени. Понятно?
С уважением,
Виктор.
Виктор.
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: Вопросы по С/С++ (СИ)
ut1wpr писал(а):что этот самый bit is received?
это уже не мои проблемы, я абстракционист
просто показал человеку примитивнейший корявенький UART
я б вообще не заморачивался, зачем изобретать велосипед, когда есть SPI, I2C, 1-wire, CAN и иже с ними
- Вложения
-
- link.PNG
- (10.47 КБ) 634 скачивания
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Re: Вопросы по С/С++ (СИ)
Либо упорно продолжаем избегать чтения, либо не все буквы знаем.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: Вопросы по С/С++ (СИ)
Попробую ваши варианты.
Я ещё кое что придумал, как попробую, отпишусь 
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Вопросы по С/С++ (СИ)
Кто подскажет как перевести 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;
Но так теряется точность. И число становится меньше, чем на самом деле.
Т.е. есть число вида 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: Вопросы по С/С++ (СИ)
А число обязательно переводить во 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: Вопросы по С/С++ (СИ)
Подозреваю, demiurg301 сам толком не знает что ему нужно, иначе вопросы были бы корректные.