RTV forum PL | NewsGroups PL

Jak prawidłowo obsłużyć bufor USART w projekcie dyplomowym na AVR?

proszę o pomoc - USART , AVR, GCC, CTS

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak prawidłowo obsłużyć bufor USART w projekcie dyplomowym na AVR?

Krzysztof
Guest

Sun Mar 12, 2006 8:32 am   



Witam!

Prosiłbym serdecznie o pomoc bo ten problem zatrzymuje moją pracę nad
projektem dyplomowym.
Sprawa jest następująca:

mam sobie taką funkcję obsługi przerwania od odbiornika USART:

SIGNAL (SIG_UART_RECV)
{
USART_odbiornik.buf[USART_odbiornik.wsk++]=UDR; //1

if(USART_odbiornik.wsk>USART_RX_buf_stop) //2
{
PORTB|=(1<<CTS);
//3
USART_odbiornik.buf_full=1; //4
USART_odbiornik.wsk=0; //5
}
}

Jak widać USART_odbiornik.wsk wskazuje na miejsce w buforze, pod które
wpisywany jest odebrany znak.
USART_RX_buf_stop - po przekroczeniu tej wartości przez
USART_odbiornik.wsk - wystawiam CTS, co
powinno zatrzymywać transmisję do momentu gdy jej nie zwolnię w programie
głównym.
Wszystko działa dobrze, gdy mam linię nr 5. Jeśli ją usunę - program nie
wstrzymuje mi transmisji i tracę bajty.

Dodam, że zależy mi na tym, aby zmienną USART_odbiornik.wsk zerować w
programie głównym, zaraz po odczycie
bufora. Dzięki temu zabezpieczam się przed sytuacją, gdy pomimo ustawienia
linii CTS - PC nadal wysyła dane,
które ma w wewnętrznym buforze.

Bardzo proszę o pomoc bo nie to nie obsługa UART'a jest moim głównym
zadaniem a zatrzymało mnie to na dobre i nie mam pomysłów co jest nie tak.

Dziękuję
Pozdrawiam

Jack Houseman
Guest

Sun Mar 12, 2006 9:07 am   



Witam,

Mnie przychodza dwa pomysly do glowy:
1. Czy czasem wystawienie CTS nie powinno byc zrobione wczesniej, tzn. czy
UART nadawczy nie zdazy wyslac jeszcze jednego znaku mimo, ze Ty wystawiasz
CTS. W takiej sytuacji CTS powinno sie wystawic w momencie
USART_RX_buf_stop-1 - o jeden znak przed koncem bufora.

2. Moze nalezaloby przeniesc bezwarunkowe zwiekszanie wskaznika do miejsca
gdzie bedzie sprawdzany warunek zapelnienia bufora np. tak:

SIGNAL (SIG_UART_RECV)
{
USART_odbiornik.buf[USART_odbiornik.wsk]=UDR; //1

if(USART_odbiornik.wsk<USART_RX_buf_stop) //2
USART_odbiornik.wsk++;
else
{
PORTB|=(1<<CTS); //3
USART_odbiornik.buf_full=1; //4
// USART_odbiornik.wsk=0; //5
}
}
W ten sposob wskaznik stoi w miejscu - czy beda przychodzily jakies znaki
czy nie - nie ma szansy jego zwiekszenia. Ew. mozna cala linie zapisu do
bufora + inkrementacja przeniesc pod warunek if - wtedy nie bedzie tez
zapisu do bufora po przekroczeniu dl. wskaznika.

Oczywiscie nie wiem czy to jest rozwiazanie problemu - ale warto zwrocic
uwage na te sprawy.


Krzysztof wrote:

Quote:
Witam!

Prosiłbym serdecznie o pomoc bo ten problem zatrzymuje moją pracę nad
projektem dyplomowym.
Sprawa jest następująca:

mam sobie taką funkcję obsługi przerwania od odbiornika USART:

SIGNAL (SIG_UART_RECV)
{
USART_odbiornik.buf[USART_odbiornik.wsk++]=UDR; //1

if(USART_odbiornik.wsk>USART_RX_buf_stop) //2
{
PORTB|=(1<<CTS);
//3
USART_odbiornik.buf_full=1; //4
USART_odbiornik.wsk=0; //5
}
}

Jak widać USART_odbiornik.wsk wskazuje na miejsce w buforze, pod które
wpisywany jest odebrany znak.
USART_RX_buf_stop - po przekroczeniu tej wartości przez
USART_odbiornik.wsk - wystawiam CTS, co
powinno zatrzymywać transmisję do momentu gdy jej nie zwolnię w programie
głównym.
Wszystko działa dobrze, gdy mam linię nr 5. Jeśli ją usunę - program nie
wstrzymuje mi transmisji i tracę bajty.

