roboforum.ru

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

Помогите с UART

Re: Помогите с UART

Myp » 31 мар 2011, 14:57

я прям тут из Твери слышу раскаты от взрывов мозгов...

а по теме вопроса:
This program is written C and should would with the gcc compiler

Re: Помогите с UART

dccharacter » 31 мар 2011, 15:01

Myp писал(а):should would

should would - это правильно, красиво и православно.

Re: Помогите с UART

AlexNail » 31 мар 2011, 15:13

dccharacter писал(а):Ты вообще что-ли %:"№;№";?

Там вот что:
Code:
Код: Выделить всёРазвернуть
main (void)
/* Read and write functions */
unsigned char
ReceiveByte (void)
{
  /* Wait for incomming data */
  while (!(UCSRA & (1 << RXC)));

  /* Return the data */
  return UDR;
}

void
TransmitByte (unsigned char data)
{
  /* Wait for empty transmit buffer */
  while (!(UCSRA & (1 << UDRE)));

  /* Start transmittion */
  UDR = data;
}

Все верно, я точно так же прописываю функции и компилятор выдает ошибки, см. выше. Инициализацию сделал кодевижн. Так в чем у меня ошибка?

Re: Помогите с UART

dccharacter » 31 мар 2011, 15:22

AlexNail писал(а):Все верно, я точно так же прописываю функции и компилятор выдает ошибки, см. выше.

Поскольку ты не способен к элементарному анализу, я с тобой разговаривать прекращаю. На прощание, почувствуй разницу между этим:
Код: Выделить всёРазвернуть
void InitUART (unsigned char baudrate);
unsigned char ReceiveByte (void);
void TransmitByte (unsigned char data);

int main (void) {...}

void InitUART (unsigned char baudrate) {...}

unsigned char ReceiveByte (void) {...}

void TransmitByte (unsigned char data) {...}

и этим:
Код: Выделить всёРазвернуть
void main(void) { unsigned char USART_R(void) {...}  void USART_T(unsigned char data) { } }

Re: Помогите с UART

Dmitri Vladimirovich » 31 мар 2011, 15:25

Alex,

советую почитать

http://en.wikipedia.org/wiki/Main_function

http://en.wikipedia.org/wiki/Function_% ... B_examples


ни в коем случае не надо на на меня обижаться

просто почитав эти страницы (начиная именно с того места где откроется станица) Вам сразу станет понятно, что функция название которой начинается с void - это что то типа подпрограммы (а лучше гляньте в вики что это на самом деле) и что её нельзя объявлять (описывать что она будет делать) в главной части программы

когда Вам давали ссылки на программы для Пик итд, Вам давали намек (четко говорили) что надо посмотреть, как правильно вставлять "подпрограммы" из даташита
Последний раз редактировалось Dmitri Vladimirovich 31 мар 2011, 15:38, всего редактировалось 2 раз(а).

Re: Помогите с UART

dccharacter » 31 мар 2011, 15:32

Dmitri Vladimirovich писал(а):Вам давали намек на то что надо посмотреть, как правильно вставлять "подпрограммы" из даташита


Ты располагаешь объявление одной функции внутри другой. Почитай учебник по Си или курс proavr.narod.ru - разве это намек?

Re: Помогите с UART

AlexNail » 31 мар 2011, 16:34

dccharacter писал(а):
AlexNail писал(а):Все верно, я точно так же прописываю функции и компилятор выдает ошибки, см. выше.

Код: Выделить всёРазвернуть
void main(void) { unsigned char USART_R(void) {...}  void USART_T(unsigned char data) { } }


Я, серьезно, запутался. Т.е получаеться: функция USART_R будет выполняться в главной функции, верно? а функцию USART_T нужно обьявить за пределами главной функции. Верно?
или вытащить ее из функции USART_R (т.е. с {} запутался). верно?

