Skocz do zawartości

Transmisja po uart i rs232, gubienie znaków


l153k

Pomocna odpowiedź

Witam,
napisałem wg wzorów z forbota program do uC, napisałem też terminal do połączenia na PC (wc++ na winapi, w każdym razie terminal wydaje się ok).

uC pracuje przy 8MHz, baudrate 9600, funkcja wysyłająca wygląda tak:

void sendStr(char *str) {
while(str[0]) {
	UDR=str[0];
	while(!(UCSRA & (1<<TXC)));
	str++;
	_delay_us(OPÓŹNIENIE_ALE_MA_GO_TU_NIE_BYĆ!!!);
}
}

kiedy w main wywołam sendStr("Example text here :)");

dla OPÓŹNIENIA 0 (linia z delay zakomentowana) odbieram: Exa

i analogicznie:

_delay_us(1) => Exa
_delay_us(10) => Exa:
_delay_us(100) => Exaexe)
_delay_us(200) => Exap hxe)
_delay_us(300) => Exapetthr)
_delay_us(500) => xamletxthee:)
_delay_ms(1) => Exampl \n e text here :)
_delay_ms(2) => E \n xample text here :)
_delay_ms(5) => Example text here :)
_delay_ms(10) => E \n xample te \n xt here :)

opcja z delay=5ms działa, ale nie chcę się na takie coś godzić. Poza tym, jest przecież pętla, która po wysłaniu czeka, aż wysyłane zostanie wysłane. O co tu może chodzić?

Jestem prawie pewien, że mój terminal działa dobrze-kiedy połączę drutem piny w przejściówce USB-RS232 nigdy niczego nie gubi, moja przejściówka z max232 też jest ok (tak samo sprawdzona).

Co to może być? Źle obliczone BAUD_PRESCALE? Jakaś niedokładność wewnętrznego generatora? Nic więcej mi do głowy za bardzo nie przychodzi...

Link do komentarza
Share on other sites

Jakaś niedokładność wewnętrznego generatora?

Z tego co kojarzę, transmisja taka będzie bardzo niestabilna na wewnętrznym rezonatorze (na pewno dla atmeg - nie napisałeś jaki to uC) i będzie mocno zależna od temperatury otoczenia.

Żeby uzyskać stabilny przekaz, musiałbyś wykorzystać zewnętrzny kwarc.

Link do komentarza
Share on other sites

uC to atmega8-16pu

a kod:

#include <avr/io.h> 
//ustawiona częstotliwość - 8000000

//pomocnicze stałe 
#define USART_BAUDRATE 9600 
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 

void usart_init(void)        //funkcja inicjalizująca usart 
{ 
   UBRRH = (BAUD_PRESCALE >> 8);        //wpisanie starszego bajtu 
   UBRRL = BAUD_PRESCALE;             //wpisanie mlodszego bajtu 

   //UCSRA bez zmian - 0x00 
   UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);                 //aktywne przerwanie od odbioru oraz zmiana trybu działania pinów D0 i D1 
   UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);     //praca synchroniczna, brak kontroli parzystości, 1 bit stopu, 8 bitów danych 

}

Pozostała część to nic odkrywczego także nie będę zaśmiecał postu (nieskończoną pętla, ustawienie portów...)

jutro sprawdzę jeszcze na putty, i z zewnętrznym kwarcem.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.