Advertisement
Guest User

Untitled

a guest
Apr 21st, 2014
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.08 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement