Autobaud w uC.
Masz problem? Zapytaj na forum elektroda.pl
From: Milosz Skowyra <miloszek.SPAM_REMOVE_at_nospam_fidonet.org.pl>
Subject: Autobaud w uC.
Date: Wed, 30 Jan 2002 22:01:52 +0100
Ehlo.
DS 89C420 ma zapisany w rom-ie loader ktory potrafi automatycznie dobrac
predkosc transmisji po wyslaniu do niego znakow AT.
Pytanie czy wie ktos jak to jest zrobione ?
W pdf-ie jest napisane ze loader probuje z kolejnymi nastawami dla
licznika i tyle, pytanie tylko czy da sie zrobic tak jak w zwyklym
modemie do PC, po pojedynczym AT predkosc jest znana i ustalona.
Nasuwa mi sie tylko jedno rozwiazanie, "recznie" zbadac czas pomiedzy
bitami i na tej podstawie wpisac do licznika USART-a okreslona wartosc.
--
Regards. Przy odpowiedzi usun "SPAM_REMOVE" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek_at_nospam_fidonet.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Zostalismy sami, niecierpliwi mysliwi...
From: Marek Lewandowski <locust_at_nospam_poczta.onet.pl>
Subject: Re: Autobaud w uC.
Date: Wed, 30 Jan 2002 22:46:50 GMT
Milosz Skowyra wygenerował manualnie w wiadomości
<3C585F40.3BAF9157_at_nospam_fidonet.org.pl> udostępnionej publicznie dnia Wed,
30 Jan 2002 22:01:52 +0100 co następuje:
Ehlo.
DS 89C420 ma zapisany w rom-ie loader ktory potrafi automatycznie dobrac
predkosc transmisji po wyslaniu do niego znakow AT.
Pytanie czy wie ktos jak to jest zrobione ?
W pdf-ie jest napisane ze loader probuje z kolejnymi nastawami dla
licznika i tyle, pytanie tylko czy da sie zrobic tak jak w zwyklym
modemie do PC, po pojedynczym AT predkosc jest znana i ustalona.
Nasuwa mi sie tylko jedno rozwiazanie, "recznie" zbadac czas pomiedzy
bitami i na tej podstawie wpisac do licznika USART-a okreslona wartosc.
możesz zrobić tak: ustawiasz w UART najwyższą prędkość (19200bps na
przykład) i z PC wysyłasz 0xFF, czyli w sumie tylko bit startu. Jesli
wysylasz z 19200, to do odb. dojdzie 0xFF.
Jesli wysylasz z 9600 (dwa razy dluzej trwa kazdy bit) to do
odbiornika dojdzie 0xEF (zero bitu startu jako dwa zera - startu i
najstarszy bit), jak z 4800, to odbierzesz 0x1F, jak z 2400 to dojdzie
0x01, a jak z 1200 to dojdzie 0x00 + error transmisji.
chyba jasno klaruję? Jak nie, to narysuj sobie ramke RS-a
(mam nadzieje, ze ja nic nie skopalem)
--
Marek Lewandowski ICQ# 10139051
locust_at_nospam_poczta.onet.pl
http://locust.republika.pl
From: "Miłosz Kłosowicz" <news_at_nospam_mikrobit.prv.pl>
Subject: Re: Autobaud w uC.
Date: Thu, 31 Jan 2002 09:29:51 +0100
DS 89C420 ma zapisany w rom-ie loader ktory potrafi automatycznie dobrac
predkosc transmisji po wyslaniu do niego znakow AT.
Pytanie czy wie ktos jak to jest zrobione ?
Może przykładzik (dla 8051) :
/*-------------- automatyczne wykrywanie szybkości portu rs --------------*/
/* TH1 = 256 - ((2^PCON * XTAL) / (384 * baud)) */
char auto_baud(void)
{
code struct /* tablica porˇwnawcza dla zegara 11,0592 Mhz
*/
{ unsigned int cmp ;
char *opis ;
char th1_val ; /* wartoťŠ timera do wpisania (pcon =1) */
} baud_table[9] =
{
{ 0x008A,">19200" ,232}, /* jesli za duzo to domyslnie 2400 baud */
{ 0x0115,"19200" ,253 },
{ 0x022B,"9600" ,250},
{ 0x0457,"4800" ,244},
{ 0x08AE,"2400" ,232},
{ 0x115C,"1200" ,208},
{ 0x22B8,"600" ,160 },
{ 0x4570,"300",64 },
{ 0x8AE1,"<300" ,232 } /* jesli za malo to domyslnie 2400 */
};
data char CharL ;
data char CharH ;
data char Baud ;
data int idx ;
data char tmp[7] ;
TMOD = 1;
TH0 = 0;
TL0 = 0;
TCON = 0;
CharL = 0;
CharH = 0;
while ( RXD ) ; /* czekamy na poczatek bitu startu */
TR0 = 1 ; /* startujemy zegar */
while( !TF0 )
{
if ( ! RXD )
continue;
CharH = TH0 ;
CharL = TL0 ;
loop:
if ( TF0 )
break;
if ( RXD )
goto loop ;
} ;
TR0 = 0 ;
TF0 = 0 ;
Baud = 0 ;
for ( idx = 8 ; idx >= 0 ; idx-- )
{
if ( (((unsigned int)CharH << 8) | (unsigned int)CharL) >
aud_table[ idx ].cmp )
{ Baud = idx ; break; };
}
return baud_table[Baud].th1_val ;
}
Miłosz