logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATMega 8 USART Prędkość wysyłania, czemu tak wolno?

davidpi 28 Sty 2012 23:01 2205 15
  • #1 10462413
    davidpi
    Poziom 10  
    Witam.
    Próbuję opanować USART w ATMega 8. Wewnętrzny oscylator 1MHz. Z komunikacją nie mam większych problemów. Jednak zastanawia mnie ustawianie prędkości transmisji. W moim programie ustawiłem prędkość transmisji na 9600bps. Rozumiem że 9600 bps oznacza wysłanie 9600 bitów w ciągu sekundy (jeżeli źle rozumuję to proszę o poprawienie mnie), a więc niespełna 1000 liczb 8 bitowych.
    Jednak z obserwacji w urządzeniu wynika, że pracuje ono dużo wolniej.Dlatego mam kilka pytań do bardziej doświadczonych kolegów.

    Oto kod programu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Obsługa USART

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod




    Ogólnie zasada jest taka: wysyłam liczbę i po wysłaniu zwiększam licznik i wyświetlam.
    Obserwując zmiany na wyświetlaczu zauważyłem, że jest wysyłanych ok 7 liczb na sekundę.
    Więc najważniejsze pytanie.
    Z jaką ja prędkością to w końcu wysyłam?? Czy na pewno 9600bps czy może coś pokręciłęm.
    Proszę o pomoc i pozdrawiam[/code]
  • #2 10462465
    Skarabeusz87
    Poziom 15  
    Po pierwsze musisz zwiększyć taktowanie procesora.
    Wg mnie min 8 MHz.
  • #3 10462485
    McMonster
    Poziom 32  
    Samo wysyłanie odbywa się z taką prędkością, jak ustawiłeś, ale między wysyłanymi liczbami robisz jeszcze dużo innych rzeczy, w tym obsługę LCD, co zajmuje procesorowi trochę czasu (szczególnie z takimi funkcjami, jak itoa()), dlatego średnia wychodzi poniżej 9600 bps.

    Spróbuj w nieskończonej pętli wysyłać w kółko stałą liczbę nie robiąc nic innego, to otrzymasz prędkość prawie idealnie 9600 bps. Prawie, bo nawet instrukcja skoku w pętli zajmuje skończenie mały czas, a do tego trzeba doliczyć błąd dokładności taktowania. Ale to już tak poza konkursem.
  • #4 10462636
    Fredy
    Poziom 27  
    Oprócz 8 bitów w których są dane jest jeszcze bit startu i co najmniej jeden bit stopu.
  • #5 10462703
    mirekk36
    Poziom 42  
    Twój kod a także same założenia są już pełne błędów. Zatem to co obserwujesz jest tylko wypadkową tego wszystkiego co robisz źle.

    1. co to za inkludowanie plików *.c ???? Inkluduje się TYLKO pliki nagłówkowe *.h
    2. co to za rozbicie inicjalizacji nadajnika i odbiornika ? Choć teoretycznie mogłoby tak być - ale nie robi się w ten sposób
    3. w inicjalizacji UART aktywujesz przerwanie RXCIE a tymczasem nie masz go nigdzie w kodzie, tzn procedury obsługi tego przerwania - więc może ci się całość resetować wciąż a ty nawet tego nie zauważasz - tylko zastanawiasz się dlaczego tak wszystko dziwnie działa - bo tu trudno nawet powiedzieć, że wolno

    4. Jeśli już musisz korzystać z tak żółwiego tempa procka 1MHz to przynajmniej zajrzyj sobie do jego noty PDF na ostatnią stronę rozdziału UART i rzuć okiem w pierwszą tabelę, TOŻ masz tam jak byk pokazany BŁĄD = -7% !!!! dla prędkości 9600bps. Więc nie wiem w czym ty to odbierasz ale transmisja może się kaszanić zdrowo. Jak widać z tej tabeli dopuszczalne błędy czyli do +/- 2% masz tylko dla prędkości do 4800 przy takim kocim taktowaniu ;) więc albo się na którąś z nich zdecyduj albo od razu ustaw 8MHz i zajrzyj do tabeli - z jakich tam prędkości możesz skorzystać.

    I teraz ktoś wyżej miał rację, że w tej pętli robisz jeszcze ogromne przerwy na obsługę np LCD. A tym bardziej jeśli twój LCD ma podpiętą jak to w większości przypadków bywa nogę R/W do GND. I jeszcze tym bardziej, że wtedy korzystasz z super kociej funkcji LCD_CLS - na nią samą w takim układzie schodzi ci szmat czasu! Czas potrzebny na ITOA jest przy tym wszystkim praktycznie pomijalny.
  • #6 10463105
    davidpi
    Poziom 10  
    Dziękuje wszystkim za zainteresowanie.
    Myślę, że obsługa LCD nie jest tutaj problemem. Poprawiłem program do takiej postaci:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Obsługa usart bez zmian:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Teraz po każdej wysłanej liczbie zmieniam stan diody podłączonej do portu PC5.
    Problem jest nadal gdyż dioda miga kilka razy na sekundę.
    Przerwanie od RXC nie ma tutaj znaczenia gdyż układ pracuje jako nadajnik i funkcja void UART_OdbiornikInit() nie jest w ogóle wywoływana.
    A może same funkcje nadawania i inicjalizacji USART są błędne??

    Dodano po 12 [minuty]:

    Zmieniłem taktowanie na 8MHz i dioda miga szybciej ( ale nadal widzę zmiany stanu, ok 15 razy na sekundę). Zauważyłem jednak, że nie ma znaczenia jaką prędkość ustawię ( tzn jaka wartość wpiszę do UBRRL) to i tak częstotliwość migania diody się nie zmienia.
    Proszę o pomoc??
  • #7 10463216
    Bartek.k.k
    Poziom 21  
    Proszę wybaczyć, że się podpinam, ale mam pytanie do 1 zdania w poście Pana Mirka.

    mirekk36 napisał:
    1. co to za inkludowanie plików *.c ???? Inkluduje się TYLKO pliki nagłówkowe *.h


    Po przesiadce z Eclipse na Avr studio 5, nie mogę dołączać bibliotek .h lecz .c, ponieważ avr studio wyświetla błąd. Co robię nie tak?
  • #8 10463380
    gaskoin
    Poziom 38  
    Jakaś fizyczna bariera Ci w tym przeszkadza czy są jakieś komunikaty ?

    Generalnie wygląda to tak, że każdy plik c kompilowany jest osobno, a jedynie nagłówki zawierają informację o tym, że taka funkcja istnieje (lub będzie dopiero istniała po kompilacji) gdzieś w zewnętrznym pliku (obojętnie jakim, jeden nagłówek może być dla kilku plików c) i dopiero na etapie linkowania jest to łączone do kupy. To tak w dość dużym skrócie.

    Nie wiem jak to wygląda w AS bo używałem go milion lat temu. Generalnie jest tak, że kompilator musi wiedzieć, gdzie ma szukać plików nagłówkowych, a linker gdzie ma szukac skompilowanych plików. Ponieważ podejrzewam, że w AS można wszystko wyklikać (w Eclipse z resztą też) to jedynie mogę zachęcić do pogrzebania w opcjach, albo podanie więcej szczegółów. Chyba, że używasz makefile edytowanego ręcznie to Ci napiszę też co i jak.

    Chcesz pomocy to daj sobie pomóc. Jak idę do lekarza to mu mówię gdzie i co mnie boli a nie "źle się czuję - co mi jest ?"
  • #9 10463448
    mirekk36
    Poziom 42  
    Bartek.k.k napisał:


    mirekk36 napisał:
    1. co to za inkludowanie plików *.c ???? Inkluduje się TYLKO pliki nagłówkowe *.h


    Po przesiadce z Eclipse na Avr studio 5, nie mogę dołączać bibliotek .h lecz .c, ponieważ avr studio wyświetla błąd. Co robię nie tak?


    Sorry ale skąd mógłbym wiedzieć co robisz nie tak? Sam nie używam kociego AVRS5 więc z pamięci nie powiem gdzie, co i jak się ustawia w projekcie. A na pewno coś w tym zakresie źle robisz bo nie ma że boli, na 100% tu coś mieszasz. Ale ja tak z ciekawości cię zapytam, dlaczego dokonałeś zamiany typu: "zamienił stryjek siekierkę na kijek?"

    I drugie, ciekawy jestem jak ustawiasz F_CPU??? w tym avrs5 ;)

    Przeczytaj na moim blogu artykuł pt: "Dlaczego ECLIPSE" to może kilka rzeczy ci się wyjaśni.
  • #10 10463490
    davidpi
    Poziom 10  
    Problem rozwiązałem, choć nie do końca rozumiem. Ustawiłem bit URSEL w rejestrze UCSRC. Teraz działa jak należy, tzn. przy prędkości 9600bps wysyła kilkaset liczb na sekundę. Doczytałem, że ten bit służy do wyboru rejestru UCSRA lub UBRRH. Czy ktoś mógłby mi wyjaśnić na chłopski rozum, do czego służy ten bit??
    Bo w tym momencie program działa, ale sam nie rozumiem do końca swojego programu.
  • #11 10463675
    Bartek.k.k
    Poziom 21  
    gaskoin napisał:
    Jakaś fizyczna bariera Ci w tym przeszkadza czy są jakieś komunikaty ?

    Generalnie wygląda to tak, że każdy plik c kompilowany jest osobno, a jedynie nagłówki zawierają informację o tym, że taka funkcja istnieje (lub będzie dopiero istniała po kompilacji) gdzieś w zewnętrznym pliku (obojętnie jakim, jeden nagłówek może być dla kilku plików c) i dopiero na etapie linkowania jest to łączone do kupy. To tak w dość dużym skrócie.

    Nie wiem jak to wygląda w AS bo używałem go milion lat temu. Generalnie jest tak, że kompilator musi wiedzieć, gdzie ma szukać plików nagłówkowych, a linker gdzie ma szukac skompilowanych plików. Ponieważ podejrzewam, że w AS można wszystko wyklikać (w Eclipse z resztą też) to jedynie mogę zachęcić do pogrzebania w opcjach, albo podanie więcej szczegółów. Chyba, że używasz makefile edytowanego ręcznie to Ci napiszę też co i jak.

    Chcesz pomocy to daj sobie pomóc. Jak idę do lekarza to mu mówię gdzie i co mnie boli a nie "źle się czuję - co mi jest ?"


    mirekk36 napisał:
    Bartek.k.k napisał:


    mirekk36 napisał:
    1. co to za inkludowanie plików *.c ???? Inkluduje się TYLKO pliki nagłówkowe *.h


    Po przesiadce z Eclipse na Avr studio 5, nie mogę dołączać bibliotek .h lecz .c, ponieważ avr studio wyświetla błąd. Co robię nie tak?


    Sorry ale skąd mógłbym wiedzieć co robisz nie tak? Sam nie używam kociego AVRS5 więc z pamięci nie powiem gdzie, co i jak się ustawia w projekcie. A na pewno coś w tym zakresie źle robisz bo nie ma że boli, na 100% tu coś mieszasz.



    Poniżej umieszczam 2 screeny.

    1) Dołączanie biblioteki .h

    ATMega 8 USART Prędkość wysyłania, czemu tak wolno?

    2) Dodanie biblioteki .c

    ATMega 8 USART Prędkość wysyłania, czemu tak wolno?

    Jak widać w 2 przypadku wszystko pięknie się skompilowało. Nie jest to dla mnie problemem, tylko ciekawi mnie dlaczego tutaj jest inaczej.

    mirekk36 napisał:
    Ale ja tak z ciekawości cię zapytam, dlaczego dokonałeś zamiany typu: "zamienił stryjek siekierkę na kijek?"


    Eclipse świrowało przy programie obsługi PCF8583, na lcd wyświetlało dziwaczne rzeczy. Ten sam kod skompilowany w avr studio chodzi w porządku.

    mirekk36 napisał:

    I drugie, ciekawy jestem jak ustawiasz F_CPU??? w tym avrs5 :wink:


    Niestety przez dodanie linijki w projekcie,:

    #define F_CPU 8000000

    ponieważ nie wiem, gdzie tutaj w opcjach się to ustawia.

    mirekk36 napisał:
    Przeczytaj na moim blogu artykuł pt: "Dlaczego ECLIPSE" to może kilka rzeczy ci się wyjaśni.


    Czytałem. Pozdrawiam Bartosz!

    PS Jeszcze raz przepraszam autora, że się tak wciąłem w temat.
  • #12 10463751
    davidpi
    Poziom 10  
    Oki. Już rozumiem o co chodzi z tym bitem URSEL. Musi być ustawiony gdy wpisujemy do UCSRC. Gdy URSEL=0, to wpisujemy do UBRRH. Dzięki za pomoc

    Dodano po 1 [minuty]:

    A na marginesie, też chętnie bym się nauczył jak kompilować program z kilku plików. Możecie polecić jakiś kurs lub tutorial jak to zrobić w AVRStudio??
  • #13 10464505
    mirekk36
    Poziom 42  
    Bartek.k.k napisał:

    Eclipse świrowało przy programie obsługi PCF8583, na lcd wyświetlało dziwaczne rzeczy. Ten sam kod skompilowany w avr studio chodzi w porządku.


    Nie pogniewaj się proszę, ale Eclipse nie świruje ;) co najwyżej programista może świrować (mówię także o sobie gdy mi się coś nie udaje) .... Ale nigdy nie szukam winy w środowisku programistycznym bo to ostre nieporozumienie. Piszesz, że w AVR5 się skompiluje prawidłowo. SKUCHA - skoro inkludujesz pliki źródłowe *.c to nie jest to tak jak powinno być. I to, że tobie to nie przeszkadza to niestety nie znaczy, że jest dobrze - a przejedziesz się na tym za jakiś czas, zresztą tak samo jak na tym nieszczęsnym F_CPU. (przy okazji podpowiem ci, że ustawia się to w opcjach samego kompilatora w AVRS5 - i trzeba dać tam parametr -DF_CPU xxxxx) bo można to oczywiście zrobić tak samo zresztą jak prawidłowo inkludować pliki nagłówkowe *.h zamiast źródłowych *.c.

    Z drugiej strony ciekawe jest niesamowicie co może mieć ECLIPSE do PCF8583 to już jest odwaga, żeby taki wniosek wyciągać. No i dziwne, że mnie i setkom ludzi nigdy się coś tak dziwnego nie zdarzyło.

    Nie piszę tego żeby się z ciebie naigrywać tylko żeby zachęcić na przyszłość jakąś, abyś szukał rozwiązań a nie obchodził problemy bocznymi uliczkami bo chcąc nie chcąc i tak trafisz w ślepy zaułek a potem będziesz żałował straconego czasu..... Lepiej od razu na każdym kroku walczyć i uczyć się prawidłowo budować projekty w C oraz zależności pomiędzy plikami - bo to szybko ale to bardzo szybko procentuje.
  • #14 10464709
    Bartek.k.k
    Poziom 21  
    mirekk36 napisał:
    Bartek.k.k napisał:

    Eclipse świrowało przy programie obsługi PCF8583, na lcd wyświetlało dziwaczne rzeczy. Ten sam kod skompilowany w avr studio chodzi w porządku.


    Nie pogniewaj się proszę, ale Eclipse nie świruje ;) co najwyżej programista może świrować (mówię także o sobie gdy mi się coś nie udaje) .... Ale nigdy nie szukam winy w środowisku programistycznym bo to ostre nieporozumienie. Piszesz, że w AVR5 się skompiluje prawidłowo. SKUCHA - skoro inkludujesz pliki źródłowe *.c to nie jest to tak jak powinno być. I to, że tobie to nie przeszkadza to niestety nie znaczy, że jest dobrze - a przejedziesz się na tym za jakiś czas, zresztą tak samo jak na tym nieszczęsnym F_CPU. (przy okazji podpowiem ci, że ustawia się to w opcjach samego kompilatora w AVRS5 - i trzeba dać tam parametr -DF_CPU xxxxx) bo można to oczywiście zrobić tak samo zresztą jak prawidłowo inkludować pliki nagłówkowe *.h zamiast źródłowych *.c.

    Z drugiej strony ciekawe jest niesamowicie co może mieć ECLIPSE do PCF8583 to już jest odwaga, żeby taki wniosek wyciągać. No i dziwne, że mnie i setkom ludzi nigdy się coś tak dziwnego nie zdarzyło.

    Nie piszę tego żeby się z ciebie naigrywać tylko żeby zachęcić na przyszłość jakąś, abyś szukał rozwiązań a nie obchodził problemy bocznymi uliczkami bo chcąc nie chcąc i tak trafisz w ślepy zaułek a potem będziesz żałował straconego czasu..... Lepiej od razu na każdym kroku walczyć i uczyć się prawidłowo budować projekty w C oraz zależności pomiędzy plikami - bo to szybko ale to bardzo szybko procentuje.


    Nigdzie nie napisałem, że eclipse "coś ma" do pcf8583, tylko że kod do obsługi w/w układu nie pracuje w porządku. Odziwo na zaktualizowanym eclipse Indigo ten sam kod działa w porządku. Swój problem rozwiązałem i mogę wrócić do eclipse. Pozdrawiam Bartosz.
  • #15 10464910
    mirekk36
    Poziom 42  
    Bartek.k.k napisał:
    Odziwo na zaktualizowanym eclipse Indigo ten sam kod działa w porządku. Swój problem rozwiązałem i mogę wrócić do eclipse. Pozdrawiam Bartosz.


    Jak widzisz czasem nie dużo potrzeba ;) .... ale jak będziesz miał jakieś konkretne problemy na przyszłość to śmiało pytaj - zawsze chętnie pomogę przy Eclipse.
  • #16 10466867
    gaskoin
    Poziom 38  
    Jak wspomniałem parę postów wyżej Twoim bólem jest konfiguracja projektu. Linker nie wie skąd ma wziąć plik obiektowy w którym znajdują się funkcje zadeklarowane w pliku h. Jak dołączasz plik c to działa, bo to tak samo jakbyś sobie te funkcje napisał w tym pliku zamiast w innym.

    Zajrzyj w konfiguracji projektu, czy masz dodaną ścieżkę wyszukiwania dla linkera w miejsce, w które kompiluje się Twój plik c dla lcd.
REKLAMA