alexey6522 писал(а):Уже руки опускаются с этих COM портом, интересно, а с USB HID так же тяжело работать, мда, наверно моя панель для авиасимулятора будет долго разрабатываться, хочу сделать панель автопилота с ручками задачи высоты авт. скорости и т.д.
и что бы все значения отображались на индикаторе
Во первых определитесь со скоростью МК - от нее будет плясать скорость передачи.
8МГц тактовая / (16*9600) -1 = 51.08 в UBRR заносим 51
8 МГц / (16*57600) -1 = 7.68 - работать не будет т.к. велика ошибка
8 МГц / (8*57600)-1 = 16.36 - работать может и будет, но неустойчиво
8 МГц / (8*38400)-1 = 25.04 - в UBRR заносим 25, в
UCSRA установить бит U2X - т.к. искользуем удвоение скорости (в делителе 8 а не 16)
12 Мгц / (8*57600) = 25.04 - в UBRR заносим 25, в
UCSRA установить бит U2X - т.к. искользуем удвоение скорости (в делителе 8 а не 16)
Первый и последние два варианта будут работать 100%
Теперь отправка:
Код: Выделить всё
void USART_vSendByte_as_hex(const unsigned char u8Data) {
/*Отправляем байт в ASCII HEX кодах*/
uint8_t tmp;
// Wait if a byte is being transmitted
while((UCSRA&(1<<UDRE)) == 0);
// Transmit data
tmp= (u8Data>>4) & 0x0f; //старший нибл
if (tmp<10) tmp+=0x30; else tmp+=0x37;
UDR = tmp;
while((UCSRA&(1<<UDRE)) == 0);
// Transmit data
tmp= u8Data & 0x0f; // младший нибл
if (tmp<10) tmp+=0x30; else tmp+=0x37;
UDR = tmp;
}
Отправка строки
строка должна заканчиваться нулем (0x00)
Код: Выделить всё
void USART_vSend_str(const char *data) {
char *tmp;
tmp=data;
while (*tmp) {
// Wait if a byte is being transmitted
while((UCSRA&(1<<UDRE)) == 0);
// Transmit data
UDR = *tmp;
tmp++;
}
}
Отправлять строку можно как обычно USART_vSend_str("Hello");
Нулевой символ добавит компилятор, а если надо отправить буфер USART_vSend_str(buff);
То Вам надо позаботиться о том, что-бы последним символом был 0