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

Готовая электроника для самодельного робота. Уровень от начинающих до опытных конструкторов.

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

Сообщение Vooon » 10 янв 2010, 21:26

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

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

Сообщение unnAm3d » 10 янв 2010, 22:00

хм... скорость uart зависит от F_CPU
в makefile у меня она определена как F_CPU = 16000000
а разве не используется внешний кварц 7,3728 ? т.е. не нужно ли изменить значение F_CPU на 7372800 ?
может конечно это бред...
а так прошивка использует 9600, и в терминале использую 9600..
unnAm3d
 
Сообщения: 27
Зарегистрирован: 05 янв 2010, 19:25
Откуда: Фрязино
Skype: vadim17.87
прог. языки: С/С++
ФИО: Гамидов Вадим Александрович

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

Сообщение Vooon » 10 янв 2010, 22:08

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

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

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

Спасибо!)
unnAm3d
 
Сообщения: 27
Зарегистрирован: 05 янв 2010, 19:25
Откуда: Фрязино
Skype: vadim17.87
прог. языки: С/С++
ФИО: Гамидов Вадим Александрович

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

Сообщение MiBBiM » 10 янв 2010, 23:26

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

так
Код: Выделить всё
F_CPU = 7372800
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

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

буду копать дальше)) но если кто поделится мыслями буду премного благодарен)))
unnAm3d
 
Сообщения: 27
Зарегистрирован: 05 янв 2010, 19:25
Откуда: Фрязино
Skype: vadim17.87
прог. языки: С/С++
ФИО: Гамидов Вадим Александрович

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

Сообщение Vooon » 11 янв 2010, 01:34

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

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

Сообщение unnAm3d » 11 янв 2010, 01:41

ну вот сам проект...
но со скоростью все вроде ок.. отбросив мысли о полудуплексе - все передается нормально...
Вложения
irs_mbot.rar
(56.25 КиБ) Скачиваний: 7
unnAm3d
 
Сообщения: 27
Зарегистрирован: 05 янв 2010, 19:25
Откуда: Фрязино
Skype: vadim17.87
прог. языки: С/С++
ФИО: Гамидов Вадим Александрович

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

Сообщение Vooon » 11 янв 2010, 02:06

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

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

Сообщение unnAm3d » 11 янв 2010, 14:12

да.. сам тоже об этом подумал.
думаю использовать StxEtx.
Спасибо за помощь!)
unnAm3d
 
Сообщения: 27
Зарегистрирован: 05 янв 2010, 19:25
Откуда: Фрязино
Skype: vadim17.87
прог. языки: С/С++
ФИО: Гамидов Вадим Александрович

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

Сообщение unnAm3d » 26 янв 2010, 12:32

Всем доброго времени суток)
Покапался в проекте ORFA..
Подскажите, так навскидку, с какими ограничениями-изменениями его можно собрать под Минибота 2.0? На боте twi/i2c реализован через программатор?
unnAm3d
 
Сообщения: 27
Зарегистрирован: 05 янв 2010, 19:25
Откуда: Фрязино
Skype: vadim17.87
прог. языки: С/С++
ФИО: Гамидов Вадим Александрович

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

Сообщение =DeaD= » 26 янв 2010, 13:04

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

Добавлено спустя 27 секунд:
Вот только UART на миниботе хитровыдуманный :)
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Пред.

Вернуться в МиниБот — национальный класс роботов

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

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