roboforum.ru

Технический форум по робототехнике.

Прием/передачи int переменных через USART???

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Прием/передачи int переменных через USART???

Сообщение wolly » 06 ноя 2007, 23:19

Доброго дня/вечера.
У меня вот какой вопрос: Каким образом организовать обмен данными/командами между PC и ATMega128???
МК slave-устройство должен периодически отсылать на РС две int переменных (координаты) и ждать команд от РС (master-устройство). Просто замечательно, если возможно этот обмен данными можно будет вести из SCADA (Citect например) через OPC-сервер :roll:
В CodVisoinAVR Wizard создаваемый код изначально заточен на прием переменной байтовой (char) величины и помещении ее в FIFO буфер. А ежели потребуется принимать от PC данные велчины int? И самое главное - Какие будут функции для того что бы передать int переменные на PC, что б он еще разобрался где какая переменная? :?: :?:
Заранее благодарен за разумные ответы и тольковые намеки :D
wolly
 
Сообщения: 43
Зарегистрирован: 06 ноя 2007, 22:16
Откуда: Кохтла-Ярве

Re: Прием/передачи int переменных через USART???

Сообщение Vooon » 06 ноя 2007, 23:33

а что есть int?
для авр - это 2а байта,
что мешает передавать сначала первый а потом второй байты cvavr'овской функцией?

а вобще тут нужно поставить тз, посмотреть распространенные протоколы.
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: Прием/передачи int переменных через USART???

Сообщение Master » 06 ноя 2007, 23:34

Если я правильно понял, то я выкручивался так.
Мне нада было мигать светиками на одном порту МК, так я слал не числа а коды символов. В Delphi это примерно так chr(25). Т. е. шлется символ с кодом ANSII 25, МК принимает его как 25 и выводит это число в порт (загоряются светики 00011001).
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Прием/передачи int переменных через USART???

Сообщение wolly » 06 ноя 2007, 23:59

Vooon писал(а):что мешает передавать сначала первый а потом второй байты cvavr'овской функцией?


cvavr'овской функция заточена на Прием, а тут передача :idea: А поскольку регистр у USART, как я понял всего один, на прием и передачу. На передачу пойдут целых две int переменных, а стало быть уже 4 байта, то есть - уже собирается очередь. И эту очередь как то нужно рассосать, по-умному. В курсе для Чайников предложено закидывать данные на передачу, как putchar (символами и строками), т.е. без очереди. Просто брать в нужном месте процедуры, дождаться когда освободится регистр и :arrow: посылать. Тут несколько иное дело...
Как-же? :RTFM: Help! Help!

Vooon писал(а):а вобще тут нужно поставить тз, посмотреть распространенные протоколы.


Что такое т3 ??? Извини, но именно тот самый Чайник :D
wolly
 
Сообщения: 43
Зарегистрирован: 06 ноя 2007, 22:16
Откуда: Кохтла-Ярве

Re: Прием/передачи int переменных через USART???

Сообщение wolly » 07 ноя 2007, 00:09

Master писал(а):Мне нада было мигать светиками на одном порту МК, так я слал не числа а коды символов. В Delphi это примерно так chr(25). Т. е. шлется символ с кодом ANSII 25, МК принимает его как 25 и выводит это число в порт (загоряются светики 00011001).


У меня с МК должны идти переменные положения ШД (1600шагов по горизонтали, +400 или -400 шагов по вертикали) - координаты. PC в идеале должен их обрабатывать в SCADA, как углы отклонения от начала координат.
Моя проблема не только с размерностью (тут все можно по-Шариковски, взять все и поделить), сколько с порядком передачи данных.
:?:
wolly
 
Сообщения: 43
Зарегистрирован: 06 ноя 2007, 22:16
Откуда: Кохтла-Ярве

Re: Прием/передачи int переменных через USART???

Сообщение Master » 07 ноя 2007, 00:39

Блин а нафига если у тебя ШД в том та и их основное достоинство, что шаги отсчитываются программно, т. е. без обратной связи. Иначе смысл использовать ШД.
И на чем будешь писать софт для организации связи с ПК? Софт для ПК в смысле.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Прием/передачи int переменных через USART???

Сообщение Vooon » 07 ноя 2007, 01:05

wolly писал(а):cvavr'овской функция заточена на Прием, а тут передача :idea: А поскольку регистр у USART, как я понял всего один, на прием и передачу. На передачу пойдут целых две int переменных, а стало быть уже 4 байта, то есть - уже собирается очередь. И эту очередь как то нужно рассосать, по-умному. В курсе для Чайников предложено закидывать данные на передачу, как putchar (символами и строками), т.е. без очереди. Просто брать в нужном месте процедуры, дождаться когда освободится регистр и :arrow: посылать. Тут несколько иное дело...
Как-же? :RTFM: Help! Help!


тз - Техническое Задание.

мастер кода cvavr прекрасно делает функции и для приема, и для передачи,
и может еще и с FIFO буфферами их сделать.

я не телепат.
зачем две 16и битных переменных для отправки одной не понимаю.
почему не использовать две 8и битных (char)?
(вариант не со сдвигами, а с указателями пока не берем)

примерчик, взял из головы.
Код: Выделить всёРазвернуть
int my_int = 0xF00F;
char my_int_h = (char) (my_int >> 8);
char my_int_l = (char) (my_int);

putchar(my_int_h); //-> F0h
putchar(my_int_l); //-> 0Fh


ессно можно проще написать, но проще для того кто хор. указатели понимает.
для начинающего это имхо сложно.
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: Прием/передачи int переменных через USART???

Сообщение Виталий » 07 ноя 2007, 01:54

