Skocz do zawartości

Atmega328 - USART nie wysyła danych do PC.


Pomocna odpowiedź

Napisano

Cześć,

Mam problem z wysłaniem danych do PC poprzez moduł USART. Korzystam z konvertera USB - TTL.

Podłączenie:

GND - do masy

RXD - do pinu PD1 mikrokontrolera (TXD)

F_CPU=16000000

Korzystam z programu TerraTerm i na konsoli nie pojawiają się żadne dane. Gdy wpisuję coś do konsoli to miga dioda TRANSMIT na konwerterze. Niesetety dane z kontrolera nie są wysyłane.

Czy ktoś wie gdzie może być problem?

Z góry dziękuję za pomoc.

Kod poniżej:

#include <avr/io.h>
#include <util/delay.h>

void uart_9600()
{
#define BAUD 9600
#include <util/setbaud.h>
UBRR0L = UBRRL_VALUE;
UBRR0H = UBRRH_VALUE;

#if USE_2X
UCSR0A |= 1 << U2X0;
#else
UCSR0A &= ~(1 << U2X0);
#endif
}

void usart_init()
{
uart_9600();
UCSR0C |= UCSZ00 | UCSZ01;
UCSR0B |= TXEN0;
}

void usart_send(uint8_t data)
{
while(!(UCSR0A & (1 << UDRE0)));
UDR0 = data;
}

int main(void)
{
usart_init();

while (1)
{
	usart_send(123);
}
}
Aktualnie program nie widzi i w ogóle portu. Innym razem przy innej konfiguracji program widział port jednak na konsoli nie pojawiały się żadne dane.

Czy ktoś wie gdzie może być problem?

Mieszasz dwa problemy, zupełnie niepotrzebnie.

Pierwszy to wykrywanie dongla przez komputer - najpierw to rozwiąż.

Potencjalne źródła? Może problem ze sterownikami, może uszkodzony dongiel, może coś innego. Ciężko powiedzieć.

Dopiero jak będziesz miał niezawodnie działający konwerter (tzn. wykrywany przez system), to zacznij uruchamiać Twój program.

Poprawiłem post jakieś 5 minut temu 😉. Problem z wykrywaniem został rozwiązany.

Tak jak pisałem wyżej, dane nie pojawiają się na konsoli. Podczas wpisywania wartości do konsoli na konwerterze świeci się lampka TRANSMIT. Niestety lampka RECEIVE się nie świeci.

    UCSR0C |= UCSZ00 | UCSZ01;
   UCSR0B |= TXEN0;

Błąd, jak już to powinno być

    UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01);
   UCSR0B |= (1<<TXEN0);

Ehhh ale gafa... Dzięki teraz działa. Nie wiem jak mogłem to przeoczyć.

Tak, przy okazji jak na postawie wartości w rejestrze UBRR0 obliczyć długość trwania bitu?

Czytam książkę "Język C dla mikrokontrolerów AVR" i tam autor podaje przykład na sterowanie diodami WS2812 poprzez UART.

UBRR0=49;  //Dla 16 MHz daje to czas trwania bitu równy 6,25 us, a bajtu 50 us

Ale skąd taka wartość? Jak on to obliczył? Chciał uzyskać baud rate na poziomie 160000, alewedług kalkulatorów na internecie żeby uzyskać taki baud rate należy ustawić rejestr UBBR0 na 5.

Niestety nie znam odpowiedzi, ale myślę, że jak się wczytasz w dokumentację, to sprawa powinna się rozjaśnić.

Ok, doczytałem rozdział Clock Generation i okazało się, że korzystałem ze wzoru dla Asynchronous Normal mode, a w trybie SPI należy korzystać ze wzoru Synchronous Master Mode.

Dzięki za pomoc 🙂.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...