Skocz do zawartości

[C][USART] Wysyłanie z powrotem odebranego bajtu


Pomocna odpowiedź

Napisano

Witam posiadam taki oto kod.

#include <avr/io.h> 

#define USART_BAUDRATE 9600 
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 

int main (void) 
{ 
  char ReceivedByte; 

  UCSRB |= (1 << RXEN) | (1 << TXEN);   // Turn on the transmission and reception circuitry 
  UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes 

  UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register 
  UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register 

  for (;;) // Loop forever 
  { 
     while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been recieved and is ready to be read from UDR 
     ReceivedByte = UDR; // Fetch the recieved byte value into the variable "ByteReceived" 

     while ((UCSRA & (1 << UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it 
     UDR = ReceivedByte; // Echo back the received byte back to the computer 
  }    
}

Prosiłbym o sprawdzenie go pod kątem działania. Ma on odbierać bajt nadesłany przez usart i odesłać go z powrotem. Nie wiedzieć czemu na moim prototypowym układzie to nie działa. Jeżeli okaże się że kod jest dobry tzn że muszę poprawić układ. Może ktoś ma działający schemat połączenia mikrokontrolera z PC poprzez rs232 korzystając z układu MAX232? Będę wdzięczny za pomoc

Nigdzie nie widzę zadeklarowanej częstotliwości F_CPU. Jest ona potrzebna do obliczania BAUD.

Ustaw pin na którym jest Rx jako wejście, a pin na którym jest Tx jako wyjście.

Spróbuj zamienić zapis:

while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been recieved and is ready to be read from UDR 
     ReceivedByte = UDR; // Fetch the recieved byte value into the variable "ByteReceived" 

while ((UCSRA & (1 << UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it 
     UDR = ReceivedByte; // Echo back the received byte back to the computer 

na:

while (!(UCSRA & (1 << RXC))); // Do nothing until data have been recieved and is ready to be read from UDR 
     ReceivedByte = UDR; // Fetch the recieved byte value into the variable "ByteReceived" 

while (!(UCSRA & (1 << UDRE))); // Do nothing until UDR is ready for more data to be written to it 
     UDR = ReceivedByte; // Echo back the received byte back to the computer 
  • 1 miesiąc później...

Również usiłowałem uruchomić ten program u siebie i o ile odpowiedź otrzymuję- o tyle w niczym nie przypomina ona wysyłanego znaku.

Nie są one przypadkowe, tzn. na dany znak zawsze otrzymuję tę samą odpowiedź. Tyle tylko że dla 0 jest to myślnik, dla 1 - M itd.

Atmega taktowana zewnętrznym oscylatorem 8MHz.

Czego to może być wina ?

Connect to this project via a serial terminal on your computer, using 8-bit, no parity 9600 baud communication settings and it will echo back anything you send to it.

Moje ustawienia wyglądają następująco:

IMG_4dac0f48892de7013.jpg

IMG_4dac13638e29c422.png

Próbowałem zmieniać bity stopu i baud rate, zmiany są- ale cały czas nie odbieram tego co wysłałem.

Korzystam z przejściówki profilec usb-rs232.

Które parametry transmisji należałoby zmienić ?

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