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

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

Reply to
Krzysztof
Loading thread data ...

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.

  1. 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:

Reply to
Jack Houseman

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??

Reply to
Krzysztof

Krzysztof napisał(a):

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).

Niepotrzebnie wymyślasz koło od nowa. Poszukaj obsługi rsa z użyciem bufora okrężnego. Tutaj masz to napisane w asemblerze

formatting link

Reply to
Zbych

Użytkownik "Zbych" snipped-for-privacy@onet.pl napisał w wiadomości news:dv14kp$e1i$ snipped-for-privacy@news.mm.pl...

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.

Reply to
Krzysztof

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

Reply to
Krzysztof

Krzysztof napisał(a):

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).

Reply to
Adam Dybkowski

A msą jakieś gotowe moduły z tym układem ??

Użytkownik "Adam Dybkowski" snipped-for-privacy@amwaw.edu.pl> napisał w wiadomości news:dv1s4b$mhn$ snipped-for-privacy@nemesis.news.tpi.pl...

Reply to
Krzysztof

Krzysztof napisał(a):

formatting link
układy FT245BM można kupić m.in. w Propox i Soyter.

Reply to
Adam Dybkowski

Krzysztof przemówił ludzkim głosem:

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.

Reply to
Zbych

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" snipped-for-privacy@onet.pl napisał w wiadomości news:dv20f0$f5f$ snipped-for-privacy@atlantis.news.tpi.pl...

Reply to
Krzysztof

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.