Технический форум по робототехнике.
blindman » 17 июн 2009, 21:40
Он хочет вот такого, если я правильно понял:
- Код: Выделить всё • Развернуть
#define A(x) #define B(x)
=DeaD= » 17 июн 2009, 21:44
ненене

Я хочу
#define F(x) (x+x*x+1)
#define G(x) (F(x)+F(x)*F(x)+1)
blindman » 17 июн 2009, 21:48
Так - да, без проблем. Только это не вложенный #define
=DeaD= » 17 июн 2009, 21:52
Оговорился

Vooon » 17 июн 2009, 21:55
А это разве не одно и тоже что и
- Код: Выделить всё • Развернуть
#define A(x) B(x)
?
Добавлено спустя 2 минуты 1 секунду:Хотя...
- Код: Выделить всё • Развернуть
#define A(x) #define B(y) x*y
Хотя имхо это слишком

не лисп же

blindman » 17 июн 2009, 22:00
Я неудачный пример привел. Но я вложенный #define именно так понял - #define , у которого в теле еще один
Добавлено спустя 3 минуты 47 секунд:Да-да, типа такого иногда хочется

=DeaD= » 17 июн 2009, 22:06
А можно в дефайне к 1 слову второе вплотную приписать, типа:
#define F(x) (1{x}2)
чтобы F(4) было (142) ?
blindman » 17 июн 2009, 22:12
- Код: Выделить всё • Развернуть
// test.c
#define F(x) (1 ##x## 2)
int a = F(4);
- Код: Выделить всё • Развернуть
andrey@laptop:~$ gcc -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
int a = (142);
andrey@laptop:~$
Vooon » 17 июн 2009, 22:14
Так вроде:
- Код: Выделить всё • Развернуть
vovan@vovan-laptop:/tmp$ cat test2.c
// concat test
#include <stdio.h>
#define FUN(x) (1##x##2)
int v=0;
int main()
{
printf("v=%i\n", v);
v = FUN(0);
printf("v=%i\n", v);
v = FUN(2);
printf("v=%i\n", v);
return 0;
}
vovan@vovan-laptop:/tmp$ gcc test2.c
vovan@vovan-laptop:/tmp$ ./a.out
v=0
v=102
v=122
vovan@vovan-laptop:/tmp$
(Ей богу консоль это вещь!!!)
=DeaD= » 17 июн 2009, 22:15
Ну ежели и такое есть, тогда я завтра накидаю попробую, что имею в виду по прошивке

=DeaD= » 20 июн 2009, 00:09
Движемся дальше.
Вот как-то так получается пока:
- Код: Выделить всё • Развернуть
uint8_t pause0[32];
uint8_t pause1[32];
uint8_t mask0[32];
uint8_t mask1[32];
uint8_t iterator;
#define portHandlerAND(name, port, nextHandler, id) \
void name(void)\
{\
port &= mask0[id]; \
OCR2 += pause0[id]; \
handler = nextHandler; \
}
#define portHandlerOR(name, port, nextHandler, id) \
void name(void)\
{\
port |= mask0[id]; \
OCR2 += pause0[id]; \
for(iterator=0; iterator<pause1[id]; iterator++){
delay_us(1);
};
port |= mask1[id]; \
handler = nextHandler; \
}
#define portHandlers(process, port, nextProcess, id) \
portHandlerOR(##process##3, port, ##nextProcess##0, (id+3))\
portHandlerOR(##process##2, port, ##process##3, (id+2))\
portHandlerOR(##process##1, port, ##process##2, (id+1))\
portHandlerAND(##process##0, port, ##process##1, (id))\
void processD0(void);
portHandlers(processAa, PORTA, processD, 0)
portHandlers(processAb, PORTA, processAa, 4)
portHandlers(processAc, PORTA, processAb, 8)
portHandlers(processAd, PORTA, processAc, 12)
portHandlers(processCa, PORTC, processAd, 16)
portHandlers(processCb, PORTC, processCa, 20)
portHandlers(processB, PORTB, processCb, 24)
portHandlers(processD, PORTD, processB, 28)
Vooon » 21 июн 2009, 18:00
Добавил сохранение/загрузку положений в EEPROM для servo4017.
Но не тестировал.
В нулевой регистр драйвера записывается флаг загружать или нет положения:
Запись 1 сохраняет положения на момент получения комманды;
Запись 0-я только сбрасывает флаг.
Т.е. устанавливаем положения серв, а потом даем команду их запомнить.
Желательно дописать драйвер, чтобы можно было прочитать текущее состояние.
Дописать правила сборки для получения .eep файла.
=DeaD= » 21 июн 2009, 18:03
2Vooon: Она по умолчанию отключена? Наверное лучше пока ничего не менять. В любом случае мне кажется правильным сначала не выдавать никаких управляющих сигналов на сервы, только по определенной команде. Запись в EEPROM наверное не лучший выход в данной ситуации.
Vooon » 21 июн 2009, 18:09
Да отключена, в эпроме флаг должен равняться 0, чтобы включить загрузку.
Отключать генерацию сигналов на сервы сложнее.
=DeaD= » 21 июн 2009, 18:30
Надо blindman'а подождать, может он знает как это просто сделать.