Страница 151 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср апр 24, 2013 09:30:57
смит
- 2.zip
- (118.97 КБ) 125 скачиваний
Не как не могу вывести время на первую строчку, а дату на вторую. У меня все на одной первой строчки
В чем мая ошибка?
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); // немного подождем
}
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср апр 24, 2013 10:26:34
urry
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 29, 2013 19:43:28
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
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 29, 2013 20:19:34
Аlex
Надо передать по USART переменную типа float
http://www.chitay.org/c/07/0706.htm
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 29, 2013 20:47:09
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]);
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 29, 2013 21:27:06
VHEMaster
помогите! Мне нужно сделать последовательную передачу данных с одного контроллера на другой. Пишу на Си использую HITECH C Compiler.
На вход контроллера последовательно идёт 8 бит информации. Каждый бит по очереди записывается в свою переменную: data0, data1 и т.д.
Позже эти 8 бит нужно совместить в 1 байт, который будет записан в переменную data. Но как это сделать, я не пойму.. Помогите!
И ещё, как сделать так чтобы контроллер отправил код, который в самой прошивке записан в 16ричной кодировке?
Знаю, записывать данные паралельно удобнее, но нету свободного порта.. I2C и другие типы шин отпадают.. Мне нужно передать и получить по своему. Контроллер PIC16F628A. Заранее спасибо!
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 29, 2013 21:46:38
korsaj
Для 8 бит нужна только одна переменная. Заполняется она с помощью сдвига влево (вправо). Записываете состояние порта в нулевой бит и после сдвигаете. Сделав 7 сдвигов получите нужные данные. Насчет 16 ричной системы не волнуйтесь. Если вам нужно выводить на дисплей, то преобразование делайте табличным методом.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 29, 2013 23:13:41
ut1wpr
VHEMaster писал(а):На вход контроллера последовательно идёт 8 бит информации. Каждый бит по очереди записывается в свою переменную: data0, data1 и т.д.
Позже эти 8 бит нужно совместить в 1 байт, который будет записан в переменную data. Но как это сделать, я не пойму.. Помогите!
Откровенный бред. Бит информации во времени есть величина безразмерная. Каким образом вы определите, где этот самый бит начался, а где кончился? В этом главная ваша проблема. Когда вы поймете, что любые последовательные действия это производная от времени, тогда сможете понять и остальное. А пока манипуляции терминами "биты", "байты", "переменные" выглядят сотрясением воздуха и не говорят, что вы понимаете, о чем говорите.
И ещё, как сделать так чтобы контроллер отправил код, который в самой прошивке записан в 16ричной кодировке?
При последовательной передаче нет разницы, передавать восемь бит, 16 или 164. Как вы сами с собой договоритесь, так и будет
Знаю, записывать данные паралельно удобнее, но нету свободного порта..
Для обмена данными по параллельному порту шириной в восемь бит вам понадобятся еще несколько разрядов, скорее всего других портов. Зачем? Предоставляю удовольствие подумать самому.
одних I2C и другие типы шин отпадают.. Мне нужно передать и получить по своему. Контроллер PIC16F628A. Заранее спасибо!
Последний вопрос. Почему "отпадают" и что значит "по своему"? Последнее заявление предполагает знание КАК ПО СВОЕМУ. Но ведь вы именно с этим вопросом и обратились. Что имеем? Я хочу по своему, но не знаю как. Смешно? На мой взгляд - грустно. Вы какую-то литературу читали перед подходом к МК?
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт апр 30, 2013 14:38:13
vitalik_1984
Совершенно согласен с Виктором, чем, к примеру, не устраивает интерфейс и протокол обмена 1wire.
Насчет того, что своим - это только спец службы занимаются разработкой "своих" интерфейсов, а так все стандартизированно стараются делать.
К тому же на некоторых Мк встроена поддержка такой шины как I2C (у Atmel TWI) вам этой одной шины достаточно будет для обмена со всеми вашими приборами.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт апр 30, 2013 15:59:52
VHEMaster
vitalik_1984 писал(а):Совершенно согласен с Виктором, чем, к примеру, не устраивает интерфейс и протокол обмена 1wire.
Насчет того, что своим - это только спец службы занимаются разработкой "своих" интерфейсов, а так все стандартизированно стараются делать.
К тому же на некоторых Мк встроена поддержка такой шины как I2C (у Atmel TWI) вам этой одной шины достаточно будет для обмена со всеми вашими приборами.
вобщето у меня передача данных будет идти по 2м проводам Один из них data, другой DTE или Data Transfender Enabled. Я просто попросил, чтобы вы помогли мне с кодом, а не с тем что лучше

Re: Вопросы по С/С++ (СИ)
Добавлено: Вт апр 30, 2013 18:07:02
vitalik_1984
так вам конкретно написали, что нужно делать. нужна одна переменная и все - сдвигом влево и операцией | получается байт.
Ваша data enabled сложно реализуется, если только по таймеру, то можно делать примерно так:
Код: Выделить всё
//в прерывании таймера
if (bit_count<7){data<<=(data|CURRENT_BIT);
bit_count++;}
else do_calculate(data);
Лучше, конечно, второй тактирующий сигнал вместо enable.
PS, по вашему мнению все должны догадываться что у вас там конкретно не получается.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт апр 30, 2013 20:37:38
korsaj
Вполне пойдет данный метод передачи, а дата энабл можно использовать для синхронизации. Можно было обойтись 1 проводом..
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 01, 2013 18:53:24
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);
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 01, 2013 23:57:48
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(). А она здесь решающая при передаче. Бить байт на биты и шифтовать здесь и пионеры умеют.
Выше предложили какой-то там инэйбл использовать для синхронизации. И что получили? Синхронный усарт, не привязанный к таймингам и стандартным скоростям. Если усарт занят в МК или его нет, реализуйте софтовый усарт. Нет таймеров - на время передачи слова организуйте программные задержки (пожертвовав прерываниями, которые придется запретить). Словом, велосипед был изобретен не помню в каком веке, но достаточно давно.
Здесь проблема в другом. В полном непонимании вопрошателя принципов обмена. Я уже намякивал, что даже параллельная шина все равно потребует какой-то синхронизации. Либо тайминговой, либо проводной. Иначе принимающая сторона не будет знать главного - "данные на шине достоверны, можно сосчитывать". А сказать это можно либо по проводу, либо во времени. Понятно?

Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 02, 2013 21:47:11
unalex
ut1wpr писал(а):что этот самый bit is received?
это уже не мои проблемы, я абстракционист
просто показал человеку примитивнейший корявенький UART
я б вообще не заморачивался, зачем изобретать велосипед, когда есть SPI, I2C, 1-wire, CAN и иже с ними
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 03, 2013 08:37:31
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.
Сложно выделить два пина по рисунку ниже (если линк односторонний, то и одного достаточно) ? :

Объясните причины вашего полного нигилизма, коллегам легче будет рекомендации выработать.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 03, 2013 12:10:32
VHEMaster
Попробую ваши варианты.

Я ещё кое что придумал, как попробую, отпишусь

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 03, 2013 14:56:22
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;
Но так теряется точность. И число становится меньше, чем на самом деле.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб май 04, 2013 17:41:34
Tolmi
А число обязательно переводить во float ? Подозреваю, что работа с long long int всё же быстрее, чем эмуляция плавающей точки.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб май 04, 2013 22:52:57
Аlex
Подозреваю, demiurg301 сам толком не знает что ему нужно, иначе вопросы были бы корректные.