Сколько можно передать по UART ?

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
CheerfulCalf
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Чт мар 22, 2012 13:25:31
Откуда: Odense, Danmark

Сколько можно передать по UART ?

Сообщение CheerfulCalf »

Извиняюсь за столь тупой вопрос, но перечитал всё а не понял (видать спал на лекциях, а сейчас чего-то не хватает)

Есть ATmega16 (8MHz), Com1 (9600). Надо из МК в ПК посылать через UART стринги в виде "[PA0=1022]". Сколько таких стрингов можно послать максимум, как это число увеличить?

(Надо сделать максимальную точность отображения на компе изменения напряжения).
Теперешний вариант
Спойлер

Код: Выделить всё

#define F_CPU 8000000

#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/sleep.h>
#include <util/delay.h>

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
#define uint  unsigned int
#define new_line "\r\n"

void USART_Init(void)
{
   UCSRB |= (1 << RXEN) | (1 << TXEN);
   UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
   UBRRH = (BAUD_PRESCALE >> 8);
   UBRRL = BAUD_PRESCALE;
   UCSRB |= (1 << RXC);
}

void USART_SendByte(uint8_t u8Data)
{   
   while((UCSRA &(1<<UDRE)) == 0);
   UDR = u8Data;
}

void USART_PutString(char* StringPtr)
{
   while(*StringPtr != 0x00)
   {
      USART_SendByte(*StringPtr);
      StringPtr++;
   }
}

void IO_init(void)
{
   DDRA = 0x00;
   PORTA = 0x3;
   asm("nop");
}

void ADC_init(void)
{
   ADMUX=(1<<REFS0);
   ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
   set_sleep_mode(SLEEP_MODE_ADC);
}

unsigned int ADC_read(unsigned char ch)
{
   uint16_t summary = 0;
   uint8_t count = 0;
   uint8_t sreg;   
   ADMUX = (0<<ADLAR) | (ch&0b1111);
   while(count<64)
   {      
      ADCSRA |= (1<<ADSC);      
      while( ! (ADCSRA&(1<<ADIF)) ) asm("nop");      
      ADCSRA |= (1<<ADIF);
      sreg = SREG;
      cli();
      summary += ADC;
      SREG = sreg;
      count++;
   }

   return (summary>>6);
}
   
int main()
{
   char buffer [33];
   char* voltage;
   
   IO_init();
   USART_Init();   
   ADC_init();
   USART_PutString("HELLO");
   USART_PutString(new_line);

   while(1)
   {
      asm("sei");
      
      for(uint i = 0; i < 9; i++)
      {
         voltage=ADC_read(i);
         USART_PutString("[PA0=");
         USART_PutString(itoa(voltage, buffer, 10));
         USART_PutString("]");         
      }
   }
}
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Сколько можно передать по UART ?

Сообщение Meteor »

CheerfulCalf писал(а):Есть ATmega16 (8MHz), Com1 (9600).

Скорость понятна, а какой формат? Что с паритетом?
CheerfulCalf писал(а):Надо из МК в ПК посылать через UART стринги в виде "[PA0=1022]".

Насколько понял в протоколе будет 10 символов.
CheerfulCalf писал(а):Сколько таких стрингов можно послать максимум, как это число увеличить?

Найдите скорость передачи одного байта с учетом всех служебных битов. Для этого скорость 9600 надо разделить на число этих бит.
Затем полученную скорость разделить на число символов. У вас, не считая кавычек, их 10.
Что касается "сколько максимум?" то встречный вопрос, а за какое время?
Расчет описанный выше, дает число строк за одну секунду. Для других интервалов - надо множить на сам интервал.
Число строк увеличивают либо за счет скорости передачи, либо за счет сокращения данных.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Ответить

Вернуться в «Теория»