USART PC<->uC tego nikt nie wyjaśni...

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
challenger
-
Posty: 7
Rejestracja: 30 cze 2009, 18:26
Lokalizacja: warszawa

USART PC<->uC tego nikt nie wyjaśni...

Post autor: challenger » 30 cze 2009, 18:38

Połączyłem komputer z układzikiem z atmega8.
Po stronie pc program terminal v1.9b, po stronie elektroniki układ USB-CDC który działa napewno. Ogólnie wszystko gra. Układ odbiera dane, problem pojawia się przy ich wysyłaniu.

Mianowicie wysyłając kolejne znaki (wg procedury z datasheeta atmega) przechodzą tylko niektóre. Jest to zależne od rozmiaru ramki danych. Dla tego samego zestawu wysyłanych znaków (dokładnie: "abcdefgh...") odbieram:
dla 7 bitowej ramki: abxdxxghx... gdzie x to krzak
dla 8 bitowej ramki: cefijl... bez krzaków
Co interesujące znaki dla 8bit ramki pasują w miejsce krzaków ramki 7-bitowej.
Kto to wyjaśni?

Udało mi się odkryć tylko tyle że układ nadaje znaki raz w kodzie szesnastkowym a raz w oktalnym - w zależności od przesyłanego znaku.


PROCEDURA NADAWCZA z datasheeta:

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}

WYSYŁANIE ZNAKÓW:

USART_Transmit(0x61); // 'a'
USART_Transmit(0x62); // 'b'
USART_Transmit(0x63);
USART_Transmit(0x64);
USART_Transmit(0x65);
USART_Transmit(0x66);
USART_Transmit(0x67);
USART_Transmit(0x68);
USART_Transmit(0x69);
USART_Transmit(0x6A);
USART_Transmit(0x6B);
USART_Transmit(0x6C);

Wszystko standardowo.

Powtarzam pytanie: dlaczego w zależności od rozmiaru ramki danych znaki są wysyłane w dwóch różnych systemach?
Na tej stronie jest tablica znaków:
http://www.pascal.webpacket.net/artykul ... =26&id=180

Proszę o pomoc bo nie mogę się doszukać rozwiązania.. to napewno nie wina jakiegoś bitu w tych znakach. Wszystko powinno działać dla 7bitowej ramki bo znaki jakie chce przesłać mieszczą się w 7 bitach (7bit to zawsze zero dla mojego kompletu danych).

Z góry dziękuje komuś kto już się z tym spotkał lub ma jakiś pomysł.

[ Dodano: 2009-06-30, 20:49 ]
w uproszczeniu (co właśnie odkryłem):

ósemkowo przesyłane są znaki których młodsze 4 bity mają wartość 0,3,5 lub 9.

krótko mówiąc moge przesyłać tylko wybrane znaki

za pomocą 7 bitowej ramki: 1,2,4,7,8 (pozostałe to krzaki)

przy pomocy 8 bitowej : 0,3,5,6,9 (pozostałe nie są wyświetlane wogóle)


Dodam że dla danych wysyłanych wielkość słowa danych nie ma znaczenia - tzn zawsze jest poprawinie.

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 30 cze 2009, 20:34

Nie miałem do czynienia z USB-CDC, ani tym terminalem, jednak podobne problemy mogą sprawiać złe ustawienia bitów stopu, albo co bardziej prawdopodobne bitu parzystości. Upewnij się że masz to dobrze ustawione.

challenger
-
Posty: 7
Rejestracja: 30 cze 2009, 18:26
Lokalizacja: warszawa

Post autor: challenger » 30 cze 2009, 20:43

tak, to zawsze jest takie same. dawałem je nawet w różnych kombinacjach po obu stronach - bez efektu.
Pozatym mała poprawka do tego co powiedziałem wcześniej: wysyłanie jest poprawne tylko przy ramce 7-bitowej. przy ośmio przychodzą jakieś krzaki.

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 01 lip 2009, 16:55

challenger pisze:Pozatym mała poprawka do tego co powiedziałem wcześniej: wysyłanie jest poprawne tylko przy ramce 7-bitowej.
challenger pisze:Wszystko powinno działać dla 7bitowej ramki bo znaki jakie chce przesłać mieszczą się w 7 bitach
No, czyli jest ok :grin:
Masz może możliwość sprawdzenia układu w terminalu z bascoma? w moim przypadku działa bez zarzutu dla ramki 8-bitowej.

_Brutus
-
Posty: 26
Rejestracja: 01 gru 2006, 16:08
Lokalizacja: Złotopole / Łódź
Kontakt:

Post autor: _Brutus » 01 lip 2009, 21:28

Zmniejsz prędkość transmisji i zastosuj kwarc 11,0592MHz. ;)

challenger
-
Posty: 7
Rejestracja: 30 cze 2009, 18:26
Lokalizacja: warszawa

Post autor: challenger » 01 lip 2009, 21:51

spróbuje jutro.
a póki co stosuje tymczasowe rozwiązanie (mam nadzieje) w takiej postaci:

for(int i=0; i<sizeof(Buffer_I); i++) Buffer_I&=0x7F;

Poprostu kasuje 7 bit każdego znaku bo problem sprowadza się do tego że przy wybranych znakach 7 bit ma wartość 1 a nie powinien. Powtarzam: zawsze przy tych samych wybranych znakach nie losowych!

_Brutus
-
Posty: 26
Rejestracja: 01 gru 2006, 16:08
Lokalizacja: Złotopole / Łódź
Kontakt:

Post autor: _Brutus » 02 lip 2009, 19:43

Przekłamania bardzo często występują przy źle dobranej prędkości transmisji. Zmniejsz ją. ;)

MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 05 lip 2009, 23:22

Prosta rada-używaj 8 bitowej ramki.

ODPOWIEDZ