Теперь в нашем онлайн-магазине доступна уникальная книга «BEAM-робототехника. От азов до создания практических устройств», идеально подходящая как для кружков робототехники, так и для самообучения дома. Вы можете приобрести её по привлекательной цене в 699 рублей. Дополнительная информация о книге доступна на нашем сайте. Также в ассортименте нашего онлайн-магазина представлены готовые наборы для сборки роботов, с помощью которых ваш ребенок сможет легко собрать своего первого робота, следуя нашим подробным инструкциям. Перейти в магазин


[ Раскрыть online-чат / Закрыть ] · [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: nightmare, Huntswarrior, Aleks_Crow  
Библиотека на С для работы с UART, AVR
Отправлено 05.06.2012 - 14:011
Участник
9 сообщений
Мужчина
Здравствуйте! Недавно начал увлекаться микроконтроллерами, а именно их программированием. На данный момент работаю только в симуляторах (Proteus, VMlab и т. д.), но в скором будущем перейду на реальное железо.

Тем не менее, подумал что мне очень понадобится разные библиотеки, для упрощения роботы с МК, не работать же всегда через регистры (на данный момент пишу на чистом Си, компилятор WinAVR). Начал я штурмовать UART (Универсальный Асинхронный Приемо/Передатчик) в народе называемый RS-232 или СOM (хотя это не правильно), так как он будет очень полезен для отладки программ, и вообще Я ориентирован на робототехнику для меня это очень полезная штука! Если купить радио-модули можно дистанционно управлять роботом отправлять разную информацию на ПК и много разных вкусностей. Очень бы хотелось знать как библиотека поведет себя в Реальных Условиях, если вам не лень прошу протестировать ее и сообщить мне о результатах.

Приведу простой пример работы с ней (некоторые функций очень похожи на Паскаливские :-)
Code

#include <avr/io.h>    // стандартные библиотеки       
#include <util/delay.h>
#include "uart_driver.c"      // собственно моя библиотечка
             
#define F_CPU 1000000UL     // частота МК
#define MAX_LINE_LENGHT 40      // макрос  определения максимальной длины строки ввода/вывода       
             
int main(void)
{
       char name[MAX_LINE_LENGHT]; // строка в которой будет храниться имя    пользователя
       unsigned int delete;   // метка которое указывает сколько по что удалять       
             
       uart_init(9600);       // в качестве параметра функция принимает   //бауд-рейт       
       uart_write("UART INIT COMPLET...\r");  // выводим сообщение об успешной инициализаций       
       uart_write("START WHILE!");    // начало главного цикла
       delete = cSend;  // сSend – счетчик отправленных символов, здесь мы вставляем //метку которая указывает по что удалять       
       while (1)
       {
        uart_write("\rHellow! My name is Linch! What you the name? ");  // Привет! Меня зовут Линч! Как тебя зовут (перевод)
        uart_readln(name);   // cохраняем имя в строке name (после ввода имени нужно    нажать enter)
        uart_write(name); uart_write(" it's cool name! \r");       
        uart_wait("Plees press enter...\r", '\r');        // Выводим сообщение и ждем нажатия клавиши (в данном случае enter'a)
        for (int i = 1; i <= 3; i++)
        {
         uart_write_int(i); uart_putc('\!');
         _delay_ms(1000);
         uart_write("\b\b");
        }
        uart_write("\rRESTART WHILE!");
        _delay_ms(1000);
        uart_clr(delete);
       }
       return 0;
}

Постоянные ссылки:

Вот такие проги :). В будущем планирую создать библиотеки для каждого модуля (АЦП, ШИМ, Таймеры, SPI и т.д. и т.п.). Все вопросы, пожелания, предложения, (жалобы!?) прошу отправлять в ящик  sciencefan@yandex.com , или пишите в комментариях. Весь код является полностью открытым(Open Source, однако :). Код хорошо комментирован, полное описание находится в самом файле библиотеки. Если есть идей что можно добавить, убрать, оптимизировать пишите вместе и обсудим. При копирование/распространений прошу указывать автора (то есть меня). С уважением Савчук Александр…


testlib.rar (15.1 Kb) · uart_driver.c (4.4 Kb)
На каждую хорошую мысль неизбежно находится свой дурак, аккуратно доводящий её до абсурда.
Профиль Личное сообщение Дом. страница icq Skype
2
Отправлено 05.06.2012 - 14:192
Администраторы
3417 сообщений
Мужчина
Осталось только найти железо у кого есть )


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Отправлено 05.06.2012 - 16:093
Участник
9 сообщений
Мужчина
Да... А на каком языке вы пишите? (программы)


