roboforum.ru

Технический форум по робототехнике.

UART и WinAVR

UART и WinAVR

Олег » 30 окт 2006, 17:23

Как в WinAVR рабоать с UART?
:?:
В документации на WinAVR нашел:

Defines
#define  FILE   struct __file
#define  stdin   (__iob[0])
#define  stdout   (__iob[1])
#define  stderr   (__iob[2])
#define  EOF   (-1)
#define  putc(__c, __stream)   fputc(__c, __stream)
#define  putchar(__c)   fputc(__c, stdout)
#define  getc(__stream)   fgetc(__stream)
#define  getchar()   fgetc(stdin)


Functions
int  fclose (FILE *__stream)
int  vfprintf (FILE *__stream, const char *__fmt, va_list __ap)
int  vfprintf_P (FILE *__stream, const char *__fmt, va_list __ap)
int  fputc (int __c, FILE *__stream)
int  printf (const char *__fmt,...)
int  printf_P (const char *__fmt,...)
int  sprintf (char *__s, const char *__fmt,...)
int  sprintf_P (char *__s, const char *__fmt,...)
int  snprintf (char *__s, size_t __n, const char *__fmt,...)
int  snprintf_P (char *__s, size_t __n, const char *__fmt,...)
int  vsprintf (char *__s, const char *__fmt, va_list ap)
int  vsprintf_P (char *__s, const char *__fmt, va_list ap)
int  vsnprintf (char *__s, size_t __n, const char *__fmt, va_list ap)
int  vsnprintf_P (char *__s, size_t __n, const char *__fmt, va_list ap)
int  fprintf (FILE *__stream, const char *__fmt,...)
int  fprintf_P (FILE *__stream, const char *__fmt,...)
int  fputs (const char *__str, FILE *__stream)
int  fputs_P (const char *__str, FILE *__stream)
int  puts (const char *__str)
int  puts_P (const char *__str)
size_t  fwrite (const void *__ptr, size_t __size, size_t __nmemb, FILE *__stream)
int  fgetc (FILE *__stream)
int  ungetc (int __c, FILE *__stream)
char *  fgets (char *__str, int __size, FILE *__stream)
char *  gets (char *__str)
size_t  fread (void *__ptr, size_t __size, size_t __nmemb, FILE *__stream)
void  clearerr (FILE *__stream)
int  feof (FILE *__stream)
int  ferror (FILE *__stream)
int  vfscanf (FILE *__stream, const char *__fmt, va_list __ap)
int  vfscanf_P (FILE *__stream, const char *__fmt, va_list __ap)
int  fscanf (FILE *__stream, const char *__fmt,...)
int  fscanf_P (FILE *__stream, const char *__fmt,...)
int  scanf (const char *__fmt,...)
int  scanf_P (const char *__fmt,...)
int  sscanf (const char *__buf, const char *__fmt,...)
int  sscanf_P (const char *__buf, const char *__fmt,...)
FILE *  fdevopen (int(*put)(char), int(*get)(void), int opts __attribute__((unused)))

может кто-то знает, когда какая из этих функций используется? :?:

avr123.nm.ru » 30 окт 2006, 20:52

я написал о USART в задаче-упражнении 5  -  avr123.nm.ru/z5.htm

еще там посмотрите:
http://hubbard.engr.scu.edu/embedded/avr/avrlib

Олег » 30 окт 2006, 23:44

В задаче 5 рассказывается на прмере CodeVisionAVR.
В CodeVisionAVR программа получается раза в два больше чем на WinAVR.
Может есть какой-нибудь пример UART на WinAVR? :?:

aesok » 31 окт 2006, 00:58

Олег писал(а):Может есть какой-нибудь пример UART на WinAVR? :?:


Посмотрите на своем диске:
X:\WinAVR\doc\examples\largedemo

Если будут вопросы, или у вас старая версия WinAVR, пишите отвечю.

Анатолий.

avr123.nm.ru » 31 окт 2006, 03:50

Олег писал(а):Может есть какой-нибудь пример UART на WinAVR? :?:


Ну тады снова : ПАФТАРЯЮ

еще там посмотрите:
http://hubbard.engr.scu.edu/embedded/avr/avrlib

Олег » 31 окт 2006, 11:10

Посмотрите на своем диске:
X:\WinAVR\doc\examples\largedemo

