Skocz do zawartości

pytań kilka odnośnie usart


Pomocna odpowiedź

Napisano

Witam

Mam pytania dotyczące pracy USART.

Rozumiem że komunikacja działa tzw tle i procesor może zajmować się czymś innym w trakcie wysyłania? Czy w efekcie jest mocno zakłócany, próbował ktoś kiedyś?

Widziałem większość programów czeka na odbiór/wysłanie ale nie jest usypiana tylko w pętli więc i tak jednostka pracuje skacząc w tą samą komórkę pamięci czy może czekanie w tych programach ma inne podłoże nie związane z sianiem zakłóceń?

Czy możliwe jest sprawdzanie flagi zakończenia wysyłania zamiast stosowania przerwania? Wydaje mi się, że niezależnie czy włączymy przerwanie to flaga przerwania będzie ustawiana i można ją z poziomu asm zawsze sprawdzić, czy mam rację?

Jaki procesor? Jeśli chodzi o ATmegi: idzie bardzo łatwo znaleźć biblioteki do obsługi USARTa za pomocą przerwań, bodajże autorem jest Fleury.

1.Można sprawdzać flagę, ale przerwania są dużo szybsze i prostsze w użyciu. Jak chcesz wysłać lub odebrać jakąś paczkę danych to robisz coś w stylu

2.Niektórym się wydaje, że czekanie na dane w głównej pętli jest prostsze. Faktycznie poza najprostszymi przypadkami jest to złudne i po chwili prowadzi do większej ilości problemów niż przerwania.

3.Wysyłanie danych jest w tle i nie wiem co masz na myśli przez "czy jest mocno zakłócany". Każda zmiana stanów tranzystora w procesorze to w pewnym sensie generowanie zakłóceń. Tylko w procesorze jest tyle tranzystorów, że obsługa sprzętowa usarta generuje jakiś ułamek ogólnych zakłóceń. Przy poprawnym projekcie płytki + kondensatory odsprzęgające nie będzie to żadnym problemem.

  • Pomogłeś! 1

Dzięki MirekCz za wyczerpującą odpowiedź, można zamknąć temat. Pomogłeś w związku z tym nacisnąłem w odpowiednie miejsce;) . Co do szybkości działania przerwania to się zgadza ale to wszystko zależy od tego co ja chcę żeby kontroler robił i w moim przypadku takowe przerwanie nie wchodzi w rachubę, gdyż chcę uzyskać konkretny czas pracy programu w głównej pętli. Stąd też pytanie o pracę w tle, jak wyślę dane do usart to chcę obliczać dalejw takich samych odstępach czyli np

main:
add
mul
jezeli flaga==1
wyslij kolejna paczke
else
nop
mov//chceżeby ten mov robił się zawsze w tym samym odstępie czasowym
add
lcall main

To zrób ten mov w przerwaniu timera i wtedy w głównej pętli robisz obsługę wysyłania/odbieranie danych z uarta. Inaczej zapewnienie idealnie powtarzalnego czasu wykonania tego mov jest bardzo trudne do zrealizowania, bo inaczej będzie trwała główna pętla programu z wysyłaniem danych, inaczej bez wysyłania, jeszcze inaczej z odbieraniem danych po usart...

no właśnie dzięki temu magicznemu nop czas trwania z wysłaniem i bez ma trwać tyle samo, bo wysyłanie jest w tle i mogę kazać procesorowi robić inne rzeczy w tym czasie, czyli dalszy ciąg programu. Ja wiem że przerwanie się tu samo nasuwa ale przerwanie się nie nadaje. Przerwanie wcale nie jest takie szybkie, musi wrzucić dane na stos i po przerwaniu odstawić dane na miejsce co zajmuje kolejne takty.

Zajmuje. Pytanie co Ty chcesz tam robić z taką wysoką częstotliwością? Dodatkowo masz problem, bo odebranie danych po usart to jedno, ale jakaś ich poważniejsza obróbka...?

będę tylko nadawał dane także obróbka odebranych informacji nie wchodzi w rachubę. Powiedzmy że będzie to pomiar częstotliwości i współczynnika wypełnienia i chcę uzyskać jak największą częstotliwość odczytu i wydać jak najmniej. A może ktoś zna jakiś układ scalony który reaguje na zbocza i jednocześnie jest układem impulsowym zliczającym czas stanu wysokiego i wysyłającym to w dowolnej formie komunikacji i kosztuje mniej niż atmega8:)

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...