daily pastebin goal
4%
SHARE
TWEET

Untitled

a guest Apr 21st, 2014 53 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /***************************Библиотека для роботы с UART***************************************
  2. Описание:
  3.         Библиотека упрощает роботу с UART (Универсальным Асинхронным Приемо/Передатчиком),
  4.         она включает в себя функций высокого так и низкого уровня. Теоретически должна работать на
  5.         всех МК серий Mega. Формат передачи 8n1 - 8 бит данных, без проверки четности, 1 стоп-бит.
  6.         Скорость передачи или baud-rate нужно указать при вызове функций uart_init(). Данные пара-
  7.         метры нужно учитывать при настройке компьютерного ПО. Данная библиотеке не требует      
  8.         каково либо специального компьютерного ПО. Сойдет и обычный HyperTerminal (OC Windows XP)
  9.         Тестирование проходило только симуляторе (Proteus 7). Так что буду очень благодарен за
  10.         информацию о том как проходит робота в реальном устройстве. Все пожелания, предложения,
  11.         отзывы, (жалобы!?), прошу отправлять на e-mail, или писать в мой блог :)
  12. Автор:
  13.         Савчук Александр (Linch)
  14. Контакты:
  15.         e-mail : sciencefan@yandex.com
  16.         WWW    : http://sciencefan.ya.ru/
  17. Просьба :
  18.         При перепечатке/копирований прошу указывать имя автора, или адрес моей странички :)
  19. ***************************Copiright by Savchuk Alex (2012)***********************************/
  20.  
  21. #include <avr/io.h>
  22.  
  23. #ifndef MAX_LINE_LENGHT
  24.         #warning "MAX_LINE_LENGHT not defined for 'uart_driver.c'"
  25.         #define  MAX_LINE_LENGHT 40 // максимальная длина строки
  26. #endif
  27.  
  28. #ifndef F_CPU
  29.         # warning "F_CPU not defined for 'uart_driver.c'"
  30.         # define F_CPU 1000000UL        // частота МК
  31. #endif
  32.                                                                 /*Прототипы функций*/
  33. inline void uart_init(unsigned int baud);                //инициализация UART'a
  34. inline void uart_putc(unsigned char data);               //отправка одного символа
  35. inline unsigned char uart_getc (void);           //получение одного символа
  36. inline void uart_write (char *str);              //отправка строки
  37. inline void uart_write_int(unsigned int val);    //отправка строки цифр
  38. inline char *uart_readln(char *s);                           //функция чтения строки (параметр - указатель на строку)
  39. inline int CharToInt(char ch);                               //преобразует цифру (ASCII) в int эквивалент
  40. inline void uart_clr(unsigned int l);                    //удаляет l символов
  41. inline void uart_wait(char *msg, char k);               //программа ждет нажатия клавиши
  42.  
  43. #define ANY 0                                                                    
  44.  
  45. unsigned int cSend = 0;   // счетчик отправленных символов
  46.  
  47.  
  48. inline void uart_init(unsigned int baud)  // Функция инициализаций UART'a (синтаксис uart_init(9600))
  49. {
  50.         #if F_CPU < 2000000UL && defined(U2X)
  51.                 UCSRA = _BV(U2X);             // если частота ниже 2 МГц, для устранения удваиваем скорость
  52.                 UBRRL = (F_CPU / (8UL * baud)) - 1;
  53.         #else
  54.                 UBRRL = (F_CPU / (16UL * baud)) - 1;
  55.         #endif
  56.         UCSRB = _BV(TXEN) | _BV(RXEN); // включаем прием/передачу
  57. }
  58.  
  59. inline void uart_putc(unsigned char data) // Функция отправки одного символа (байта) (синтаксис uart_putc('a'))
  60. {
  61.        
  62.         while ( !( UCSRA & (1<<UDRE) ) ); // ждем пока освободится регистр UDR
  63.         UDR = data;                                                // начинаем передачу
  64.         if (data != 8)         
  65.                 cSend++; // увеличиваем счетчик отправленных символов
  66.         else
  67.                 cSend--; // если отослали backspace уменьшаем счетчик отправленных символов
  68. }
  69.  
  70. inline unsigned char uart_getc (void) // функция принятия 1-го символа (байта)
  71. {
  72.         while ( !(UCSRA & (1<<RXC)) );   // ждем прихода символа
  73.         return UDR;                                               // получаем результат
  74. }
  75.  
  76. inline void uart_write (char *str)      // функция передачи строки
  77. {
  78.         for(int i = 0; str[i]; ++i)    
  79.                 uart_putc(str[i]);
  80. }
  81.  
  82. inline void uart_write_int(unsigned int val)
  83. {
  84.         char str[MAX_LINE_LENGHT];    
  85.         itoa(val, str, 10); // преобразим значение val в строку
  86.         uart_write(str);         // отправим строку
  87. }
  88.  
  89. inline char *uart_readln(char *s)
  90. {
  91.   char ch, *p;
  92.   int t;
  93.  
  94.   p = s;  /* uart_readln() возвращает указатель s */
  95.  
  96.   for(t=0; t<MAX_LINE_LENGHT; ++t){
  97.     ch = uart_getc();  // получаем символ
  98.         uart_putc(ch);          // для наглядности отправляем назад
  99.     switch(ch) {               
  100.       case '\r':
  101.         s[t] = '\0'; /* завершает строку */
  102.         return p;
  103.       case 0x08:
  104.         if(t>0) t--;
  105.         break;
  106.       default:
  107.         s[t] = ch;
  108.     }
  109.   }
  110.   s[MAX_LINE_LENGHT - 1] = '\0';
  111.   return p;
  112. }
  113.  
  114. inline int CharToInt(char ch)
  115. {
  116.         if ((ch >= '0') && (ch <= '9')) // если символ число
  117.                 return ch - '0';                          // делаем преобразование
  118.         else
  119.                 return -1;                                        // иначе возвращаем 1
  120. }
  121.  
  122. inline void uart_clr(unsigned int l)
  123. {
  124.         for(int i = cSend - l; i >= 0 ; i--)
  125.         {
  126.                 uart_putc(8);
  127.         }              
  128. }
  129.  
  130. inline void uart_wait(char *msg, char k) // функция которая ожидает нажатия клавиши
  131. {
  132.         uart_write(msg);                     // вывод сообщения
  133.         while(uart_getc() != k);                         // ждем нажатия клавиши k
  134.        
  135. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top