Добавлено спустя 46 минут 11 секунд:
Фу вроде немного вьехал :))
Вот Код, компилятор пишет ок, но в VMLab в терминале не возвращает те символы которые пришли. Что может быть не так?
Код: Выделить всёРазвернуть
while (1)
      {   
                 USART_T(USART_R());
      };
}
            unsigned char USART_R(void)
           
            {
                while(!(UCSRA&(1<<RXC)));
                return UDR;
            };
         
           void USART_T(unsigned char data)
           
            {
                while(!(UCSRA&(1<<UDRE)));
                UDR=data;
            }           

Re: Помогите с UART

HarryStar » 31 мар 2011, 16:47

И почему часть новичков начинают не с начала, а сразу с USARTа или с боевых осьминогов с роборуками?
Что у вас не так, пока непонятно. Но объявления функций сделано уже нормально, значит прогресс есть.

Re: Помогите с UART

AlexNail » 31 мар 2011, 17:47

HarryStar писал(а):И почему часть новичков начинают не с начала, а сразу с USARTа или с боевых осьминогов с роборуками?
Что у вас не так, пока непонятно. Но объявления функций сделано уже нормально, значит прогресс есть.

я придумал себе задачу, USART это пока часть ее :) и пытаюсь на конкретном примере разобраться, конечно тяжело, но я думаю участники форума всетаки помогут мне :)

Re: Помогите с UART

Radist » 01 апр 2011, 05:55

Вот именно поэтому я и пишу свои программы на асемблере, а не на Си. Сколько раз пытался выучить его по самоучителю. Простое получалось, что-то посложнее - глючило. В результате я могу читать и понимать сишные программы (не слишком заумные), а писать - нет. Как и с английским - читаю и понимаю, но не говорю и не пишу. В асемблере с уартом все просто - есть управляющие регистры, в которые надо писать данные. Их структура описана в даташите. На Си надо делать то же самое, но при этом соблюсти все условия синтаксиса, которые у разных компиляторов немного различаются. По идее хорошо было бы знать оба эти языка. Но в любом случае нужно понимание. Если есть рабочий код, решающий вашу задачу, но нет понимания как он работает - такой код пользы не принесет. Поэтому считаю что пользование всякими мастерами и визардами для новичка - это вред. Он сгенерил код, который вы не понимаете - зачем вам это надо? Чтобы написать рабочий код нужно знать КАК писать (учебник по Си) и что писать (даташит).

Re: Помогите с UART

Duhas » 01 апр 2011, 08:08

Radist писал(а):Поэтому считаю что пользование всякими мастерами и визардами для новичка - это вред. Он сгенерил код, который вы не понимаете - зачем вам это надо? Чтобы написать рабочий код нужно знать КАК писать (учебник по Си) и что писать (даташит).



+100500

Re: Помогите с UART

AlexNail » 01 апр 2011, 23:45

Да я это прекрасно понимаю. Но все таки хотелось бы конкретнее. Мне нужна помощь, кто может помочь, помогите разобраться.

Re: Помогите с UART

Сергей » 02 апр 2011, 11:38

Сначала нужно научиться программированию, хотя бы базовому. Проблема не в UART и не в микроконтроллере, а в банальном незнании синтаксиса

Re: Помогите с UART

avr123.nm.ru » 02 апр 2011, 17:12

AlexNail писал(а):Мне нужна помощь, кто может помочь, помогите разобраться.
что там - Пример краткого курса по AVR - www.proavr.narod.ru/z5.htm - использование UART в AVR - www.proavr.narod.ru/z4.htm - вам не понятно ? Конкретно что ?

Re: Помогите с UART

к561ЛА7 » 05 апр 2011, 14:51

Непонятно вот что:

в задаче есть инициализация усарта и 2 команды - putchar и getchar,

а код вижн при настройки усарта выдает еще такую лабуду

Код: Выделить всёРазвернуть
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 256
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// USART Transmitter buffer
#define TX_BUFFER_SIZE 256
char tx_buffer[TX_BUFFER_SIZE];

#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif

// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
   {
   --tx_counter;
   UDR=tx_buffer[tx_rd_index];
   if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer[tx_wr_index]=c;
   if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
   ++tx_counter;
   }
else
   UDR=c;
#asm("sei")
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>


непонятную, что тут и зачем неясно и нужна лиона тоже неясно.


Rambler\'s Top100 Mail.ru counter