roboforum.ru

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

программирование UART (на Си)

Re: программирование UART (на Си)

Vooon » 10 янв 2010, 21:26

Похоже что скорость принимающей стороны выше. Проверь верно ли установлена скорость на устройстве.
Ну и проверь какая ошибка.

Re: программирование UART (на Си)

unnAm3d » 10 янв 2010, 22:00

хм... скорость uart зависит от F_CPU
в makefile у меня она определена как F_CPU = 16000000
а разве не используется внешний кварц 7,3728 ? т.е. не нужно ли изменить значение F_CPU на 7372800 ?
может конечно это бред...
а так прошивка использует 9600, и в терминале использую 9600..

Re: программирование UART (на Си)

Vooon » 10 янв 2010, 22:08

Конечно зависит от тактовой!
И значение регистра скорости вычисляется при компиляции.
А вот какая тактовая зависит от fuse-битов.

Добавлено спустя 55 секунд:
Т.е. верно: скорость приемника 9600, а передатчика в районе 4800.

Re: программирование UART (на Си)

unnAm3d » 10 янв 2010, 22:33

как я понял для выбора external crystal нужно выставить fuse SUT...CKSEL.
Не подскажете что выбрать в winavr studio (там чекбокс)
уже установлено там:
Ext. Crystal/Resonator Medium freq.; Start-up time: 16K CK + 64 ms
fuse CKOPT установлен.
на плате соответственно внешний кварц 7,3728 Mhz

Спасибо!)

Re: программирование UART (на Си)

MiBBiM » 10 янв 2010, 23:26

не надо фьюзы шить! убьешь бота!
просто напиши вместо
Код: Выделить всёРазвернуть
F_CPU = 16000000

так
Код: Выделить всёРазвернуть
F_CPU = 7372800

Re: программирование UART (на Си)

unnAm3d » 11 янв 2010, 01:18

да-да.
так и сделал. в makefile прописал
Код: Выделить всёРазвернуть
F_CPU = 7372800

теперь шлю
Код: Выделить всёРазвернуть
char tmpbuff[] = "HELLO\n";

в терминале получаю:
00 43 85
мистика...
терминал настроен на те же 9600 8N1 no-parity

Добавлено спустя 1 час 36 минут 31 секунду:
получил наконец-то в terminal HELLO от бота)))
но без отключения rx во время передачи.
если использовать предложенные vooon:
OUT_BLOCK_FORCEON()
то в терминал выводится только: 00 43 85 (передаю "HELLO\n")
если использовать:
Код: Выделить всёРазвернуть
int usart_putchar(char c, FILE *stream) {
    if ( c == '\n' )
        usart_putchar('\r', stream);
    loop_until_bit_is_set(UCSRA, UDRE);
    UART_DISABLE_RX();
    UDR = c;
    loop_until_bit_is_set(UCSRA, UDRE);
    UART_ENABLE_RX();
    return 0;
}

то в терминале: 00 E1

буду копать дальше)) но если кто поделится мыслями буду премного благодарен)))

Re: программирование UART (на Си)

Vooon » 11 янв 2010, 01:34

Теперь лучше прикрепи проект целиком в архиве к посту.
Теперь явно наоборот скорость передатчика выше.

Re: программирование UART (на Си)

unnAm3d » 11 янв 2010, 01:41

ну вот сам проект...
но со скоростью все вроде ок.. отбросив мысли о полудуплексе - все передается нормально...
Вложения
irs_mbot.rar
(56.25 КиБ) Скачиваний: 7

Re: программирование UART (на Си)

Vooon » 11 янв 2010, 02:06

Тогда используй как есть.
Просто в протоколе нужно будет учесть, что мы себя слышим (игнорировать пакеты с заголовком ответа).

Re: программирование UART (на Си)

unnAm3d » 11 янв 2010, 14:12

да.. сам тоже об этом подумал.
думаю использовать StxEtx.
Спасибо за помощь!)

Re: программирование UART (на Си)

unnAm3d » 26 янв 2010, 12:32

Всем доброго времени суток)
Покапался в проекте ORFA..
Подскажите, так навскидку, с какими ограничениями-изменениями его можно собрать под Минибота 2.0? На боте twi/i2c реализован через программатор?

Re: программирование UART (на Си)

=DeaD= » 26 янв 2010, 13:04

А зачем twi/i2c? ORFA же первично через UART получает команды?

Добавлено спустя 27 секунд:
Вот только UART на миниботе хитровыдуманный :)

Re: программирование UART (на Си)

Vooon » 26 янв 2010, 16:14

Почему это принципиально? Она может быть и I2C slave.
Но под минибота нужно переписывать драйверы, или как минимум проверить.

1. Нужно написать файл platform/MINIBOT2.mk
Код: Выделить всёРазвернуть
# -*- Makefile -*-

MCU = atmega32
F_CPU = 7372800UL
BAUD =

DRIVERS = ports adc motor


2. Ports — drivers/ports/ports_driver.h
Маски нужно изменить
Код: Выделить всёРазвернуть
#ifdef MINIBOT2
   #define GATE_NUM_PORTS 4
   #define GATE_PORT_MASK_A 0
   #define   GATE_PORT_MASK_B 0xE3
   #define   GATE_PORT_MASK_C 0x03
   #define   GATE_PORT_MASK_D 0x33
   #define GATE_PORT_SPECS GATE_PORT_SPEC(A), GATE_PORT_SPEC(B), GATE_PORT_SPEC(C), GATE_PORT_SPEC(D)
   #define GATE_PORT_UID 0x0022
#endif


3. Motor — нужно переопределить макросы портов
4. ADC — нужно проверить, думаю заработает с минимумом правок
5. В local_config.mk раскомменитировать I2C_SLAVE = 1

Добавлено спустя 2 минуты 20 секунд:
После чего прошивка будет принимать команды с I2C, но этот режим не тестирован.


Rambler\'s Top100 Mail.ru counter