Набросал не большой код:
UART настраивал на скорость в 9600 , 8 бит данных, 1 стоп бит и без бита парритета. Плюс отключен параметр удвоения скорости.
CODE
#define F_CPU 12000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include <stdlib.h>
#include <avr/io.h>
#include <stdio.h>
#include <stddef.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//Переменные
volatile char buf[26]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
volatile char dat[26]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
unsigned char i,cnt,y;
// Функция включения USART_D1, cкорость 9600( а надо 250000) bod
void StartUsartD1()
{
USARTD1_BAUDCTRLB = 0;
USARTD1_BAUDCTRLA = 0x4D;
USARTD1_CTRLA = 0; //Отключение прерываний
USARTD1_CTRLC = USART_CHSIZE_8BIT_gc; //8 data bits, no parity and 1 stop bit
USARTD1_CTRLB = USART_TXEN_bm | USART_RXEN_bm; //Включение приема передатчика
PORTD_OUTSET = PIN7_bm; //Настраиваем выводы PC6 и PC7
PORTD_DIRSET = PIN7_bm;
PORTD_OUTCLR = PIN6_bm;
PORTD_DIRCLR = PIN6_bm;
}
// Функция получения данных USART_D1.
char getChar1(void)
{
char buffer1;
while (1)
{
while( !(USARTD1_STATUS & USART_RXCIF_bm) );
buffer1=USARTD1_DATA;
//if ((USARTD1_STATUS & (USART_BUFOVF_bm))==0)
if ((USARTD1_STATUS & (USART_FERR_bm | USART_PERR_bm | USART_BUFOVF_bm))==0)
return buffer1;
};
}
// Фунуция передачи данных USART_D1
void sendChar1(char d1)
{
while( !(USARTD1_STATUS & USART_DREIF_bm) );
USARTD1_DATA = d1;
}
// Функция инициализации
int main(void)
{
// Настройка работы от внешнего кварца в 12МГц
cli();
OSC.XOSCCTRL = 0x8B;
OSC.CTRL = 0x08;
while((OSC.STATUS & 0x08) == 0);
//PORTD.OUTSET =0x04;
PORTD.DIR = 0x04;
//Активация USART
StartUsartD1();
while (1)
{
cnt = getChar1();
if (cnt ==0x55) {
for (i=0;i<12;i++) sendChar1(buf[i]);
}
else {
for (i=0;i<12;i++) sendChar1(dat[i]); }
};
}
#define __DELAY_BACKWARD_COMPATIBLE__
#include <stdlib.h>
#include <avr/io.h>
#include <stdio.h>
#include <stddef.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//Переменные
volatile char buf[26]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
volatile char dat[26]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
unsigned char i,cnt,y;
// Функция включения USART_D1, cкорость 9600( а надо 250000) bod
void StartUsartD1()
{
USARTD1_BAUDCTRLB = 0;
USARTD1_BAUDCTRLA = 0x4D;
USARTD1_CTRLA = 0; //Отключение прерываний
USARTD1_CTRLC = USART_CHSIZE_8BIT_gc; //8 data bits, no parity and 1 stop bit
USARTD1_CTRLB = USART_TXEN_bm | USART_RXEN_bm; //Включение приема передатчика
PORTD_OUTSET = PIN7_bm; //Настраиваем выводы PC6 и PC7
PORTD_DIRSET = PIN7_bm;
PORTD_OUTCLR = PIN6_bm;
PORTD_DIRCLR = PIN6_bm;
}
// Функция получения данных USART_D1.
char getChar1(void)
{
char buffer1;
while (1)
{
while( !(USARTD1_STATUS & USART_RXCIF_bm) );
buffer1=USARTD1_DATA;
//if ((USARTD1_STATUS & (USART_BUFOVF_bm))==0)
if ((USARTD1_STATUS & (USART_FERR_bm | USART_PERR_bm | USART_BUFOVF_bm))==0)
return buffer1;
};
}
// Фунуция передачи данных USART_D1
void sendChar1(char d1)
{
while( !(USARTD1_STATUS & USART_DREIF_bm) );
USARTD1_DATA = d1;
}
// Функция инициализации
int main(void)
{
// Настройка работы от внешнего кварца в 12МГц
cli();
OSC.XOSCCTRL = 0x8B;
OSC.CTRL = 0x08;
while((OSC.STATUS & 0x08) == 0);
//PORTD.OUTSET =0x04;
PORTD.DIR = 0x04;
//Активация USART
StartUsartD1();
while (1)
{
cnt = getChar1();
if (cnt ==0x55) {
for (i=0;i<12;i++) sendChar1(buf[i]);
}
else {
for (i=0;i<12;i++) sendChar1(dat[i]); }
};
}
Скомпилировал, прошил, запускаю терминал
По моей задумке если я отправляю 0x55(символ юникода получается U) то мне шлется массив с 0xFF, если что нить другое то 0x55.
В итоге две проблемы:
1) ответ идет в виде массива 0x0E, в теории говорит что скорость настроена не правильно. Но вроде перепроверил все.

BSEL = 12000000/(2^0 * 16 * 9600) = 78.125 -1 = 77 (0x4D)
2) Как только прошил схему, без отправки контроллеру чего либо, он мне уже присылает в ответ 2 массива.
Помогите пожалуйста разобраться
