Witam,
Mam problem z transmisją szeregową na ATMEGA8L. Próbowałem wszystkich znalezionych na forum możliwości ale nic nie pomogło.
Może zacznę od połączeń:
atmega8l <-> MAX3232 <-> PC
MAX-sior (właściwie zamiennik SP3232ECP) podłączony jest według zaleceń datasheet'a. Miedzy MAX-em a PC-tem jest zwykły kabel rs232 (w sensie, że nie przejściówka usb).
Te połączenia są raczej prawidłowe - zwarcie RX z TX za MAX-em powoduje echo.
F_CPU ustawione na 8000000, na procku odpowiednie fusebity także. Baudrate = 19200.
Kod na procku jedynie robi echo.
Rezultaty:
Po połączeniu terminalem (niestety zwykły hypertrm ...) z prędkością 19200 zamiast echa dostaje dziwne znaczki. Po połączeniu z prędkością 9600 lub 4800 - niektóre znaki są ok, a niektóre pozamieniane lub też krzaki.
Jak już wspomniałem próbowałem zabawy z różnymi ustawieniami (F_CPU na 1000000 chyba też - ale jeszcze sprawdzę) ale nic nie pomogło - a że jestem laikiem jeśli chodzi o elektronikę to wolę się zapytać od razu na forum niż tracić czas na losowe próby z losowymi wartościami itp.
Może ktoś ma listę najczęściej popełnianych błędów przy zabawie z UART-em ?
Oto kawałek kodu, który wrzucam na procka (obsługa UART-a jest z atmel-owskeigo datasheet-a):
Mam problem z transmisją szeregową na ATMEGA8L. Próbowałem wszystkich znalezionych na forum możliwości ale nic nie pomogło.
Może zacznę od połączeń:
atmega8l <-> MAX3232 <-> PC
MAX-sior (właściwie zamiennik SP3232ECP) podłączony jest według zaleceń datasheet'a. Miedzy MAX-em a PC-tem jest zwykły kabel rs232 (w sensie, że nie przejściówka usb).
Te połączenia są raczej prawidłowe - zwarcie RX z TX za MAX-em powoduje echo.
F_CPU ustawione na 8000000, na procku odpowiednie fusebity także. Baudrate = 19200.
Kod na procku jedynie robi echo.
Rezultaty:
Po połączeniu terminalem (niestety zwykły hypertrm ...) z prędkością 19200 zamiast echa dostaje dziwne znaczki. Po połączeniu z prędkością 9600 lub 4800 - niektóre znaki są ok, a niektóre pozamieniane lub też krzaki.
Jak już wspomniałem próbowałem zabawy z różnymi ustawieniami (F_CPU na 1000000 chyba też - ale jeszcze sprawdzę) ale nic nie pomogło - a że jestem laikiem jeśli chodzi o elektronikę to wolę się zapytać od razu na forum niż tracić czas na losowe próby z losowymi wartościami itp.
Może ktoś ma listę najczęściej popełnianych błędów przy zabawie z UART-em ?
Oto kawałek kodu, który wrzucam na procka (obsługa UART-a jest z atmel-owskeigo datasheet-a):
//=======================| MAIN |==========================
int main( void )
{
unsigned char hex = 0;
InitUART( 9600 );
/* Enable interrupts => enable UART interrupts */
_SEI();
/* while FOREVER */
for(;;)
{
hex = ReceiveByte();
TransmitByte(hex);
}
return 0;
}
//=======================| UART |==========================
/* UART Buffer Defines */
#define UART_RX_BUFFER_SIZE 512 /* 2,4,8,16,32,64,128 or 256 bytes */
#define UART_TX_BUFFER_SIZE 128
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 )
#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1 )
#if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )
#error TX buffer size is not a power of 2
#endif
/* Static Variables */
static volatile unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
static volatile unsigned char UART_RxHead;
static volatile unsigned char UART_RxTail;
static volatile unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
static volatile unsigned char UART_TxHead;
static volatile unsigned char UART_TxTail;
/* Initialize UART */
void InitUART( unsigned long int baudrate )
{
unsigned char x;
UBRRH = (unsigned char)(((F_CPU/(16UL*baudrate))-1)>>8);
UBRRL = (unsigned char)((F_CPU/(16UL*baudrate))-1);
/* Enable UART receiver and transmitter, and both interrupts */
UCSRB = ((1<<RXCIE) | (1<<RXEN) | (1<<TXEN));
UCSRC = (1<<URSEL)|(1<<UCSZ0);
x = 0; /* Flush receive buffer */
UART_RxTail = x;
UART_RxHead = x;
UART_TxTail = x;
UART_TxHead = x;
}
/* Interrupt handlers */
ISR(USART_RXC_vect)
{
unsigned char data;
unsigned char tmphead;
data = UDR; /* Read the received data */
/* Calculate buffer index */
tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;
UART_RxHead = tmphead; /* Store new index */
if ( tmphead == UART_RxTail )
{
/* ERROR! Receive buffer overflow */
}
UART_RxBuf[tmphead] = data; /* Store received data in buffer */
}
ISR(USART_UDRE_vect)
{
unsigned char tmptail;
/* Check if all data is transmitted */
if ( UART_TxHead != UART_TxTail )
{
/* Calculate buffer index */
tmptail = ( UART_TxTail + 1 ) & UART_TX_BUFFER_MASK;
UART_TxTail = tmptail; /* Store new index */
UDR = UART_TxBuf[tmptail]; /* Start transmition */
}
else
{
UCSRB &= ~(1<<UDRIE); /* Disable UDRE interrupt */
}
}
/* Read and write functions */
unsigned char ReceiveByte( void )
{
unsigned char tmptail;
while ( UART_RxHead == UART_RxTail ) /* Wait for incomming data */
;
tmptail = ( UART_RxTail + 1 ) & UART_RX_BUFFER_MASK;/* Calculate buffer index */
UART_RxTail = tmptail; /* Store new index */
return UART_RxBuf[tmptail]; /* Return data */
}
void TransmitByte( unsigned char data )
{
unsigned char tmphead;
/* Calculate buffer index */
tmphead = ( UART_TxHead + 1 ) & UART_TX_BUFFER_MASK; /* Wait for free space in buffer */
while ( tmphead == UART_TxTail );
UART_TxBuf[tmphead] = data; /* Store data in buffer */
UART_TxHead = tmphead; /* Store new index */
UCSRB |= (1<<UDRIE); /* Enable UDRE interrupt */
}
