Есть 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("]");
}
}
}