Dodam, że zależy mi na tym, aby zmienną USART_odbiornik.wsk zerować w
programie głównym, zaraz po odczycie
bufora. Dzięki temu zabezpieczam się przed sytuacją, gdy pomimo ustawienia
linii CTS - PC nadal wysyła dane,
które ma w wewnętrznym buforze.

Bardzo proszę o pomoc bo nie to nie obsługa UART'a jest moim głównym
zadaniem a zatrzymało mnie to na dobre i nie mam pomysłów co jest nie tak.

Dziękuję
Pozdrawiam

--
Pozdrawiam
Jado

>> Otwarty Projekt Automatyki Domowej [HA] http://zegaruz.republika.pl <<

Krzysztof
Guest

Sun Mar 12, 2006 10:26 am   



Jak na razie nie pomaga, dodam, że używam chip'u FTDI 232BM.

Straszne głupoty się dzieją!!!! A może w nowszych wersjach problem ten
został rozwiązany??

Zbych
Guest

Sun Mar 12, 2006 12:36 pm   



Krzysztof napisał(a):

Quote:
USART_odbiornik.wsk - wystawiam CTS, co
powinno zatrzymywać transmisję do momentu gdy jej nie zwolnię w programie
głównym.

Zrobiłeś błędne założenie. PCet po wystawieniu CTS może ci wysłać nawet
kilkanaście bajtów, zanim zatrzyma transmisję (podobnie sytuacja wygląda
z XON/XOFF).

Quote:
Bardzo proszę o pomoc bo nie to nie obsługa UART'a jest moim głównym
zadaniem a zatrzymało mnie to na dobre i nie mam pomysłów co jest nie tak.

Niepotrzebnie wymyślasz koło od nowa. Poszukaj obsługi rsa z użyciem
bufora okrężnego. Tutaj masz to napisane w asemblerze
http://members.tripod.com/Stelios_Cellar/AVR/FileArchive/Source/queue.zip

Krzysztof
Guest

Sun Mar 12, 2006 1:59 pm   



Użytkownik "Zbych" <abuse@onet.pl> napisał w wiadomości
news:dv14kp$e1i$1@news.mm.pl...
Quote:
Krzysztof napisał(a):

USART_odbiornik.wsk - wystawiam CTS, co
powinno zatrzymywać transmisję do momentu gdy jej nie zwolnię w programie
głównym.

Zrobiłeś błędne założenie. PCet po wystawieniu CTS może ci wysłać nawet
kilkanaście bajtów, zanim zatrzyma transmisję (podobnie sytuacja wygląda z
XON/XOFF).


Wiem! Z tego też powodu USART_odbiornik.wsk zerować chcę w programie
głównym.
Dzięki temu mogę odebrać te bajty, które wysłane zostaną po ustawieniu CTS.

Krzysztof
Guest

Sun Mar 12, 2006 2:00 pm   



No tak ale tam nie ma obsługi CTS/RTS!!!

Adam Dybkowski
Guest

Sun Mar 12, 2006 8:15 pm   



Krzysztof napisał(a):

Quote:
Jak na razie nie pomaga, dodam, że używam chip'u FTDI 232BM.

Straszne głupoty się dzieją!!!! A może w nowszych wersjach problem ten
został rozwiązany??

Następnym razem zastosuj FT245BM. Ma magistralę równoległą i stroby,
którymi steruje procesor. Jak nie ma czasu odebrać danych to nie steruje
Smile i wstrzymanie transmisji w komputerze odbywa się automagicznie.
Zdecydowanie lepsze rozwiązanie, niż FT232BM, który procesorowi "do
gardła" wpycha kolejne bajty i musisz za tym nadążyć.

A od strony peceta oba układy są widoczne tak samo czyli jako wirtualny
port COM (albo przez sterownik D2XX jeżeli tak wolisz).

--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/

Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.

Krzysztof
Guest

Sun Mar 12, 2006 9:58 pm   



Też mi się to wydawało takie proste !!!!
Jutro spróbuję z MAXem i sprawdzę w ten sposób czy problemów nie sprawia
FTDI


Użytkownik "Zbych" <abuse@onet.pl> napisał w wiadomości
news:dv20f0$f5f$1@atlantis.news.tpi.pl...
Quote:
Krzysztof przemówił ludzkim głosem:

No tak ale tam nie ma obsługi CTS/RTS!!!

A w czym problem ?
W przerwaniu jeśli wyjdziesz poza np. 3/4 zajętości bufora blokujesz
transmisję, a w programie głównym po opróżnieniu do, powiedzmy, 1/4
odblokowujesz.


elektroda NewsGroups Forum Index - Elektronika Polska - Jak prawidłowo obsłużyć bufor USART w projekcie dyplomowym na AVR?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map