На каждую хорошую мысль неизбежно находится свой дурак, аккуратно доводящий её до абсурда.
Профиль Личное сообщение Дом. страница icq Skype
2
Отправлено 05.06.2012 - 16:514
Администраторы
3417 сообщений
Мужчина
Смотря для чего программы - для мк - Си, для ПК C#

[p.s.]Я пишу на любителя, и когда надо. По этому всегда почти забываю почти под 0 если не часто пользуюсь языками этими[/p.s.]


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
34
Отправлено 05.06.2012 - 18:575
Начальная группа
1798 сообщений
Мужчина
Попробовал скомпилировать в AVRGCC3.3.2.31 без оптимизации и получил 14 ошибок:
http://bsvi.ru/10506125ab256
Еще варнинги насчет константы F_CPU, т.к. она определяется после подключения delay.h и uart_driver.c а не до.
Вынес прототипы функций в .h файл, определил переменную cSend в uart_driver.c и _cSend в uartDriver.c, исправил ошибку на строке:
Code
uart_wait("Please press enter...\r", '\r');   

Надо так, а то ожидания не происходит:
Code
uart_wait("Please press enter...", '\r');  

Пробую ввести имя через Terminal by bray и не вводится оно.
В остальном работает в железе на atmega32. Занимает всё это 1 кб памяти с оптимизацией по размеру.

uart_clr(), cSend какая-то, переменная delete, зачем это всё? Лучше не выносить это за пределы uart_driver.c

А вообще вот такого набора функция для работы с юартом достаточно (см. See also):
http://arduino.cc/en/Serial/Begin
Добавить еще прерывания и будет вообще хорошо smile
Подключить прерывание можно так: передаем в функцию, которая включает прерывание указатель на функцию, которая вызовется когда произойдет прерывание. Т.е. также как в Procyon avrlib в файле uart.c

Зацени какую библиотеку нашел: https://github.com/abcminiuser/lufa-lib


uartDriver.c (1.8 Kb) · uart_driver.h (0.7 Kb) · 0873746.c (3.4 Kb)
Профиль Личное сообщение Дом. страница icq Skype
38
Отправлено 06.06.2012 - 10:076
Участник
9 сообщений
Мужчина
Quote (nightmare)
Попробовал скомпилировать в AVRGCC3.3.2.31 без оптимизации и получил 14 ошибок:

Ухты не ожидал что кто то отзовется, nightmare спасибо за роботу которою вы проделали! Вот мне уже МК пришел (тоже кстати ATmega32) на будущее буду болле детально свой софт тестировать. nightmare еще раз спасибо!

Добавлено (06.06.2012, 10:07)
---------------------------------------------

Quote (nightmare)
А вообще вот такого набора функция для работы с юартом достаточно (см. See also):
http://arduino.cc/en/Serial/Begin

Да она простая только, зависит от файла Arduino.h, который в свою очередь еще от нескольких, также она написана на С++, а я пишу в основном на Си.


На каждую хорошую мысль неизбежно находится свой дурак, аккуратно доводящий её до абсурда.
Профиль Личное сообщение Дом. страница icq Skype
2
Отправлено 07.06.2012 - 21:297
Начальная группа
1798 сообщений
Мужчина
Несколько функций для настройки UART и отправки символа или строки символов.
Code

//F_CPU - тактовая частота процессора в герцах
#define F_CPU 7372800UL
//Отправляет символ
void uart_tx(unsigned char d)
{
   while ( !( UCSRA & (1<<UDRE)) );
   UDR = d;
}
//Отправляет строку символов
void uart_ss(char * s)
{
    while(*(s)!='\0') uart_tx(*(s++));   
}
//В начале программы вызвать эту функцию для настройки UART
void uart_init(unsigned long baudrate)
{
   //9600, 1 stop bit, parity disabled, rxc interrupt enabled   
   UCSRA = 0;
   UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
   UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
   UBRRL = F_CPU / (16U * baudrate) - 1;
}


Профиль Личное сообщение Дом. страница icq Skype
38
Отправлено 07.06.2012 - 21:338
Участник
9 сообщений
Мужчина
Quote (nightmare)
Несколько функций для настройки UART и отправки символа или строки символов.

Только обработчик прерывания нужно дописать :-)


На каждую хорошую мысль неизбежно находится свой дурак, аккуратно доводящий её до абсурда.
Профиль Личное сообщение Дом. страница icq Skype
2
  • Страница 1 из 1
  • 1
Поиск: