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)
{
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();
}
int main()
{
while(1)
{
out(outs);
}
}
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
}
Контроллер связан с компьютером через rs485. Со связью вроде разобрались все работает. Но как только подключаем функцию out(outs); все рушится. Ножка направления передачи PD2 начинает жить своей жизнью. И здесь мне совсем уж непонятно что не так и какой участок кода дергает ножку.