Доброго времени уважаемые форумчане.
Занесла меня нелегкая снова на путь AVR ))))
Есть готовая плата, но нужно модернизировать а лучше с нуля написать прошивку под USART.
У самого весит очень большой проект, над которым сейчас работаю и времени на решение этой задачки попросту нет, к томуже с рождением сына его катастрофически стало не хватать. Вот и прошу помощи. Писал раньше в Atmel Studio 6.0, сейчас просто сменил архитектуру с AVR на ARM и чтобы заняться этим вопросом многое надо вспоминать.
Данные:
Async Serial
4800 bit rate
8 bit
1 stop bit
Even parity bit
LSB first
Используемый мк - Atmega8-16AU
Выводы PD2 - на прием, PD6 или PB1 - на передачу.
Цель организовать прием и передачу с заданными параметрами.
При приеме данных 1E 66 FF передавать в ответ FF FB CD 21
При приеме первого пакета данных в начале передачи ответа формировать сперва данные 21 21 21 а после передавать ответы на запросы.
Если после прекращения на приеме отсутствую пакеты данных и устанавливается лог 1 то постоянно выдавать данные 21 21 21 21.....
Пример:
Вложение:
Комментарий к файлу: Фрагмент приема передачи начало - конец
USART.jpg [152.86 KiB]
Скачиваний: 445
PS платные варианты помощи тоже приветсвуються (в личных сообщениях)
Добавлено after 9 hours 29 minutes:Ну что-же, начну понемногу сам отвечать на свои вопросы, попутно вспоминая азы AVR
Настройка AVR:
Код:
#ifndef F_CPU
#define F_CPU 8000000UL // рабочая частота
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
int init_UART(void)
{
// Установка скорости 4800
UBRRH=0;
UBRRL=103;
UCSRA=0b00000000;
UCSRB|=(1<<RXEN)|(1<<RXCIE)|(1<<TXEN);
UCSRC=0b10100110; // 8bit EPB 1Stop
}
Прием данных и их обработка:
Код:
volatile unsigned char i=0;
volatile unsigned long data;
ISR(USART_RXC_vect) //прерывание по приему
{
temp[i]=UDR;
if (temp[i]==0xFF)
{
data = 0;
S = 1;
for(i=i-1; i!=0; i--)
{
data = data+temp[i];
}
}
else
{
i++;
}
}
По факту мы приняли 0x1E 0x66 0xFF и записали его в буфер.
Прошу дальнейшей помощи.