Код: Выделить всёРазвернуть
int my_int = 0xF00F;
char my_int_h = (char) (my_int >> 8);
char my_int_l = (char) (my_int);

putchar(my_int_h); //-> F0h
putchar(my_int_l); //-> 0Fh

//И после того ка приняли два байта подряд восстанавливаем int.
int input = my_int_l | (my_int_h << 8);

Все новости о моих проектах http://savethebest.ru
Аватара пользователя
Виталий
 
Сообщения: 2114
Зарегистрирован: 08 окт 2004, 16:43
Откуда: St. Petersburg
Skype: quark-bot
ФИО: Клебан Виталий

Re: Прием/передачи int переменных через USART???

Сообщение rig » 07 ноя 2007, 20:29

с помощью указателей
Код: Выделить всёРазвернуть
передача. формируется массив чисел, затем отправляется по ЮСАРТ
unsigned char *adress_temp_1821;
int temp_1821;

adress_temp_1821   =&temp_1821;
data_tx[2]   =*adress_temp_1821;     
data_tx[3]   =*(adress_temp_1821+1);


прием
unsigned char *adress_temperatura ;    // указатель
int  temperatura;
adress_temperatura   =&temperatura;
*adress_temperatura++   =data_rx[2];
*adress_temperatura   =data_rx[3];
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Re: Прием/передачи int переменных через USART???

Сообщение wolly » 07 ноя 2007, 20:51

Master писал(а):Блин а нафига если ...и их ... шаги отсчитываются программно.
Vooon писал(а):зачем две 16и битных переменных...

ШД это два привода (вертикальной и горизонтально разверток 180 и 360 град) устройства, которое сканирует пространство вокруг себя и засекя объект переключается на его сопровождение.
2-е INT - это координаты вектора направления на объект. В десятичных числах максимальные их величины 1600 (горизонт), 800 (вертикаль).

Master писал(а):И на чем будешь писать софт для организации связи с ПК? Софт для ПК в смысле.

А вот это на сей момент наверное самый сложный вопрос. :?:
До сей поры я работал с Simatic S7-200 и Unitronics. Они связывались со Citect SCADA либо напрямую, как Сименс, либо через UniOPCsrver, как Юнитроникс.
Как вязать со SCADA ATmega вообще не представляю...
Чем и как еще можно организовать прием-передачу команд и данных от PC к MK устройству и обратно так что бы принимаемая информация и управление было по возможности удобна???
wolly
 
Сообщения: 43
Зарегистрирован: 06 ноя 2007, 22:16
Откуда: Кохтла-Ярве

Re: Прием/передачи int переменных через USART???

Сообщение wolly » 07 ноя 2007, 21:09

За примеры кодов спасибо... буду осваивать полученное :idea:
Созрел еще вопрос:
В чем отличается передача данных printf() и putchar()?
В случае putchar() аргументы отправляются посредством USART. Это наглядно продемонстрировано функцией.
А printf(), как она распоряжается данными?
wolly
 
Сообщения: 43
Зарегистрирован: 06 ноя 2007, 22:16
Откуда: Кохтла-Ярве

Re: Прием/передачи int переменных через USART???

Сообщение Vooon » 07 ноя 2007, 21:18

printf() - форматированный вывод.

Код: Выделить всёРазвернуть
unsigned char i;
for(i=0; i<10; i++)
{
    printf("Hello World #%02d\n", i)
}

выводет на терминал:
Код: Выделить всёРазвернуть
Hello World #00
Hello World #01
Hello World #02
Hello World #03
Hello World #04
Hello World #05
Hello World #06
Hello World #07
Hello World #08
Hello World #09
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: Прием/передачи int переменных через USART???

Сообщение Сергей » 07 ноя 2007, 21:24

Если без гемороя - то почему просто не отправлять строку а в МК ее преобразовывать? Число не слишком длинное. Да и если как сказано - изредка посылаются эти числа
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Re: Прием/передачи int переменных через USART???

Сообщение Vooon » 08 ноя 2007, 02:07

Сергей писал(а):Если без гемороя - то почему просто не отправлять строку а в МК ее преобразовывать? Число не слишком длинное. Да и если как сказано - изредка посылаются эти числа

можно и так :)

код:
Код: Выделить всёРазвернуть
/// отправляет 16и битное число текстом, HEX
void send_int16(int s)
{
   char data[5];
   data[4] = '0' + (s & 0x0F);
   if( data[4] > '9' )
      data[4] += 7;
   data[3] = '0' + ((s>>(4)) & 0x0F);
   if( data[3] > '9' )
      data[3] += 7;
   data[2] = '0' + ((s>>(8)) & 0x0F);
   if( data[2] > '9' )
      data[2] += 7;
   data[1] = '0' + (s>>(12));
   if( data[1] > '9' )
      data[1] += 7;
   puts(data);
}
/// другой вариант, требует больше памяти
printf("%04X", s);

/// принимает 16и битное число
int get_int16(void)
{
   int ret = 0x0000;
   char temp = 0, i;
   for( i = 12; i >= 0; i - 4 )
   {
      temp = getchar();
      if( temp > 'F')
         temp -= 'a' - '9';
      if( temp > '9' )
         temp -= 7;
      temp -= '0';
      ret |= (temp & 0x0F)<<i;
   }
   return ret;
}
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: Прием/передачи int переменных через USART???

Сообщение wolly » 10 ноя 2007, 20:11

Советы и намеки перевариваю...
:?: Какой прогой/телом можно управлять МК с РС и выводить принятые данные на визуализацию?
Первоначальные очень смелые планы по привязке к SCADA пока никак не вытанцовываются :(
wolly
 
Сообщения: 43
Зарегистрирован: 06 ноя 2007, 22:16
Откуда: Кохтла-Ярве

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3