Witajcie,
próbuję właśnie wykorzystać bibliotekę RKAvrLib do realizacji transmisji RS485 w oparciu o przerwania i tu napotkałem problem...
Po inicjalizacji UART'u wszystko działa poprawnie, dopóki nie próbuję wysłać jakiegokolwiek komunikatu przez UART.
przykładowo wywołanie:
uruchamia funkcję biblioteczną:
Wysyła ona w pętli kolejne znaki do funkcji putchar:
Która po zakończeniu powoduje restart programu / zawieszenie się procesora i w rezultacie również restart albo po prostu powrót do początku main().
Wykomentowanie oznaczonej linii sprawia, iż program przestaje się wysypywać. Oczywiście wysyłanie wtedy nie działa.
Obsługa przerwania jest zrealizowana następująco:
Co może być przyczyną problemów z działaniem?
Pozdrawiam serdecznie i z góry dziękuję za pomoc...
Patryk
próbuję właśnie wykorzystać bibliotekę RKAvrLib do realizacji transmisji RS485 w oparciu o przerwania i tu napotkałem problem...
Po inicjalizacji UART'u wszystko działa poprawnie, dopóki nie próbuję wysłać jakiegokolwiek komunikatu przez UART.
przykładowo wywołanie:
UART_putstr_P(PSTR("Test nadawania"))uruchamia funkcję biblioteczną:
#include "../uart.h"
void UART_putstr_P(const char *s) // wysyła łańcuch s z FLASH na UART
{
#ifdef UART_DE_PORT
// sbi(UART_DE_PORT,UART_DE_BIT); // odblokuj nadajnik RS485
#endif
register u08 c;
while ((c = pgm_read_byte(s++))) // dopóki nie napotkasz 0
{
UART_putchar(c); // wysyłaj znak
}
#ifdef UART_DE_PORT
// cbi(UART_DE_PORT,UART_DE_BIT); // zablokuj nadajnik RS485
#endif
}
Wysyła ona w pętli kolejne znaki do funkcji putchar:
#include "../uart.h"
int UART_putchar(char c) // wysyła znak c na UART
{
// cbi(_UCR_,RXEN); // zablokuj odbior
sbi(UART_DE_PORT,UART_DE_BIT); // odblokuj nadajnik RS485
while((UART_BUF_SIZE - (UART_t_in - UART_t_out)) <= 2); // Wait...
// Add data to the transmit buffer, enable TXCIE
UART_tbuf[UART_t_in & UART_TMASK] = c;
UART_t_in++;
// ------------ PROBLEM WYWOŁUJE TA LINIA: ----------//
sbi(_UCR_, UDRIE); // włącz przerwanie od pustego bufora
// ------------ PROBLEM WYWOŁUJE POWYŻSZA LINIA ----------//
cbi(UART_DE_PORT,UART_DE_BIT); // zablokuj nadajnik RS485
// sbi(_UCR_,RXEN); // odblokuj odbior
return 0;
}
Która po zakończeniu powoduje restart programu / zawieszenie się procesora i w rezultacie również restart albo po prostu powrót do początku main().
Wykomentowanie oznaczonej linii sprawia, iż program przestaje się wysypywać. Oczywiście wysyłanie wtedy nie działa.
Obsługa przerwania jest zrealizowana następująco:
SIGNAL(SIG_UART_DATA)
{
if(UART_t_in != UART_t_out)
{
_UDR_ = UART_tbuf[UART_t_out & UART_TMASK];
UART_t_out++;
}
else
{
_UCR_ &= ~(1<<UDRIE);
}
}
Co może być przyczyną problemów z działaniem?
Pozdrawiam serdecznie i z góry dziękuję za pomoc...
Patryk
