[51] serial a 16-bitowa rozdzielczosc sygnalu taktujacego
Jan 23, 2004 10 Replies
J
Janko Muzykant
Znowu pozawracam grupowe głowy ale jakoś nie mogę sobie poradzić a nie znalazłem rozwiązania po sieci.
Problem: Taktowanie seriala - normalnie robi się licznikiem T1 w trybie 2 (autoprzeładowanie). Ale ja potrzebuję licznikiem T1 (nie T2!) narzucając mu TH1 i TL1 dowolne, z dokładnością 16 a nie 8 bitów (czyli w trybie pierwszym). Jak to zrealizować sprzętowo? - wpisuję do SBUF, transmisja zaczyna lecieć, licznik się przepełnia i... ?
Czy zostaje mi tylko wysyłanie programowe z wykorzystaniem licznika 16 bit?
Albo czy da się jakość uzyskać 31250 i 38400 (+-0,4%) z jednego kwarca, bez T2 i sprzętowo?
Didn't find your answer? Ask the community — no account required.
P
Piotr Nabielec
Hej,
Taktuj po prostu uklad licznikiem w trybie 16 bitowym, a przeladowuj go 'recznie' w jego wlasnej procedurze obslugi przerwania.
Ladujesz TH1 i TL1. Wlaczasz przerwanie licznika T1 (EA+ET1) i puszczasz licznik (ustawiasz TR1). Jak sie przepelni to ustawi Ci siê TF1 i wywola przerwanie licznika 1. Tam wpisujesz nowe warto¶ci TH1 i TL1. Przy okazji przepelnianie licznika taktuje port szeregowy. Problem jest z duzymi wartosciami (szybkie przepe³nianie) - bo przeladowanie licznika pare cykli potrwa.
Uzywanie licznika 16-bitowego do taktowania transmisji szeregowej s³uzy bardziej do wyciagania bardzo niskich predko¶ci transmisji niz zwiekszania rozdzielczosci. On liczy do 65536 zamiast do 256, co nie oznacza, ze szybciej :)
Bêdzie ciê¿ko. Maksymalnie wyci±gasz 57600bps i to przy SMOD=1 oraz liczniku przepe³niaj±cym siê co jeden cykl.
Trzeba by pokombinowaæ z trybem pracy seriala innym ni¿ 1 (3). W grê wchodzi drugi, ale musia³by¶ obni¿yæ taktowanie kwarcu, a tym samym nie wyci±gniesz obu prêdko¶ci.
Ja prostego rozwiazania nie widze (sprzetowego). Programowo musialbys zmieniac stan TxD co 24 cykle (38400) lub co 29 albo 30 (31250). W tym drugim wypadku jednak nie wyciagniesz dokladnosci nawet rzedu
1%. [wszystko liczone dla kwarcu 11,0592].
Pozdrawiam
Piotrek
J
Janko Muzykant
Oczywiście tak się da, tylko, że robimy przerwanie, które mi trochę nie pasuje. Zasugerowałem się opisami w źródłach ''że w trybie drugim najlepiej'' ale nie wspomniano, ze tylko w tym trybie mamy autoprzeładowanie a co za tym idzie prosty sposób sterowania serialem.
Tak więc to co miał mi robić T2 będzie robiła procedurka na innym T a T2 będzie taktował seriala w trybie autorzeładowania obu bajtów - przy dokładności dopuszczalnej <0,4% wyrobi się z zapasem.
Dzięki za pomoc.
P
Piotr Nabielec
Hej,
Oczywiscie w Twoim przypadku TRZEBA uzyc T2 jesli w ogole chcesz to zrobic :-)
Problem nie wynika z wywolywania przerwania tylko z taktowania ukladu portu szeregowego. W przypadku korzystania z licznika T1 impulsy z oscylatora po podzieleniu przez 12 (czyli po zrobieniu z nich cykli) wchodza na licznik ktory liczy do
16 (32 dla SMOD=0) i jego przepelnienie to jeden takt dla ukladu portu szeregowego. W takim razie wyciagasz predkosc transmisji = fosc / (12 * 16 * czestotliwosc_przepelniania_T1). Jakiego trybu bys nie uzyl przepelnianie T1 co 1 cykl daje Ci 57600bps (SMOD=1), a juz co 2 o polowe mniejsza predkosc 28800. Nic posrodku zadna metoda sprzetowa nie jestes w stanie wyciagnac [11,0592MHz]
Nie chodzi wiec o zwiekszenie ilosci bitow, czy generowanie przerwania, ale zwiekszenie czestotliwosci taktowania seriala. Gdy seriala (w trybach 1 lub 3) taktuje licznik T2 to czestotliwosc oscylatora jest dzielona w sumie tylko przez 32 (a nie 192) - to zwieksza 'rozdzielczosc' taktowania szesciokrotnie! I nie wynika to z budowy licznikow tylko ze specyfiki taktowania portu szeregowego tymi licznikami.
Przy kwarcu 11,0592MHz swoje 38400bps wyciagniesz dla RCAP2=65527, a
31250bps dla RCAP2=65525. Dla tej drugiej predkosci blad mi wychodzi 0,54%, a wiec nie wiem jak chcesz wyciagnac te '<0,4% z zapasem' ;-)
Pozdrawiam
Piotrek
P
Piotr Nabielec
Hej,
Pomeczylem temat :-) Wyszlo idealnie dla kwarcu 16MHz i RCAP2=65520 (idealnie 31250bps) oraz RCAP2=65523 (odchy³ka +0,16% wzglêdem 38400bps)
Chyba, ze masz inne parametry to chetnie poslucham :-)
Pozdrawiam
Piotrek
J
Janko Muzykant
W serii S52 mamy możliwość pracy T2 jako generator impulsów na P1.0 We wzorze określającym częstotliwość mamy w mianowniku nie 32 lecz 4, co znacznie zwiększa rozdzielczość. I tak dla 6MHz i (65536-RCAP2)=48 wychodzi dokładnie 31250, dla(65536-RCAP2)=39 wychodzi 38461,53 czyli +0,16% względem zamierzonego
34800.
Czy przy podłączeniu pod serial częstotliwość impulsów na P1.0 podzieli sie jeszcze 8 razy (co by wynikało na wzór na prędkość transmisji)? (Jeszcze tego nie sprawdziłem a w materiałach nie mogę znaleźć).
P
Piotr Nabielec
Hej,
Hm. W dokumentacji nic nie znalazlem na temat mozliwosci taktowania tym trybem ukladu portu szeregowego. Trzeba by to sprawdzic :)
Serial z samej swojej zasady taktowania sygnalem zewnetrznym dzieli czestotliwosc przez 16 lub 32 (SMOD=0). Gdy go taktujesz licznikiem T2 w trybie 'baud generator' to na serial wchodzi czestotliwosc oscylatora / 2. Stad wychodzi te fosc/32. Widac to dokladnie na 'Figure 4 - Timer 2 in Baud Rate Generator Mode' w datasheecie S52.
Co do trybu 'programmable clock out' licznika T2 to nie ma ani slowa o mozliwosci uzycia go do taktowania portu szeregowego, ale z samej zasady wydaje mi sie, gdyby nawet udalo sie jakos taktowac tym trybem port szeregowy to, ze czestotliwosc ta (fosc/4) podzieli sie jeszcze przez 16. Moge sie mylic, bo nie sprawdzalem i nic o tym nie wiem. Mysle, ze pozostaje sprawdzic w praktyce :-)
Pozdrawiam
Piotrek
J
Janko Muzykant
Już znalazłem odpowiedź - owszem, mamy podział przez 4 dla wyjścia i jeszcze przez 8 (a ściślej przez 16 zza podziału przez 2) dla seriala. Czyli pupa :( Jak by tego dzielnika nie mogli ominąć jakimś bitem z sfr-a...
No nic, wychodzi T1 w modzie 1 z ładowaniem wartości początkowych w obsłudze przerwania licznika - właściwie nie problem tylko, że nie miałem do tej pory takiej potrzeby więc pytałem (zwykle to do seriala dobierało się kwarc). Dzieki za pomoc.
J
J.F.
Moge prosic o wyliczenia, bo nijak mi nie pasuje.
P.S. IMHO - 12MHz, i nie trzeba zadnych trybow 16 bit . moze tez byc 6,18,24MHz
J.
P
Piotr Nabielec
Jasne, ze mozna. Oparlem sie o kwarc 16MHz i licznik T2 pracujacy w trybie 'baud rate'. Czestotliwosc fosc podzielona przez 2 taktuje uklad portu szeregowego. Ten dodatkowo dzieli to przez 16 dla SMOD=1. W zwiazku z tym predkosc transmisji = fosc/[32 * (65536 - RCAP2)]
Dla RCAP2=65520 licznik liczy do 16 i sie przepelnia, w zwiazku z tym predkosc = 16,000,000 / [32 * 16] = 31250. Dla RCAP2=65523 licznik liczy do 13 i sie przepelnia, w zwiazku z tym predkosc = 16,000,000 / [32 * 13] = 38461,5
Hm. A jak dla kwarca 6MHz chcesz wyciagnac obie predkosci tzn. i 31250 i
38400 ?! [ zakladamy, ze wszystko dzieje sie na S52 ]
Pozdrawiam
Piotrek
J
J.F.
Sorry, zle pisze, pogubilem sie. Tak sie zasugerowalem ze zgubiles gdzies /12, ze sam zgubilem /16 ..
Starosc nie radosc..
J.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.