Библиотека на С для работы с UART, AVR
|
|
Участник
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)
На каждую хорошую мысль неизбежно находится свой дурак, аккуратно доводящий её до абсурда.
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Осталось только найти железо у кого есть )
|
|
|
|
|
Участник
9 сообщений
Мужчина
|
Да... А на каком языке вы пишите? (программы)
На каждую хорошую мысль неизбежно находится свой дурак, аккуратно доводящий её до абсурда.
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Смотря для чего программы - для мк - Си, для ПК C#
[p.s.]Я пишу на любителя, и когда надо. По этому всегда почти забываю почти под 0 если не часто пользуюсь языками этими[/p.s.]
|
|
|
|
|
Начальная группа
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 Добавить еще прерывания и будет вообще хорошо Подключить прерывание можно так: передаем в функцию, которая включает прерывание указатель на функцию, которая вызовется когда произойдет прерывание. Т.е. также как в 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)
|
|
|
|
|
Участник
9 сообщений
Мужчина
|
Quote (nightmare) Попробовал скомпилировать в AVRGCC3.3.2.31 без оптимизации и получил 14 ошибок: Ухты не ожидал что кто то отзовется, nightmare спасибо за роботу которою вы проделали! Вот мне уже МК пришел (тоже кстати ATmega32) на будущее буду болле детально свой софт тестировать. nightmare еще раз спасибо!Добавлено (06.06.2012, 10:07) ---------------------------------------------
Да она простая только, зависит от файла Arduino.h, который в свою очередь еще от нескольких, также она написана на С++, а я пишу в основном на Си.
На каждую хорошую мысль неизбежно находится свой дурак, аккуратно доводящий её до абсурда.
|
|
|
|
|
Начальная группа
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; }
|
|
|
|
|
Участник
9 сообщений
Мужчина
|
Quote (nightmare) Несколько функций для настройки UART и отправки символа или строки символов. Только обработчик прерывания нужно дописать :-)
На каждую хорошую мысль неизбежно находится свой дурак, аккуратно доводящий её до абсурда.
|
|
|
|
|