Łopatologiczne działanie UART na AVR

Tutaj mozesz poruszać tematy ogólne powiązane z elektroniką, np. dyskusje na temat podzespołów, układów, zasad ich działania. Czyli można pisać o wszystkim czego nie da się przyporządkować do innych działów.
ODPOWIEDZ
Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Łopatologiczne działanie UART na AVR

Post autor: siekierzyński » 20 lut 2014, 22:25

Witam,

Przetrzepałem już cały internet w poszukiwaniu informacji co się dokładnie dzieje przy odbiorze danych przez AVR.
Ogólnie mam projekt w którym programowo generuje PWM na 84 pinach (atmega2560). Zależy mi na odbiorze dancyh w locie generowania sygnału PWM, czyli bez przerwań, opóźnień itp.

Program będę pisał w BASCOMie. Odbierane dane przez UART traktuję jako wartości bitowe, nie jako znaki.

Teraz do sedna.

Jedna ramka ma 8 miejsc danych (8 bajtów), każdy po 8 bitów (0-255) (nie liczę bajtu startu, stopu i parzystości).

I teraz pytanie co się dzieje, gdy ramka przychodzi do AVR? Cała ramka (8 bajtów) jest wpisywanych do rejestru cyklicznego, czy jakiegoś tam, czy tylko jeden bajt jest wpisywany do rejestru cyklicznego a potem przepisywane do UDR? Czy może dane od razu trafiają do UDR.
Mało tego, gdzieś wyczytałem, że bufor wynosi 3 bajty, a na dobrą sprawę to 1 bajt. O.o

Dalej, jeśli dane są już gotowe do odczytania przez program (odebrane) w rejestrze, to jest ustawiana jakaś flaga.
Tylko czy ta flaga jest ustawiana po odebraniu jednego bajtu, czy całej ramki (8 bajtów).

Dalej :P
Prędkość transmisji określa się w bodach na sekundę (czyli w bitach na sekundę). Jeśli mamy np 115200b/s, to to jest 115200 bitów na sekundę, tylko czy w to wliczane są bity stopu, startu i parzystości?
Bo zastanawiam się, czy przy funkcji ischarwiating() i inkey() i zewnętrznym kwarcu 22,1184MHz procek wyrobi z odczytem danych po jednym bajcie (bo inkey() obiera jeden bajt i go wywala z rejestru UDR, a poprzednie się przesuwają 'do przodu').

Jeśli mam np. program terminal v1.9b i wyślę za pomocą jego np. 0xF0, to on lub komputer wyśle ten bajt jako ramkę jedno-bajtową, czy jako ramkę 8 bajtową, z czego pozostałe będą wypełnione 0x00?

Przepraszam ja taką palplaninę i haos, ale chcę w końcu raz na zawsze rozprawić się z komunikacją szeregową, bo nie jest ona jakoś skomplikowana, tylko, że brak jakiejś konkretnej wiedzy na ten temat.

Pozdrawiam

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Re: Łopatologiczne działanie UART na AVR

Post autor: c4v2 » 21 lut 2014, 12:03

siekierzyński pisze:...Jedna ramka ma 8 miejsc danych (8 bajtów), każdy po 8 bitów (0-255) (nie liczę bajtu startu, stopu i parzystości).
Rozumiem że miał Pan na myśli: bit startu, bit stopu i bit parzystości.
siekierzyński pisze:..Prędkość transmisji określa się w bodach na sekundę (czyli w bitach na sekundę). Jeśli mamy np 115200b/s, to to jest 115200 bitów na sekundę, tylko czy w to wliczane są bity stopu, startu i parzystości?
Tak, są wliczane.
Jaki procesor AVR może być "pędzony" zewnętrznym kwarcu 22,1184MHz? W Bascom AVR przy kwarcu 14,74..MHz bez większych problemów można uzyskać prędkość transmisji 115200 bodów korzystając funkcji ischarwiating() i inkey(). Bufor sprzętowy USART w AVR może pomieścić 3 bajty, Aby odbiór znaków mógł być przeprowadzany (bez nadpisywania bajtów) w tle działania programu należy utworzyć programowy bufor wejściowy (jest na to instrukcja).
siekierzyński pisze:Jeśli mam np. program terminal v1.9b i wyślę za pomocą jego np. 0xF0, to on lub komputer wyśle ten bajt jako ramkę jedno-bajtową, czy jako ramkę 8 bajtową, z czego pozostałe będą wypełnione 0x00?
Jeżeli wyśle Pan wartość 0xF0 przy 8 bitowej ramce to oczywiście wysłany będzie bajt: &B11110000 plus bity startu, stopu, etc.

Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Post autor: siekierzyński » 21 lut 2014, 18:11

