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.
USART PC<->uC tego nikt nie wyjaśni...
-
challenger
- -
- Posty: 7
- Rejestracja: 30 cze 2009, 18:26
- Lokalizacja: warszawa
-
challenger
- -
- Posty: 7
- Rejestracja: 30 cze 2009, 18:26
- Lokalizacja: warszawa
- Aro
- Użytkownik
- Posty: 677
- Rejestracja: 30 paź 2006, 18:49
- Lokalizacja: Świerczyniec | Wrocław
- Kontakt:
challenger pisze:Pozatym mała poprawka do tego co powiedziałem wcześniej: wysyłanie jest poprawne tylko przy ramce 7-bitowej.
No, czyli jest okchallenger pisze:Wszystko powinno działać dla 7bitowej ramki bo znaki jakie chce przesłać mieszczą się w 7 bitach
Masz może możliwość sprawdzenia układu w terminalu z bascoma? w moim przypadku działa bez zarzutu dla ramki 8-bitowej.
-
challenger
- -
- Posty: 7
- Rejestracja: 30 cze 2009, 18:26
- Lokalizacja: warszawa
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!
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!