Обращаюсь к опытным программистам, а так же к начинающим.
Если Вам будет не сложно, то заходите в эту тему, чтобы помогать и исправлять ошибки начинающих писак кода, чтобы меньше было говнокода .
За ранее всем участникам спасибо.
Пишу для ATmega8 в AtmelStudio (вернее собираю прошивку в нём, а пишу в Notepad++).
Сейчас изучаю приём/передачу данных по UART.
Стояла задача передать массив с 16 битными данными. С передачей массива немного разобрался, но вот передавать 16 бит через 8 битный буфер зашёл в тупик. Передаю только 8 бит данных из массива.
Как передавать 16 бит?
Пока решил таким способом.
Вот код:
Code: Select all
#define F_CPU 1000000UL // 1 MHz
#include <avr/io.h>
#include <uart.h>
#include <util/delay.h>
#define FOSC 1000000L //Тактовая частота
#define BAUD 4800L //Скорость порта
#define MYUBRR FOSC/16/BAUD-1
void USART_Transmit(void);
void USART_Init( unsigned int ubrr);
uint16_t Massiv [16] = {0,1,2,3,4,5,6,7,8,9,10,11,24,255,256,1140}; // массив 2 байтых данных
//Функция отправки данных
void USART_Transmit(void)
{
for (int i=0;i<16;i++)
{
uint16_t Temp=Massiv[i];
uint8_t TempH=Temp>>8;
uint8_t TempL=Temp;
while (!(UCSRA & (1<<UDRE))); //Ожидание опустошения буфера приема
UDR=TempH;
while (!(UCSRA & (1<<UDRE))); //Ожидание опустошения буфера приема
UDR=TempL;
}
}
//Инициализация модуля USART
void USART_Init( unsigned int ubrr)
{
//Задаем скорость работы USART
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
UCSRB = (1<<TXEN); //разрешёна передача
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
int main(void)
{
USART_Init (MYUBRR);
while(1)//вечный цикл
{
USART_Transmit();
_delay_ms(1000);
}
}