Rozumiem że miał Pan na myśli: bit startu, bit stopu i bit parzystości
Tak, miałem na myśli bity.
Jaki procesor AVR może być "pędzony" zewnętrznym kwarcu 22,1184MHz?
Teoretycznie żaden. No faktycznie że jest 14.7456 Mhz, musialem przeoczyć, myślałem, że po 11.0592 Mhz jest dopiero 22.1184MHz. Może dlatego też procek nie wyrabia.
w tle działania programu należy utworzyć programowy bufor wejściowy (jest na to instrukcja).
Masz na myśli odbiór danych z buforu spretowego za pomocą np. funkcji INK3Y ()? Czy coś innego?
8 bitowej ramce
Czyli inaczej 1-dno bajtowej? A jeśli będę chcial mieć stałą ramkę 8 bajtową i wyślę 1 znak?

I mam prośbę c4v2, mógłbyś pisać do mnie na Ty? Bo tak staro się czuję a mqm 23 lata :-)
Dziękuję za część wyjaśnień i czekam na dalsze.

Pozdrawiam.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 22 lut 2014, 13:40

Zwykle maksymalna częstotliwość taktowania AVR to 16MHz ale niektóre mogą być taktowane do 20MHz. Programowy bufor kołowy jest twożony instrukcją Config SerialIn=Buffered , Size=bytes, gdzie wartość bytes określa wielkość bufora w bajtach, Oczywiście że przy zastosowaniu buforowania porogramowego odbiór danych można zrealizować funkcją InKey(). Długość ramki danych w module USART dla AVR może być różna: od 5 do 9 bitów, dla wygody najlepsza wydaje się ramka ośmio bitowa (1 Bajt.). Zatem nie wchodzi w grę ramka 8 bajtowa między bitami startu i stopu. Czy czasem "nie chodzi" o programową ramkę definiowaną przez programistę w warstwie aplikacji (protokół).

Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Post autor: siekierzyński » 22 lut 2014, 15:57

c4v2 pisze:Długość ramki danych w module USART dla AVR może być różna: od 5 do 9 bitów
Czekaj, czyli jedna ramka może pomieścić tylko "jeden znak"?

Kod: Zaznacz cały

[BIT STARTU][8my bit][7my][6sty][5ty][4ty][3ci][2gi][1szy bit][bit parzyst.][bit stop]
?!
Łooo jeżu... To ja przez tyle czasu byłem w błędzie myśląc, że jedna ramka może mieć 8 znaków.... To teraz już lepiej mi się to rysuje. Spojrzałem jeszcze raz na 'budowę' ramki i tam faktycznie są bity, nie bajty...
c4v2 pisze:bufor kołowy jest twożony instrukcją Config SerialIn=Buffered , Size=bytes
Tylko, że przy Config SerialIn są włączane przerwania, a przy programowym PWM będzie widać mrugnięcia LEDów (wiem, że czasy są bardzo krótkie, ale ja jestem mocno wyczulony i to widzę :-) ). Wieczorem zaprogramuję układ i zobaczę czy przy sprzętowym buforze i funkcją inkey() wyrobi.
c4v2 pisze:Zwykle maksymalna częstotliwość taktowania AVR to 16MHz ale niektóre mogą być taktowane do 20MHz.
To może kupię jeszcze 18.432 Mhz i poeksperymentuję - w końcu procek się nie spali :-)

EDIT:
W chwili obecnej jestem w trakcie odbudowy tej listwy: LINKObrazek Sterownik, zbudowany od nowa, co prawda jest, ale muszę go do komputera podłączyć i wszystko oprogramować.
Na podanym filmiku jest poprzednia listwa, która podczas poprawiana paneli, spadła i się cała połamała...

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 26 lut 2014, 20:28

Jeśli nie wysyłasz komend a jedynie wartości bitowe, możesz zaryzykować wywalenie bitu parzystości. Przy takiej prędkości transmisji nie warto przejmować się uszkodzonymi bajtami skoro na sekundę ze sto razy prześlesz te wszystkie 84 bajty opisujące jasność poszczególnych LEDów.

Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Post autor: siekierzyński » 01 mar 2014, 16:02

Ertew, w sumie można, bo i tak nie mam zamiaru go sprawdzać ;P

I pytanie kolejne, kupiłem 2 kwarce 18,432MHz, ale co do tego drugiego, dolnego, to mam wątpliwości...

EDIT:

Zastosowałem 2 kwarce 18,432MHz, bo na 22... Atmega32 nie chciała ruszyć. Mam teraz problem, bo potrzebuję 8 bitowej ramki, plus jeszcze jednego bitu do informacji, czy dane to adres w pamięci ukontrolera, czy dane jako dane. Czytałem, że można zrobić, 9 bitową komunikację, ale mój konwerter USB <-> UART nie obsługuje tego. Można ponoć wykorzystać bit parzystości jako '9bit', ale z tym mogą być problemy. Zastanawiam się, czy nie lepiej porobić 'ramek' 5 bitowych i 8 bitów rozbijać po 4 + 5ty jako informacja adres/dane.
Załączniki
20140301_155708.jpg

ODPOWIEDZ