Re: Atmega jak zrealizowac odbior szeregowy

Jul 20, 2010 8 Replies


> Ja cie nie chce straszyc ale tego FFSK 2400Bd CMX469A  nie ma w > > google. :)


> > Ale ok, jesli masz po prostu dwa sygnaly i jeden jest zegarowy a drugi
> > z danymi to sprawa jest relatywnie prosta.
> > Polecam ksiazke  
formatting link
> Na poczatek bedzie dobra. Trudno mi cos wiecej zaproponowac bo tez sie
> > ucze.
> > Mozesz tez rozwazyc inne jego pozycje bo pisze dobrze i przyklady
> > dzialaja (a przynajmniej te ktore zbudowalem).
>
> > --
>
> Cos chyba zle wpisales bo ten scalak jest na pierwzym miejscu w google i
> kolejnych kilkudziesieciu pozycjach.
> Co do ksiazki to taka mam a w Bascomie pisze programy od dawna. Lecz do tych
> zastosowan bedzie potrzebna jakas wstawka w asemblerze (wole go niz C) ale
> nie wiem z ktorej strony ugryzc zwlaszcza temat tworzenia, organizacji i
> dostepu do bufora bo to juz by mi cos dalo.

Wpisalem cala fraze i pokazalo sie zero wynikow. Ale rzeczywiscie samo CMX469A pokazuje troche wynikow. A czemu wstawka w asm? bascom jest relatywnie szybki jesli nie uzywa sie fikusnikow. Probowales cokolwiek juz napisac w tym temacie? Ja na lysym bascomie zrobilem pwm-a i nawet dziala czyli mruga diodami szybciej niz te200Hz (ale nie wiem dokladnie ile).

Pewne rzeczy latwiej w asm zrobic, chodza szybciej a co najwazniejsze mniej miejsca zajmuja. Procz odebrania jeszcze te dane trzeba obrobic i to pewnie juz by bylo w Bascomie bo tak mi latwiej. Poki co nic nie mam ani w asm ani w bascomie bo stanalem na etapie wymyslania jak zrobic 9 bajtowy bufor zapisywany bit po bicie. Jak to wymysle albo ktos mi podpowie zeby nie wywazac otwartych juz drzwi, to wtedy bede myslal nad reszta.

Uzytkownik "Chomik" snipped-for-privacy@hot.pl napisal w wiadomosci news:i24v66$llo$ snipped-for-privacy@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.

U¿ytkownik "Chomik" snipped-for-privacy@hot.pl napisa³ w wiadomo¶ci news:i2510m$mh7$ snipped-for-privacy@news.supermedia.pl...

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.

U¿ytkownik "Chomik" snipped-for-privacy@hot.pl napisa³ w wiadomo¶ci news:i2510m$mh7$ snipped-for-privacy@news.supermedia.pl...

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

formatting link
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.

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.

U¿ytkownik "Chomik" snipped-for-privacy@hot.pl napisa³ w wiadomo¶ci news:i26ujo$2lu$ snipped-for-privacy@news.supermedia.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.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required