Skocz do zawartości
dejmieno

Atmega328 - USART nie wysyła danych do PC.

Pomocna odpowiedź

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);
}
}

Udostępnij ten post


Link to post
Share on other sites
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.

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites
    UCSR0C |= UCSZ00 | UCSZ01;
   UCSR0B |= TXEN0;

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

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

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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 🙂.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...