Если будут вопросы, или у вас старая версия WinAVR, пишите отвечю.

Анатолий.


Наверное у меня старая версия WinAVR, у меня такого примера нет. Если не трудно выложите этот пример на форуме.

Олег » 31 окт 2006, 11:16

Ну тады снова : ПАФТАРЯЮ

еще там посмотрите:
http://hubbard.engr.scu.edu/embedded/avr/avrlib


Это интересная вещь, но я не могу разобраться как это все дело подключить к WinAVR? :?:

avr123.nm.ru » 31 окт 2006, 12:48

Олег писал(а):
Посмотрите на своем диске:
X:\WinAVR\doc\examples\largedemo


у меня такого примера нет. Если не трудно выложите этот пример на форуме.


у меня он в папке - C:\WinAVR\examples\largedemo

avr123.nm.ru » 31 окт 2006, 12:49

советую свежий WinAVR скачать и с VMLAB использовать.

Олег » 31 окт 2006, 14:21

Как в WinAVR посмотреть объем полученной программы? :?:
Какую  программу можно использовать вместо VMLAB, но чтобы она поддерживала ATTiny2313? :?:

avr123.nm.ru » 31 окт 2006, 14:49

AVR Stusio  (45 + 22  Мб)  atmel.ru  soft

Олег » 31 окт 2006, 15:35

Чем эта функция:
Код: Выделить всёРазвернуть
/*
* Send a C (NUL-terminated) string down the UART Tx.
*/
void printstr(const char *s)
{

 while (*s)
   {
     if (*s == '\n')
   putchr('\r');
     putchr(*s++);
   }
}

отличается от этой:
Код: Выделить всёРазвернуть
/*
* Same as above, but the string is located in program memory,
* so "lpm" instructions are needed to fetch it.
*/
void printstr_p(const char *s)
{
 char c;

 for (c = pgm_read_byte(s); c; ++s, c = pgm_read_byte(s))
   {
     if (c == '\n')
   putchr('\r');
     putchr(c);
   }
}

Myp » 31 окт 2006, 17:54

така же как предидущая, but the string is located in program memory, so "lpm" instructions are needed to fetch it.

aesok » 31 окт 2006, 19:36

Олег писал(а):
Посмотрите на своем диске:
X:\WinAVR\doc\examples\largedemo

Если будут вопросы, или у вас старая версия WinAVR, пишите отвечю.

Анатолий.


Наверное у меня старая версия WinAVR, у меня такого примера нет. Если не трудно выложите этот пример на форуме.


Я рекомендую вам установить новую версию WinAVR, которая вышла весной. Ваша версия avr-libc 1.2.x при работе с файлами использует днамическое вделение памяти (функция malloc) в функции открытия файлов, а это дополнительно  около 500 инструкций кода.  avr-libc 1.4.x не использует malloc для функций ввода вывода.

Для использовния нужно:

1. Фнукця которая выводит в поток 1 сомвол.
Код: Выделить всёРазвернуть
int
uart_putchar(char c, FILE *stream)
{
 if (c == '\n')
   uart_putchar('\r', stream);
 loop_until_bit_is_set(UCSRA, UDRE);
 UDR = c;

 return 0;
}


2. Далее в "main", для avr-libc 1.2:

Код: Выделить всёРазвернуть
 
    usart_init();

    fdevopen(&uart_putchar, NULL, 0);

   printf("\r\nHello\r\n");



для avr-libc 1.4:

Код: Выделить всёРазвернуть
 

FILE uart_str = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_W);

main()
{
   usart_init();

   stdout = &uart_str;

   printf("\r\nHello\r\n");
.....


Анатолий.

PS: Я ошибся, правильное название примера "stdiodemo".

PSS: Уточните вопрос, Вас интнрисует "работа с UART" или "работа с UART c помощю стандартных функций ввода вывода"?

Олег » 31 окт 2006, 20:42

PSS: Уточните вопрос, Вас интнрисует "работа с UART" или "работа с UART c помощю стандартных функций ввода вывода"?

Меня интересует вообще работа с UART.

А именно как вывести через UART константу находящуюся во Flash памяти и как получить через UART какое-нибудь слово, а потом сравнить его с имеющимися. :?:


Rambler\'s Top100 Mail.ru counter