Mam bardzo dziwny problem. Dziwny o tyle że ten sam program na niemal identycznym układzie działa a teraz nie chce.
Wysyłam znaki na uart za pomocą procedury:
W mainie wygląda to tak:
Uart inicjowany jest wg datasheeta więc napewno jest poprawny.
To wersja bardziej rozbudowana ale nawet po wyrzuceniu tego co niepotrzebne dzieje się to samo a mianowicie:
Czy ktoś ma pojęcie o co może tutaj chodzić? Dlaczego wysłanie znaku restartuje procla? przecież bufer sie nie przepełnia ;/ (/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE)) ) )
Dodano po 1 [godziny] 4 [minuty]:
czy zamiast UDRE nie powinno być UDRE0 ?
dałem UDRE0 i nadal dzieje się to samo
Wysyłam znaki na uart za pomocą procedury:
void TS(char * line)
{
USART0_Transmit_Word(line);
USART0_Transmit(0x0D);
USART0_Transmit(0x0A); [b]<--- ta linijka psuje wszystko - jeśli wywołam tą funkcje dwa razy z rzędu program się restartuje, why?![/b]
}void USART0_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR0 = data;
}
/////////////////////////////////////////////////////
void USART0_Transmit_Word(char *data)
{
while (*data)
USART0_Transmit(*data++);
}W mainie wygląda to tak:
main {
TS("start");TS("123");
while (1)
{
TS("xxx");
LED5_TOGGLE;
_delay_ms(200);
}Uart inicjowany jest wg datasheeta więc napewno jest poprawny.
#define FOSC 8000000 // Clock Speed
#define BAUD_UART0 19200
#define BAUD_UART1 9600
#define USART0PORT PORTE
#define USART0DDR DDRE
#define RX0PIN 0
#define TX0PIN 1
#define USART1PORT PORTD
#define USART1DDR DDRD
#define RX1PIN 2
#define TX1PIN 3
//////////////////////////////////////////////////////
void USARTs_Init()
{
unsigned int ubrr = FOSC/16/BAUD_UART1-1;
/* Set baud rate */
UBRR1H = (unsigned char)(ubrr>>8);
UBRR1L = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSR1B = (1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
/* Set frame format: 8data, 1stop bit */
UCSR1C = (3<<UCSZ10);
ubrr = FOSC/16/BAUD_UART0-1;
/* Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 1stop bit */
UCSR0C = (3<<UCSZ00);
// Ustawienie portów
// DDR
USART0DDR |= _BV(RX0PIN);
USART0DDR &= ~_BV(TX0PIN);
USART1DDR |= _BV(RX1PIN);
USART1DDR &= ~_BV(TX1PIN);
// PORT
USART0PORT |= _BV(RX0PIN);
USART0PORT |= _BV(TX0PIN);
USART1PORT |= _BV(RX1PIN);
USART1PORT |= _BV(TX1PIN);
}To wersja bardziej rozbudowana ale nawet po wyrzuceniu tego co niepotrzebne dzieje się to samo a mianowicie:
Czy ktoś ma pojęcie o co może tutaj chodzić? Dlaczego wysłanie znaku restartuje procla? przecież bufer sie nie przepełnia ;/ (/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE)) ) )
Dodano po 1 [godziny] 4 [minuty]:
czy zamiast UDRE nie powinno być UDRE0 ?
dałem UDRE0 i nadal dzieje się to samo