roboforum.ru

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

Прошу помощи! (помогите с написанием программы на Си Code..)

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

Прошу помощи! (помогите с написанием программы на Си Code..)

Сообщение slava » 30 май 2005, 13:29

Вообщем беда - не могу написать программу на Си. (CodeVision)

Я научился мигать светодиодами, управлять таймерами, писать на LCD, отправлять символы по последовательному порту.

А теперь вот в ступоре! Прошу помощи.

Мне нужно что бы я мог послать команду по последовательному порту (от PC в МК) вида "stop" , "left motor on", "left motor off", "led on", "led off" и т.п.
Процедуры обработки напишу сам, а вот как принимать команды и вызывать соответствующие процедуры - ну не получается! И еще хочется что б данная обработка работала по прерыванию от UARTа (что б не сновном цикле крутилась)

Помогите плз.
slava
 
Сообщения: 188
Зарегистрирован: 12 апр 2005, 11:47
Откуда: Москва

Сообщение Tracer » 30 май 2005, 14:11

Ну а вчем собственно у тебя проблема

Если ты умееш принимать(передавать) символы по RS232 то ты можеш и писать их в строку. А затем используя стандартные функции (см. string.h)находить подстроку в строке и по результату выполнять нужную ветку алгоритма

Разбор команд стандартная процедура в программах для простоты их можно и упростить Left motor ON -> LMON например
Аватара пользователя
Tracer
 
Сообщения: 195
Зарегистрирован: 24 ноя 2004, 12:36
Откуда: Харьков

Сообщение slava » 30 май 2005, 17:42

Понимаю, что туплю :(

Но если кусок кода скинете, то буду должен пиво :)
slava
 
Сообщения: 188
Зарегистрирован: 12 апр 2005, 11:47
Откуда: Москва

Сообщение nest » 30 май 2005, 17:57

в принципе ... примерно так:

отсылаешь , скажим , "1" - загорается лампочка... "2" - крутится мотор ... и в таком духе дальше ...
просто будет завязка "символ<->команда" (это то ты сможешь ?)

если хочешь отправлять текстовые комманды - придётся позаботиться о разграничителях пакетов ... типа: %stop& , %motor_on&
(т.е. "%" - начало пакета, "&" - конец пакета ...)
Аватара пользователя
nest
 
Сообщения: 977
Зарегистрирован: 21 янв 2005, 12:16
Откуда: Germany
Предупреждения: -4
прог. языки: asm

Сообщение slava » 31 май 2005, 11:29

nest писал(а):в принципе ... примерно так:

отсылаешь , скажим , "1" - загорается лампочка... "2" - крутится мотор ... и в таком духе дальше ...
просто будет завязка "символ<->команда" (это то ты сможешь ?)


типа

k=getchar();
if (k=="1") { зажгли лампочку}

и т.д.

это неинтересно, ибо будем постоянно ждать введенные символы ..


если хочешь отправлять текстовые комманды - придётся позаботиться о разграничителях пакетов ... типа: %stop& , %motor_on&
(т.е. "%" - начало пакета, "&" - конец пакета ...)


