Jak poprawnie zarządzać buforowaniem w USART na AVR z użyciem CTS?
proszę o pomoc - USART , AVR, GCC, CTS
From: "Krzysztof" <krysss1981_at_nospam_poczta.onet.pl>
Subject: proszę o pomoc - USART , AVR, GCC, CTS
Date: Sun, 12 Mar 2006 09:32:40 +0100
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
From: Jack Houseman <KILLSPAMjado_at_nospam_chello.pl>
Subject: Re: =?ISO-8859-2?Q?prosz=EA?= o pomoc - USART , AVR, GCC, CTS
Date: Sun, 12 Mar 2006 10:07:31 +0100
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:
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 <<
From: "Krzysztof" <krysss1981_at_nospam_poczta.onet.pl>
Subject: Re: proszę o pomoc - USART , AVR, GCC, CTS
Date: Sun, 12 Mar 2006 11:26:25 +0100
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??
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: =?ISO-8859-2?Q?prosz=EA_o_pomoc_-_USART_=2C_AVR=2C?=
Date: Sun, 12 Mar 2006 20:15:57 +0100
Krzysztof napisał(a):
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.
From: "Krzysztof" <krysss1981_at_nospam_poczta.onet.pl>
Subject: Re: proszę o pomoc - USART , AVR, GCC, CTS
Date: Sun, 12 Mar 2006 20:23:40 +0100
A msą jakieś gotowe moduły z tym układem ??
Użytkownik "Adam Dybkowski" <adybkows123_at_nospam_amwaw.edu.pl> napisał w wiadomości
news:dv1s4b$mhn$1_at_nospam_nemesis.news.tpi.pl...
Krzysztof napisał(a):
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.
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: =?ISO-8859-2?Q?prosz=EA_o_pomoc_-_USART_=2C_AVR=2C?=
Date: Sun, 12 Mar 2006 20:31:59 +0100
Krzysztof napisał(a):
>> Następnym razem zastosuj FT245BM.
A msą jakieś gotowe moduły z tym układem ??
http://www.propox.com/products/t_94.html
Same układy FT245BM można kupić m.in. w Propox i Soyter.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: =?ISO-8859-2?Q?prosz=EA_o_pomoc_-_USART_=2C_AVR=2C?=
Date: Sun, 12 Mar 2006 13:36:58 +0100
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).
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
From: "Krzysztof" <krysss1981_at_nospam_poczta.onet.pl>
Subject: Re: proszę o pomoc - USART , AVR, GCC, CTS
Date: Sun, 12 Mar 2006 14:59:04 +0100
Użytkownik "Zbych" <abuse_at_nospam_onet.pl> napisał w wiadomości
news:dv14kp$e1i$1_at_nospam_news.mm.pl...
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.
From: "Krzysztof" <krysss1981_at_nospam_poczta.onet.pl>
Subject: Re: proszę o pomoc - USART , AVR, GCC, CTS
Date: Sun, 12 Mar 2006 15:00:33 +0100
No tak ale tam nie ma obsługi CTS/RTS!!!
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: =?ISO-8859-2?Q?prosz=EA_o_pomoc_-_USART_=2C_AVR=2C?=
Date: Sun, 12 Mar 2006 21:31:14 +0100
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.
From: "Krzysztof" <krysss1981_at_nospam_poczta.onet.pl>
Subject: Re: proszę o pomoc - USART , AVR, GCC, CTS
Date: Sun, 12 Mar 2006 21:58:22 +0100
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_at_nospam_onet.pl> napisał w wiadomości
news:dv20f0$f5f$1_at_nospam_atlantis.news.tpi.pl...
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.