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

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.