вроде этого, но использовать rx_buffer - а тут и туплю :(
slava
 
Сообщения: 188
Зарегистрирован: 12 апр 2005, 11:47
Откуда: Москва

Сообщение Tracer » 31 май 2005, 11:53

Зачем ждать Ты же размещаеш код в функции прерывания по приему символа

switch(UDR)
      {
      case {код символа}: {зажигаем лампочку};break;
      case {код символа}: {Left motor ON};break;
      .....
      default: break;
      }
Аватара пользователя
Tracer
 
Сообщения: 195
Зарегистрирован: 24 ноя 2004, 12:36
Откуда: Харьков

Сообщение slava » 31 май 2005, 13:13

Tracer писал(а):Зачем ждать Ты же размещаеш код в функции прерывания по приему символа

switch(UDR)
      {
      case {код символа}: {зажигаем лампочку};break;
      case {код символа}: {Left motor ON};break;
      .....
      default: break;
      }


Это я понял, а как сделать если я хочу текстовые команды использовать  ? и еще с параметрами ?
slava
 
Сообщения: 188
Зарегистрирован: 12 апр 2005, 11:47
Откуда: Москва

Сообщение Tracer » 31 май 2005, 14:04

Без разбора строки на подстроку никуда не деться
Прийдется делать нечто такое

#include <string.h>
#define ON 1
#define OFF 0
...

   if(strstr(uartbuffer,"Light") != NULL)
     {
        if(strstr(uartbuffer,"ON") != NULL) light(ON);
        if(strstr(uartbuffer,"OFF) != NULL) light(OFF);
      }
if(strstr(uartbuffer,"Motor") != NULL)
     {
        if(strstr(uartbuffer,"ON") != NULL) motor(ON);
        if(strstr(uartbuffer,"OFF) != NULL) motor(OFF);
      }
Аватара пользователя
Tracer
 
Сообщения: 195
Зарегистрирован: 24 ноя 2004, 12:36
Откуда: Харьков

Сообщение slava » 31 май 2005, 14:36

т.е. в обработчике прерывания ловим идентификатор конца команды, далее из буфера в строку - и ее уже обратываем, так ?
slava
 
Сообщения: 188
Зарегистрирован: 12 апр 2005, 11:47
Откуда: Москва

Сообщение Tracer » 31 май 2005, 15:08

Именно ТАК
Аватара пользователя
Tracer
 
Сообщения: 195
Зарегистрирован: 24 ноя 2004, 12:36
Откуда: Харьков

Сообщение FSnow » 01 июн 2005, 13:31

... если я хочу текстовые команды использовать? и еще с параметрами ?

я думаю будет оригинально использовать вместо команд
четверостишья допустим А.С.Пушкина, что-то вроде этого:
Команда 1:
"Идет на право - песнь заводит"  означает
Поворот на право с включением сирены
Команда 2:
"Выпьем няня, где же кружка <Параметр>"  -
Робот галопом несется на кухню за пивом  
<Параметр> количество банок пива.  :lol:
А если серьезно, ИМХО, текстовые команды - явный пербор.
Пакета длиной байта 3 + CRC должно хватить.
Пусть
  $01 -  Команда позиционирование сервопривода
  <п1>- id сервопривода
  <п2>- позиция
Пример  01 04 83 (CRC)
Ну и дальше начинаешь обрабатывать ...
FSnow
 
Сообщения: 7
Зарегистрирован: 23 май 2005, 09:14

Сообщение slava » 01 июн 2005, 18:36

FSnow писал(а):
... если я хочу текстовые команды использовать? и еще с параметрами ?

я думаю будет оригинально использовать вместо команд
четверостишья допустим А.С.Пушкина, что-то вроде этого:
Команда 1:
"Идет на право - песнь заводит"  означает
Поворот на право с включением сирены
Команда 2:
"Выпьем няня, где же кружка <Параметр>"  -
Робот галопом несется на кухню за пивом  
<Параметр> количество банок пива.  :lol:
А если серьезно, ИМХО, текстовые команды - явный пербор.
Пакета длиной байта 3 + CRC должно хватить.
Пусть
  $01 -  Команда позиционирование сервопривода
  <п1>- id сервопривода
  <п2>- позиция
Пример  01 04 83 (CRC)
Ну и дальше начинаешь обрабатывать ...



Текстовые команды возможно и перебор - но:

1. Наглядно
2. Для повторения боллее чем удобно
slava
 
Сообщения: 188
Зарегистрирован: 12 апр 2005, 11:47
Откуда: Москва

Сообщение Tracer » 01 июн 2005, 19:13

Исключительно для удобства НАЧИНАЮЩИХ и при наличии избыточного МК текстовые команды - ПРАВИЛЬНО
Но красивее в КЛАССИЧЕСКОМ смысле всетаки числовое представление

КАК промежуточное решение

Интерфейсная программа  на ПК преобразует ТЕКСТОВЫЕ команды в числовые и передает их в МК по  СОМ порту

Ну а вообще РАЗРАБОТЧИК всегда ПРАВ (ИМНО) :D
Аватара пользователя
Tracer
 
Сообщения: 195
Зарегистрирован: 24 ноя 2004, 12:36
Откуда: Харьков

Сообщение slava » 01 июн 2005, 19:19

Tracer писал(а):Исключительно для удобства НАЧИНАЮЩИХ и при наличии избыточного МК текстовые команды - ПРАВИЛЬНО
Но красивее в КЛАССИЧЕСКОМ смысле всетаки числовое представление

КАК промежуточное решение

Интерфейсная программа  на ПК преобразует ТЕКСТОВЫЕ команды в числовые и передает их в МК по  СОМ порту

Ну а вообще РАЗРАБОТЧИК всегда ПРАВ (ИМНО) :D


Хм, может я и заблуждаюсь, но:

Все свои разработки по теме роботов, я буду делать открытыми!, и поэтому, для помощи начинающим-повторяющим текстовые команды будут проще для освоения. опять таки ИМХО :)
slava
 
Сообщения: 188
Зарегистрирован: 12 апр 2005, 11:47
Откуда: Москва

Сообщение FSnow » 02 июн 2005, 09:06

Ну а вообще РАЗРАБОТЧИК всегда ПРАВ (ИМНО)

возможно, возможно...  :wink:

2Slava
Кстати, Вы прикинули планируемое количество команд?

для помощи начинающим-повторяющим текстовые команды будут проще для освоения

Спорно. Мне кажется, если начинающий разобрался
с МК, то таблица из 15 (допустим) команд его наврядли напрягет.

КАК промежуточное решение
Интерфейсная программа  на ПК преобразует ТЕКСТОВЫЕ команды в числовые и передает их в МК по  СОМ порту

смущает только фраза "промежуточное решение".
ИМХО, это нормальное решение.

и еще пытаюсь представить ситуацию (возможно я ее не так вижу).
Решил начинающий повторить Ваш проект
(кстати я с интересом за ним слежу, делаю что-то подобное,
чуть по проще, и планирую идти по Вашим стопам  :wink: )
Далее начинающий собрал плату. Прошил контроллер.
Запустил интерфейсную прогу на ПК. Работает (повезло ему).
Потом начал разбираться с кодом (для общего развития).
читает:
switch(UDR) {
     // Код $01 - Зажигаем лампу №1 (к примеру)
     case {код символа}: {зажигаем лампочку};break;
     .....

неужели это менее понятно и наглядно, чем  
  // Light - Зажигаем лампу №1
 if(strstr(uartbuffer,"Light") != NULL)
    {
       if(strstr(uartbuffer,"ON") != NULL) light(ON);
       if(strstr(uartbuffer,"OFF) != NULL) light(OFF);
     }


К слову, операции со строками, само собой будут выполнятся
медленнее, хотя я понял что на это забили.
И еще обязательно прийдется выковыривать слова из строки
если работать с параметрами, преобразовывать  их в числа и т.п.

Все выше сказанное - всего лишь мое мнение.
Ничего личного  :lol:
FSnow
 
Сообщения: 7
Зарегистрирован: 23 май 2005, 09:14

След.

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

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

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