Ср июн 22, 2022 21:41:49
ISR(USART_TX_vect) // прерывание по завершению отправки
{
PORTD &= ~0b00000100; // Отпускаем ножку направления PD2 по прерыванию завершения отправки данных
UCSR0B &= ~(1 << TXCIE0);
UCSR0B |= (1 << RXCIE0);
}
//Прерывание по опустошению буффера УАПП
ISR(USART_UDRE_vect)
{
PORTD |= 0b00000100; // Поднимаем ножку направления PD2 по прерыванию начала отправки данных
if (bufferIndexOut >= INDEX_MAX) // Вывели весь буффер?
{
bufferIndexOut = 0;
UCSR0B &= ~(1 << UDRIE0); // Запрещаем прерывание по опустошению - передача закончена
}
else
{
UDR0 = inString[bufferIndexOut];
bufferIndexOut++; // Увеличиваем индекс
}
}
ISR(USART_RX_vect) // прерыванию по окончанию приема модуля USART
{
inchar = UDR0;
if (inchar == 0x2A)
bufferIndexIn = 0;
if (bufferIndexIn < 14)
{
inString[bufferIndexIn] = inchar;
bufferIndexIn++;
}
if (bufferIndexIn > 13) // Вывели весь буффер?
{
bufferIndexIn = 0; // Сбрасываем индекс массива
UCSR0B |= (1 << UDRIE0) | (1 << TXCIE0); // Разрешаем прерывание по опустошению - начинаем передачу массива
}
}
Чт июн 23, 2022 10:09:12
Чт июн 23, 2022 10:42:57
Чт июн 23, 2022 14:48:06
Чт июн 23, 2022 15:49:17
ISR(USART_TX_vect) // прерывание по завершению отправки
{
cli();
if (bufferIndexOut <= 13)
{
UDR0 = inString[bufferIndexOut];
bufferIndexOut++; // Увеличиваем индекс
}
else if (bufferIndexOut > 13) // Вывели весь буффер?
{
PORTD &= ~0b00000100; // Опускаем ножку направления PD2 по прерыванию начала отправки данных
bufferIndexOut = 0;
UCSR0B &= ~(1 << TXCIE0);
UCSR0B |= (1 << RXCIE0);
}
sei();
}
//Прерывание по опустошению буффера УАПП
ISR(USART_RX_vect) // прерыванию по окончанию приема модуля USART
{
cli();
inchar = UDR0;
if (inchar == 0x2A)
bufferIndexIn = 0;
if (bufferIndexIn < 14)
{
receiveDog=0;
inString[bufferIndexIn] = inchar;
bufferIndexIn++;
}
if (bufferIndexIn > 13) // Вывели весь буффер?
{
bufferIndexIn = 0; // Сбрасываем индекс массива
bufferIndexOut = 0; // Сбрасываем индекс массива
UCSR0B &= ~(1 << RXCIE0);
UCSR0B |= (1 << TXCIE0);
PORTD |= 0b00000100; // Поднимаем ножку направления PD2 по прерыванию начала отправки данных
UDR0 = inString[bufferIndexOut];
bufferIndexOut++;
}
sei();
}
Чт июн 23, 2022 16:53:04
Чт июн 23, 2022 17:42:00
Чт июн 23, 2022 17:58:09
Чт июн 23, 2022 18:05:51
Чт июн 23, 2022 20:33:40
Пт июн 24, 2022 01:36:49
Пт июн 24, 2022 10:37:43
Пт июн 24, 2022 11:46:33
Пт июн 24, 2022 15:42:46
а если весь буфер передан, то разрешается прерывание по окончанию передачи
Сб июн 25, 2022 16:03:39
Вот немного изменённый вариант с отслеживанием регистра данных (UDR0)…
Вложение:
UART_Demo_V2.hex [1.18 KiB]
Скачиваний: 2
Передача пакета должна происходить быстрее по сравнению с предыдущей версией. Попробуй… если всё будет работать нормуль, то попробую описать славами как нужно сделать…
void out(uint16_t x)
{
PORTD |= 0xC0; // OE1,2 disable
DDRB = 0b00001111; // portB out
DDRC = 0b00011111; // portC out
PORTB = (PORTB & 0xF0) | (uint8_t)(x & 0x000F); // 1nd 4bit write
PORTC = (PORTC & 0xF0) | (uint8_t)((x & 0x00F0) >> 4); // 2nd 4bit write
PORTD |= 0x10; // CLK1 OUT ENABLE
PORTD &= 0xEF; // CLK1 OUT DISABLE
PORTB = (PORTB & 0xF0) | (uint8_t)((x & 0x0F00) >> 8); // 3nd 4bit write
PORTC = (PORTC & 0xF0) | (uint8_t)((x & 0xF000) >> 12); // 4nd 4bit write
PORTD |= 0x20; // CLK2 OUT ENABLE
PORTD &= 0xDF; // CLK2 OUT DISABLE
DDRB = 0b00000000; // portB IN
DDRC = 0b00010000; // portC IN
}
Сб июн 25, 2022 16:38:46
Пн июн 27, 2022 16:19:59
Вот немного изменённый вариант с отслеживанием регистра данных (UDR0)…
Передача пакета должна происходить быстрее по сравнению с предыдущей версией. Попробуй… если всё будет работать нормуль, то попробую описать славами как нужно сделать…
Пн июн 27, 2022 17:04:39
Пн июн 27, 2022 17:15:02
Пн июн 27, 2022 17:21:01