-
11. Data: 2010-07-20 21:21:20
Temat: Re: Atmega jak zrealizowac odbior szeregowy
Od: "Andy" <a...@c...pl>
Użytkownik "Chomik" <c...@h...pl> napisał w wiadomości
news:i2510m$mh7$1@news.supermedia.pl...
>
> >>
> >
> > ale w czym wlasciwie problem ?
> >
> > Ja pisze w C i nie znam bascoma ale da sie chyba zrobic licznika do 8 w
> > bascomie ?
> > Czy moze nie ma przesuniecia shifta na zmiennej ?
> >
> > Czy masz problem jak poszczegolne bity wkleic do zmiennej ?
> >
> > np odebrany bit ustawiasz na najstarszym bicie zmiennej
> > a nastepnie zmienna przesuwasz w prawo o jeden bit
> >
> > i robisz tak 8 razy i masz odebranych 8 bitow
> >
> Dla jednego bajtu nie problem. Bufor ma miec co najmniej 9 bajtow. To juz
> troche komplikuje i bascom zbyt czasochlonny kod by do tego robil wiec
wole
> w asm (C wogole nie znam ). Wiec jeszcze pozostaje mi rozszerzenie tego
> przesuwania na cale 9 bajtow.
>
Tablice chyba sa ?
Jesli masz juz jeden bajt to wrzucasz go do tablicy.
Typowe rozwiaznie to tzw. bufor okrezny (ring buffer).
Moze jest cos takiego gotowego w bascomie ?
Czyli tablica np. na 9 bajtow
(albo lepiej troche wiecej jesli zuzycie RAM'u nie jest krytyczne
to lepiej ze dwa razy wiecej, zalezy jak szybko dane przychodza i jak sa
obrabiane)
i dwa indeksy - indeks do zapisu i indeks do odczytu.
Gdy indeks dojdzie do konca tablicy to go "zawijasz" go czyli zerujesz
i idzie od pocztaku.
Wrzucenie do bufora:
zapis do tablicy pod indeksem na jaki wskazuje indeks do zapisania
zwiekszenie ideksu o 1 i sprawdznie czy wiekszy lub rowny rozmiarowi
tablicy a jesli tak to wyzerowanie.
Odczyt z bufora:
odczyt z tablicy z indeksu do odczytu, zwiekszenie indeksu o 1
i sprawdznie czy wiekszy lub rowny rozmiarowi tablicy a jesli tak to
wyzerowanie.
Gdy oba indeksy sa rowne tzn. nie ma nic w buforze a gdy rozne
to mozna odczytywac.
Trzeba jeszcze uwazac na przepelnienie bufora. Mozna dodac jakas zmienna
sygnalizujac przepelnienie.
Jesli z jakiegos powodu nie bedzie odczytu a beda kolejne zapisy
to dojdzie do sytuacji kiedy indeksy znow beda rowne
i jesli taka sytuacja nastapi to znaczy, ze w buforz jest max danych
i wiecej nie wejdzie. Warto wtedy ustawic jakas zmienna sygnalizujaca
overflow.
--
Andrzej
-
12. Data: 2010-07-20 22:06:57
Temat: Re: Atmega jak zrealizowac odbior szeregowy
Od: "Gejzero" <g...@p...onet.pl>
Użytkownik "Chomik" <c...@h...pl> napisał w wiadomości
news:i2510m$mh7$1@news.supermedia.pl...
>
>>>
>>
>> ale w czym wlasciwie problem ?
>>
>> Ja pisze w C i nie znam bascoma ale da sie chyba zrobic licznika do 8 w
>> bascomie ?
>> Czy moze nie ma przesuniecia shifta na zmiennej ?
>>
>> Czy masz problem jak poszczegolne bity wkleic do zmiennej ?
>>
>> np odebrany bit ustawiasz na najstarszym bicie zmiennej
>> a nastepnie zmienna przesuwasz w prawo o jeden bit
>>
>> i robisz tak 8 razy i masz odebranych 8 bitow
>>
> Dla jednego bajtu nie problem. Bufor ma miec co najmniej 9 bajtow. To juz
> troche komplikuje i bascom zbyt czasochlonny kod by do tego robil wiec
> wole w asm (C wogole nie znam ). Wiec jeszcze pozostaje mi rozszerzenie
> tego przesuwania na cale 9 bajtow.
Ja bym się zainteresowal programową implementacją portu szeregowego.
Kiedyś były dobre przyklady w asmie ale ja wtedy szukalem na 51. Zapewne na
AVR też są.
Przy prędkości 2400 to chyba można by ręcznie odbierać :P. A tak na serio to
chyba sygnał był w tych przykładach próbkowany z 8 razy na jedną zmiane
stanu.
Tutaj http://www.btc.pl/index.php?ukey=product&productID=2
0844 jest
przykład realizacji programowej w Bascomie. Jednak, korzysta on z Bacomowego
podprogramyu :( Ewentualnie można skompilować prosty przykład i zobaczyć jak
Bascom realizuje taką transmisje programowo i na niej się wzorować już w
asemblerze.
Gejzero.
-
13. Data: 2010-07-21 13:58:03
Temat: Re: Atmega jak zrealizowac odbior szeregowy
Od: "Chomik" <c...@h...pl>
>
> Przeczytałeś to
> http://www.cmlmicro.com/Products/applications/AN_WDA
TA_469AFW_1.pdf ?
>
> Z opisu wynika, że uC mógłby pracować jako SPI slave. Przy nadawaniu
> włączasz Tx Enable i dane wysyłasz w takt Tx Sync:
>
>> The Tx Data must be valid at the time of the rising edge of the Tx Sync
>> clock signal. Therefore, the optimum
>> time to change Tx Data is on the falling edge of the Tx Sync clock.
>
> Odbiór robisz synchronicznie z Rx Sync:
>
>> The optimum time to sample the Clocked Data Out is on the falling edge of
>> the Rx Sync Out clock signal.
>
> Oczywiście możesz się obyć bez SPI podłączając linie Sync do przerwań.
No i tak napisalem Sygnal CLK bedzie generowal przerwanie i wtedy bedzie
odczytywany bit. Problem byl bardziej co dalej z tym zrobic ale juz chyba
powoli rozwiazalem.
-
14. Data: 2010-07-21 14:01:42
Temat: Re: Atmega jak zrealizowac odbior szeregowy
Od: "Chomik" <c...@h...pl>
> Gdy oba indeksy sa rowne tzn. nie ma nic w buforze a gdy rozne
> to mozna odczytywac.
>
> Trzeba jeszcze uwazac na przepelnienie bufora. Mozna dodac jakas zmienna
> sygnalizujac przepelnienie.
> Jesli z jakiegos powodu nie bedzie odczytu a beda kolejne zapisy
> to dojdzie do sytuacji kiedy indeksy znow beda rowne
> i jesli taka sytuacja nastapi to znaczy, ze w buforz jest max danych
> i wiecej nie wejdzie. Warto wtedy ustawic jakas zmienna sygnalizujaca
> overflow.
>
Problem jest inny. Bufor ten musi funkcjonowac na zasadzie rejestru
przesuwnego przesuwajac cala zawartosc o 1 bit po kazdym odebranym.. Po
kazdym odebranym bicie musze sprawdzic czy przyszla ramka startowa. Poki co
napisalem rozwiazanie tego programowo w bascomie nie wiem tylko czy czasowo
sie procesor ze wszystkim wyrobi. Dlatego tez wspominalem o tym asm zeby w
nim pewne rzeczy zrobic.
-
15. Data: 2010-07-21 14:21:04
Temat: Re: Atmega jak zrealizowac odbior szeregowy
Od: "Andy" <a...@c...pl>
Użytkownik "Chomik" <c...@h...pl> napisał w wiadomości
news:i26ujo$2lu$2@news.supermedia.pl...
> > Gdy oba indeksy sa rowne tzn. nie ma nic w buforze a gdy rozne
> > to mozna odczytywac.
> >
> > Trzeba jeszcze uwazac na przepelnienie bufora. Mozna dodac jakas zmienna
> > sygnalizujac przepelnienie.
> > Jesli z jakiegos powodu nie bedzie odczytu a beda kolejne zapisy
> > to dojdzie do sytuacji kiedy indeksy znow beda rowne
> > i jesli taka sytuacja nastapi to znaczy, ze w buforz jest max danych
> > i wiecej nie wejdzie. Warto wtedy ustawic jakas zmienna sygnalizujaca
> > overflow.
> >
> Problem jest inny. Bufor ten musi funkcjonowac na zasadzie rejestru
> przesuwnego przesuwajac cala zawartosc o 1 bit po kazdym odebranym.. Po
> kazdym odebranym bicie musze sprawdzic czy przyszla ramka startowa. Poki
co
> napisalem rozwiazanie tego programowo w bascomie nie wiem tylko czy
czasowo
> sie procesor ze wszystkim wyrobi. Dlatego tez wspominalem o tym asm zeby w
> nim pewne rzeczy zrobic.
>
Jesli stala masz tylko preambule (jeden bajt)
to poluj tylko na niego
Przesuwanie wszystkich 9 bajtow chyba nie ma sensu.
--
Andrzej
-
16. Data: 2010-07-21 15:37:01
Temat: Re: Atmega jak zrealizowac odbior szeregowy
Od: "Chomik" <c...@h...pl>
>
> Jesli stala masz tylko preambule (jeden bajt)
> to poluj tylko na niego
> Przesuwanie wszystkich 9 bajtow chyba nie ma sensu.
>
>
No wlasnie nie wiem co lepsze.
Dla mnie wydaje sie ze lepiej miec w buforze calosc 9 bajtow i jak wykryje
preambule to od razu przejsc do obrobki calosci.Przy dluzszych transmisjach
pewnie to bym inaczej robil ale tutaj tak mi najwygodniej.