Сколько можно передать по 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... не спрашивайте даже
Реклама
Ответить

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